Распределённое трассирование и Service Mesh

Содержание

Создание приложений с поддержкой передачи контекста трассировки

Хотя прокси Istio могут автоматически отправлять спаны, для объединения этих спанов в единую трассу требуется дополнительная информация. Приложения должны передавать эту информацию в HTTP-заголовках, чтобы при отправке спанов прокси бэкенд мог объединить их в одну трассу.

Для этого каждое приложение должно собирать заголовки из каждого входящего запроса и пересылать их во все исходящие запросы, вызванные этим входящим запросом. Выбор заголовков для пересылки зависит от настроенного бэкенда трассировки. Ниже приведено краткое описание:

Все приложения должны пересылать следующие заголовки:

  • x-request-id: заголовок, специфичный для Envoy, который используется для последовательного выборочного логирования и трассировки.
  • traceparent и tracestate: стандартные заголовки W3C

Для других инструментов наблюдаемости обращайтесь к их документации.

Настройка платформы распределённого трассирования с Service Mesh

Alauda Service Mesh поддерживает распределённое трассирование через интеграцию со следующими компонентами:

  • Alauda Build of Jaeger: кастомизированное дистрибутивное решение на базе open source проекта Jaeger. Обеспечивает сквозную видимость запросов в сложных распределённых системах.

  • Alauda Build of OpenTelemetry: основан на проекте OpenTelemetry, этот компонент упрощает сбор телеметрических данных по метрикам, логам и трассам, управляя OpenTelemetry Collector и инструментированием рабочих нагрузок.

OpenTelemetry Collector выступает в роли посредника для телеметрических сигналов. Он поддерживает несколько форматов данных и предоставляет стандартизированный конвейер для обработки и экспорта телеметрии в бэкенды, такие как Jaeger.

Настройка сбора данных распределённого трассирования с Service Mesh

Вы можете интегрировать Alauda Service Mesh с OpenTelemetry для инструментирования, генерации, сбора и экспорта трасс, метрик и логов OpenTelemetry с целью анализа и понимания производительности и поведения вашего ПО.

Требования

  • .
  • .
  • Создан экземпляр Istio.
  • Создан экземпляр Istio CNI.

Процедура

Установите экземпляр Jaeger в namespace istio-system.

Обратитесь к скрипту установки в и используйте пример команды ниже для развертывания выделенного для Istio Jaeger:

INFO

Параметр --jaeger-es-index-prefix задаёт префикс индекса в Elasticsearch, где хранятся данные трассировки.

  • Для одно-кластерной service mesh рекомендуется заканчивать префикс именем кластера, например istio-tracing-cluster-1.
  • Для мультикластерной service mesh трассы со всех кластеров должны храниться в одном индексе; рекомендуется заканчивать префикс meshID, например istio-tracing-mesh-1.
./install-jaeger.sh \
  --es-url='https://xxx' \
  --es-user-base64='xxx' \
  --es-pass-base64='xxx' \
  --target-namespace='istio-system' \
  --jaeger-basepath-suffix='/istio/jaeger' \
  --jaeger-es-index-prefix='istio-tracing-xxx'

После успешной установки вы можете получить доступ к UI Jaeger для запроса трасс по адресу <platform-url>/clusters/<cluster>/istio/jaeger.

Перейдите к Alauda Build of OpenTelemetry в OperatorHub и создайте OpenTelemetryCollector в namespace istio-system.

Пример OpenTelemetry Collector в namespace istio-system

apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
  name: otel
  namespace: istio-system
spec:
  observability:
    metrics: {}
  deploymentUpdateStrategy: {}
  config:
    processors:
      batch: {}
    exporters:
      debug: {}
      otlp:
        endpoint: 'dns:///jaeger-prod-collector-headless.istio-system:4317'
        balancer_name: round_robin
        tls:
          insecure: true
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: '0.0.0.0:4317'
    service:
      pipelines:
        traces:
          exporters:
            - debug
            - otlp
          processors:
            - batch
          receivers:
            - otlp
  1. Поле endpoint — это сервис коллектора Jaeger в namespace istio-system.

Обновите ресурс Istio, чтобы включить трассировку и определить провайдера трассировки OpenTelemetry:

Пример: Включение трассировки через meshConfig

apiVersion: sailoperator.io/v1
kind: Istio
metadata:
  name: default
  # ...
spec:
  namespace: istio-system
  # ...
  values:
    meshConfig:
      enableTracing: true
      extensionProviders:
      - name: otel
        opentelemetry:
          port: 4317
          service: otel-collector.istio-system.svc.cluster.local
  1. Поле service — это сервис коллектора OpenTelemetry в namespace istio-system.

Обновите ресурс Telemetry, чтобы включить провайдера трассировки, определённого в meshConfig:

Пример ресурса Istio Telemetry

apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: asm-default
  namespace: istio-system
  # ...
spec:
  # ...
  tracing:
    - providers:
        - name: otel
      randomSamplingPercentage: 100
NOTE

После того как вы убедитесь, что трассы видны, уменьшите значение randomSamplingPercentage, чтобы сократить количество запросов.