GH GambleHub

Distributed Tracing: OpenTelemetry

Distributed Tracing: OpenTelemetry

1) Неге OTel және ол не береді

OpenTelemetry (OTel) - ашық стандарт және OTLP бірыңғай хаттамасымен телеметрияға (трейстер, метриктер, логтар) арналған SDK/агенттер/коллекторлар жиынтығы. Мақсаттары:
  • Сұрау жолдарының толассыз көрінуі (gateway → сервистер → ДБ/кэш/кезек).
  • Тез RCA/деградациялар мен релиздерді жөндеу (канарейка/blue-green).
  • SLO және авто-кері қайтарумен байланыстыру (деректердегі операциялық шешімдер).
  • Вендор-агностикалық: бір 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 - қатаң иерархиядан тыс спан байланысы (async/fan-out/fan-in үшін маңызды).

Спандарды атау:
  • 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`.

Схеманың тұрақтылығын 'schemaUrl' арқылы SDK/Collector ресурстарында көрсетіңіз.

4) Сэмплинг: head, tail, adaptive

Head-based (SDK-да): алдын ала, арзан шешеді; high-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 (көптеген репликалар).
OTLP: gRPC `4317`, HTTP `4318`; TLS/mTLS қосыңыз.

«agent + 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/алерттер үшін 'traces _ spanmetrics _ calls {service, route, code}' және 'duration _ bucket' бар.

9) K8s: Collector (DaemonSet + Deployment)

Agent (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) - бірнеше реплика, Service ClusterIP/Ingress, CPU/QPS бойынша HPA.

10) Қауіпсіздік және құпиялылық

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

Collector сүзгісінің мысалы:
yaml processors:
attributes/redact:
actions:
- key: user. email action: delete
- key: payment. card action: delete

11) Аспаптау: жылдам бастау

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

'links' арқылы байланысы бар PRODUCER/CONSUMER (хабарлардың өз өмірлік циклі бар).
Мәтінмәнді хат тақырыптарына ('traceparent '/' baggage') жылжытыңыз.
batch-consume кезінде хабарды спан бойынша жасаңыз немесе 'messaging' төлсипатымен біріктіріңіз. batch. size`.
cron/jobs үшін: бастапқы оқиғаларға + links қосу үшін жаңа trace (бар болса).

13) Baggage және таргетинг

Ең аз тұрақты кілттерді ('tenant _ id', 'region', 'vip _ tier') baggage ішінде сақтаңыз; PII тыйым салыңыз.
Кейіннен сегменттер бойынша метриктерді біріктіру үшін gateway/gateway логгері арқылы лақтырыңыз.

14) Релиздермен және SLO-гейтингпен интеграциялау

Канареялық қадамдар → маршруттар/юз-сегменттер бойынша '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 ерекшеліктерін сэмплеңіз.
SDK және Collector-дағы Batch-процессор; жарылыс кезінде трассаны жоғалтпау үшін кезек күтіңіз.

16) Үйлесімділік және көші-қон

Насихатшылар: W3C пайдаланыңыз; көші-қон кезінде B3/X-Ray оқуды қолдаңыз (dual-propagation).
Экспорт: OTLP → APM (Jaeger/Tempo/Elastic/X-Ray және т.б.).
Тұрақты semconv нұсқалары - 'schemaUrl' тіркеп, жаңартуларды жоспарлаңыз.

17) Қарсы үлгілер

Атрибуттардың жоғары түбегейлілігі ('user _ id' в label, динамикалық кілттер).
'trace _ id' → жоқ логтар корреляциясы жоқ.
Тікелей бағдарламалардан APM-ге экспорттау (gateway жоқ, TLS/mTLS жоқ).
Өнімдегі «бар болғаны» 100% жинау - қымбат және мағынасыз.
'db' ішіндегі пайдаланушы деректері бар SQL сұраулар дамбалары. statement`.
Сервистің/нұсқаның келісілмеген атауы - метрика «шашырайды».

18) Енгізу чек-парағы (0-45 күн)

0-10 күн

2-3 маңызды сервистерде SDK/автоинструментті қосу.
TLS арқылы Agent (DaemonSet) + Gateway (Deployment), OTLP 4317/4318 баптау.
'service қосу. name`, `service. version`, `deployment. environment 'барлық жерде.

11-25 күн

Tail-sampling қателер/жасырындылық/» ақшалай» бағыттар бойынша.
SpanMetrics → Prometheus, Exemplars және RED/SLO дашбордтарын қосыңыз.
W3C-ны API-шлюз/NGINX/mesh арқылы насихаттау; логтарды корреляциялау.

26-45 күн

Кезектерді жабу/ДБ/кэш; async үшін links.
Collector бағдарламасындағы PII-редакция саясаты; SDK-дегі атрибуттар лимиттері.
SLO-гейтинг релиздері мен авто-кері қайтаруды біріктіру.

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

Policy: PII атрибуттарына тыйым салу (псевдо-линтер)

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

21) Қорытынды

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

Contact

Бізбен байланысыңыз

Кез келген сұрақ немесе қолдау қажет болса, бізге жазыңыз.Біз әрдайым көмектесуге дайынбыз!

Telegram
@Gamble_GC
Интеграцияны бастау

Email — міндетті. Telegram немесе WhatsApp — қосымша.

Сіздің атыңыз міндетті емес
Email міндетті емес
Тақырып міндетті емес
Хабарлама міндетті емес
Telegram міндетті емес
@
Егер Telegram-ды көрсетсеңіз — Email-ге қоса, сол жерге де жауап береміз.
WhatsApp міндетті емес
Пішім: +ел коды және номер (мысалы, +7XXXXXXXXXX).

Батырманы басу арқылы деректерді өңдеуге келісім бересіз.