OpenTelemetry

OpenTelemetry (OTel) es un framework de observabilidad de código abierto y neutral para el proveedor para instrumentar, generar, recopilar y exportar datos de telemetría. Las trazas del OpenTelemetry Protocol (OTLP) se pueden enviar a Jaeger, así como a muchos servicios comerciales.

Para aprender cómo Istio maneja el trazado, visite la descripción general de esta tarea.

Después de completar esta tarea, comprenderá cómo hacer que su application participe en el trazado con OpenTelemetry, independientemente del lenguaje, framework o plataforma que utilice para construir su application.

Esta tarea utiliza la muestra Bookinfo como la application de ejemplo y el OpenTelemetry Collector como el receptor de las trazas. Para ver un ejemplo de cómo enviar trazas directamente a un backend compatible con OTLP, consulte la tarea de Jaeger.

Desplegar el OpenTelemetry Collector

Crea un namespace para el Recopilador de OpenTelemetry:

$ kubectl create namespace observability

Despliega el Recopilador de OpenTelemetry. Puedes usar esta configuración de ejemplo como punto de partida.

Zip
$ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n observability

Instalación

Todas las opciones de trazado se pueden configurar globalmente a través de MeshConfig. Para simplificar la configuración, se recomienda crear un único fichero YAML que pueda pasar al comando istioctl install -f.

Elegir el exportador

Istio se puede configurar para exportar trazas del OpenTelemetry Protocol (OTLP) a través de gRPC o HTTP. Solo se puede configurar un exportador a la vez (ya sea gRPC o HTTP).

Exportar a través de gRPC

En este ejemplo, las trazas se exportarán a través de OTLP/gRPC al OpenTelemetry Collector. El ejemplo también habilita el detector de recursos de entorno. El detector de entorno agrega atributos de la variable de entorno OTEL_RESOURCE_ATTRIBUTES al recurso OpenTelemetry exportado.

$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    enableTracing: true
    extensionProviders:
    - name: otel-tracing
      opentelemetry:
        port: 4317
        service: opentelemetry-collector.observability.svc.cluster.local
        resource_detectors:
          environment: {}
EOF

Exportar a través de HTTP

En este ejemplo, las trazas se exportarán a través de OTLP/HTTP al OpenTelemetry Collector. El ejemplo también habilita el detector de recursos de entorno. El detector de entorno agrega atributos de la variable de entorno OTEL_RESOURCE_ATTRIBUTES al recurso OpenTelemetry exportado.

$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    enableTracing: true
    extensionProviders:
    - name: otel-tracing
      opentelemetry:
        port: 4318
        service: opentelemetry-collector.observability.svc.cluster.local
        http:
          path: "/v1/traces"
          timeout: 5s
          headers:
            - name: "custom-header"
              value: "custom value"
        resource_detectors:
          environment: {}
EOF

Habilitar el trazado para la malla a través de la API de Telemetría

Habilite el trazado aplicando la siguiente configuración:

$ kubectl apply -f - <<EOF
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: otel-demo
spec:
  tracing:
  - providers:
    - name: otel-tracing
    randomSamplingPercentage: 100
    customTags:
      "my-attribute":
        literal:
          value: "default-value"
EOF

Desplegar la Application Bookinfo

Despliegue la application de ejemplo Bookinfo.

Generar trazas usando la muestra de Bookinfo

  1. Cuando la application Bookinfo esté en funcionamiento, acceda a http://$GATEWAY_URL/productpage una o más veces para generar información de traza.

    Para ver los datos de seguimiento, debes enviar solicitudes a tu servicio. El número de solicitudes depende de la tasa de muestreo de Istio y se puede configurar mediante la API de Telemetría. Con la tasa de muestreo predeterminada del 1%, debes enviar al menos 100 solicitudes antes de que el primer seguimiento sea visible. Para enviar 100 solicitudes al servicio productpage, usa el siguiente comando:

    $ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
  2. El OpenTelemetry Collector utilizado en el ejemplo está configurado para exportar trazas a la consola. Si utilizó la configuración del Collector de ejemplo, puede verificar que las trazas están llegando mirando los registros del Collector. Debería contener algo como:

    Resource SchemaURL:
    Resource labels:
          -> service.name: STRING(productpage.default)
    ScopeSpans #0
    ScopeSpans SchemaURL:
    InstrumentationScope
    Span #0
        Trace ID       : 79fb7b59c1c3a518750a5d6dad7cd2d1
        Parent ID      : 0cf792b061f0ad51
        ID             : 2dff26f3b4d6d20f
        Name           : egress reviews:9080
        Kind           : SPAN_KIND_CLIENT
        Start time     : 2024-01-30 15:57:58.588041 +0000 UTC
        End time       : 2024-01-30 15:57:59.451116 +0000 UTC
        Status code    : STATUS_CODE_UNSET
        Status message :
    Attributes:
          -> node_id: STRING(sidecar~10.244.0.8~productpage-v1-564d4686f-t6s4m.default~default.svc.cluster.local)
          -> zone: STRING()
          -> guid:x-request-id: STRING(da543297-0dd6-998b-bd29-fdb184134c8c)
          -> http.url: STRING(http://reviews:9080/reviews/0)
          -> http.method: STRING(GET)
          -> downstream_cluster: STRING(-)
          -> user_agent: STRING(curl/7.74.0)
          -> http.protocol: STRING(HTTP/1.1)
          -> peer.address: STRING(10.244.0.8)
          -> request_size: STRING(0)
          -> response_size: STRING(441)
          -> component: STRING(proxy)
          -> upstream_cluster: STRING(outbound|9080||reviews.default.svc.cluster.local)
          -> upstream_cluster.name: STRING(outbound|9080||reviews.default.svc.cluster.local)
          -> http.status_code: STRING(200)
          -> response_flags: STRING(-)
          -> istio.namespace: STRING(default)
          -> istio.canonical_service: STRING(productpage)
          -> istio.mesh_id: STRING(cluster.local)
          -> istio.canonical_revision: STRING(v1)
          -> istio.cluster_id: STRING(Kubernetes)
          -> my-attribute: STRING(default-value)

Limpieza

  1. Elimine el recurso Telemetry:

    $ kubectl delete telemetry otel-demo
  2. Elimine cualquier proceso istioctl que aún pueda estar ejecutándose usando control-C o:

    $ killall istioctl
  3. Desinstale el OpenTelemetry Collector:

    Zip
    $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability
    $ kubectl delete namespace observability
  4. Si no planea explorar ninguna tarea de seguimiento, consulte las instrucciones de limpieza de Bookinfo para apagar la application.

¿Fue útil esta información?
¿Tienes alguna sugerencia para mejorar?

¡Gracias por tus comentarios!