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.
$ 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
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
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
Elimine el recurso Telemetry:
$ kubectl delete telemetry otel-demo
Elimine cualquier proceso
istioctl
que aún pueda estar ejecutándose usando control-C o:$ killall istioctl
Desinstale el OpenTelemetry Collector:
$ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability $ kubectl delete namespace observability
Si no planea explorar ninguna tarea de seguimiento, consulte las instrucciones de limpieza de Bookinfo para apagar la application.