OpenTelemetry
Los proxies de Envoy se pueden configurar para exportar sus registros de acceso en formato OpenTelemetry.
En este ejemplo, los proxies envían registros de acceso a un colector de OpenTelemetry, que está configurado para imprimir los registros en la salida estándar.
Se puede acceder a la salida estándar del colector de OpenTelemetry mediante el comando kubectl logs
.
Antes de empezar
Configura Istio siguiendo las instrucciones de la Guía de instalación.
Despliega la aplicación de ejemplo curl para usarla como fuente de prueba para enviar solicitudes. Si tienes habilitada la inyección automática de sidecar , ejecuta el siguiente comando para desplegar la aplicación de ejemplo:
$ kubectl apply -f @samples/curl/curl.yaml@
De lo contrario, inyecta manualmente el sidecar antes de desplegar la aplicación
curl
con el siguiente comando:$ kubectl apply -f <(istioctl kube-inject -f @samples/curl/curl.yaml@)
Establece la variable de entorno
SOURCE_POD
con el nombre de tu pod de origen:$ export SOURCE_POD=$(kubectl get pod -l app=curl -o jsonpath={.items..metadata.name})
Inicia el ejemplo httpbin.
Si has habilitado la inyección automática de sidecar, despliega el servicio
httpbin
:$ kubectl apply -f @samples/httpbin/httpbin.yaml@
De lo contrario, tienes que inyectar manualmente el sidecar antes de desplegar la aplicación
httpbin
:$ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@)
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
Habilitar el registro de acceso de Envoy
Para habilitar el registro de acceso, use la API de Telemetría.
Edite MeshConfig
para agregar un proveedor de OpenTelemetry, llamado otel
. Esto implica agregar una estrofa de proveedor de extensión:
extensionProviders:
- name: otel
envoyOtelAls:
service: opentelemetry-collector.observability.svc.cluster.local
port: 4317
La configuración final debería verse algo así:
apiVersion: v1
kind: ConfigMap
metadata:
name: istio
namespace: istio-system
data:
mesh: |-
accessLogFile: /dev/stdout
defaultConfig:
discoveryAddress: istiod.istio-system.svc:15012
proxyMetadata: {}
tracing:
zipkin:
address: zipkin.istio-system:9411
enablePrometheusMerge: true
extensionProviders:
- name: otel
envoyOtelAls:
service: opentelemetry-collector.observability.svc.cluster.local
port: 4317
rootNamespace: istio-system
trustDomain: cluster.local
meshNetworks: 'networks: {}'
Luego, agregue un recurso Telemetry que le diga a Istio que envíe registros de acceso al colector de OpenTelemetry.
$ cat <<EOF | kubectl apply -n default -f -
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: curl-logging
spec:
selector:
matchLabels:
app: curl
accessLogging:
- providers:
- name: otel
EOF
El ejemplo anterior utiliza el proveedor de registro de acceso otel
, y no configuramos nada más que la configuración predeterminada.
Una configuración similar también se puede aplicar a un namespace individual, o a un workload individual, para controlar el registro a un nivel granular.
Para obtener más información sobre el uso de la API de Telemetría, consulte la descripción general de la API de Telemetría.
Usando Mesh Config
Si utilizó una configuración de IstioOperator
para instalar Istio, agregue el siguiente campo a su configuración:
spec:
meshConfig:
accessLogFile: /dev/stdout
extensionProviders:
- name: otel
envoyOtelAls:
service: opentelemetry-collector.observability.svc.cluster.local
port: 4317
defaultProviders:
accessLogging:
- envoy
- otel
De lo contrario, agregue la configuración equivalente a su comando istioctl install
original, por ejemplo:
$ istioctl install -f <your-istio-operator-config-file>
Formato de registro de acceso predeterminado
Istio utilizará el siguiente formato de registro de acceso predeterminado si no se especifica accessLogFormat
:
[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %RESPONSE_CODE_DETAILS% %CONNECTION_TERMINATION_DETAILS%
\"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\"
\"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME% %ROUTE_NAME%\n
La siguiente tabla muestra un ejemplo utilizando el formato de registro de acceso predeterminado para una solicitud enviada desde curl
a httpbin
:
Operador de registro | registro de acceso en curl | registro de acceso en httpbin |
---|---|---|
[%START_TIME%] | [2020-11-25T21:26:18.409Z] | [2020-11-25T21:26:18.409Z] |
\"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" | "GET /status/418 HTTP/1.1" | "GET /status/418 HTTP/1.1" |
%RESPONSE_CODE% | 418 | 418 |
%RESPONSE_FLAGS% | - | - |
%RESPONSE_CODE_DETAILS% | via_upstream | via_upstream |
%CONNECTION_TERMINATION_DETAILS% | - | - |
\"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" | "-" | "-" |
%BYTES_RECEIVED% | 0 | 0 |
%BYTES_SENT% | 135 | 135 |
%DURATION% | 4 | 3 |
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% | 4 | 1 |
\"%REQ(X-FORWARDED-FOR)%\" | "-" | "-" |
\"%REQ(USER-AGENT)%\" | "curl/7.73.0-DEV" | "curl/7.73.0-DEV" |
\"%REQ(X-REQUEST-ID)%\" | "84961386-6d84-929d-98bd-c5aee93b5c88" | "84961386-6d84-929d-98bd-c5aee93b5c88" |
\"%REQ(:AUTHORITY)%\" | "httpbin:8000" | "httpbin:8000" |
\"%UPSTREAM_HOST%\" | "10.44.1.27:80" | "127.0.0.1:80" |
%UPSTREAM_CLUSTER% | outbound|8000||httpbin.foo.svc.cluster.local | inbound|8000|| |
%UPSTREAM_LOCAL_ADDRESS% | 10.44.1.23:37652 | 127.0.0.1:41854 |
%DOWNSTREAM_LOCAL_ADDRESS% | 10.0.45.184:8000 | 10.44.1.27:80 |
%DOWNSTREAM_REMOTE_ADDRESS% | 10.44.1.23:46520 | 10.44.1.23:37652 |
%REQUESTED_SERVER_NAME% | - | outbound_.8000_._.httpbin.foo.svc.cluster.local |
%ROUTE_NAME% | default | default |
Probar el registro de acceso
Envíe una solicitud de
curl
ahttpbin
:$ kubectl exec "$SOURCE_POD" -c curl -- curl -sS -v httpbin:8000/status/418 ... < HTTP/1.1 418 Unknown ... < server: envoy ... I'm a teapot! ...
Verifique el registro de
otel-collector
:$ kubectl logs -l app=opentelemetry-collector -n observability [2020-11-25T21:26:18.409Z] "GET /status/418 HTTP/1.1" 418 - via_upstream - "-" 0 135 3 1 "-" "curl/7.73.0-DEV" "84961386-6d84-929d-98bd-c5aee93b5c88" "httpbin:8000" "127.0.0.1:80" inbound|8000|| 127.0.0.1:41854 10.44.1.27:80 10.44.1.23:37652 outbound_.8000_._.httpbin.foo.svc.cluster.local default
Tenga en cuenta que los mensajes correspondientes a la solicitud aparecen en los registros de los proxies de Istio tanto del origen como del destino, curl
y httpbin
, respectivamente. Puede ver en el registro el verbo HTTP (GET
), la ruta HTTP (/status/418
), el código de respuesta (418
) y otra información relacionada con la solicitud.
Limpieza
Apague los services curl y httpbin:
$ kubectl delete telemetry curl-logging
$ kubectl delete -f @samples/curl/curl.yaml@
$ kubectl delete -f @samples/httpbin/httpbin.yaml@
$ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n istio-system
$ kubectl delete namespace observability
Deshabilitar el registro de acceso de Envoy
Elimine, o establezca en ""
, la configuración meshConfig.extensionProviders
y meshConfig.defaultProviders
en su configuración de instalación de Istio.
$ istioctl install --set profile=default
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete