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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Требования

    Процедура

    Пометьте пространство имён istio-system меткой проекта:

    kubectl label namespace istio-system cpaas.io/project=cpaas-system --overwrite

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

    Обратитесь к скрипту установки в Развёртывание экземпляра Jaeger и используйте пример команды ниже для развертывания выделенного для 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 в пространстве имён istio-system.

    Пример OpenTelemetry Collector в пространстве имён 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 в пространстве имён 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 в пространстве имён 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, чтобы сократить количество запросов.