Автоинструментация приложения с использованием OpenTelemetry

У меня есть кластер AKS, в котором я запускаю тестовое веб-приложение на основе Python-Django. У меня также настроены Grafana и Prometheus. Мне нужно использовать OpenTelemetry, чтобы получить данные метрик из тестового приложения и визуализировать их в Grafana.

У меня есть сборщик OpenTelemetry, развернутый в виде оператора Kubernetes с использованием CRD OTEL (см. https://opentelemetry.io/docs/kubernetes/operator/automatic/ ).

Я уже развернул CRD OpenTelemetry и развернул сборщик. Коллекционер какой-тоOpenTelemetryCollector. Я настроил экспортер какPromethusа коллектор OTEL обслуживает Прометея и все это взаимосвязано. Я могу просмотреть панели на основе коллекторов OTEL в Grafana.

Моя цель - получить метрики на основе приложений, такие какpod_cpu_usage,pod_memory_usageи т. д. в Grafana с помощью коллектора OTEL.

Ниже приведена YAML-конфигурация OTEL Collector:

отель-collector.yml

      apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: otel
  namespace: otel
  labels:
    opentelemetry.io/name: otelcol
    app.kubernetes.io/instance: opentelemetry
    app.kubernetes.io/name: otelcol
    app.kubernetes.io/version: "0.82.0"
  annotations:
    otel_collector: "true"
    prometheus.io/port: "9464"
    prometheus.io/scrape: "true"
spec:
  config: |
    receivers:
      prometheus:
        config:
          scrape_configs:
            - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
              job_name: integrations/kubernetes/cadvisor
              kubernetes_sd_configs:
                - role: node
              relabel_configs:
                - replacement: kubernetes.default.svc.cluster.local:443
                  target_label: __address__
                - regex: (.+)
                  replacement: /api/v1/nodes/$${1}/proxy/metrics/cadvisor
                  source_labels:
                    - __meta_kubernetes_node_name
                  target_label: __metrics_path__
              scheme: https
              tls_config:
                ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
                insecure_skip_verify: false
                server_name: kubernetes
              scrape_interval: 10s
              static_configs:
              - targets: [ '0.0.0.0:8888' ]
            - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
              job_name: integrations/kubernetes/kubelet
              kubernetes_sd_configs:
                - role: node
              relabel_configs:
                - replacement: kubernetes.default.svc.cluster.local:443
                  target_label: __address__
                - regex: (.+)
                  replacement: /api/v1/nodes/$${1}/proxy/metrics
                  source_labels:
                    - __meta_kubernetes_node_name
                  target_label: __metrics_path__
              scheme: https
              tls_config:
                ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
                insecure_skip_verify: false
                server_name: kubernetes
              scrape_interval: 10s
              static_configs:
              - targets: [ '0.0.0.0:8888' ]
            - job_name: integrations/kubernetes/kube-state-metrics
              kubernetes_sd_configs:
                - role: pod
              relabel_configs:
                - action: keep
                  regex: kube-state-metrics
                  source_labels:
                    - __meta_kubernetes_pod_label_app_kubernetes_io_name
              scrape_interval: 10s
              static_configs:
              - targets: [ '0.0.0.0:8888' ]
            - job_name: integrations/node_exporter
              kubernetes_sd_configs:
                - namespaces:
                    names:
                      - default
                  role: pod
              relabel_configs:
                - action: keep
                  regex: prometheus-node-exporter.*
                  source_labels:
                    - __meta_kubernetes_pod_label_app_kubernetes_io_name
                - action: replace
                  source_labels:
                    - __meta_kubernetes_pod_node_name
                  target_label: instance
                - action: replace
                  source_labels:
                    - __meta_kubernetes_namespace
                  target_label: namespace
              scrape_interval: 10s
              static_configs:
              - targets: [ '0.0.0.0:8888' ]

            - job_name: 'otel-collector'
              scrape_interval: 10s
              static_configs:
              - targets: [ '0.0.0.0:8888' ]
      otlp:
        protocols:
          grpc:
            endpoint: '0.0.0.0:4317'
          http:
            cors:
              allowed_origins:
              - http://*
              - https://*
            endpoint: '0.0.0.0:4318'

    processors:
      batch: {}
      filter/ottl:
        error_mode: ignore
        metrics:
          metric:
          - name == "rpc.server.duration"
      memory_limiter:
        check_interval: 5s
        limit_percentage: 80
        spike_limit_percentage: 25
      resource:
        attributes:
        - action: insert
          from_attribute: k8s.pod.uid
          key: service.instance.id

    exporters:
      logging: {}
      prometheus:
        enable_open_metrics: true
        endpoint: '0.0.0.0:9464'
        resource_to_telemetry_conversion:
          enabled: true

    extensions:
      health_check: {}
      memory_ballast:
        size_in_percentage: 40

    service:
      pipelines:
        metrics:
          receivers: [prometheus, otlp]
          processors: [batch, filter/ottl, memory_limiter, resource]
          exporters: [prometheus, logging]

Ниже приведена текущая YAML-конфигурация инструментария (ссылка: https://github.com/open-telemetry/opentelemetry-operator#deployment-modes ), которая у меня есть:

otel-instrumentation.yml

      apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: python-instrumentation
  namespace: trojanwall
spec:
  exporter:
    endpoint: http://10.244.0.7:4318
  propagators:
    - tracecontext
    - baggage
  sampler:
    type: parentbased_traceidratio
    argument: "1"
  python:
    env:
      - name: OTEL_LOGS_EXPORTER
        value: otlp_proto_http
      - name: OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED
        value: 'true'

Мне нужно реализовать автоматическое инструментирование для приложения Python-Django без изменения исходного кода приложения.

После этого я добавил следующую аннотацию в YAML-файл развертывания тестового приложения Python-Django:

      annotations:
  instrumentation.opentelemetry.io/inject-python: "true"

Однако ни одна из метрик моего приложения не отображается в Grafana.

Как я могу сделать это правильно, используя OpenTelemetry Collector и Auto-Instrumentation?
Может ли кто-нибудь дать какие-либо идеи о том, как правильно это сделать?

0 ответов

Другие вопросы по тегам