Dağıtılmış İzleme: OpenTelemetry
Dağıtılmış İzleme: OpenTelemetry
1) Neden OTel ve ne veriyor
OpenTelemetry (OTel) açık bir standart ve tek bir OTLP protokolü ile telemetri (yollar, metrikler, günlükler) için bir dizi SDK/aracı/toplayıcıdır. Hedefler:- İstek yollarının uçtan uca görünürlüğü (ağ geçidi, hizmetler, DB/önbellek/kuyruklar).
- Hızlı RCA/hata ayıklama bozulması ve serbest bırakılması (kanaryalar/mavi-yeşil).
- SLO ve otomatik geri dönüşlerle bağlantı (verilere dayalı operasyonel çözümler).
- Satıcı-agnostik: tek bir APM'ye bağlı olmadan herhangi bir arka uca dışa aktarma.
Referans ilkeleri: standardize, örnek akıllı, varsayılan olarak güvenli, her şeyi ilişkilendirir.
2) Temel bilgiler: bağlam, açıklıklar, nitelikler
Trace - çağrı ağacı/grafik; Span - işlem (RPC, SQL, kuyruk çağrısı).
Yayılma Türü: 'SERVER', 'CLIENT', 'PRODUCER', 'CONSUMER', 'INTERNAL'.
W3C Trace Bağlam: 'traceparent', 'tracestate' başlıkları; bağlam servisler arası taşınır.
Nitelikler - anahtar değeri (düşük kardinalite!), Olaylar - zaman damgaları, Durum - hata kodu/açıklaması.
Bağlantılar - sıkı bir hiyerarşinin dışındaki bağlantı alanları (async/fan-out/fan-in için önemlidir).
- HTTP: 'HTTP {METHOD}' (nitelik olarak 'GET/withdraw')
- DB: 'DB SELECT'/' DB INSERT'
- Kuyruk: 'QUEUE yayınlama konusu = X'/' QUEUE tüketim konusu = X'
3) Semantik sözleşmeler (semconv)
Kararlı nitelik şemaları kullan:- HTTP/GRPC: 'http. Yöntem ',' http. Rota ',' http. status_code', 'url. dolu '.
- DB: 'db. sistem = postgresql ',' db. '(sadece güvenli sıkmak!),' db. İsim '.
- Mesajlaşma: 'Mesajlaşma. sistem = kafka ',' mesajlaşma. operation = receive ', mesajlaşma. varış noktası '.
- Cloud/K8s/Host: 'bulut. Bölge ',' k8s. Pod. Name ',' konteyner. id '.
- Kaynak nitelikleri (gerekli): 'hizmeti. İsim ',' hizmeti. Sürüm ',' dağıtım. Çevre '.
SDK/Collector kaynaklarında 'schemaUrl' aracılığıyla şema kararlılığını belirtin.
4) Örnekleme: baş, kuyruk, uyarlanabilir
Kafa tabanlı (SDK'da): önceden karar verir, ucuz; Yüksek QPS için iyidir, ancak "ilginç" parçaları kaçırabilir.
Kuyruk tabanlı (Toplayıcıda): parçanın tamamlanmasından sonra karar verir; Durum, gecikme, niteliklere göre kurallara izin verir.
Uyarlanabilir/Dinamik: P95 hataları/büyümesi için örnek payını yükseltir.
Üretim seviyesinin tarifi: Dünya çapında %1-5 baş + "önemli" kuyruk seçimi: 'durum = HATA', 'gecikme> p95', "para yolları", PSP/KYC hataları.
5) Korelasyon: metrikler, günlükler, izler
Örnekler: metrik histogramlarda 'trace _ id' içeren etiketler (parçaya hızlı atlama).
Günlükler: 'trace _ id'/' span _ id' ekleyin ve günlüklerden izlemeye geçin.
SpanMetrics (işlemci), SLO'lar/uyarılar için RED metriklerinden ('istekler, hatalar, süre') izler toplar.
6) Dağıtım mimarisi
Her düğümdeki Ajan (DaemonSet), uygulamalardan (OTLP) ve ileriye doğru toplar.
Ağ Geçidi (Küme/Bölge) - Yönlendirme/örnekleme/zenginleştirme boru hatları ile Merkezi Toplayıcı (birçok kopya).
OTLP: gRPC '4317', HTTP '4318'; TLS/mTLS'yi etkinleştir.
"Ajan + ağ geçidi'nin artıları: izolasyon, tamponlama, yerel geri dönüş, basitleştirilmiş ağ.
7) OpenTelemetry Collector - temel şablon (ağ geçidi)
yaml receivers:
otlp:
protocols:
grpc: { endpoint: 0. 0. 0. 0:4317 }
http: { endpoint: 0. 0. 0. 0:4318 }
processors:
memory_limiter: { check_interval: 5s, limit_percentage: 75 }
batch: { timeout: 2s, send_batch_size: 8192 }
attributes:
actions:
- key: deployment. environment action: upsert value: prod resource:
attributes:
- key: service. namespace action: upsert value: core tail_sampling:
decision_wait: 5s policies:
- name: errors type: status_code status_code: { status_codes: [ERROR] }
- name: slow_traces type: latency latency: { threshold_ms: 800 }
- name: important_routes type: string_attribute string_attribute:
key: http. route values: ["/withdraw", "/deposit"]
- name: baseline_prob type: probabilistic probabilistic: { sampling_percentage: 5 }
exporters:
otlp/apm:
endpoint: apm-backend:4317 tls: { insecure: true }
prometheus:
endpoint: 0. 0. 0. 0:9464
extensions:
health_check: {}
pprof: { endpoint: 0. 0. 0. 0:1777 }
zpages: { endpoint: 0. 0. 0. 0:55679 }
service:
extensions: [health_check, pprof, zpages]
pipelines:
traces: { receivers: [otlp], processors: [memory_limiter,attributes,resource,batch,tail_sampling], exporters: [otlp/apm] }
metrics: { receivers: [otlp], processors: [batch], exporters: [prometheus] }
logs: { receivers: [otlp], processors: [batch], exporters: [] }
8) SpanMetrics ve SLO için RED
Bir işlemci ekleyin:yaml processors:
spanmetrics:
metrics_exporter: prometheus histogram:
explicit:
buckets: [50ms,100ms,200ms,400ms,800ms,1600ms,3200ms]
service:
pipelines:
traces: { receivers: [otlp], processors: [spanmetrics,batch,tail_sampling], exporters: [otlp/apm] }
metrics: { receivers: [otlp], processors: [batch], exporters: [prometheus] }
Şimdi SLO/uyarılar için 'traces _ spanmetrics _ calls {service, route, code}'ve' duration _ bucket 'var.
9) K8s: Collector (DaemonSet + Deployment) dağıtımı
Ajan (DaemonSet) parçası:yaml apiVersion: apps/v1 kind: DaemonSet metadata: { name: otel-agent, namespace: observability }
spec:
template:
spec:
containers:
- name: otelcol image: otel/opentelemetry-collector:latest args: ["--config=/conf/agent. yaml"]
ports:
- { containerPort: 4317, name: otlp-grpc }
- { containerPort: 4318, name: otlp-http }
Ağ Geçidi (Dağıtım) - birkaç kopya, Service ClusterIP/Ingress, CPU/QPS tarafından HPA.
10) Güvenlik ve gizlilik
TLS/mTLS между SDK - Aracı - Ağ Geçidi - Arka Uç.
Ağ Geçidi girişinde kimlik doğrulama (Temel/OAuth/Başlıklar); Kökenleri sınırlayın.
PII revizyonu: filter/mask attributes ('kullanıcı. Email ',' kart. ') Collector işlemcisinde.
Sınırlar: SDK'da, olay boyutunu/nitelik sayısını sınırlayın (kardinalite koruması).
Arka uçtaki RBAC + bireysel proje/kiracı ad alanları.
yaml processors:
attributes/redact:
actions:
- key: user. email action: delete
- key: payment. card action: delete
11) Enstrümantasyon: Hızlı başlangıçlar
Düğüm noktası. js
js import { NodeSDK } from "@opentelemetry/sdk-node";
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-grpc";
import { Resource } from "@opentelemetry/resources";
import { SemanticResourceAttributes as R } from "@opentelemetry/semantic-conventions";
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({ url: "http://otel-agent. observability:4317" }),
resource: new Resource({
[R.SERVICE_NAME]: "payments-api",
[R.SERVICE_VERSION]: "1. 14. 2",
[R.DEPLOYMENT_ENVIRONMENT]: "prod"
}),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk. start();
Java (Bahar)
java
// Gradle: io. opentelemetry. instrumentation:opentelemetry-spring-boot-starter
// application. yml otel:
service:
name: orders-api exporter:
otlp:
endpoint: http://otel-agent. observability:4317 traces:
sampler: parentbased_traceidratio sampler-arg: 0. 05
Python (FastAPI)
python from opentelemetry import trace from opentelemetry. sdk. resources import Resource from opentelemetry. exporter. otlp. proto. grpc. trace_exporter import OTLPSpanExporter from opentelemetry. sdk. trace import TracerProvider from opentelemetry. sdk. trace. export import BatchSpanProcessor
provider = TracerProvider(resource=Resource. create({"service. name":"fraud-scoring","deployment. environment":"prod"}))
provider. add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint="http://otel-agent. observability:4317", insecure=True)))
trace. set_tracer_provider(provider)
Git
go exp, _:= otlptracegrpc. New(ctx, otlptracegrpc. WithEndpoint("otel-agent. observability:4317"), otlptracegrpc. WithInsecure())
res:= resource. NewWithAttributes(semconv. SchemaURL, semconv. ServiceNameKey. String("gateway"), semconv. DeploymentEnvironmentKey. String("prod"))
tp:= sdktrace. NewTracerProvider(sdktrace. WithBatcher(exp), sdktrace. WithResource(res), sdktrace. WithSampler(sdktrace. ParentBased(sdktrace. TraceIDRatioBased(0. 05))))
otel. SetTracerProvider(tp)
12) Asenkron: kuyruklar, otobüsler, cron
"Bağlantılar" aracılığıyla iletişim kuran PRODUCER/CONSUMER (mesajların kendi yaşam döngüleri vardır).
İçeriği mesaj başlıklarına ('traceparent'/' bagage') yayın.
Toplu tüketirken, mesaj başına bir yayılma alanı oluşturun veya 'messaging niteliği ile birleştirin. Toplu. Boyut '.
Cron/jobs için: çalıştırılacak yeni izleme + birincil olaylara bağlantılar (varsa).
13) Bagaj ve hedefleme
Bagajda en az sabit anahtar ('tenant _ id', 'region', 'vip _ tier') saklayın; PII'yi yasaklayın.
Metriklerin segmente göre daha sonra toplanması için ağ geçidi/ağ geçidi kaydedicisini itin.
14) Sürümler ve SLO gating ile entegrasyon
Kanarya adımları - rotalar/alt segmentler üzerinde 'izler _ spanmetrics _' kontrol edin.
Bozulma sırasında (5xx/p95) - otomatik durdurma ve geri alma (Argo Rollouts AnalysisTemplate + PromQL).
Metriklerden gelen örnekler doğrudan yayın aralığının "kötü" izlerine yol açar.
15) Sınırlar ve performans
Ограничивайте: 'OTEL _ SPAN _ ATTRIBUTE _ COUNT _ LIMIT', 'OTEL _ SPAN _ EVENT _ COUNT _ LIMIT', 'OTEL _ ATTRIBUTE _ VALUE _ LENGTH _ LIMIT'.
Olasılık/frekansa göre örnek/stacktrace istisnaları.
SDK ve Collector'da toplu işlemci; Patlamalar meydana geldiğinde izleri kaybetmemek için kuyrukları tutun.
16) Birlikte çalışabilirlik ve geçişler
Yayıcılar: W3C kullanın; Çift yayılımı B3/X-Ray okumayı destekler.
İhracat: OTLP - APM (Jaeger/Tempo/Elastic/X-Ray, vb.).
Semconv'un kararlı sürümleri - 'schemaUrl'yi düzeltin ve yükseltmeleri planlayın.
17) Anti-desenler
Niteliklerin yüksek kardinalitesi (etikette 'user _ id', dinamik anahtarlar).
Trace _ id olmayan günlükler - korelasyon yok.
Uygulamalardan doğrudan Internet APM'ye aktarın (ağ geçidi olmadan, TLS/mTLS olmadan).
Satışlarda "sadece" %100 toplamak pahalı ve anlamsızdır.
Db'deki kullanıcı verileriyle SQL sorgularının dökümü. Açıklama '.
Tutarsız hizmet/sürüm adı - metrikler "parçalanıyor".
18) Uygulama kontrol listesi (0-45 gün)
0-10 gün
2-3 kritik serviste SDK/otomatik enstrümantasyonu etkinleştirin.
Aracıyı (DaemonSet) + Ağ Geçidini (Dağıtım), OTLP 4317/4318'i TLS ile yapılandırın.
Add 'service. İsim ',' hizmeti. Sürüm ',' dağıtım. Çevre'her yerde.
11-25 gün
Hatalar/gecikme/" para" yolları ile kuyruk örnekleme.
SpanMetrics - Prometheus, Exemplars ve RED/SLO panolarını içerir.
W3C'yi API ağ geçidi/NGINX/mesh üzerinden yaymak; günlükleri ilişkilendirir.
26-45 gün
Kapak kuyrukları/DB/önbellek; async için bağlantılar.
Collector'da PII sürümü politikaları; SDK'daki nitelik sınırları.
Sürümlerin SLO geçidi ve otomatik geri alma özelliğini entegre edin.
19) Olgunluk metrikleri
Takip ≥ %95 ile gelen istek kapsamı (örnekleme kafası/kuyruğu dahil).
Exemplars ile metriklerin payı %80 ≥.
RCA zamanı "metrikten ize" ≤ 2 dakika (p50).
0 PII özniteliklerde/olaylarda sızar (tarayıcı).
Tüm servislerin 'hizmeti' vardır. İsim/versiyon/çevre've tutarlı semantik.
20) Ekler: faydalı parçalar
NGINX propagandası:nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;
proxy_set_header baggage $http_baggage;
Prometheus с Örnekleri (Grafana):
histogram_quantile(0. 95, sum(rate(traces_spanmetrics_duration_bucket{route="/withdraw"}[5m])) by (le))
Politika: PII özelliklerinin yasaklanması (sözde linter)
yaml forbid_attributes:
- user. email
- payment. card
- personal.
21) Sonuç
OpenTelemetry, gözlemlenebilirliği standartlaştırılmış, yönetilebilir bir devreye dönüştürür: birleşik semantik, güvenli yayılma, akıllı örnekleme ve metrikler ve günlüklerle güçlü korelasyon. Bir ajan + ağ geçidi oluşturun, kuyruk örnekleme, spanmetrics ve Examplars ekleyin, PII ve kardinaliteyi izleyin - ve izleme sadece hata ayıklama için değil, aynı zamanda otomatik SRE/Release çözümleri için de bir araç haline gelecek ve her sürümde MTTR'yi ve riskleri azaltacaktır.