OpenTelemetry, OTEL para os íntimos, tem sido assunto crescente em várias indústrias. Se você ainda não se informou sobre o assunto recomendo esses dois links:
Documentação Oficial
O que é opentelemetry
A CISCO vem investindo forte no assunto e tem feito grandes contribuições a comunidade. Um bom exemplo disso é a instrumentação do NGINX utilizando OpenTelemetry. Nesse post vou mostrar como encaixamos o AppDynamics nessa conversa.
O AppDynamics, para quem ainda não teve o prazer de conhecer, é uma excelente plataforma de observabilidade onde temos no mesmo contexto todas as informações necessárias para entender como sua aplicação impacta diretamente seu negócio. Observabilidade na veia utilizando Métricas, Eventos, Traces e Logs. A coleta dos dados é feita através de agentes construídos pela própria AppDynamics, mas, como uma boa plataforma de observabilidade, temos o OTEL como uma das formas de ingestão de dados também.
Compartilhar conhecimento é uma forma de aprender e por isso resolvi escrever esse tutorial combinando temas interessantes para mim NGINX + OTEL + AppDynamics. Espero que seja interessante para você também. Segue o fio...
Para começar
Antes de começar você vai precisar de:
- git
- docker
- docker-compose
- Controller AppDynamics SaaS
- Um editor de textos
Como funciona?
Antes de começar com os builds vamos entender como tudo isso funciona.
![LeandroFerreira_0-1668795541312.png LeandroFerreira_0-1668795541312.png](https://community.cisco.com/t5/image/serverpage/image-id/168460iF94A851B5C84A7E7/image-size/medium?v=v2&px=400)
No NGINX temos um agente que vai coletar informações e enviar a um coletor (OpenTelemetry Collector). Tanto o agente quanto o coletor são desenvolvidos pela comunidade. O coletor ao receber as informações enviadas pelo agente faz as devidas transformações e manda para o AppDynamics.
Criando uma imagem com NGINX e instalando o agente
Vamos começar construindo uma imagem com NGINX já instrumentado. O primeiro passo é clonar o repositório.
git clone https://github.com/lof000/appd-sample-apps-otel.git
Depois que clonar o repo, tudo que vamos executar você vai encontrar na pasta nginxotel. Primeiro vamos dar uma olhada no Docker file só para entender o que estamos fazendo.
FROM nginx:1.18
RUN apt-get update ; apt-get install unzip
#DOWNLOAD OTEL NGINX AGENT
ADD https://github.com/open-telemetry/opentelemetry-cpp-contrib/releases/download/webserver%2Fv1.0.0/opentelemetry-webserver-sdk-x64-linux.tgz.zip /opt
#INSTALL OTEL AGENT
RUN cd /opt ; unzip opentelemetry-webserver-sdk-x64-linux.tgz.zip; tar xvfz opentelemetry-webserver-sdk-x64-linux.tgz
RUN cd /opt/opentelemetry-webserver-sdk; ./install.sh
#SET ENV VARIABLE FOR OTEL AGENT LIB
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/opt/opentelemetry-webserver-sdk/sdk_lib/lib
Agora vamos fazer o build
docker build -t nginx_otel .
Configurando o agente do NGINX
Com a imagem pronta, podemos configurar a funcionamento do agente editando o arquivo opentelemetry_module.conf. No exemplo do git eu já deixei tudo pronto, não é necessário editar nada. Fica o exemplo abaixo para entendimento
NginxModuleEnabled ON;
NginxModuleOtelSpanExporter otlp;
NginxModuleOtelExporterEndpoint otel-collector:4317;
NginxModuleServiceName nginx_service;
NginxModuleServiceNamespace nginx_lab;
NginxModuleServiceInstanceId nginx_serviceID;
NginxModuleResolveBackends ON;
NginxModuleTraceAsError ON;
NginxModuleOtelSpanExporter: O agente do NGINX envia os dados para um coletor (OTEL COLLECTOR). Esse campo indica qual protocolo de comunicação está sendo usado para “conversar” com o collector.
NginxModuleOtelExporterEndpoint: Aqui indicamos onde está o collector (host e porta). Abrindo o arquivo docker-compose.yml você vai ver um serviço com esse nome
NginxModuleServiceNamespace: Aqui damos o nome do namespace
NginxModuleServiceName: Aqui damos um nome para o serviço.
Podemos ver mais detalhes na documentação.
Configurando a comunicação do coletor com o AppDynamics
Com o NGINX instrumentado vamos configurar a comunicação do coletor com o AppDynamics. Não é nosso foco aprofundarmos em detalhes do coletor agora.
Faça o login na controller e clique na aba OTEL
![LeandroFerreira_1-1668795541314.png LeandroFerreira_1-1668795541314.png](https://community.cisco.com/t5/image/serverpage/image-id/168458iFA154A9EDE2EA077/image-dimensions/2036x109?v=v2)
Logo abaixo clique em show, para visualizar seu token de acesso. Copie e guarde esse token porque vamos utilizado em breve.
![LeandroFerreira_13-1668796242556.png LeandroFerreira_13-1668796242556.png](https://community.cisco.com/t5/image/serverpage/image-id/168469iD9B6EE468617A766/image-dimensions/744x147?v=v2)
Você também vai precisar de seu account name. Clique na engrenagem depois em license e depois na aba account
![LeandroFerreira_3-1668795541317.png LeandroFerreira_3-1668795541317.png](https://community.cisco.com/t5/image/serverpage/image-id/168462i624B44EEB593B105/image-dimensions/294x231?v=v2)
![LeandroFerreira_14-1668796301184.png LeandroFerreira_14-1668796301184.png](https://community.cisco.com/t5/image/serverpage/image-id/168470i8764683867A3EA3C/image-dimensions/485x139?v=v2)
Guarde esse account name. Por último vamos obter o OTEL endpoint da controller. Acesse a documentação e localize a URL de acordo com sua região.
OTEL Endpoints por região
Por exemplo, se a sua controller estiver hospedada em Virginia a url será
https://pdx-sls-agent-api.saas.appdynamics.com
Agora vamos editar o arquivo otel-collector-config.yaml e colocar as informações que você acabou de obter.
processors:
resource:
attributes:
- key: appdynamics.controller.account
action: upsert
value: "<o account name que acabamos de obter>"
- key: appdynamics.controller.host
action: upsert
value: "<hostname da controller… minhacontroller.saas.appdynamics.com>"
- key: appdynamics.controller.port
action: upsert
value: 443
.....
otlphttp:
endpoint: <OTEL ENDPOINT>
headers: {"x-api-key": "<access key que você obteve antes, na aba OTEL>"}
Testando
Com todos os arquivos configurados, vamos subir o serviço e ver se deu tudo certo.
docker-compose up -d
Verificando se tudo está no ar
docker-compose ps
![LeandroFerreira_5-1668795541320.png LeandroFerreira_5-1668795541320.png](https://community.cisco.com/t5/image/serverpage/image-id/168463iE12AAF927D6E5EDF/image-size/large?v=v2&px=999)
docker logs nginx
![LeandroFerreira_6-1668795541323.png LeandroFerreira_6-1668795541323.png](https://community.cisco.com/t5/image/serverpage/image-id/168464iA7B2459F0D4DE1C8/image-size/large?v=v2&px=999)
docker logs otel-collector
![LeandroFerreira_7-1668795541325.png LeandroFerreira_7-1668795541325.png](https://community.cisco.com/t5/image/serverpage/image-id/168465i1D94F504A599C373/image-size/large?v=v2&px=999)
Para finalizar vamos enviar requisições ao nginx
./load.sh
Verifique novamente os logs do coletor, você deve ver mensagens como essa indicando que ele está recebendo as informações do agente e enviando o AppDynamics
![LeandroFerreira_8-1668795541328.png LeandroFerreira_8-1668795541328.png](https://community.cisco.com/t5/image/serverpage/image-id/168466i813679F8C36F9EC2/image-size/large?v=v2&px=999)
Deixando o load rodar por uns 5 minutos veremos as informações na controller do AppDynamics
![LeandroFerreira_9-1668795541330.png LeandroFerreira_9-1668795541330.png](https://community.cisco.com/t5/image/serverpage/image-id/168467iC747C47978A9575F/image-size/large?v=v2&px=999)
![LeandroFerreira_10-1668795541338.png LeandroFerreira_10-1668795541338.png](https://community.cisco.com/t5/image/serverpage/image-id/168468iD3F3A5F3BA09A8E3/image-size/large?v=v2&px=999)
Pronto! Começamos a exercitar o uso de OTEL junto com o AppDynamics. No próximo tutorial vou mostrar um exemplo monitorando o NGINX e seus backends, fique ligado.