Como enviar dados através do Logstash ou Kafka a partir do Elastic APM

Em implementações modernas, os servidores de aplicativos em geral têm curta vida útil ou usam menos hardware confiável (máquinas virtuais preemptivas/de baixa prioridade, instâncias pontuais) do que outros componentes, como filas de mensagens e bancos de dados. Nesse casos, é recomendável transferir rapidamente os dados para um sistema mais confiável.

A partir da versão 6.4.0, o APM Server é capaz de enviar dados para o Logstash ou Kafka, repassando os requisitos de confiabilidade para um desses sistemas. O uso do Logstash também oferece a oportunidade de enriquecer os dados APM usando um dos muitos plugins Logstash disponíveis.

Nesta postagem de blog, vamos analisar a configuração e algumas ressalvas ao enviar dados através de outro sistema antes da ingestão para o Elasticsearch.

  1. Configurar o Logstash para gerar saída para o Elasticsearch
  2. Configurar o Elastic APM Server para envio para o Logstash
  3. Configurar o Elasticsearch
  4. Opcionalmente incluir mapas de origem
  5. Introduzir o Kafka

Configurar o Logstash

Em primeiro lugar, adicione um pipeline para configurar o Logstash para receber eventos do APM Server, usando o protocolo beats/lumberjack, e enviá-los ao Elasticsearch.

input {
   beats {
        id => "apm-server"
        port => 5044
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "apm-%{[beat][version]}-%{[processor][event]}-%{+YYYY.MM.dd}"
  }
}

Um índice será criado por dia por tipo de evento - transaction, span, etc - assim como a configuração padrão do APM Server geraria. Os mapas de origem introduzem uma dica neste momento que trataremos mais adiante nesta postagem.

Quem está atento deve estar se perguntando de que se tratam as referências. O APM Server se baseia no Beats Framework e dessa maneira passa os mesmos metadados nos eventos. Isso significa que manusear os dados do APM na mesma instância do Logstash como outros dados Beat pode ser feito usando uma condicional em [@metadata][beat] == "apm-server".

Configurar o APM Server

Agora que o Logstash está configurado, atualize apm-server.yml do APM Server para gerar saída de eventos corretamente:

output.elasticsearch:
  enabled: false
output.logstash
  enabled: true
  hosts: ["logstash:5044"]

Opções adicionais incluindo configurações de backoff, proxy e ssl são detalhadas na documentação do Elastic APM Server.

Se você tiver o monitoramento habilitado no APM Server, confira se definiu:

xpack.monitoring.elasticsearch:
  enabled: true
  hosts: ["elasticsearch:9200"]

Isso manterá o monitoramento do APM Server em si fluindo diretamente para o Elasticsearch.

Configurar o Elasticsearch

Mais uma etapa e estaremos prontos para iniciar o APM Server. O Elasticsearch precisa primeira saber como armazenar os dados do APM do jeito que a interface do usuário do APM espera, ou seja, precisa de um modelo de índice. Há duas opções para carregar esse modelo.

Se você puder apontar temporariamente um APM Server no Elasticsearch, isso poderá ser feito com este procedimento:

 apm-server setup --template

Caso contrário, primeiro exporte o modelo originário do APM Server:

apm-server export template > apm-6.4.2.tmpl.json

E carregue-o para o Elasticsearch. Com a função curl, isso pode ser feito assim:

curl -XPUT -H 'Content-Type: application/json' http://elasticsearch:9200/_template/apm-6.4.2 -d @apm-6.4.2.tmpl.json

Esses comandos devem relatar o sucesso ou a falha a cada operação. Para confirmar que o modelo foi carregado com êxito, consulte _template/apm-*. Isso deverá retornar um conjunto de documentos como:

{
  "apm-6.4.2": {
    "order": 1,
    "index_patterns": [
      "apm-6.4.2-*"
    ],
...

Observe que o padrão do índice coincide com aquele configurado anteriormente na etapa do Logstash. Além disso, observe que ele inclui as informações da versão, o que significa que essa etapa da configuração deve ser:

  1. Executado com a mesma versão do APM Server que se conecta ao Logstash.
  2. Repetido durante cada atualização do APM Server.

Usá-lo

Agora inicie o APM Server e comece a analisar o comportamento do aplicativo.

Mapas de origem

Os mapas de origem são usados para mapear código ofuscado de volta às fontes originais. Geralmente eles são usados para reverter Javascript minimizado.

Os mapas de origem exigem consideração especial quando a saída do APM Server não é o Elasticsearch. Independentemente de como por fim atinjam o Elasticsearch, eles devem ser armazenados para o APM Server usá-los. Para configurar o armazenamento do mapeamento de origens, defina rum.source_mapping.elasticsearch assim:

apm-server:
  rum:
    source_mapping:
      elasticsearch:
        hosts: ["elasticsearch:9200"]
        index_pattern: "apm-*-sourcemap*"

Isso instrui o APM Server a procurar mapas de origem em índices que coincidem com apm-*-sourcemap*.

Apesar de ser possível carregar os mapas de origem através do Logstash, recomendamos enviá-los diretamente ao Elasticsearch durante o processo de implementação para garantir que sejam armazenados antes que cheguem quaisquer eventos que exijam mapeamento. Se isso não for uma opção, a configuração do Logstash fornecida nesta postagem coincidirá com o padrão de índice usado para recuperar mapas de origem quando for o momento de aplicá-los, por isso nenhuma alteração adicional é necessária.

Introdução do Kafka no fluxo

O Kafka também pode servir para eventos de buffer com saída gerada do APM Server para entrega ao Elasticsearch. Uma configuração simples do APM Server com Kafka tem aparência semelhante a esta:

output.kafka:
  enabled: true
  hosts: ["kafka:9092"]
  topics:
    - default: 'apm'
      topic: 'apm-%{[context.service.name]}'

O uso de um tópico por serviço é demonstrado aqui, mas não é obrigatório. Opções de configuração adicionais estão descritas na documentação.

Depois que os eventos estiverem fluindo para o Kafka, o Logstash poderá ser configurado para encaminhá-los ao Elasticsearch. Por exemplo:

input {
  kafka {
    id => "apm-server-kafka"
    bootstrap_servers => ["kafka:9092"]
    topics_pattern => "apm.*"
    codec => "json"
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "apm-%{[beat][version]}-%{[processor][event]}-%{+YYYY.MM.dd}"
  }
}

Volto a lembrar, um índice será criado por dia por tipo de evento — transaction, span, etc — assim como a configuração padrão do APM Server geraria. Mais opções para os plugins de entrada do Logstash Kafka estão descritas na documentação.

Faça uma tentativa

O APM Server oferece alguma flexibilidade para enviar dados do APM usando Logstash ou Kafka. Faça uma tentativa e deixe seus comentários no nosso fórum de discussão. Também estamos sempre abertos a contribuições, então confira o código-fonte e abra uma questão ou faça uma solicitação.