Обогащение из Kubernetes: различия между версиями

Материал из Документация Ключ-АСТРОМ
(Новая страница: «В следующем примере конфигурации показано, как настроить экземпляр '''Collector''' для обогаще...»)
 
 
Строка 354: Строка 354:


Мы также настраиваем [https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.136.0/processor/transformprocessor процессор <code>transform</code>] на автоматическое добавление информации о кластере '''Kubernetes''' в качестве атрибутов ресурсов для всех сигналов телеметрии.
Мы также настраиваем [https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/v0.136.0/processor/transformprocessor процессор <code>transform</code>] на автоматическое добавление информации о кластере '''Kubernetes''' в качестве атрибутов ресурсов для всех сигналов телеметрии.
=== Экспортеры ===
В разделе <code>exporters</code> мы указываем [https://github.com/open-telemetry/opentelemetry-collector/tree/v0.136.0/exporter/otlphttpexporter экспортер <code>otlphttp</code>] по умолчанию и настраиваем его с помощью '''URL-адреса''' нашего '''API''' Ключ-АСТРОМ и требуемого токена аутентификации.
Для этой цели мы устанавливаем следующие две переменные среды и ссылаемся на них в значениях конфигурации для <code>endpoint</code> и <code>Authorization</code>.
* <code>DT_ENDPOINT</code> содержит базовый '''URL-адрес''' конечной точки '''API''' Ключ-АСТРОМ (например, <code><nowiki>https://{your-environment-id}.live.astromkey.com/api/v2/otlp</nowiki></code>)
* <code>DT_API_TOKEN</code> содержит токен API
=== Сервисные контейнеры ===
В разделе <code>service</code> мы собираем объекты приёмника, процессора и экспортёра в контейнеры для трассировок, метрик и логов. Эти контейнеры позволяют нам отправлять сигналы '''OpenTelemetry''' через экземпляр '''Collector''' и автоматически дополнять их дополнительной информацией, специфичной для '''Kubernetes'''.

Текущая версия на 20:22, 6 октября 2025

В следующем примере конфигурации показано, как настроить экземпляр Collector для обогащения телеметрических данных OTLP дополнительными метаданными Kubernetes. Это включает, например, сведения о поде, развертывании и кластере, что позволяет Ключ-АСТРОМ корректно сопоставлять предоставленные телеметрические данные с соответствующими сущностями в Ключ-АСТРОМ.

Ключ-АСТРОМ рекомендует использовать АктивныйШлюз для улучшения мониторинга состояния и производительности кластера Kubernetes. Развертывание АктивныйШлюз позволяет приложению Ключ-АСТРОМ Kubernetes визуализировать данные Kubernetes и OpenTelemetry и сопоставлять их с соответствующими сущностями Kubernetes.

Предустановка

  • необязательно Развернутый АктивныйШлюз для мониторинга API Kubernetes
  • Один из следующих дистрибутивов Collector с процессорами Kubernetes Attributes и Transform :
  • Collector развернут в режиме агента
  • URL-адрес API вашей среды Ключ-АСТРОМ
  • API-токен с соответствующей областью доступа
  • Kubernetes настроен на требуемый контроль доступа на основе ролей

Информацию о настройке Collector с использованием указанной ниже конфигурации см. в разделах Развертывание коллектора и Конфигурация коллектора.

Демо конфигурация

Учетная запись службы

Помимо конфигурации Collector, обязательно обновите конфигурацию Kubernetes, чтобы она соответствовала имени учетной записи службы, используемому в файле RBAC (см. записи для Helm, Operator).

extensions:

  health_check:

    endpoint: ${env:MY_POD_IP}:13133

receivers:

  otlp:

    protocols:

      grpc:

        endpoint: ${env:MY_POD_IP}:4317

      http:

        endpoint: ${env:MY_POD_IP}:4318

processors:

  k8sattributes:

    extract:

      metadata:

        - k8s.pod.name

        - k8s.pod.uid

        - k8s.pod.ip

        - k8s.deployment.name

        - k8s.replicaset.name

        - k8s.statefulset.name

        - k8s.daemonset.name

        - k8s.job.name

        - k8s.cronjob.name

        - k8s.namespace.name

        - k8s.node.name

        - k8s.cluster.uid

        - k8s.container.name

      annotations:

        - from: pod

          key_regex: metadata.astromkey.com/(.*)

          tag_name: $$1

        - from: pod

          key: metadata.astromkey.com

          tag_name: metadata.astromkey.com

    pod_association:

      - sources:

        - from: resource_attribute

          name: k8s.pod.name

        - from: resource_attribute

          name: k8s.namespace.name

      - sources:

        - from: resource_attribute

          name: k8s.pod.ip

      - sources:

        - from: resource_attribute

          name: k8s.pod.uid

      - sources:

        - from: connection

  transform:

    error_mode: ignore

    trace_statements: &astromkey_transformations

      # Set attributes taken from k8s metadata.

      - context: resource

        statements:

          - set(attributes["k8s.workload.kind"], "job") where IsString(attributes["k8s.job.name"])

          - set(attributes["k8s.workload.name"], attributes["k8s.job.name"]) where IsString(attributes["k8s.job.name"])

          - set(attributes["k8s.workload.kind"], "cronjob") where IsString(attributes["k8s.cronjob.name"])

          - set(attributes["k8s.workload.name"], attributes["k8s.cronjob.name"]) where IsString(attributes["k8s.cronjob.name"])

          - set(attributes["k8s.workload.kind"], "daemonset") where IsString(attributes["k8s.daemonset.name"])

          - set(attributes["k8s.workload.name"], attributes["k8s.daemonset.name"]) where IsString(attributes["k8s.daemonset.name"])

          - set(attributes["k8s.workload.kind"], "statefulset") where IsString(attributes["k8s.statefulset.name"])

          - set(attributes["k8s.workload.name"], attributes["k8s.statefulset.name"]) where IsString(attributes["k8s.statefulset.name"])

          - set(attributes["k8s.workload.kind"], "replicaset") where IsString(attributes["k8s.replicaset.name"])

          - set(attributes["k8s.workload.name"], attributes["k8s.replicaset.name"]) where IsString(attributes["k8s.replicaset.name"])

          - set(attributes["k8s.workload.kind"], "deployment") where IsString(attributes["k8s.deployment.name"])

          - set(attributes["k8s.workload.name"], attributes["k8s.deployment.name"]) where IsString(attributes["k8s.deployment.name"])

          # remove the delete statements if you want to preserve these attributes

          - delete_key(attributes, "k8s.deployment.name")

          - delete_key(attributes, "k8s.replicaset.name")

          - delete_key(attributes, "k8s.statefulset.name")

          - delete_key(attributes, "k8s.daemonset.name")

          - delete_key(attributes, "k8s.cronjob.name")

          - delete_key(attributes, "k8s.job.name")

      - context: resource

        statements:

          - merge_maps(attributes, ParseJSON(attributes["metadata.astromkey.com"]), "upsert") where IsMatch(attributes["metadata.astromkey.com"], "^\\{")

          - delete_key(attributes, "metadata.astromkey.com")

    metric_statements: *astromkey_transformations

    log_statements: *astromkey_transformations

exporters:

  otlphttp:

    endpoint: ${env:DT_ENDPOINT}

    headers:

      Authorization: "Api-Token ${env:DT_API_TOKEN}"

service:

  extensions:

    - health_check

  pipelines:

    traces:

      receivers: [otlp]

      processors: [k8sattributes, transform]

      exporters: [otlphttp]

    metrics:

      receivers: [otlp]

      processors: [k8sattributes, transform]

      exporters: [otlphttp]

    logs:

      receivers: [otlp]

      processors: [k8sattributes, transform]

      exporters: [otlphttp]

Конфигурация Kubernetes

Настройте следующий файл rbac.yaml с вашим экземпляром Kubernetes, чтобы разрешить сборщику использовать API Kubernetes с типом аутентификации учетной записи службы.

apiVersion: v1

kind: ServiceAccount

metadata:

  labels:

    app: collector

  name: collector

---

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

  name: collector

  labels:

    app: collector

rules:

  - apiGroups:

      - ''

    resources:

      - 'pods'

      - 'namespaces'

    verbs:

      - 'get'

      - 'watch'

      - 'list'

  - apiGroups:

      - 'apps'

    resources:

      - 'replicasets'

    verbs:

      - 'get'

      - 'list'

      - 'watch'

  - apiGroups:

      - 'extensions'

    resources:

      - 'replicasets'

    verbs:

      - 'get'

      - 'list'

      - 'watch'

---

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

  name: collector

  labels:

    app: collector

roleRef:

  apiGroup: rbac.authorization.k8s.io

  kind: ClusterRole

  name: collector

subjects:

  - kind: ServiceAccount

    name: collector

    namespace: default

Компоненты

Для нашей конфигурации мы настроили следующие компоненты.

Приемники

В разделе receivers мы указываем стандартный приемник otlp, как активный компонент приемника для нашего экземпляра Collector.

Это сделано в основном для демонстрационных целей. Вы можете указать здесь любой другой допустимый получатель (например, zipkin).

Процессоры

В разделе processors мы указываем процессор k8sattributes со следующими параметрами:

  • extract— Указывает, какую информацию следует извлечь.
  • pod_association— Указывает, как информация о модуле связана с атрибутами.

Обратите внимание, что атрибут k8s.container.name будет извлечён только в том случае, если модуль, от которого был получен входящий сигнал, содержит только один контейнер, или если принятый сигнал содержит атрибут ресурса k8s.container.id. В противном случае процессор k8sattributes не сможет правильно связать нужный контейнер.

Ключ-АСТРОМ Operator дополняет данные OpenTelemetry из модулей Kubernetes аннотациями metadata.astromkey.com. При наличии этих аннотаций процессор k8sattributes их извлекает.

Мы также настраиваем процессор transform на автоматическое добавление информации о кластере Kubernetes в качестве атрибутов ресурсов для всех сигналов телеметрии.

Экспортеры

В разделе exporters мы указываем экспортер otlphttp по умолчанию и настраиваем его с помощью URL-адреса нашего API Ключ-АСТРОМ и требуемого токена аутентификации.

Для этой цели мы устанавливаем следующие две переменные среды и ссылаемся на них в значениях конфигурации для endpoint и Authorization.

  • DT_ENDPOINT содержит базовый URL-адрес конечной точки API Ключ-АСТРОМ (например, https://{your-environment-id}.live.astromkey.com/api/v2/otlp)
  • DT_API_TOKEN содержит токен API

Сервисные контейнеры

В разделе service мы собираем объекты приёмника, процессора и экспортёра в контейнеры для трассировок, метрик и логов. Эти контейнеры позволяют нам отправлять сигналы OpenTelemetry через экземпляр Collector и автоматически дополнять их дополнительной информацией, специфичной для Kubernetes.