Distributed Tracing
(Бөлүк: Технология жана инфраструктура)
Кыскача резюме
Бөлүштүрүлгөн тректер суроо-талап жолу аркылуу убакыт кайда жана эмне үчүн жоготот деген суроого жооп берет шлюзы, API, кезек, DD, тышкы провайдерлер (PSP/оюн студиялары). OpenTelemetry (OTel) - сооданы, метриканы жана логтерди бириктирген ачык SDK/агенттер/протокол стандарты. iGaming p95/p99 кармап негизги курал болуп саналат, тез төлөм көйгөйлөрүн локалдаштыруу жана жогорку мелдештерге чейин "тар жерлерди" аныктоо.
1) OTel түшүнүгү
Trace - операциянын толук жолу (депозит, коюм, чегерүү).
Span - иш бөлүгү (HTTP-handler, SQL-суроо, кезек чакыруу/провайдер).
Attributes - майда-чүйдөсүнө чейин ('net. peer. name`, `db. system`, `psp. route`).
Events - заматта окуялар (retray, тайм, кэш-ката).
Links - башка жолдор менен байланыш (async/queue үчүн маанилүү).
Resource - процесстин мета-маалыматтары: 'service. name`, `service. version`, `deployment. environment`, `cloud. region`.
2) Контекстти пропагандалоо
W3C Trace Context колдонуу:
traceparent: 00-<trace_id>-<span_id>-01 tracestate:...
Кошумча - коопсуз ачкычтар үчүн багаж (мисалы, 'tenant', 'route'), PIIди ал жакка салбаңыз.
Кайда контекстин бургулоо үчүн: API-шлюз → ички RPC → продюсер кезек → Консьмер → тышкы HTTP (PSP/провайдерлер).
3) Семантикалык конвенциялар (милдеттүү минимум)
HTTP/RPC: `http. method`, `http. route`, `http. status_code`.
DB/кэш: 'db. system` (`mysql`/`postgresql`/`redis`), `db. statement '(жашырылган),' db. operation`.
Кезектер: 'messaging. system` (`kafka`/`rabbitmq`), `messaging. destination`, `messaging. operation` (`send`/`process`).
Төлөмдөр: 'psp. route`, `psp. provider`, `payment. id '(псевдоним),' amount ',' currency '.
iGaming домени: 'game. provider`, `game. session_id` (hash), `player. id_hash`.
Бирдиктүү таксономия → дашборддор салыштыруу жана себептерин тез издөө.
4) Sampling: маалыматтар чөгүп жок кантип
Head-based (суроо кире)
Жөнөкөй, арзан; жалпы агымына ылайыктуу.
Минус - Сиз жогото аласыз "кызыктуу" жай/туура эмес жолдор.
Tail-based (в Collector)
Чечим спан аяктагандан кийин кабыл алынат: каталарды/жай/маанилүү сегменттерди (VIP/төлөмдөрдү) гана сактайбыз.
Прод-жүктөө үчүн идеалдуу: жогорку маалыматтуулук менен бааны бир топ төмөндөтөт.
- Head: "арткы" каптоо үчүн 5-10%.
- Tail: 100% каталар + p95 + жай + төлөм жолдору/канарейка релиздери.
5) Топология OpenTelemetry Collector
Агент-сайдкар (ар бир түйүн/поп): жергиликтүү кабыл алуу, минималдуу буфер, агрегаторго экспорт.
Gateway (кластердик): tail-sampling, багыттоо, байытуу, Tempo экспорттоо/Jaeger/Zipkin/OTLP.
Мисал: tail-sampling (YAML үзүндүсү)
yaml processors:
tailsampling:
decision_wait: 5s policies:
- name: errors type: status_code status_code:
status_codes: [ ERROR ]
- name: slow_p95 type: latency latency:
threshold_ms: 250
- name: payments type: string_attribute string_attribute:
key: service. name values: [ "payments-api", "payments-worker" ]
6) Метриктер жана логдор менен байланыш
Ар бир логин жазууга 'trace _ id '/' span _ id' деп кошуңуз.
Жашыруун көрсөткүчтөрдү гистограмма катары сактаңыз жана exemplars - p95-бокеттен белгилүү бир изге "секирүү" үчүн өкүлчүлүктүү 'trace _ id' шилтемесин киргизиңиз.
Релиздердин аннотациялары (Git SHA, чарттын версиясы) - events/лейблдер сыяктуу.
7) Аспапташтыруу (тилдер жана auto-агенттер)
Go (кол + унаа)
go tp:= sdktrace. NewTracerProvider(
sdktrace. WithBatcher(exporter),
sdktrace. WithResource(resource. NewWithAttributes(
semconv. SchemaURL,
semconv. ServiceName("payments-api"),
)),
)
otel. SetTracerProvider(tp)
ctx, span:= tracer. Start(ctx, "Deposit")
defer span. End()
span. SetAttributes(
attribute. String("psp. route","pspX"),
attribute. String("currency","EUR"),
)
Java
Auto-agent '-javaagent: opentelemetry-javaagent. jar ', аркылуу env (' HOTEL _ SERVICE _ NAME ',' HOTEL _ EXPORTER _ OTLP _ ENDPOINT ').
Кол менен - аннотациялар/пияз жерлеринин куралы (JDBC-пулдар, кэш).
Node. js / Python
SDK + плагиндер менен Auto куралы (Express/FastAPI/celery).
кезектери үчүн - өндүрүүчүсү/консумер 'messaging.' жана шилтемелерди коюу.
8) кезек жана async: туура уктап
Продюсер ('send'): топик/кезекке жөнөтүү үчүн span.
Consumer ('process'): span өндүрүүчүнүн шилтемеден жаңы span кабарды иштетүү (жалпы 'trace _ id' жок себеп-натыйжа байланышын сактоо).
Атрибуттар: 'messaging. kafka. partition`, `messaging. rabbitmq. routing_key`, `messaging. message_id`.
Ретраларда - event 'retry', аракет эсептегич.
9) BD/кэш жана N + 1
BD Trading айдоочуларды күйгүзүү, батчи бир типтеги суроо топтоо.
Redis/кэш үчүн - 'cache атрибуттары. hit`/`cache. miss`.
"Оор" өтүнүчтөрдү өзүнчө уктоого алып - p99 кайда экенин көрүүгө болот.
10) Тышкы провайдерлер: PSP/оюн студиялары
HTTP кардарлары: 'psp. provider`, `psp. route`, `timeout_ms`, `attempt`.
Коддорду/ката түрлөрүн логин, бирок PII эмес (карта номери, токендер).
'duration', 'error-rate' боюнча студияларды/маршруттарды салыштыруу.
11) Frontend жана RUM
OTel Web SDK: `page_view`, `resource_load`, `xhr`.
UI → API → DD колдонуучунун жолуна түшүү үчүн, 'traceparent' -ди артка буруңуз.
Гео/тармак провайдерлери боюнча сегментация - кошумча лейблдер.
12) Коопсуздук жана PII
Талааларды жашыруу ('db. statement 'түзөтүү менен),' player _ id 'деп хэштегиле.
Маалымат зоналары: 'pii = true', 'region = EU/TR/LATAM'.
Тёлёмдёрдън соодасына жеткиликтъълъктъ контролдоо (ролу негизделген).
WORM/Retention: сезимтал изи үчүн сактоо мөөнөтү, саясат боюнча алып салуу.
13) аткаруу жана наркы
Tail-sampling саясат боюнча: "каталар + жай + төлөмдөр + канарейка релиздери".
Downsampling histogram метрика, агрессивдүү тизгин дедупликация.
Кардиналдуулуктун чеги: 'user _ id' метриканын белги катары кирбейт.
Collector, OTLP кысуу менен буферлер/батчи.
14) Dashboard жана талдоо
Service map: кызматтардын көз карандылыгы, каталар/жашыруун боёк.
Release compare: туруктуу vs канарейка текшерүү (p95, error-rate, payments conv).
Top slow traces: маршрут боюнча '/deposit ', PSP/аймак боюнча кесип.
Queue lag: терең керектөө кечигүү менен жолдор.
15) Collector конфигурациясынын мисалдары
Pipelines (метрика/соода/логи, үзүндү)
yaml receivers:
otlp: { protocols: { http: {}, grpc: {} } }
processors:
batch:
memory_limiter:
limit_mib: 1024 spike_limit_mib: 256 attributes/payments:
actions:
- key: "psp. provider"
action: insert value: "pspX"
exporters:
otlp/traces: { endpoint: tempo:4317, tls: { insecure: true } }
otlp/metrics:{ endpoint: prometheus-otlp:4317, tls: { insecure: true } }
otlp/logs: { endpoint: loki-otlp:4317, tls: { insecure: true } }
service:
pipelines:
traces:
receivers: [ otlp ]
processors: [ memory_limiter, batch, tailsampling ]
exporters: [ otlp/traces ]
metrics:
receivers: [ otlp ]
processors: [ batch ]
exporters: [ otlp/metrics ]
logs:
receivers: [ otlp ]
processors: [ batch ]
exporters: [ otlp/logs ]
16) Runbooks (типтүү жагдайлар)
A) өсүшү p99 'payments-api'
1. Ачуу "Top slow traces" → span DD/PSP түшүп.
2. Эгерде PSP көйгөйү - каттамды которуу, ретрацияны/таймауттарды күйгүзүү.
3. Текшерүү кезек 'withdrawals' (lag), көбөйтүүнү.
B) бошотулгандан кийин 5xx каталар
1. Filter 'service. version`.
2. Туруктуу/канарейка салыштыруу; 'psp. route`.
3. Промоушенди тоңдуруп, артка жылдыруу (караңыз: "Релиздер стратегиясы "/" Ролбэки ").
C) N + 1 шектүү
1. көп сандагы кыска DB-span менен соода.
2. Агрегацияны/джойнду күйгүзүү, кэш катмарын кошуу.
17) Киргизүү чек-тизмеси
1. OTel SDK жана бирдиктүү Resource атрибуттарын ('service. name`, `env`, `region`).
2. W3C Trace Context бардык катмарлары жана кезек аркылуу үгүттөө.
3. Семантикалык атрибуттардын минималдуу топтому (HTTP/DB/queue/PSP).
4. Tail-sampling: каталар, p95 +, төлөмдөр, канар.
5. 'trace _ id '/' span _ id' менен логдор, exemplars менен метриктер.
6. Dashbord: service map, release compare, payments flow.
7. PII-саясат: маскировка, зоналар, ролдору, retenshn.
8. Тесттер/жүктөө: чокуларынын алдында байланышты жана completeness Trace текшерүү.
9. Автогенерация runbook-шилтемелер alerts.
10. Телеметрия жана кардиналдык наркы боюнча отчет.
18) Антипаттерндер
Tracking DD/кезек жок "гана кире" → эч кандай пайдасы жок.
Жок пропаганда async → "жарылып" себептик байланыштар чынжыр.
Sampling кокусунан 1% tail логикасы жок → жай/туура эмес кармоо.
'trace _ id' → жок Логи аркылуу корреляция жок.
Чийки PII атрибуттар/логдор → комплаенс тобокелдиктер.
кардиналдуулук "шыпта" (колдонуучу/session белги метрик катары) → жарылуу наркы.
Натыйжалары
OpenTelemetry ар түрдүү инструменттердин жыйындысы аткаруу тилине байкоо бурат. Контекстти туура үгүттөө менен, так семантика, tail-sampling жана бир катар "метрика тректерин" iGaming командасы p95/p99 көзөмөлүндө кармап, тар жерлерди тез изоляциялайт (DD, кезек, PSP) жана трафиктин туу чокуларында да ишенимдүү релиздерди чыгарат.