Centralizando la Observabilidad con OpenTelemetry Collector
Una arquitectura de microservicios distribuida puede ser increíblemente potente, pero también increíblemente difícil de depurar y monitorizar si no tenemos visibilidad de lo que ocurre en su interior. La observabilidad —la capacidad de entender el estado interno de un sistema a partir de sus salidas externas— no es un lujo, es una necesidad.
Para lograrla, nos apoyaremos en OpenTelemetry (OTel), el estándar de código abierto para la instrumentación y recolección de datos de telemetría (métricas, trazas y logs). En este tutorial, desplegaremos el OpenTelemetry Collector, que actuará como un “agente” centralizado en nuestro clúster.
OTel Collector Contrib vs. Grafana Alloy
Section titled “OTel Collector Contrib vs. Grafana Alloy”Antes de empezar, es importante conocer las herramientas. Desplegaremos la distribución contrib
del OTel Collector, pero otra opción popular, especialmente en el ecosistema de Grafana, es Grafana Alloy. Ambas son válidas, pero tienen diferencias clave.
Característica | OpenTelemetry Collector (Contrib) | Grafana Alloy |
---|---|---|
Origen y Gobernanza | Proyecto de la CNCF, neutral en cuanto a proveedores. | Proyecto de Grafana Labs, optimizado para el ecosistema Grafana. |
Ecosistema | Enorme. La versión contrib incluye docenas de receptores y exportadores para casi cualquier tecnología. | Más enfocado. Excelente integración con Grafana (Loki, Mimir, Tempo, Pyroscope) pero menos opciones para otros proveedores. |
Curva de Aprendizaje | Baja si ya conoces YAML. La complejidad está en conocer los componentes. | Moderada. |
Nuestra Elección | OTel Collector Contrib. Lo elegimos por su neutralidad y el vasto ecosistema de componentes, lo que nos da la máxima flexibilidad. | Una excelente alternativa si estás 100% comprometido con el stack de Grafana y te gusta la potencia del lenguaje River. |
Para más información, puedes consultar la documentación oficial de OTel y de Grafana Cloud.
Parte 1: Obteniendo la Configuración desde Grafana Cloud
Section titled “Parte 1: Obteniendo la Configuración desde Grafana Cloud”-
Añadir una Nueva Conexión Iniciamos sesión en nuestra cuenta de Grafana Cloud y, en el menú de la izquierda, vamos a
Connections > Add new connection
. -
Seleccionar el OpenTelemetry Collector En el buscador, escribimos “otel” y seleccionamos la integración “OpenTelemetry Collector”.
-
Generar un Token de Acceso Grafana necesita un token para autenticar los datos que nuestro Collector le enviará. Le damos un nombre a nuestro token (ej.
vm-k8s-otel
) y hacemos clic en “Create token”. -
Obtener la Configuración Base ¡Magia! Grafana nos genera automáticamente una configuración
values.yaml
completa y pre-rellenada con nuestro endpoint y credenciales. Hacemos clic en “Copy to clipboard” para copiar toda esta configuración.
Parte 2: Desplegando el Collector en Kubernetes
Section titled “Parte 2: Desplegando el Collector en Kubernetes”-
Adaptar el Archivo
values.yaml
Pegamos la configuración copiada en un nuevo archivovalues.yaml
. La configuración de Grafana es un excelente punto de partida, pero está pensada para su propio chart. La adaptaremos ligeramente para que sea compatible con el chart oficial de OTel Collector Contrib. En nuestro caso, la configuración final se ve así:values.yaml config:extensions:health_check: {}basicauth/grafana_cloud:# https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/basicauthextensionclient_auth:username: "308297"password: "glc_..." # Tu token de Grafana Cloudreceivers:jaeger: nullotlp: {}# https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver/otlpreceiver# protocols:# grpc:# http:hostmetrics:# Optional. Host Metrics Receiver added as an example of Infra Monitoring capabilities of the OpenTelemetry Collector# https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/hostmetricsreceiverscrapers:load:memory:processors:batch: {}# https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/batchprocessorresourcedetection:# Enriches telemetry data with resource information from the host# https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/resourcedetectionprocessordetectors: ["env", "system"]override: falsetransform/drop_unneeded_resource_attributes:# https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/transformprocessorerror_mode: ignoretrace_statements:- context: resourcestatements:- delete_key(attributes, "k8s.pod.start_time")- delete_key(attributes, "os.description")- delete_key(attributes, "os.type")- delete_key(attributes, "process.command_args")- delete_key(attributes, "process.executable.path")- delete_key(attributes, "process.pid")- delete_key(attributes, "process.runtime.description")- delete_key(attributes, "process.runtime.name")- delete_key(attributes, "process.runtime.version")metric_statements:- context: resourcestatements:- delete_key(attributes, "k8s.pod.start_time")- delete_key(attributes, "os.description")- delete_key(attributes, "os.type")- delete_key(attributes, "process.command_args")- delete_key(attributes, "process.executable.path")- delete_key(attributes, "process.pid")- delete_key(attributes, "process.runtime.description")- delete_key(attributes, "process.runtime.name")- delete_key(attributes, "process.runtime.version")log_statements:- context: resourcestatements:- delete_key(attributes, "k8s.pod.start_time")- delete_key(attributes, "os.description")- delete_key(attributes, "os.type")- delete_key(attributes, "process.command_args")- delete_key(attributes, "process.executable.path")- delete_key(attributes, "process.pid")- delete_key(attributes, "process.runtime.description")- delete_key(attributes, "process.runtime.name")- delete_key(attributes, "process.runtime.version")transform/add_resource_attributes_as_metric_attributes:# https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/transformprocessorerror_mode: ignoremetric_statements:- context: datapointstatements:- set(attributes["deployment.environment"], resource.attributes["deployment.environment"])- set(attributes["service.version"], resource.attributes["service.version"])exporters:otlphttp/grafana_cloud:# https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/otlpexporterendpoint: "https://otlp-gateway-prod-us-central-0.grafana.net/otlp"auth:authenticator: basicauth/grafana_cloudservice:extensions: [basicauth/grafana_cloud, health_check]pipelines:traces:receivers: [otlp]processors: [resourcedetection, transform/drop_unneeded_resource_attributes, batch]exporters: [otlphttp/grafana_cloud]metrics:receivers: [otlp, hostmetrics]processors: [resourcedetection, transform/drop_unneeded_resource_attributes, transform/add_resource_attributes_as_metric_attributes, batch]exporters: [otlphttp/grafana_cloud]logs:receivers: [otlp]processors: [resourcedetection, transform/drop_unneeded_resource_attributes, batch]exporters: [otlphttp/grafana_cloud] -
Desplegar el Collector con Helm Ahora, instalamos el OTel Collector usando su chart oficial y pasándole nuestro archivo de configuración.
Terminal window helm install inventory opentelemetry/opentelemetry-collector `-f .\values.yaml `--namespace otel-collector `--create-namespace `--set image.repository="otel/opentelemetry-collector-k8s" `--set mode="deployment"--set image.repository
: Especificamos que queremos usar la imagencontrib-k8s
, que incluye más componentes.--set mode="deployment"
: Desplegamos el collector como unDeployment
centralizado en lugar de unDaemonSet
(que correría en cada nodo).
-
Verificar el Despliegue en Lens
- En “Helm > Releases”, vemos nuestra nueva release
inventory
en el namespaceotel-collector
. - En “Workloads > Pods”, encontramos nuestros dos pods del collector corriendo.
- Paso crucial: En “Network > Services”, localizamos el servicio
inventory-opentelemetry-collector
. Este servicio de tipoClusterIP
expone los puertos (4317
para gRPC,4318
para HTTP) a los que nuestros microservicios enviarán sus datos. Este es el endpoint que usaremos para configurar nuestros microservicios más adelante.
- En “Helm > Releases”, vemos nuestra nueva release
Conclusión
Section titled “Conclusión”¡Has desplegado con éxito el pilar de tu estrategia de observabilidad! Ahora tienes un OTel Collector centralizado, configurado para recibir datos de telemetría de tus aplicaciones y enviarlos de forma segura a Grafana Cloud.
Hemos construido una “tubería” de datos robusta y flexible. En los próximos artículos, cuando despleguemos los microservicios del ecosistema CodeDesignPlus, simplemente los configuraremos para que apunten a inventory-opentelemetry-collector.otel-collector.svc.cluster.local:4317
, y toda su telemetría comenzará a fluir automáticamente hacia Grafana, dándonos una visibilidad sin precedentes de nuestra aplicación.