Ingeniería

Cómo enviar datos a través de Logstash o Kafka desde APM de Elastic

En las implementaciones modernas, los servidores de aplicaciones a menudo tienen una vida útil reducida o usan hardware menos confiable (MV o instancias más accesibles predecibles o de baja prioridad) que otros componentes, como las colas de mensajes y las bases de datos. En esos casos, la mejor opción es extraer rápidamente los datos a un sistema más confiable.

A partir de la versión 6.4.0, el servidor de APM puede enviar datos a Logstash o Kafka y descargar los requisitos de confiabilidad a uno de esos sistemas. El uso de Logstash también presenta una oportunidad para enriquecer los datos de APM empleando uno de los numerosos plugins disponibles de Logstash.

Veremos la configuración y revisión de algunas advertencias al enviar datos a través de otro sistema antes de la ingesta en Elasticsearch.

  1. Configurar Logstash para la salida hacia Elasticsearch
  2. Configurar el servidor de APM de Elastic para el envío a Logstash
  3. Configurar Elasticsearch
  4. Incluir mapas de origen de forma opcional
  5. Introducir Kafka

Configurar Logstash

Primero, agreguen una pipeline a fin de configurar Logstash para recibir eventos del servidor de APM, usando el protocolo beats/lumberjack, y envíenlos a Elasticsearch.

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

Se crea un índice por día y por tipo de evento (transacción, intervalo, etc.), tal como se generaría a través de la configuración predeterminada del servidor de APM Server. Los mapas de origen introducen un inconveniente que abordaremos más adelante en este blog.

Quienes miren de cerca posiblemente se pregunten de qué se tratan las referencias a beat. El servidor de APM está hecho a partir del marco de Beats y, como tal, pasa los mismos metadatos en eventos. Esto significa que es posible manejar datos de APM en la misma instancia de Logstash que la de otros datos de Beat usando un condicional en [@metadata][beat] == "apm-server".

Configurar el servidor de APM

Ahora que Logstash está configurado, actualicen el archivo apm-server.yml del servidor de APM para que produzca eventos de manera correspondiente:

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

En la documentación del servidor de APM de Elastic, se muestran en detalle otras opciones, como los ajustes de interrupción, proxy y SSL.

Si habilitaron el monitoreo en el servidor de APM, asegúrense de configurar lo siguiente:

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

Esto hará que el monitoreo del servidor de APM se transmita directamente a Elasticsearch.

Configurar Elasticsearch

Con un paso más estaremos listos para iniciar el servidor de APM. Elasticsearch primero debe saber cómo almacenar los datos de APM como lo espera la UI de APM; necesita una plantilla de índice. Hay dos opciones para cargar esta plantilla.

Si pueden apuntar transitoriamente un servidor de APM a Elasticsearch, esto se puede hacer con lo siguiente:

 apm-server setup --template

De lo contrario, exporten primero la plantilla desde Server:

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

Luego cárguenla en Elasticsearch. Usando curl, esto se puede hacer con lo siguiente:

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

Estos comandos deben reportar resoluciones correctas o erróneas con cada operación. Para confirmar que la plantilla se cargó correctamente, busquen _template/apm-*. Con esto debería mostrarse un conjunto de documentos como el siguiente:

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

Tengan en cuenta que el patrón de índice coincide con el que se configuró en el paso de Logstash. A su vez, observen que incluye información sobre la versión. Eso significa que este paso de configuración debería:

  1. Realizarse exactamente con la misma versión de APM Server que se conecte a Logstash.
  2. Repetirse durante cada actualización del servidor de APM.

Úsenlo

Ahora inicien el servidor de APM y comiencen a analizar el comportamiento de sus aplicaciones.

Mapas de origen

Los mapas de origen se usan para volver a mapear código ofuscado a las fuentes originales. Con mayor frecuencia, se observa su uso para revertir Javascript minimizado.

Los mapas de origen requieren consideración especial cuando la salida del servidor de APM no es Elasticsearch. Independientemente de cómo lleguen finalmente a Elasticsearch, deben almacenarse allí para que el servidor de APM los use. Para configurar el almacenamiento de mapeo de origen, configuren rum.source_mapping.elasticsearch. Ejemplo:

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

Esto indica al servidor de APM que debe buscar mapas de origen en índices que coincidan con apm-*-sourcemap*.

Si bien es posible cargar mapas de origen a través de Logstash, les recomendamos enviarlos directamente a Elasticsearch durante sus procesos de desarrollo para garantizar que se almacenen antes de la llegada de cualquier evento que deba mapearse. Si esta opción no está disponible, la configuración de Logstash proporcionada en este blog coincide con el patrón de índice predeterminado que se usa para recuperar mapas de origen cuando llega el momento de aplicarlos, por lo que no se necesitan cambios adicionales.

Introducción de Kafka en el flujo

Kafka también puede servir para almacenar en búfer la salida de eventos del servidor de APM para la entrega a Elasticsearch. Una configuración simple del servidor de APM con Kafka tiene el siguiente aspecto:

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

Aquí se muestra, aunque no es obligatorio, el uso de un tema por servicio. En la documentación se describen opciones de configuración adicionales.

Una vez que los eventos ingresan en Kafka, se puede configurar Logstash para que los introduzca en Elasticsearch. Por ejemplo:

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}"
  }
}

Una vez más, se crea un índice por día y por tipo de evento (transacción, intervalo, etc.), tal como se generaría a través de la configuración predeterminada del servidor de APM. Se describen más opciones para el plugin de entrada Kafka de Logstash en la documentación.

Pruébenlo

El servidor de APM ofrece flexibilidad para enviar datos de APM usando Logstash o Kafka. Pruébenlo y dejen sus comentarios en nuestro foro de debate. También aceptamos aportes en todo momento. No duden en ver el código fuente y abrir una consulta o solicitud de incorporación de cambios.