GH GambleHub

Distributed Tracing: OpenTelemetry

Distributed Tracing: OpenTelemetry

1) Эмне үчүн OTEL жана ал берет

OpenTelemetry (OTel) - бир OTLP протоколу менен телеметрия (Trace, метрика, Логи) үчүн ачык стандарт жана SDK/агенттер/жыйноочулар топтому. Максаттары:
  • Сурам жолдорунун толук көрүнүшү (gateway → кызматтар → DD/кэш/кезек).
  • Fast RCA/деградацияларды жана релиздерди оңдоо (канарейка/көк-жашыл).
  • SLO жана auto-rebound менен байланыш (маалыматтар боюнча иш чечимдер).
  • Vendor-Agnosticity: бир APM шилтеме жок, ар кандай арткы экспорт.

Колдоо негиздери: standardize, sample smart, secure by default, correlate everything.

2) Негиздери: контекст, спандар, атрибуттар

Trace - дарак/чакыруу тилкеси; Span - операция (RPC, SQL, кезек чакыруу).
Span Kind: `SERVER`, `CLIENT`, `PRODUCER`, `CONSUMER`, `INTERNAL`.
W3C Trace Context: 'traceparent', 'tracestate' аталыштары; контекст кызмат аралык которулат.
Attributes - ачкыч мааниси (төмөн кардиналдуулук!), Events - убакыт белгилери, Status - код/ката баяндоо.
Links - катуу иерархия тышкары span байланыш (async/fan-out/fan-in үчүн маанилүү).

Span аталышы:
  • HTTP: 'HTTP {METHOD}' ('GET/withdraw' атрибут катары)
  • DB: `DB SELECT` / `DB INSERT`
  • Queue: `QUEUE publish topic=X` / `QUEUE consume topic=X`

3) Семантикалык макулдашуулар (semconv)

Туруктуу атрибуттардын схемаларын колдонуңуз:
  • HTTP/GRPC: `http. method`, `http. route`, `http. status_code`, `url. full`.
  • DB: `db. system=postgresql`, `db. statement '(коопсуз кысуу гана!),' db. name`.
  • Messaging: `messaging. system=kafka`, `messaging. operation=receive`, `messaging. destination`.
  • Cloud/K8s/Host: `cloud. region`, `k8s. pod. name`, `container. id`.
  • Resource attributes (милдеттүү): 'service. name`, `service. version`, `deployment. environment`.

Схеманын туруктуулугун SDK/Collector ресурстарында 'schemaUrl' аркылуу көрсөтүңүз.

4) Sampling: head, tail, adaptive

Head-based (SDK): алдын ала чечет, арзан; жогорку-QPS үчүн жакшы, бирок "кызыктуу" жолдорду сагынам болот.
Tail-based (Collector): трек аяктагандан кийин чечет; статусу, латенттүүлүгү, атрибуттары боюнча эрежелерди берет.
Adaptive/Динамикалык: p95 каталар/өсүү менен сэмплдин үлүшүн жогорулатат.

Прод-деңгээл рецепт: Head 1-5% глобалдык + Tail тандоо "маанилүү": 'status = ERROR', 'latency> p95', "акча жолдору", PSP/KYC каталар.

5) Корреляция: метрика, Логи, соода

Exemplars: 'trace _ id' белгилери гистограммда метрика (трассага тез секирүү).
Логи: 'trace _ id '/' span _ id' кошуу жана логдордон трассага өтүү.
SpanMetrics (processor): SLO/alerts үчүн RED-метрика ('requests, errors, duration') жолдорун бириктирет.

6) жайгаштыруу архитектурасы

Agent (DaemonSet) ар бир түйүн арыз чогултат (OTLP) жана алдыга.
Gateway (Cluster/Region) - борбордук Collector (көп репликалар) багыттоо/sampling/байытуу пайплайндар менен.
OTLP: gRPC `4317`, HTTP `4318`; TLS/mTLS кирет.

Артыкчылыктары "агент + gateway": изоляция, буферизация, жергиликтүү backpressure, жөнөкөйлөтүлгөн тармак.

7) OpenTelemetry Collector - негизги шаблон (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 үчүн SpanMetrics жана RED

иштетүү кошуу:
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] }

Азыр SLO/alerts үчүн 'traces _ spanmetrics _ calls {service, route, code}' жана 'duration _ bucket' бар.

9) K8s: жайылтуу Collector (DaemonSet + Deployment)

Агент (DaemonSet) үзүндүсү:
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) - бир нече реплика, ClusterIP/Ingress кызматы, CPU/QPS боюнча HPA.

10) Коопсуздук жана купуялык

TLS/mTLS между SDK → Agent → Gateway → Backend.
Gateway киришиндеги аутентификация (Basic/OAuth/Headers); келип чыгышын чектөө.
PII редакциясы: атрибуттарды чыпкалоо/жашыруу ('user. email ',' card. ') Collector процессорунда.
Лимиттер: SDKда окуянын өлчөмүн/атрибуттардын санын чектеңиз (кардиналдуулуктан коргоо).
RBAC Backend + долбоорлор/тенанттар өзүнчө неймспейс.

Collector чыпкасы мисал:
yaml processors:
attributes/redact:
actions:
- key: user. email action: delete
- key: payment. card action: delete

11) Instrumentation: тез баштоо

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) Асинхрондук: кезек, шиналар, cron

PRODUCER/CONSUMER 'links' аркылуу байланыш менен (билдирүүлөрдүн өзүнүн жашоо цикли бар).
Контекстти билдирүү аталыштарына жайылтуу ('traceparent '/' baggage').
batch-consume менен билдирүү боюнча span түзүү же 'messaging атрибуту менен бириктирүү. batch. size`.
cron/Jobs үчүн: баштапкы иш-чаралар үчүн жаңы trace + links (бар болсо).

13) Багаж жана максаттуу

Минималдуу туруктуу ачкычтарды ('tenant _ id', 'region', 'vip _ tier') сактаңыз; тыюу PII.
Сегменттер боюнча метриктерди андан ары бириктирүү үчүн gateway/gateway-логгер аркылуу ыргытыңыз.

14) релиздер жана SLO-Gating менен бириктирүү

Канарейка кадамдары → каттамдар/жуз-сегменттер боюнча 'traces _ spanmetrics _' текшерүү.
Деградацияда (5xx/p95) - авто-токтоо жана артка кайтуу (Argo Rollouts AnalysisTemplate + PromQL).
Метрикадан алынган нускалар түздөн-түз релиздик интервалдын "жаман" жолдоруна алып барат.

15) Лимиттер жана аткаруу

Ограничивайте: `OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT`, `OTEL_SPAN_EVENT_COUNT_LIMIT`, `OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT`.
ыктымалдыгы/жыштыгы боюнча/stacktrace өзгөчөлүктөрүн Sample.
SDK жана Collector боюнча Batch процессору; кезек күтүңүз.

16) шайкештик жана миграция

Пропагандисттер: W3C колдонуу; миграцияда B3/X-Ray окууга колдоо көрсөтүү (dual-propagation).
Экспорт: OTLP → APM (Jaeger/Tempo/Elastic/X-Ray ж.б.).
Туруктуу semconv версиялары - 'schemaUrl' жаздырып, жаңылоону пландаштырыңыз.

17) Анти-үлгүлөрү

Атрибуттардын жогорку кардиналдуулугу ('user _ id' in label, динамикалык ачкычтар).
'trace _ id' → жок Логи эч кандай корреляция.
түздөн-түз Интернет APM тиркемелеринен экспорттоо (gateway жок, TLS/mTLS жок).
100% "гана" чогултуу - кымбат жана маанисиз.
SQL-суроо дампалары 'db' колдонуучунун маалыматтары менен. statement`.
Кызматтын макулдашылбаган аталышы/версиясы - метриктер "чачыранды".

18) киргизүү чек-тизмеси (0-45 күн)

0-10 күн

SDK/автоинструменттерди 2-3 маанилүү кызматтарга киргизүү.
Агент (DaemonSet) + Gateway (Deployment), TLS менен OTLP 4317/4318.
Кошуу 'service. name`, `service. version`, `deployment. environment 'бардык жерде.

11-25 күн

Tail-sampling каталар/жашыруун/" акча" жолдору боюнча.
SpanMetrics → Prometheus, Exemplars жана dashboard RED/SLO камтыйт.
W3C API/NGINX/mesh аркылуу үгүттөө; Логторду корреляциялоо.

26-45 күн

кезектерди жабуу/DD/кэш; async үчүн шилтемелер.
Collector боюнча PII редактордук саясат; SDKдагы атрибуттардын лимиттери.
SLO-Gating релиздерди жана Auto-кайра бириктирүү.

19) Жетилүү метрикасы

Келген суроо-талаптарды 95% ≥ (sampling head/tail эске алуу менен) менен жабуу.
Exemplars менен метриктердин үлүшү ≥ 80%.
Убакыт RCA "жол метрикадан" ≤ 2 мин (p50).
0 атрибуттар/окуялар PII агып (сканер).
Бардык кызматтарда 'service бар. name/version/environment 'жана макулдашылган семантика.

20) Тиркемелер: пайдалуу үзүндүлөр

NGINX үгүт:
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))

Саясат: PII атрибуттарга тыюу салуу (псевдо-линтер)

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

21) Корутунду

OpenTelemetry стандартташтырылган, башкарылуучу контурга байкоо бурат: бирдиктүү семантика, коопсуз пропаганда, акылдуу сэмплинг жана метриктер жана логдор менен күчтүү корреляция. Агентти + gateway куруу, tail-sampling, spanmetrics жана Exemplars кошуу, PII жана кардиналдуулугун карап - жана tracking жөндөө үчүн гана эмес, ошондой эле автоматташтырылган SRE/Release чечимдер үчүн курал болуп калат, MTTR жана ар бир бошотуу тобокелдиктерди кыскартуу.

Contact

Биз менен байланышыңыз

Кандай гана суроо же колдоо керек болбосун — бизге кайрылыңыз.Биз дайым жардам берүүгө даярбыз!

Telegram
@Gamble_GC
Интеграцияны баштоо

Email — милдеттүү. Telegram же WhatsApp — каалооңузга жараша.

Атыңыз милдеттүү эмес
Email милдеттүү эмес
Тема милдеттүү эмес
Билдирүү милдеттүү эмес
Telegram милдеттүү эмес
@
Эгер Telegram көрсөтсөңүз — Emailден тышкары ошол жактан да жооп беребиз.
WhatsApp милдеттүү эмес
Формат: өлкөнүн коду жана номер (мисалы, +996XXXXXXXXX).

Түшүрүү баскычын басуу менен сиз маалыматтарыңыздын иштетилишине макул болосуз.