Автоинструментация приложения с использованием 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?
Может ли кто-нибудь дать какие-либо идеи о том, как правильно это сделать?