GH GambleHub

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).

Adlandırma aralıkları:
  • 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ı.

Collector'da bir filtre örneği:
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.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Telegram
@Gamble_GC
Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.