Distributed Tracing
(Bo’lim: Texnologiyalar va infratuzilma)
Qisqacha xulosa
Taqsimlangan trassalar shlyuz, API, navbatlar, DB, tashqi provayderlar (PSP/oʻyin studiyalari) orqali soʻrov yoʻlida vaqt qayerda va nima uchun yoʻqoladi degan savolga javob beradi. OpenTelemetry (OTel) - treys, metrika va loglarni birlashtiruvchi SDK/agentlar/protokolning ochiq standarti. iGaming’da p95/p99’ni ushlab turish, to’lov muammolarini tezda mahalliylashtirish va eng yuqori darajadagi musobaqalar oldidan «tor joylarni» aniqlash uchun asosiy vositadir.
1) OTel konsepsiyalari
Trace - operatsiyaning to’liq yo’li (depozit, stavka, hisobdan chiqarish).
Span - ish uchastkasi (HTTP-xandler, SQL-so’rov, navbat/provayderni chaqirish).
Attributes - tafsilotli kalit qiymati (’net. peer. name`, `db. system`, `psp. route`).
Events - tezkor hodisalar (retray, taymaut, kesh-xato).
Links - boshqa treklar bilan aloqa (async/queue uchun muhim).
Resource - jarayonning meta maʼlumotlari:’service. name`, `service. version`, `deployment. environment`, `cloud. region`.
2) Kontekst targ’iboti
W3C Trace Context yordamida:
traceparent: 00-<trace_id>-<span_id>-01 tracestate:...
Qo’shimcha - xavfsiz kalitlar uchun baggage (masalan,’tenant’,’route’), u erga PII qo’ymang.
Kontekstni qayerda ochish mumkin: API-shlyuz → ichki RPC → prodyuser → konsumer → tashqi HTTP (PSP/provayderlar).
3) Semantik konvensiyalar (majburiy minimal)
HTTP/RPC: `http. method`, `http. route`, `http. status_code`.
DB/kesh:’db. system` (`mysql`/`postgresql`/`redis`), `db. statement’(yashirin),’db. operation`.
Navbatlar:’messaging. system` (`kafka`/`rabbitmq`), `messaging. destination`, `messaging. operation` (`send`/`process`).
To’lovlar:’psp. route`, `psp. provider`, `payment. id’(taxallus),’amount’,’currency’.
iGaming domeni:’game. provider`, `game. session_id` (hash), `player. id_hash`.
Yagona taksonomiya → dashbordlarning taqqoslanishi va sabablarni tezda izlash.
4) Sampling: ma’lumotlarga qanday cho’kib ketmaslik kerak
Head-based (soʻrov kirish joyida)
Oddiy, arzon; umumiy oqim uchun mos keladi.
Minus - siz «qiziqarli» sekin/noto’g’ri trassalarni yo’qotishingiz mumkin.
Tail-based (в Collector)
Qaror spanlar tugagandan so’ng qabul qilinadi: xatolar/sekin/muhim segmentlarni (VIP/to’lovlar) saqlaymiz.
Oziq-ovqat yuklamasi uchun ideal: yuqori ma’lumotga ega bo’lganda narxni keskin pasaytiradi.
- Head: «fon» qoplamasi uchun 5-10%.
- Tail: 100% xato + p95 + sekin + to’lov trassalari/kanar relizlari.
5) OpenTelemetry Collector topologiyalari
Agent-saidkar (har bir uzel/poda): lokal qabul qilish, minimal bufer, agregatorga eksport qilish.
Gateway (klaster): tail-sampling, marshrutizatsiya, boyitish, Tempo/Jaeger/Zipkin/OTLP ga eksport qilish.
Misol: tail-sampling (YAML parchasi)
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) Metriklar va loglar bilan korrelyatsiya
Har bir log yozuviga’trace _ id ’/’ span _ id’qoʻshing.
Maxfiylik metriklarini gistogramma sifatida saqlang va exemplars - p95-boketdan aniq izga sakrash uchun reprezentativ’trace _ id’ga havolani yoqing.
Relizlar izohlari (Git SHA, chart versiyasi) - events/leybllar kabi.
7) Instrumentalizatsiya (tillar va avtoagentlar)
Go (qoʻl + avto)
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
Avtoagent’-javaagent: opentelemetry-javaagent. jar’, orqali env (’HOTEL _ SERVICE _ NAME’,’HOTEL _ EXPORTER _ OTLP _ ENDPOINT’).
Qo’lda - piyoz joylarining izohlari/asbobi (JDBC-pullar, kesh).
Node. js / Python
SDK + plaginlar (Express/FastAPI/celery) bilan avtoinstrument.
Navbatlar uchun prodyuser/konsumerning’messaging.’va links’ni qo’yish uchun o’ralgan.
8) Navbatlar va async: to’g "ri uyqular
Prodyuser (’send’): topik/navbatga jo’natish uchun span.
Konsumer (’process’): linkdan span-prodyuserga xabarni qayta ishlash uchun yangi span (umumiy’trace _ id’bo’lmasdan sababiy aloqani saqlash).
Atributlar:’messaging. kafka. partition`, `messaging. rabbitmq. routing_key`, `messaging. message_id`.
Retrajlarda - event’retry’, urinishlar hisoblagichi.
9) DB/kesh va N + 1
BD drayverlarining treysingini yoqing, bir xil turdagi so’rovlarni batchlarga guruhlang.
Redis/kesh uchun’cache’atributlari. hit`/`cache. miss`.
«Og’ir» so’rovlarni alohida uyalarga olib boring - p99 qayerdaligini ko’rishingiz mumkin.
10) Tashqi provayderlar: PSP/o’yin studiyalari
HTTP mijozlarini aylantiring:’psp. provider`, `psp. route`, `timeout_ms`, `attempt`.
Xato kodlari/turlarini kiriting, lekin PII (karta raqami, tokenlar) emas.
’duration’,’error-rate’bo’yicha studiyalarni/yo’nalishlarni solishtiring.
11) Frontend va RUM
OTel Web SDK: `page_view`, `resource_load`, `xhr`.
UI → API → DB’dan foydalanish uchun’traceparent’ni orqa tomonga buring.
Tarmoq geo/provayderlari bo’yicha segmentatsiya - opsion yorliqlar.
12) Xavfsizlik va PII
Maydonlarni yashiring (’db. statement’tahrirlangan holda), xeshlashing’player _ id’.
Maʼlumotlar zonasi:’pii = true’,’region = EU/TR/LATAM’.
To’lovlar treyslaridan foydalanishni nazorat qilish (rolga asoslangan).
WORM/Retention: sezgir izlar uchun saqlash muddatlari, siyosat boʻyicha olib tashlash.
13) Unumdorlik va qiymat
Siyosat bo’yicha Tail-sampling: «xatolar + sekin to’lovlar + kanar relizlari».
Downsampling gistogramm metrik, agressiv de-duplikatsiyasi.
Kardinallikni cheklash:’user _ id’ni metrika yorlig’i sifatida yozib qo’ymaslik.
Collector’da bufer/batchi, OTLP kompresssiyasi.
14) Dashbordlar va tahlil
Service map: xizmatlarga bogʻliqlik, xato/yashirin boʻyoq.
Release compare: barqaror vs kanareya taftishi (p95, error-rate, payments conv).
Top slow traces: ’/deposit’yo’nalishi bo’yicha, PSP/mintaqa bo’yicha kesma.
Queue lag: iste’mol qilish kechiktirilgan trassalar.
15) Collector konfiguratsiyasining namunalari
Pipelines (metriklar/treyslar/loglar, parcha)
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 (namunaviy stsenariylar)
A)’payments-api’da p99 ning o’sishi
1. «Top slow traces» ni ochish → DB/PSP spanlariga tushish.
2. Agar PSP muammosi bo’lsa - yo’nalishni o’zgartirish, retray/taymautlarni yoqish.
3. ’withdrawals’ (lag) navbatini tekshirish, konsumerlarni koʻpaytirish.
B) Chiqarilgandan keyingi xatolar 5xx
1. ’service’ filteri. version`.
2. Barqaror/kanareykani solishtirish; ’psp’ dagi paypalarni topish. route`.
3. Promoushenni muzlatish, orqaga qaytarish («Reliz strategiyasi «/» Rolbeki »ga qarang).
C) N + 1 ga shubha
1. Qisqa DB spanlari ko’p bo’lgan treyslar.
2. Agregatsiyani/joylarni yoqish, kesh qatlamini qoʻshish.
17) Joriy etish chek-varaqasi
1. OTel SDK va yagona Resource atributlarini kiriting (’service. name`, `env`, `region`).
2. Barcha qatlam va navbatlar orqali W3C Trace Context targʻiboti.
3. Minimal semantik atributlar toʻplami (HTTP/DB/queue/PSP).
4. Tail-sampling: xatolar, p95 +, to’lovlar, kanar.
5. ’trace _ id ’/’ span _ id’ loglari, exemplars metrikalari.
6. Dashbordlar: service map, release compare, payments flow.
7. PII-siyosat: niqoblash, zonalar, rollar, retenshn.
8. Test/yuk: cho’qqilar oldidan treysingning korrelyatsiyasi va completenessini tekshirish.
9. Runbook havolalarini alertalarda avtogeneratsiya qilish.
10. Telemetriya va kardinallik qiymati bo’yicha hisobot.
18) Antipatternlar
DB/navbatlarsiz «faqat kirish joyida» trassalari foydasiz.
Async → da targ’ibot yo’qligi sababiy bog’liqlik zanjirlarini «yirtib tashlaydi».
Sampling tasodifiy 1% tail-mantiqsiz → sekin/noto’g’ri tutmang.
’trace _ id’ → bilan bogʻlanish yoʻq.
Atributlar/loglardagi xom PII → komplayens xavfi.
«Shiftga» (metrik yorliq sifatida user/session) → qiymat portlashi.
Yakunlar
OpenTelemetry ko’rinishni turli xil asboblar to’plamidan unumdorlik tiliga aylantiradi. Kontekstni to’g’ri targ’ib qilish, aniq semantika, tail-sampling va «trassaning metrikasi» bog’lamasi bilan iGaming jamoasi p95/p99 ni nazorat ostida ushlab turadi, tor joylarni tezda izolyatsiya qiladi (BD, navbatlar, PSP) va hatto trafik cho’qqilariga ham relizlarni ishonchli ravishda chiqaradi.