Ingeniería

Agregar Elastic APM gratuito y abierto como parte de tu despliegue de Elastic Observability

En un blog reciente, te mostramos cómo dar los primeros pasos con el nivel gratuito y abierto de Elastic Observability. A continuación, haremos un recorrido por lo que necesitas hacer para expandir tu despliegue a fin de comenzar a reunir métricas del monitoreo de rendimiento de aplicaciones (APM) o datos de "rastreo" en tu cluster de observabilidad, de forma gratuita.

¿Qué es APM?

El monitoreo de rendimiento de aplicaciones te permite ver dónde pasan tiempo tus aplicaciones, qué hacen, a qué otras aplicaciones o servicios llaman y qué errores o excepciones se encuentran.

distributed-trace.png

Además, APM también te permite ver el historial y las tendencias de los indicadores de rendimiento clave, como la latencia y el rendimiento, e información de transacciones y dependencias:

ruby-overview.png

Ya sea que estés configurando alertas para infracciones al SLA, intentando evaluar el impacto del lanzamiento más reciente o decidiendo dónde hacer la próxima mejora, APM puede ayudar en el análisis de causa raíz para mejorar la experiencia de los usuarios y llevar el tiempo promedio de resolución (MTTR) hacia cero.

Arquitectura lógica

Elastic APM depende de la integración con APM dentro de Elastic Agent, que reenvía los datos de métricas y rastro de aplicaciones desde las aplicaciones instrumentadas con agentes de APM hasta un cluster de Elastic Observability. Elastic APM brinda soporte a varios tipos de agentes:

  • Elastic APM Agents nativos, disponibles para varios idiomas, entre ellos, Java, .NET, Go, Ruby, Python, Node.js,  PHP y JavaScript del lado del cliente
  • Código instrumentado con OpenTelemetry
  • Código instrumentado con OpenTracing
  • Código instrumentado con Jaeger

En este blog, proporcionaremos un rápido ejemplo de cómo instrumentar código con el agente nativo Elastic APM Python, pero los pasos generales son similares en otros lenguajes.

Ten en cuenta que hay una gran diferencia entre Elastic APM Agent y Elastic Agent. Son componentes muy distintos, como puedes ver en el diagrama anterior, por lo que es importante no confundirlos.

Instalar Elastic Agent

El primer paso es instalar Elastic Agent. Necesitas instalar primero Fleet o puedes instalar Elastic Agent independiente. Instala Elastic Agent en alguna parte siguiendo esta guía. Esto te dará un endpoint de integración con APM que puedes lograr. Ten en cuenta que este paso no es necesario en Elastic Cloud, dado que nosotros hospedamos la integración con APM por ti. Ejecuta lo siguiente para comprobar que Elastic Agent esté activo:

curl <ELASTIC_AGENT_HOSTNAME>:8200

Instrumentación del código de muestra con un agente de Elastic APM

Las instrucciones para los distintos agentes de lenguajes varían según el lenguaje de programación, pero en un alto nivel tienen un flujo similar. Primero, agregas la dependencia del agente en la especificación nativa del lenguaje, luego configuras el agente para hacerle saber cómo encontrar la integración con APM.

Puedes probar el tipo que quieras, pero haremos el recorrido con las instrucciones de Python usando este ejemplo de Python que creamos.

Obtén el código de muestra (o usa el tuyo)

Para comenzar, clonamos el repositorio de GitHub y cambiamos el directorio:

git clone https://github.com/davidgeorgehope/PythonElasticAPMExample
cd PythonElasticAPMExample

Cómo agregar la dependencia

Agregar la dependencia de Elastic APM es simple; observa el archivo app.py del repositorio de GitHub y verás las líneas de código siguientes.

import elasticapm
from elasticapm import Client

app = Flask(__name__)
app.config["ELASTIC_APM"] = { "SERVICE_NAME": os.environ.get("APM_SERVICE_NAME", "flask-app"), "SECRET_TOKEN": os.environ.get("APM_SECRET_TOKEN", ""), "SERVER_URL": os.environ.get("APM_SERVER_URL", "http://localhost:8200"),}
elasticapm.instrumentation.control.instrument()
client = Client(app.config["ELASTIC_APM"])

La biblioteca de Python para Flask es capaz de detectar transacciones automáticamente, pero también puedes iniciar transacciones en el código conforme a lo siguiente, como hicimos en este ejemplo:

@app.route("/")
def hello():
client.begin_transaction('demo-transaction')
client.end_transaction('demo-transaction', 'success')

Configura el agente

Los agentes deben enviar los datos de rastreo de las aplicaciones a la integración con APM, y deben ser accesibles para poder hacerlo. Configuramos Elastic Agent para que escuche en la IP del host local, por lo que todo en la subred puede enviarle datos. Como puedes ver en el código a continuación, usamos docker-compose.yml para pasar la configuración a través de variables del entorno. Edita estas variables para adaptarlas a tu instalación de Elastic.

# docker-compose.yml
version: "3.9"
services:
flask_app:
build: .
ports:
- "5001:5001"
environment:
- PORT=5001
- APM_SERVICE_NAME=flask-app
- APM_SECRET_TOKEN=your_secret_token
- APM_SERVER_URL=http://host.docker.internal:8200

Algunos comentarios sobre lo anterior:

  • service_name: si no lo incluyes, el valor predeterminado será el nombre de la aplicación, pero aquí puedes anularlo.
  • secret_token: los tokens secretos te permiten autorizar solicitudes al servidor APM, pero es necesario que el servidor APM esté configurado con SSL/TLS y que se haya configurado un token secreto. No estamos usando HTTPS entre los agentes y el servidor APM, así que lo marcaremos como comentario.
  • server_url: así es como el agente puede llegar a la integración con APM dentro de Elastic Agent. Reemplaza esto con el nombre o la IP de tu host que ejecuta Elastic Agent.

Ahora que está lista la parte de Elastic APM de la configuración, simplemente seguimos los pasos de README para comenzar.

docker-compose up --build -d

El paso de compilación llevará varios minutos.

Puedes navegar a la aplicación de muestra en ejecución visitando http://localhost:5001. La muestra no es muy compleja, pero genera algunos datos de APM. Para generar un poco de carga, puedes volver a cargarlos un par de veces o ejecutar un breve script:

#!/bin/bash
# load_test.sh
url="http://localhost:5001"
for i in {1..1000}
do
curl -s -o /dev/null $url
sleep 1
done

Esto volverá a cargar las páginas a cada segundo.

De regreso en Kibana, vuelve a la app de APM (ícono de hamburguesa, luego selecciona APM) y deberías ver nuestro nuevo servicio flask-app (dejamos ejecutar este para mostrar un poco más de historial):

En la página Service Overview (Visión general de servicios) se proporciona un resumen rápido del estado de un servicio en un lugar. Si eres un desarrollador o un SRE, esta es la página que te ayudará a responder preguntas como las siguientes: 

  • ¿Cómo afectó un despliegue nuevo el rendimiento?
  • ¿Cuáles son las transacciones más afectadas?
  • ¿Cómo se correlaciona el rendimiento con la infraestructura subyacente?

Esta vista proporciona una lista de todas las aplicaciones que han enviado datos de rastreo de aplicaciones a Elastic APM en el período especificado (en este caso, los últimos 15 minutos). También hay minigráficos de latencia, rendimiento y tasa de errores. Al hacer clic en flask-app, nos dirigimos a la página service overview (visión general de servicios), que muestra las diversas transacciones del servicio (recuerda que mi script está llegando al endpoint /, como se ve en la sección Transactions [Transacciones]). Vemos gráficos más grandes de Latency (Latencia), Throughput (Rendimiento), Errors (Errores) y Error Rates (Tasas de errores).

Cuando estés instrumentando aplicaciones reales, con carga real, verás mucha más conectividad (y también errores).

Al hacer clic en una transacción dentro de la vista de transacciones, en este caso, la transacción demo-transaction de nuestra app de muestra, podemos ver exactamente qué operaciones se llamaron:

Esto incluye información detallada sobre las llamadas a servicios externos, como búsquedas de bases de datos:

¿Qué sigue?

Ahora que tienes el cluster de Elastic Observability en funcionamiento y recopilando datos de rastreo de aplicaciones listas para usar, explora las API públicas de los lenguajes que usan tus aplicaciones, lo cual te permitirá llevar tus datos de APM al siguiente nivel. Las API te permiten agregar metadatos personalizados, definir transacciones comerciales, crear intervalos personalizados y más. Puedes encontrar las especificaciones de API públicas de los distintos agentes APM (como Java, Ruby, Python y más) en las páginas de documentación de los agentes APM. 

Si quieres obtener más información sobre Elastic APM, echa un vistazo a nuestro webinar sobre Elastic APM en el cambio a la opción nativa del cloud para conocer de qué otras formas te puede ayudar Elastic APM en tu ecosistema.

Si decides que prefieres que nosotros hospedemos tu cluster de observabilidad, puedes registrarte para una prueba gratuita de Elasticsearch Service en Elastic Cloud y cambiar tus agentes para que apunten al cluster nuevo.

Publicado originalmente el 5 de mayo de 2021; actualizado el 6 de abril de 2023.