OpenTelemetry

OpenTelemetry (OTel) — це незалежна від постачальника платформа з відкритим вихідним кодом для вимірювання, генерації, збору та експорту телеметричних даних. Трейси OpenTelemetry Protocol (OTLP) можна надсилати до Jaeger, а також до багатьох комерційних сервісів.

Щоб дізнатися, як Istio обробляє трейсинг, відвідайте огляд цього завдання.

Після завершення цього завдання ви зможете зрозуміти, як ваш застосунок може брати участь у трейсингу з OpenTelemetry, незалежно від мови, фреймворка або платформи, який ви використовуєте для створення застосунку.

Це завдання використовує Bookinfo як демонстраційний застосунок та OpenTelemetry Collector як приймач трейсів. Приклад надсилання трейсів безпосередньо до OTLP-сумісного бекенду наведено у завданні Jaeger.

Розгортання OpenTelemetry Collector

Створіть простір імен для OpenTelemetry Collector:

$ kubectl create namespace observability

Розгорніть OpenTelemetry Collector. Ви можете використовувати цей приклад конфігурації як відправну точку.

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

Встановлення

Всі параметри трейсингу можна налаштувати глобально через MeshConfig. Щоб спростити конфігурацію, рекомендується створити один YAML файл, який можна передати команді istioctl install -f.

Вибір експортеру

Istio можна налаштувати для експорту трейсів OpenTelemetry Protocol (OTLP) через gRPC або HTTP. Можна налаштувати лише один експортер одночасно (або gRPC, або HTTP).

Експорт через gRPC

У цьому прикладі трейс буде експортуватися через OTLP/gRPC до OpenTelemetry Collector. Приклад також активує детектор ресурсів середовища. Детектор середовища додає атрибути зі змінної середовища OTEL_RESOURCE_ATTRIBUTES до експортованого ресурсу OpenTelemetry.

$ 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

Експорт через HTTP

У цьому прикладі трейс буде експортуватися через OTLP/HTTP до OpenTelemetry Collector. Приклад також активує детектор ресурсів середовища. Детектор середовища додає атрибути зі змінної середовища OTEL_RESOURCE_ATTRIBUTES до експортованого ресурсу OpenTelemetry.

$ 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

Увімкнення трейсингу для mesh через Telemetry API

Увімкніть трейсинг, застосувавши наступну конфігурацію:

$ 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

Розгортання Bookinfo

Розгорніть демонстраційний застосунок Bookinfo.

Генерація трейсів за допомогою Bookinfo

  1. Коли Bookinfo буде запущено, отримайте доступ до http://$GATEWAY_URL/productpage один або кілька разів для генерації інформації про трейс.

    Щоб побачити дані трасування, потрібно надіслати запити до вашої служби. Кількість запитів залежить від коефіцієнта відбору Istio і може бути налаштована за допомогою Telemetry API. При стандартному значенні для коефіцієнта відбору в 1% вам потрібно надіслати принаймні 100 запитів, перш ніж перші трейси стануть видимими.

    Щоб надіслати 100 запитів до служби productpage, використовуйте наступну команду:

    $ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
  2. Використовуйте OpenTelemetry Collector, сконфігурований для експорту трейсів у консоль, щоб перевірити, що трейс надходять, переглянувши логи Колектора. Логи повинні містити щось подібне до:

    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)

Очищення

  1. Видаліть ресурс Telemetry:

    $ kubectl delete telemetry otel-demo
  2. Видаліть будь-які процеси istioctl, які можуть все ще працювати, використовуючи control-C або:

    $ killall istioctl
  3. Видаліть OpenTelemetry Collector:

    Zip
    $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability
    $ kubectl delete namespace observability
  4. Якщо ви не плануєте досліджувати жодних подальших завдань, зверніться до інструкцій з очищення Bookinfo, щоб завершити роботу з застосунком.

Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

Дякуємо за ваш відгук!