Skip to content

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.

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ísticaOpenTelemetry Collector (Contrib)Grafana Alloy
Origen y GobernanzaProyecto de la CNCF, neutral en cuanto a proveedores.Proyecto de Grafana Labs, optimizado para el ecosistema Grafana.
EcosistemaEnorme. 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 AprendizajeBaja si ya conoces YAML. La complejidad está en conocer los componentes.Moderada.
Nuestra ElecciónOTel 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”
  1. 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.

    Añadiendo una nueva conexión en Grafana Cloud
  2. Seleccionar el OpenTelemetry Collector En el buscador, escribimos “otel” y seleccionamos la integración “OpenTelemetry Collector”.

    Seleccionando la integración de OpenTelemetry Collector
  3. 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”.

    Generando un Access Policy Token en Grafana Cloud
  4. 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.

    Configuración generada por Grafana Cloud y copiada al portapapeles

Parte 2: Desplegando el Collector en Kubernetes

Section titled “Parte 2: Desplegando el Collector en Kubernetes”
  1. Adaptar el Archivo values.yaml Pegamos la configuración copiada en un nuevo archivo values.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/basicauthextension
    client_auth:
    username: "308297"
    password: "glc_..." # Tu token de Grafana Cloud
    receivers:
    jaeger: null
    otlp: {}
    # 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/hostmetricsreceiver
    scrapers:
    load:
    memory:
    processors:
    batch: {}
    # https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/batchprocessor
    resourcedetection:
    # Enriches telemetry data with resource information from the host
    # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/resourcedetectionprocessor
    detectors: ["env", "system"]
    override: false
    transform/drop_unneeded_resource_attributes:
    # https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/transformprocessor
    error_mode: ignore
    trace_statements:
    - context: resource
    statements:
    - 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: resource
    statements:
    - 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: resource
    statements:
    - 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/transformprocessor
    error_mode: ignore
    metric_statements:
    - context: datapoint
    statements:
    - 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/otlpexporter
    endpoint: "https://otlp-gateway-prod-us-central-0.grafana.net/otlp"
    auth:
    authenticator: basicauth/grafana_cloud
    service:
    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]
  2. 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 imagen contrib-k8s, que incluye más componentes.
    • --set mode="deployment": Desplegamos el collector como un Deployment centralizado en lugar de un DaemonSet (que correría en cada nodo).
    Desplegando el OTel Collector con Helm
  3. Verificar el Despliegue en Lens

    • En “Helm > Releases”, vemos nuestra nueva release inventory en el namespace otel-collector. Verificando la release del OTel Collector en Lens
    • En “Workloads > Pods”, encontramos nuestros dos pods del collector corriendo. Verificando los pods del OTel Collector en Lens
    • Paso crucial: En “Network > Services”, localizamos el servicio inventory-opentelemetry-collector. Este servicio de tipo ClusterIP 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. Verificando el servicio ClusterIP del OTel Collector

¡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.