Monitorización de Kong con Prometheus, Elasticsearch y Grafana

Kong Enterprise incluye la funcionalidad Vitals que aporta métricas y gráficos de Kong, pero que no tenemos disponible en Kong Community. En su lugar, podemos utilizar Prometheus y Grafana, pudiendo importar de grafana.com Dashboards existentes de Kong, y habilitar en Kong la exportación de métricas a Prometheus mediante el Plugin de Prometheus. Pero además podemos exportar las peticiones y respuestas de las APIs que publicamos a través de Kong, enviándolas a Elasticsearch utilizando Logstash con el Plugin de Logs UDP, el de Logs TCP, o el de Logs HTTP (podemos elegir), para complementar así nuestra monitorización de Kong, y explotar estos Logs con Grafana o Kibana (API Analytics).

Continuando con la serie de Posts acerca de Kong, en esta ocasión vamos a ver cómo podemos monitorizar Kong, mediante el uso de Prometheus, Logstash, Elasticsearch y Grafana.

Si quieres seguir este Post paso a paso, te recomiendo que te apoyes en el Docker Compose que compartí en GitHub (GitHub – ElWillieES – kong-docker-lab) y que revises los anteriores Post, al menos el primero (Introducción a Kong Gateway y Kong Dashboard) que además de hacer una introducción a Kong, también explica el Docker Compose compartido en GitHub. Este Docker Compose ya viene con todo incluido: Kong, Konga, Elasticsearch, ElasticHQ, Logstash, Kibana, Prometheus, y Grafana (entre otras cosas), lo que te ayudará a que puedas probarlo todo, de una forma rápida y sencilla.

Introducción a la monitorización de Kong con Prometheus, Elasticsearch y Grafana

Kong Enterprise incluye la funcionalidad Vitals, que proporciona métricas y gráficos de la salud, rendimiento, y uso de Kong. En la versión Community podemos utilizar el Plugin de Prometheus y el Plugin de UDP Log (o bien el de TCP Log o el de HTTP Log), que junto con Prometheus, Elasticsearch y Grafana, nos permite conseguir un resultado algo similar.

Prometheus es una herramienta Open Source de monitorización que proporciona una base de datos de series temporales (TSDB) orientada a métricas, junto a su propio lenguaje de consulta (PromQL), que podemos utilizar como origen de datos para hacer nuestros propios Dashboards con Grafana, y además proporciona funciones de Alerta y Notificación. Grafana es una herramienta para construir Dashboards que también proporciona funciones de Alerta y Notificación. De hecho, Prometheus no proporciona una capa de visualización, debe utilizarse Grafana para este fin.

Prometheus utiliza Exporters, que son como agentes que exponen métricas a través de HTTP, de tal modo, que el servidor Prometheus se conecta a estos Exporter para leer sus métricas (Scrapping) e insertarlas en su base de datos TSDB. En el caso de Kong, el Plugin de Prometheus al activarlo, proporcionará el Exporter para Prometheus con métricas de Kong, para que podamos ingestar sus datos en Prometheus, una vez añadido a la configuración del servidor de Prometheus. Además podemos utilizar el Blackbox Exporter de Prometheus para monitorizar los orígenes HTTP que publicamos desde Kong, y así construir en Grafana un Dashboard más completo.

Por otro lado, Elasticsearch es un servicio de búsqueda Open Source, escalable, que actúa también como una base de datos NoSQL de series temporales (TSDB) y orientada a Documentos, donde podemos ingestar Logs y métricas para búsquedas y consultas, muy útil también para soluciones analíticas (de análisis de datos).

Podemos utilizar Logstash (también Open Source) como herramienta para crear y ejecutar procesos de ingesta (Pipelines), y así poder ingestar en Elasticsearch datos de diferentes orígenes. Además permite parsear, filtrar y transformar los datos al vuelo, y trabaja en equipo con FileBeat y MetricBeat, para el envío de ficheros y métricas a Logstash, y de ahí a Elasticsearch. Podemos utilizar el Plugin UDP Log de Kong para a través de Logstash importar en Elasticsearch los datos de peticiones y respuestas HTTP de Kong, que posteriormente podremos explotar desde Grafana o Kibana (ambos son también Open Source). También podemos utilizar el Plugin TCP Log de Kong o el Plugin HTTP Log de Kong (en lugar del UDP Log), ambos similares al anterior, y en todos los casos, con Postman ejecutar N veces una Colección con llamadas a nuestras APIs para generar tráfico y probarlo (más sencillo que jMeter y suficiente para este caso).

Prefiero Grafana en lugar de Kibana por ser una herramienta más abierta, que puede conectar con multitud de orígenes de datos, como Prometheus o Elasticsearch, y otros muchos más.

Con todo esto, podemos construir nuestra propia solución de API Analytics, de forma muy sencilla, y analizar cómo se consumen nuestras APIs, en base a nuestra necesidades, como podría ser:

  • API Performance
  • API Usage
  • API Errors

Suele denominarse ELK a aquella solución basada en Elasticsearch, Logstash, y Kibana. Igualmente suele denominarse ELG a aquella solución basada en Elasticsearch, Logstash, y Grafana. Ambas son soluciones Open Source que pueden utilizarse de forma gratuita (Free), existiendo versiones de pago con mayor funcionalidad y soporte.

Una de las ventajas de Grafana, es que ofrece una gran cantidad de Dashboards ya desarrollados y disponibles de forma gratuita en grafana.com, que podemos importar de forma rápida, y modificarlos con total libertad. De este modo, aunque tenemos la posibilidad de desarrollar nuestros propios Dashboards completamente desde cero, podemos ahorrarnos mucho esfuerzo, usando los Dashboards ya existentes, o bien partir de ellos para personalizarlos conforme a nuestras necesidades. Existen diferentes Dashboards de Kong, proporcionados tanto por Kong como por el resto de la Comunidad.

Hace tiempo hicimos una introducción a Grafana en la que explicábamos cómo realizar su instalación y configuración básica, del mismo modo que también hicimos una introducción a Prometheus explicando igualmente su instalación y configuración básica, que seguimos después complementando con varios Posts adicionales, en los que hablamos de diferentes Exporters, del Alert Manager, y del descubrimiento mediante file_sd y http_sd.

Dicho todo esto, vamos a ver cómo configurar la monitorización de Kong con Prometheus y Grafana, utilizando Konga, y partiendo del repo de GitHub (GitHub – ElWillieES – kong-docker-lab) que hemos usado en Posts anteriores, para después ver cómo utilizar Logstash, Elasticsearch, y Grafana para analizar los Logs de peticiones y respuestas de las APIs publicadas a través de Kong, mediante los Plugin UDP Log, TCP Log, y HTTP Log. Comenzamos.

En un entorno de alta carga, aunque nos interese configurar la monitorización, podemos mantenerla deshabilitada para minimizar el impacto en el servicio, y sólo activarla temporalmente para depurar incidencias, optimizando recursos.

Configuración de Kong con Prometheus y Grafana

Para habilitar en Kong la exportación de métricas a Prometheus, deberemos utilizar el Plugin de Prometheus. Para más información acerca de este Plugin: Kong – Plugin – Prometheus

A continuación vamos a añadir el Plugin de Prometheus a nivel global, utilizando Konga.

En la siguiente pantalla, click en Add Plugin para continuar.

Una vez añadido el Plugin podremos acceder a las métricas de Kong a través del puerto de adminitración de Kong (por defecto el tcp-8001), en /metrics, tal y como podemos ver en la siguiente pantalla.

En nuestro caso, la configuración de Prometheus del Docker Compose que utilizamos para este laboratorio, ya incluye la configuración para obtener las métricas de Kong, a través del Plugin que acabamos de configurar, por lo que no tendremos que hacer nada adicional. En otro caso, tendríamos que añadir dicha configuración (ver en la siguiente imagen) y reiniciar Prometheus.

Con el Plugin de Prometheus habilitado en Kong, y Prometheus configurado para obtener las métricas de Kong, podemos acceder a Prometheus y explorar las métricas que nos proporciona Kong. A continuación se muestra un ejemplo, con una métrica cualquiera. Sin embargo, las capacidades gráficas de Prometheus no dan para mucho, debe utilizarse Grafana para este fin (ej: construir Dashboards).

Hecho esto, vamos a acceder a Grafana. El Docker Compose que utilizamos para este laboratorio, ya incluye Grafana, por lo que podemos acceder y hacer login con el usuario que trae Grafana por defecto (admin/admin).

Lo primero que deberemos hacer en Grafana es añadir un Datasource.

La primera opción que nos propone Grafana, es justo Prometheus, la que necesitamos. La seleccionamos.

Deberemos especificar la URL de Prometheus. Hay más opciones que podríamos ajustar si queremos. Click Save & Test, y ya tendremos nuestro origen de datos configurado.

Lo siguiente que vamos a hacer es importar el Dashboard oficial de Kong en Grafana. Para ello, en Dashboards -> Manage, click en Import.

En la siguiente pantalla, especificaremos el ID del Dashboard que deseamos importar de grafana.com (en nuestro caso es el 7424), y click Load.

Seguidamente tendremos que especificar, al menos, cuál es el Datasource que deseamos utilizar para el Dashboard. Click import para continuar.

Y con esto ya tenemos nuestro Dashboard de Kong importado en Grafana.

A fecha de hoy, algunos de los paneles no muestran datos por defecto, porque el nombre de la métrica que referencian ha cambiado, y corrigiéndolo lo tendremos funcionando en unos minutos. Lo mismo ocurre con los desplegables de la parte superior del Dashboard que se utilizan para filtrar, será necesario revisar y corregir la consulta de alguno de ellos. Es fácil, y rápido.

A partir de aquí, podemos hacer lo queramos, desde probar a importar otros Dashboards de grafana.com (podemos buscarlos en su Web, e ir importando y probando), modificar el que ya tenemos para ajustarlo a nuestras necesidades, configurar Alertas y Notificaciones por el canal que deseemos (ej: Slack, Telegram, Teams, etc.), o cualqueir otra cosa.

Monitorización de peticiones y respuestas de Kong con Logstash y Elasticsearch con el Plugin UDP Log

Para habilitar en Kong el envío de datos de peticiones y respuestas a Elasticsearch a través de Logstash, podemos utilizar el Plugin de UDP Log, el de TCP Log, o el de HTTP Log. En este caso, vamos a realizar un ejemplo con el primero (UDP Log). Para más información acerca de estos Plugins: Kong – Plugin – UDP Log, Kong – Plugin – TCP Log, y Kong – Plugin – HTTP Log

Vamos a añadir el Plugin de UDP Log a nivel global, utilizando Konga, para enviar los datos de peticiones y respuestas a Logstash, en el puerto udp-5555.

Necesitaremos configurar un Pipeline de Logstash que escuche en dicho puerto (udp-5555), y envíe los datos a un índice de Elasticseach (un índice en Elasticsearch es equivalente a una tabla en una base de datos relacional como MySQL o PostgreSQL). En nuestro caso, utilizaremos un índice que llamaremos kong-request. A continuación se muestra una Pipeline de ejemplo. En el caso del Docker Compose de Kong que os compartí, ya incluye Logstash con esta Pipeline configurada, al igual que incluye Elasticsearch, Kibana y Grafana, por lo que no será necesario hacer nada. En caso contrario habría que provisionar esos servicios y quizás adaptar la pipeline de Logstash (ej: cambiar el Host de Elasticsearch por el que uséis). Elasticsearch es una base de datos NoSQL, por lo que no tendremos que crear el índice, al insertar el primer documento (o registro, como lo queramos llamar), si no existe el índice, lo crea de forma implícita. Super fácil.

input {
  udp {
    port => 5555
  }
}

# Kong log is on JSON format 
filter {
  json {
    source => "message"
    add_tag => ["kong"]
  }

  mutate {
     remove_field => [ "message" ]
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "kong-requests"
  }
}

Realizamos algunas peticiones a los servicios publicados a través de Kong, lo que producirá que se generen logs que se enviarán a Elasticseach a través del Pipeline de Logstash. Elasticsearch se gestiona totalmente mediante llamadas API Rest, tanto para realizar tareas de administración como para ejecutar consultas, etc. Así, por ejemplo, si deseamos consultar los documentos (registros) que tiene un índice (ej: el índice kong-requests), podríamos ejecutar un curl como siguiente.

curl -H 'Content-Type: application/json' -XGET 'http://127.0.0.1:9200/kong-requests/_search?pretty'

A continuación se muestra el resultado de ejecución del comando anterior.

Hacerlo así está bien, pero es un poco entretenido, todo sea dicho. Con una colección Postman te puedes facilitar la vida, pero sigue siendo un poco rollo. Por suerte, existen alternativas como el uso de ElasticHQ, una herramienta Open Source que permite administrar Elasticsearch de forma gráfica y sencilla, desde una Web. A continuación vamos a comprobar los registros que tenemos en Elasticsearch utilizando ElasticHQ, que también está incluido el Docker Compose de Kong que os compartí.

Lo siguiente es crear un Datasource en Grafana, para conectarnos a nuestro índice de Elasticsearch que tiene los datos de Kong (peticiones y respuestas HTTP), y poder navegar por nuestros datos, hacer un Dashboard, o lo que deseemos.

Hecho. Ahora podemos navegar por nuestros datos de Kong (de peticiones y respuestas), con la funcionalidad Explore de Grafana. Basta son seleccionar el Datasource y hacer los ajustes que deseemos (ej: intervalo temporal, métrica, etc)

Las posibilidades de Grafana explorando datos de Elasticsearch, son brutales, más las posibilidades que nos dan los Dashboard, el alertado, y las posibilidad de trabajar con diferentes orígenes de datos. Un detalle de todo lo que podemos hacer Grafana queda bastante del alcance de este Post, no obstante, os pongo abajo otro pantallazo, y os invito a jugar, a hacer un Split, a añadir varias consultas, jugar con los vuestros datos y los diferentes tipos de métricas, etc.

Si queremos generar datos de peticiones y respuestas HTTP para trastear con Elasticsearch y Grafana, podemos crearnos un Colección en Postman con algunas de las APIs que publicamos a través de Kong y ejecutarla.

Especificamos cuantas iteraciones deseamos ejecutar, y listo. No es lo mismo que jMeter, pero para este caso, más que suficiente.

Utilización del Plugin TCP Log

Si lo deseamos, podemos utilizar el Plugin TCP Log en lugar del UDP Log. La configuración es bastante similar, como se puede ver en el siguiente pantallazo de Konga.

Necesitaremos configurar un Pipeline de Logstash que escuche en el mismo puerto que espeficamos en el Plugin TCP Log (tcp-5555), y envíe los datos a un índice de Elasticseach (utilizaremos un índice diferente al que usamos en el ejemplo de UDP). A continuación se muestra una Pipeline de ejemplo. En el caso del Docker Compose de Kong que os compartí, también incluye Logstash con esta Pipeline configurada para el envío de datos a través de TCP, por lo que no será necesario hacer nada más.

input {
  tcp {
    port => 5555
  }
}

# Kong log is on JSON format 
filter {
  json {
    source => "message"
    add_tag => ["kong"]
  }

  mutate {
     remove_field => [ "message" ]
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "kong-requests-tcp"
  }
}

El resto sería igual que en el caso anterior del Plugin UDP Log (crear un Datasource de Elasticsearch en Grafana, generar tráfico de prueba, y explorar los datos).

Utilización del Plugin HTTP Log

También podemos utilizar el Plugin HTTP Log en lugar del UDP Log. La configuración es igualmente similar, como se puede ver en el siguiente pantallazo de Konga.

Necesitaremos configurar un Pipeline de Logstash que escuche en el mismo puerto que espeficamos en el Plugin HTTP Log (tcp-5556), y envíe los datos a un índice de Elasticseach (utilizaremos un índice diferente al que usamos en el ejemplo de UDP). A continuación se muestra una Pipeline de ejemplo. En el caso del Docker Compose de Kong que os compartí, también incluye Logstash con esta Pipeline configurada para el envío de datos a través de HTTP, por lo que no será necesario hacer nada más.

input {
  http {
    port => 5556
  }
}

# Kong log is on JSON format 
filter {
  json {
    source => "message"
    add_tag => ["kong"]
  }

  mutate {
     remove_field => [ "message" ]
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "kong-requests-http"
  }
}

Despedida y Cierre

Hasta aquí llega este Post sobre Kong, donde hemos podido ver cómo monitorizar Kong utilizando Prometheus y Grafana, importando el Dashboard oficial de Kong, y habilitando el Plugin de Prometheus a través de Konga, que junto con el envío de peticiones y respuestas HTTP a Elasticsearch con Logstash para su visualización en Grafana, resulta una alternativa a la funcionalidad Vitals que incluye Kong Enterprise, y que en la versión Community al no estar disponible tendremos que recurrir a soluciones como esta.

Además, para el seguimiento del laboratorio de este Posts, podemos utilizar el Docker Compose que os compartí en GitHub, y que incluye contenedores con Prometheus, Grafana, Logstash, Elasticsearch, Kibana, y ElasticHQ, todo listo para usar: GitHub – ElWillieES – kong-docker-lab

Poco más por hoy, como siempre confío que la lectura resulte de interés.