GH GambleHub

Distributed Tracing: OpenTelemetry

Distributed Tracing: OpenTelemetry

1) Niyə OTEL və nə verir

OpenTelemetry (OTel) - açıq standart və vahid OTLP protokolu ilə telemetriya (treys, metrika, log) üçün SDK/agent/kollektorlar dəsti. Məqsədlər:
  • Sorğu yollarının tam görünürlüyü (gateway → xidmətlər → DB/cache/növbələr).
  • Sürətli RCA/deqradasiya və relizlərin hata ayıklanması (kanarya/mavi-yaşıl).
  • SLO və avtomatik geri çəkilmə ilə əlaqə (məlumat üzərində əməliyyat həlləri).
  • Satıcı-aqnostik: bir APM bağlı olmadan hər hansı bir geri ixrac.

Dayaq prinsipləri: standardize, sample smart, secure by default, correlate everything.

2) Əsaslar: kontekst, span, atributlar

Trace - ağac/zəng qrafiki; Span - əməliyyat (RPC, SQL, çağırış növbəsi).
Span Kind: `SERVER`, `CLIENT`, `PRODUCER`, `CONSUMER`, `INTERNAL`.
W3C Trace Context: 'traceparent', 'tracestate' başlıqları; kontekst servislərarası köçürülür.
Attributes - açar dəyəri (aşağı kardinallıq!), Events - vaxt işarələri, Status - səhv kodu/təsviri.
Links - span əlaqəsi (async/fan-out/fan-in üçün vacibdir).

Span adları:
  • HTTP: 'HTTP {METHOD}' ('GET/withdraw' atribut kimi)
  • DB: `DB SELECT` / `DB INSERT`
  • Queue: `QUEUE publish topic=X` / `QUEUE consume topic=X`

3) Semantik konvensiyalar (semconv)

Sabit atribut sxemlərindən istifadə edin:
  • HTTP/GRPC: `http. method`, `http. route`, `http. status_code`, `url. full`.
  • DB: `db. system=postgresql`, `db. statement '(yalnız təhlükəsiz sıxma!),' db. name`.
  • Messaging: `messaging. system=kafka`, `messaging. operation=receive`, `messaging. destination`.
  • Cloud/K8s/Host: `cloud. region`, `k8s. pod. name`, `container. id`.
  • Resource attributes (mütləq): 'service. name`, `service. version`, `deployment. environment`.

Sxemin sabitliyini SDK/Collector resurslarında 'schemaUrl' vasitəsilə göstərin.

4) Sampling: baş, tail, adaptive

Head-based (SDK-da): əvvəlcədən, ucuz qərar verir; high-QPS üçün yaxşıdır, lakin «maraqlı» marşrutları qaçıra bilər.
Tail-based (Collector-da): trek başa çatdıqdan sonra qərar verir; status, gizlilik, atributlar qaydaları imkan verir.
Adaptive/Dinamik: p95 səhvlər/artım zamanı sampl payını artırır.

Prod səviyyə resepti: Baş 1-5% qlobal + Tail seçimi «vacib»: 'status = ERROR', 'latency> p95', «pul marşrutları», PSP/KYC səhvləri.

5) Korrelyasiya: metriklər, loqlar, treyslər

Exemplars: metrik histoqramda 'trace _ id' işarələri (trasa sürətli atlama).
Qeydlər: 'trace _ id '/' span _ id' əlavə edin və qeydlərdən trasa keçin.
SpanMetrics (processor): SLO/alertlər üçün RED-metrika ('requests, errors, duration') yollarından yığır.

6) Yerləşdirmə arxitekturası

Agent (DaemonSet) hər qovşaqda applications (OTLP) və forvardit toplayır.
Gateway (Cluster/Region) - marşrutlaşdırma/sampling/zənginləşdirmə paylaynları ilə mərkəzi Collector (bir çox replikalar).
OTLP: gRPC `4317`, HTTP `4318`; TLS/mTLS daxil edin.

«agent + gateway» üstünlükləri: izolyasiya, tamponlama, yerli backpressure, sadələşdirilmiş şəbəkə.

7) OpenTelemetry Collector - əsas şablon (gateway)

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) SLO üçün SpanMetrics və RED

Prosessor əlavə edin:
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] }

İndi SLO/alertlər üçün 'traces _ spanmetrics _ calls {service, route, code}' və 'duration _ bucket' var.

9) K8s: Collector yerləşdirilməsi (DaemonSet + Deployment)

Agent (DaemonSet) fraqmenti:
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 }

Gateway (Deployment) - bir neçə replika, Service ClusterIP/Ingress, CPU/QPS üzrə HPA.

10) Təhlükəsizlik və məxfilik

TLS/mTLS между SDK → Agent → Gateway → Backend.
Gateway girişində autentifikasiya (Basic/OAuth/Headers); mənbəyini məhdudlaşdırın.
PII redaktəsi: sifətləri süzün/maskalayın ('user. email ',' card. ') Collector prosessorunda.
Limitlər: SDK-da hadisənin ölçüsünü/atributların sayını (kardinallıqdan qorunma) məhdudlaşdırın.
RBAC backend + ayrı-ayrı layihələr/tenantlar.

Collector filter nümunəsi:
yaml processors:
attributes/redact:
actions:
- key: user. email action: delete
- key: payment. card action: delete

11) Instrumental: sürətli başlanğıc

Node. 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 (Spring)

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)

Go

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) Asinxron: növbələr, şinlər, cron

PRODUCER/CONSUMER 'links' vasitəsilə əlaqə ilə (mesajların öz həyat dövrü var).
Konteksti mesaj başlıqlarına ('traceparent '/' baggage') təşviq edin.
batch-consume ilə mesaja span yaradın və ya 'messaging' atributu ilə yığın. batch. size`.
cron/jobs üçün: başlanğıc + links üçün yeni trace (əgər varsa).

13) Baggage və hədəfləmə

Minimum sabit açarları ('tenant _ id', 'region', 'vip _ tier') baggage-də saxlayın; PII qadağan.
Seqmentlər üzrə metrlərin daha sonra yığılması üçün gateway/gateway-logger vasitəsilə atın.

14) Relizlər və SLO Gating ilə inteqrasiya

Kanarya addımları → marşrutlar/üz seqmentləri üzrə 'traces _ spanmetrics _' yoxlayın.
Deqradasiya zamanı (5xx/p95) - avtomatik dayanma və geri dönmə (Argo Rollouts AnalysisTemplate + PromQL).
Metrlərdən nümunələr birbaşa buraxılış intervalının «pis» marşrutlarına aparır.

15) Limitlər və performans

Ограничивайте: `OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT`, `OTEL_SPAN_EVENT_COUNT_LIMIT`, `OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT`.
Ehtimallara/tezliyə görə/stacktrace istisnalarını sample.
SDK və Collector-da Batch prosessor; sıçrayışlarda izləri itirməmək üçün növbələr saxlayın.

16) Uyğunluq və miqrasiya

Təbliğatçılar: W3C istifadə edin; miqrasiyada B3/X-Ray oxumağı dəstəkləyin (dual-propagation).
İxrac: OTLP → APM (Jaeger/Tempo/Elastic/X-Ray və s.).
Semconv sabit versiyaları - 'schemaUrl' qeyd edin və yeniləmələri planlaşdırın.

17) Anti-nümunələr

Atributların yüksək kardinallığı ('user _ id' in label, dinamik açarlar).
'trace _ id' → olmadan qeydlər heç bir korrelyasiya yoxdur.
İnternet APM tətbiqlərindən birbaşa ixrac (gateway olmadan, TLS/mTLS olmadan).
Məhsulda «cəmi» 100% yığım bahalı və mənasızdır.
'db-də istifadəçi məlumatları ilə SQL sorğu dampaları. statement`.
Razılaşdırılmamış xidmət adı/versiyası - metriklər «dağılır».

18) Giriş çek siyahısı (0-45 gün)

0-10 gün

2-3 kritik xidmətlərdə SDK/avtomobil alətlərini işə salın.
TLS ilə Agent (DaemonSet) + Gateway (Deployment), OTLP 4317/4318 konfiqurasiya.
Əlavə edin 'service. name`, `service. version`, `deployment. environment 'hər yerdə.

11-25 gün

Tail-sampling səhvlər/gizli/» pul» marşrutları.
SpanMetrics → Prometheus, Exemplars və RED/SLO dashboard daxil.
API/NGINX/mesh vasitəsilə W3C təbliğatı; qeydləri əlaqələndirmək.

26-45 gün

Növbələri əhatə etmək/BD/cache; async üçün links.
Collector-da PII redaksiya siyasəti; SDK-da atribut limitləri.
SLO-geytinq buraxılışları və avtomatik geri dönüş inteqrasiya.

19) Yetkinlik metrikası

Daxil olan sorğuların əhatə dairəsi 95% ≥ (sampling head/tail daxil olmaqla).
Exemplars ilə metriklərin payı ≥ 80%.
RCA vaxtı «metrikdən trasa» ≤ 2 dəq (p50).
Atributlarda/hadisələrdə 0 PII sızması (skaner).
Bütün xidmətlər 'service var. name/version/environment 'və razılaşdırılmış semantika.

20) Proqramlar: faydalı fraqmentlər

NGINX təbliğatı:
nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;
proxy_set_header baggage   $http_baggage;
Prometheus с Exemplars (Grafana):

histogram_quantile(0. 95, sum(rate(traces_spanmetrics_duration_bucket{route="/withdraw"}[5m])) by (le))

Policy: PII atributlarının qadağan edilməsi (psevdo-linter)

yaml forbid_attributes:
- user. email
- payment. card
- personal.

21) Nəticə

OpenTelemetry müşahidə standartlaşdırılmış, idarə olunan kontura çevirir: vahid semantika, təhlükəsiz təbliğat, ağıllı sampling və metrik və log ilə güclü korrelyasiya. Agent + gateway qurun, tail-sampling, spanmetrics və Exemplars əlavə edin, PII və kardinallığı izləyin - və izləmə yalnız hata ayıklama üçün deyil, həm də hər buraxılışda MTTR və riskləri azaldan SRE/Release avtomatlaşdırılmış həllər üçün bir vasitə olacaq.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

Telegram
@Gamble_GC
İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.