cancelar
Mostrar resultados para 
Pesquisar em vez de 
Queria dizer: 
cancel
574
Apresentações
3
Útil
0
Comentários
Leandro Ferreira
Cisco Employee
Cisco Employee

Alguns meses atrás escrevi mostrando como instrumentar um NGINX e enviar traces para o AppDynamics. Nos últimos meses anunciamos a compra da SPLUNK e com isso o crescimento de nosso portfólio de observabilidade. O Splunk Observability Cloud (o11y) é a nossa plataforma de observabilidade para aplicações modernas totalmente compatível com OpenTelemetry.

Com isso em mente resolvi refazer a implementação agora tendo o Splunk Observability Cloud como o frontend. O desenho abaixo mostra a ideia geral.

LeandroFerreira_0-1720707836337.png

Resumidamente o que vamos fazer:

  • Criar uma imagem do NGINX com instrumentação OTEL
  • Configurar a instrumentação OTEL no NGINX
  • Configurar o Splunk Otel Collector para receber os dados do NGINX e enviar para Splunk Observability Cloud
  • Criar um docker compose para subir e testar tudo

 

Criando e configurando a imagem do NGINX

Vamos começar criando a imagem. De acordo com a documentação vamos criar um Dockefile com o seguinte conteúdo.

 

FROM nginx:1.26.0
RUN apt-get update ; apt-get install unzip
ADD https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases/download/webserver%2Fv1.1.0/opentelemetry-webserver-sdk-x64-linux.tgz /opt
RUN cd /opt ; tar xvfz opentelemetry-webserver-sdk-x64-linux.tgz
RUN cd /opt/opentelemetry-webserver-sdk; ./install.sh
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/opt/opentelemetry-webserver-sdk/sdk_lib/lib
RUN echo "load_module /opt/opentelemetry-webserver-sdk/WebServerModule/Nginx/1.26.0/ngx_http_opentelemetry_module.so;\n$(cat /etc/nginx/nginx.conf)" > /etc/nginx/nginx.conf

COPY opentelemetry_module.conf /etc/nginx/conf.d

 

Agora criamos este arquivo de configuração chamado opentelemetry_module.conf no mesmo diretório do Dockerfile

 

NginxModuleEnabled ON;
NginxModuleOtelSpanExporter otlp;
NginxModuleOtelExporterEndpoint otelcol:4317;
NginxModuleServiceName nginx_front;
NginxModuleServiceNamespace digibank;
NginxModuleServiceInstanceId NginxFrontInstanceId;
NginxModuleResolveBackends ON;
NginxModuleTraceAsError ON;
NginxModuleAttributes environment digibankXX;

 

Se quiser ver todos as opções disponíveis basta consultar a documentação.

Com os dois arquivos prontos o próximo passo e criar a imagem

 

docker build -t leandrovo/nginx_otel:1.26.0 .

 

 

Configurando o Splunk OTEL Collector

Como vamos usar uma imagem já existente do Splunk OTEL Collector precisamos apenas informar a configuração que vamos usar. Crie um arquivo chamado otelcol-config.yml com o conteúdo abaixo:

 

extensions:
  health_check:
    endpoint: 0.0.0.0:13133
  http_forwarder:
    ingress:
      endpoint: 0.0.0.0:6060
    egress:
      endpoint: "https://api.${SPLUNK_REALM}.signalfx.com"
  zpages:
receivers:
  fluentforward:
    endpoint: 0.0.0.0:24224
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
  sapm:
    endpoint: 0.0.0.0:7276
  signalfx:
    endpoint: 0.0.0.0:9943
  prometheus:
    config:
      scrape_configs:
        - job_name: 'otel-collector'
          scrape_interval: 10s
          static_configs:
            - targets: ['localhost:8888']
          metric_relabel_configs:
            - source_labels: [ __name__ ]
              regex: '.*grpc_io.*'
              action: drop

processors:
  batch:
  attributes/copyfromexistingkey:
    actions:
    - key: environment
      from_attribute: DEPLOYMENT_ENV
      action: upsert
  attributes/newenvironment:
    actions:
    - key: environment
      value: "digibanknginx"
      action: insert
  resourcedetection:
    detectors:
      - env
      - system
    timeout: 10s
    override: true

exporters:

  debug:
    verbosity: detailed
  logging:
    verbosity: detailed
  sapm:
    access_token: "${SPLUNK_ACCESS_TOKEN}"
    endpoint: "https://ingest.${SPLUNK_REALM}.signalfx.com/v2/trace"
  signalfx:
    access_token: "${SPLUNK_ACCESS_TOKEN}"
    realm: "${SPLUNK_REALM}"
    sync_host_metadata: true

service:
  extensions: [health_check, http_forwarder, zpages]
  pipelines:
    traces:
      receivers: [otlp, sapm]
      processors: [attributes/newenvironment,attributes/copyfromexistingkey,batch, resourcedetection]
      exporters: [ debug,logging,sapm, signalfx ]
    metrics:
      receivers: [otlp, signalfx, prometheus]
      processors: [batch, resourcedetection]
      exporters: [signalfx]

 

 

Criando o docker compose para testar tudo

Com todas as configurações prontas vamos agora informar algumas variáveis de ambiente importantes. Se você ainda não tem um trial agora é o momento de fazê-lo. Clique nesse link e cria seu trial no Splunk Observability Cloud.

Com o trial criado você precisa agora obter seu token de conexão.  Basta clicar em Acess Tokens depois em Default

LeandroFerreira_1-1720708336083.png

Agora crie um arquivo chamado .env incluindo seu token e as demais informações. O valor de SPLUNK_REALM você obtém na URL do seu trial. https://app.<<SEU REALM>>.signalfx.com

 

SPLUNK_ACCESS_TOKEN=<<SEU TOKEN>>
SPLUNK_REALM==<<SEU REAL>>
OTEL_EXPORTER_ENDPOINT=http://otelcol:4318
DEPLOYMENT_ENV=nginx

 

Agora vamos criar um arquivo chamado docker-compose.yaml

 

version: "3.4"

services:

  nginx:
    image: leandrovo/nginx_otel:1.26.0
    container_name: nginx
    volumes:
      - type: bind
        source: ./opentelemetry_module.conf
        target: /etc/nginx/conf.d/opentelemetry_module.conf
        #target: /opt/opentelemetry_module.conf

    ports:
      - "80:80"


  otelcol:
    image: quay.io/signalfx/splunk-otel-collector:latest
    container_name: otel-col
    deploy:
      resources:
        limits:
          memory: 125M
    restart: unless-stopped
    command: ["--config=/etc/otelcol-config.yml"]
    volumes:
      - ./otelcol-config.yml:/etc/otelcol-config.yml
      - ./logs:/logs
      - ./checkpoint:/checkpoint
    ports:
      - "4317" # OTLP over gRPC receiver
      - "4318" # OTLP over HTTP receiver
      - "9464"
      - "8888"
      - "13133"
      - "14250"
      - "14268"
      - "6060"
      - "9080"
      - "9411"
      - "9943"
      - "7276"
    environment:
      SPLUNK_ACCESS_TOKEN: ${SPLUNK_ACCESS_TOKEN}
      SPLUNK_REALM: ${SPLUNK_REALM}

 

Subindo os containers

 

docker composse up -d

 

Com os containers no ar vamos gerar uma carga de teste.

 

while true; do curl http://localhost ; sleep 1 ; done

 

Este é o resultado após algumas requisições. Vemos o service map e logo abaixo um trace com as operações.

LeandroFerreira_2-1720708526399.png

LeandroFerreira_3-1720708535599.png

Para deixar as coisas mais interessantes adicionei backends em java também instrumentados com OpenTelemetry, sugiro agora que você faça o teste acima e depois faça um clone do repositório abaixo com o resultado. Vejam que interessante.

https://github.com/lof000/splunk-labs/tree/main

LeandroFerreira_4-1720708609527.png

LeandroFerreira_5-1720708616974.png

Vejam como foi simples usar o Splunk Observability Cloud como um frontend para OpenTelemetry. Se você está testando ou já usa OpenTelemetry agora é um bom momento de experimentar essa plataforma.

 

 

 

 

 

 

 

Primeiros Passos

Encontre respostas, faça perguntas e conecte-se com nossa comunidade de especialistas da Cisco de todo o mundo.

Estamos felizes por você estar aqui! Participe de conversas e conecte-se com sua comunidade.