Distributed Tracing
(Бөлім: Технологиялар және Инфрақұрылым)
Қысқаша түйіндеме
Бөлінген трассалар шлюз, API, кезектер, ДҚ, сыртқы провайдерлер (PSP/ойын студиялары) арқылы сұрау жолындағы уақыт қайда және неліктен жоғалады деген сұраққа жауап береді. OpenTelemetry (OTel) - SDK/агенттердің/хаттаманың ашық стандарты. iGaming-те бұл p95/p99 ұстайтын, төлем проблемаларын тез арада оқшаулайтын және ең жоғары турнирлер алдында «тар жерлерді» анықтайтын негізгі құрал.
1) OTel тұжырымдамалары
Trace - операцияның толық жолы (депозит, мөлшерлеме, шығару).
Span - жұмыс учаскесі (HTTP-хэндлер, SQL-сұрау, кезек шақыру/провайдер).
Attributes - ('net. peer. name`, `db. system`, `psp. route`).
Events - жедел оқиғалар (ретрай, таймаут, кэш-жаңылыс).
Links - басқа жолдармен байланыс (async/queue үшін маңызды).
Resource - процестің метадеректері: 'service. name`, `service. version`, `deployment. environment`, `cloud. region`.
2) Контексті насихаттау
W3C Trace Context бағдарламасын пайдаланыңыз:
traceparent: 00-<trace_id>-<span_id>-01 tracestate:...
Қосымша - қауіпсіз кілттер үшін baggage (мысалы, '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) Сэмплинг: деректерде қалай суға батпау керек
Head-based (сұрау кіреберісінде)
Қарапайым, арзан; жалпы ағын үшін жарамды.
Минус - «қызықты» баяу/қате трассаларды жоғалтуға болады.
Tail-based (в Collector)
Шешім спан аяқталғаннан кейін қабылданады: қателерді/баяу/маңызды сегменттерді (VIP/төлемдер) ғана сақтаймыз.
Прод-жүктеме үшін өте қолайлы: жоғары ақпараттылық кезінде құнды айтарлықтай төмендетеді.
- Head: «фондық» жабын үшін 5-10%.
- Tail: 100% қателер + p95 + баяу + төлем жолдары/канареялық релиздер.
5) OpenTelemetry Collector топологиялары
Agent-сайдкар (әрбір торапта/поезда): жергілікті қабылдау, ең аз буфер, агрегаторға экспорт.
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) Аспаптандыру (тілдер және авто-агенттер)
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
Авто-агент '-javaagent: opentelemetry-javaagent. ('OTEL _ SERVICE _ NAME', 'OTEL _ EXPORTER _ OTLP _ ENDPOINT').
Қолмен - пияз орындарының аннотациялары/құралы (JDBC-пулдар, кэш).
Node. js / Python
SDK + плагині бар авто-құрал (Express/FastAPI/celery).
Кезектер үшін - 'messaging.' және links қою үшін продюсер/консьюмердің орамасы.
8) Кезектер және async: дұрыс ұйықтау
Продюсер ('send'): span топик/кезекке жіберу.
Consumer ('process'): link-ден span-ға жаңа span (жалпы 'trace _ id' -сіз себеп-салдарлық байланысты сақтау).
Төлсипаттар: 'messaging. kafka. partition`, `messaging. rabbitmq. routing_key`, `messaging. message_id`.
Ретраяларда - event 'retry', әрекеттер есептегіші.
9) ДБ/кэш және N + 1
БД драйверлерінің трейсингін қосыңыз, батчиге бір типті сұрауларды топтаңыз.
Redis/кэш үшін - 'cache' төлсипаттары. hit`/`cache. miss`.
«Ауыр» сұрауларды жеке спаналарға шығарыңыз - p99 қайда екенін көруге болады.
10) Сыртқы провайдерлер: PSP/ойын студиялары
HTTP клиенттерін айналдырыңыз: 'psp. provider`, `psp. route`, `timeout_ms`, `attempt`.
PII (карта нөмірі, белгілер) емес, кодтарды/қате түрлерін логин.
'duration', 'error-rate' бойынша студияларды/бағыттарды салыстырыңыз.
11) Фронтенд және RUM
OTel Web SDK: `page_view`, `resource_load`, `xhr`.
UI → API → БД пайдаланушы жолын басып өту үшін 'traceparent' -ті бэкендке тесіңіз.
Желінің гео/провайдерлері бойынша сегменттеу - опциондық лейблдер.
12) Қауіпсіздік және PII
Өрістерді жасырыңыз ('db. statement 'өңдеумен),' player _ id 'хэшін басыңыз.
Деректер аймағы: 'pii = true', 'region = EU/TR/LATAM'.
Төлем трейстерiне қол жеткiзудi бақылау (рөлге негiзделген).
WORM/Retention: сезімтал іздерді сақтау мерзімі, саясат бойынша жою.
13) Өнімділік және құн
Tail-sampling саясаты бойынша: «қателер + баяу + төлемдер + канареялық релиздер».
Downsampling гистограмма метрика, агрессивті дедупликация логов.
Түбірлік шегі: 'user _ id' метрика белгісі ретінде жазылмасын.
Collector буферлері/батчтары, OTLP компрессиясы.
14) Дашбордтар және талдау
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» ашыңыз → ДБ/PSP спандарына кіру.
2. Егер PSP проблемасы болса - маршрутты ауыстыру, ретрацияны/таймауттарды қосу.
3. 'withdrawals' (lag) кезегін тексеру, консумерлерді ұлғайту.
B) 5xx шығарылғаннан кейінгі қателер
1. 'service сүзгісі. version`.
2. Тұрақты/канареялық салыстыру; 'psp. route`.
3. Промоушенді тоқтатып, сырғып тастау («Релиздер стратегиясын «/» Ролбэки »қараңыз).
С) N + 1 күдікті
1. Қысқа DB-спандар саны көп трейстер.
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. Дашбордтар: service map, release compare, payments flow.
7. PII-саясат: бүркемелеу, аймақтар, рөлдер, ретеншн.
8. Тесттер/жүктеме: шыңдар алдында корреляцияны және completeness трейсингті тексеру.
9. Runbook сілтемелерін автогенерациялау.
10. Телеметрия және кардиналдық құны бойынша есеп.
18) Антипаттерндер
ДБ/кезектерсіз «тек кіреберісте» трассировкасы пайдасыз.
async → -да насихаттың жоқтығы себеп-салдарлық байланыстар тізбегін «үзеді».
tail логикасыз кездейсоқ 1% сэмплинг → баяу/қате ұстамаймыз.
'trace _ id' → логтары толассыз корреляцияланбайды.
Атрибуттардағы/логтардағы шикі PII → комплаенс тәуекелдері.
Түбегейлі «төбеге» (метрик лейблі ретінде user/session) → құн жарылысы.
OpenTelemetry бақылануды шашыраңқы құралдар жиынтығынан толассыз өнімділік тіліне айналдырады. Контекст дұрыс насихатталса, ұқыпты семантика, tail-sampling және «трассаның метрикасы» байланыстырылса, iGaming командасы p95/p99-ды бақылауда ұстайды, тар жерлерді (ДБ, кезектер, PSP) жылдам оқшаулайды және трафик пиктеріне де релиздерді сенімді түрде шығарады.