GH GambleHub

분산 추적

(섹션: 기술 및 인프라)

간략한 요약

분산 추적은 게이트웨이, API, 대기열, 데이터베이스, 외부 제공 업체 (PSP/게임 스튜디오) 를 통해 요청 경로를 따라 시간이 어디에서, 왜 손실되는지에 대한 답변을 제공합니다. OpenTelemetry (OTel) 는 트레일, 메트릭 및 로그를 결합한 개방형 SDK/에이전트/프로토콜 표준입니다. iGaming에서는 p95/p99를 유지하고 결제 문제를 신속하게 현지화하며 피크 토너먼트 전에 병목 현상을 식별하는 기본 도구입니다.

1) OTel 개념

추적-작업의 전체 경로 (예금, 요율, 인출).
스팬 - 작업 영역 (TP 핸들러, SQL 요청, 대기열/공급자 호출).
속성-세부 정보가있는 값 키 ('net. 동료. 이름 ',' db. 시스템 ',' psp. 경로 ').
이벤트 - 인스턴트 이벤트 (후퇴, 타임 아웃, 캐시 미스).
링크-다른 흔적에 대한 링크 (async/큐에 중요).
리소스 - 프로세스 메타데이터: '서비스. 이름 ',' 서비스. 버전 '', 배포 환경 ',' 구름. 지역 '.

2) 상황 전파

W3C 추적 컨텍스트 사용:

traceparent: 00-<trace_id>-<span_id>-01 tracestate:...

또한 보안 키 용 수하물 (예: '테넌트', '경로') 에는 PII가 없습니다.

컨텍스트를 뚫을 수있는 곳: API 게이트웨이 → 내부 RPC → 생산자 → 대기열 → 외부 TH (PSP/공급자).

3) 시맨틱 컨벤션 (필수 최소)

HTP/RPC: 'http. 방법 '', http. 경로 ',' http. 상태 _ 코드 '.
DB/캐시: 'db. 시스템 '(' mysql '/' postgresql '/' redis '),' db. '(마스크)', db. 작동 '.
대기열: '메시징. 시스템 '(' kafka '/' rabbitmq '),' 메시징. 목적지 ',' 메시징. 작업 '(' 보내기 '/' 프로세스 ').
지불: 'psp. 경로 ',' psp. 공급자 ',' 지불. id '(가명),' 금액 ',' 통화 '.
iGaming 도메인: '게임. 제공자 ',' 게임. 세션 _ id '(해시),' 플레이어. id _ hash '.

단일 분류법 → 대시 보드의 비교 및 원인에 대한 빠른 검색.

4) 샘플링: 데이터에 익사하지 않는 방법

헤드 기반

간단하고 저렴합니다. 일반적인 흐름에 적합합니다.
마이너스-" 흥미로운 "느린/잘못된 트랙을 잃을 수 있습니다.

테일 기반 (달린 수집기)

스팬이 끝난 후 결정이 내려집니다. 오류/느림/중요 세그먼트 (VIP/지불) 만 저장합니다.
생산 부하에 이상적입니다. 높은 정보 컨텐츠로 비용을 크게 줄입니다.

권장 하이브리드:
  • 머리: "배경" 적용 범위는 5-10% 입니다.
  • 꼬리: 100% 오류 + p95 + 느린 + 결제 트랙/카나리아 릴리스.

5) OpenTelemetry Collector 토폴로지

에이전트 사이드카 (각 노드/포드): 로컬 수락, 최소 버퍼, 애그리 게이터로 내보냅니다.
게이트웨이 (클러스터): 테일 샘플링, 라우팅, 농축, Tempo/Jaeger/Zipkin/OTLP 수출.

예: 테일 샘플링 (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' 를 각 로그 항목에 추가합니다.
대기 시간 지표를 히스토그램으로 저장하고 예제를 포함합니다-p95 보켓에서 특정 추적으로의 "점프" 에 대한 대표 'trace _ id' 에 대한 참조.
이벤트/레이블과 같은 릴리스 주석 (Git Ś, 차트 버전).

7) 계측 (언어 및 자동 에이전트)

이동 (수동 + 자동)

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

자바

자동 에이전트 '-javaagent: opentelmetry-javaagent. jar ', env를 통한 설정 (' OTEL _ SERVICE _ Name ',' OTEL _ EXPORTER _ OTLP _ ENDPOINT ').
매뉴얼-양파 장소의 주석/도구 (JDBC 풀, 캐시).

노드. js/파이썬

SDK + 플러그인이있는 자동 도구 (Express/FastAPI/celery).
대기열의 경우-프로듀서/소비자 래퍼가 '메시징' 을 넣습니다. '그리고 링크.

8) 대기열 및 async: 올바른 스팬

프로듀서 ('보내기'): 주제/대기열로 보내려면 스팬입니다.
소비자 ('프로세스'): 링크에서 생산자 범위로의 새로운 메시지 처리 범위 (공통 'trace _ id' 없이 인과 관계 저장).
속성: '메시징. 카프 카. 파티션 ',' 메시징. rabbitmq. 라우팅 _ key ',' 메시징. 메시지 _ id '.
배상으로-이벤트 '재 시도', 시도 카운터.

9) DB/캐시와 N + 1

데이터베이스 드라이버 추적, 동일한 유형의 그룹 쿼리를 배치로 사용하십시오.
Redis/cash의 경우 속성은 '캐시입니다. '/' 캐시를 누르십시오. 그리워 '.
스팬을 분리하기 위해 "무거운" 요청을하십시오-p99 위치를 볼 수 있습니다.

10) 외부 제공 업체: PSP/게임 스튜디오

고객을 감싸십시오: 'psp. 공급자 ',' psp. 경로 ',' 타임 아웃 _ ms ',' 시도 '.
로그 오류 코드/유형이지만 PII (카드 번호, 토큰) 는 아닙니다.
스튜디오/경로를 '지속 시간', '오류율' 로 비교하십시오.

11) 프론트 엔드와 RUM

OTel 웹 SDK: 'page _ view', 'resource _ load', 'xhr'.
UI → API → 데이터베이스를 통해 사용자의 경로를 바느질하기 위해 백엔드에 피어스가 '추적' 되었습니다.
지리/네트워크 제공 업체별 세분화-선택적 레이블.

12) 안전과 PII

필드를 마스크하십시오 ('db. 문장 '편집), 해시' player _ id '.
데이터 영역: 'pii = 참', '지역 = EU/TR/LATAM'.
결제 트랙 (역할 기반) 에 대한 액세스 제어.
WORM/보존: 민감한 추적에 대한 보존 기간, 정책에 의한 삭제.

13) 성능 및 비용

정책에 따른 테일 샘플링: "오류 + 느린 + 지불 + 카나리아 릴리스".
다운 샘플링 히스토그램의 메트릭, 공격적인 로그 중복 제거.
카디널리티 제약: 'user _ id' 를 메트릭 레이블로 쓰지 마십시오.
콜렉터의 버퍼/배치, OTLP 압축.

14) 대시 보드 및 분석

서비스 맵: 서비스 종속성, 오류/대기 시간 착색.
릴리스 비교: 안정적인 카나리아 개정 (p95, 오류율, 지불 conv).
가장 느린 흔적: 경로 '/예금 '을 따라, PSP/지역을 따라 구간.
대기열 지연: 깊은 소비 지연 트랙.

15) 수집기 구성의 예

파이프 라인 (메트릭/트레일/로그, 조각)

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) 런북 (일반적인 시나리오)

A) '결제 아피' 의 p99 성장

1. "최고의 느린 흔적" 을 엽니 다 → 데이터베이스/PSP 스팬에 속합니다.
2. PSP 문제가 경로를 변환하는 경우 배상/타임 아웃을 활성화하십시오.
3. 대기열 '인출' (지연) 을 확인하고 소비자를 늘리십시오.

B) 출시 후 5xx 버그

1. 서비스 별 필터. 버전 '.
2. 안정/카나리아 비교; 'psp에서 스파이크를 찾으십시오. 경로 '.
3. 프로모션 동결, 롤백 (릴리스 전략/롤백 참조).

C) 의심되는 N + 1

1. 짧은 DB 스팬이 많은 트레일.
2. 집계/즐거움을 사용하고 캐시 계층을 추가하십시오.

17) 구현 점검표

1. OTel SDK 사용 및 균일 한 자원 속성 ('서비스. 이름 ',' env ',' region ').
2. 모든 레이어와 대기열을 통해 W3C 추적 컨텍스트를 전파합니다.
3. 최소 시맨틱 속성 세트 (TH/DB/큐/PSP).
4. 꼬리 샘플링: 오류, p95 +, 지불, 카나리아.
5. 'trace _ id '/' span _ id' 가있는 로그, 예시가있는 메트릭.
6. 대시 보드: 서비스 맵, 릴리스 비교, 지불 흐름.
7. PII 정책: 마스킹, 영역, 역할, 보존.
8. 테스트/로드: 피크 전에 추적의 상관 관계 및 완전성을 확인하십시오.
9. 경고에서 런북 링크의 자동 생성.
10. 원격 측정 비용 및 카디널리티 보고서.

18) 안티 패턴

데이터베이스/대기열이없는 "입구에서만" 흔적 → 사용하지 않음.
async → 원인의 전파 부족 및 효과 사슬 파괴.
테일 로직이없는 무작위 1% 샘플링 → 느리게/잘못 잡히지 않습니다.
trace _ id가없는 로그 → 엔드-투-엔드 상관 관계 없음.
속성/로그의 원시 PII → 규정 준수 위험.
카디널리티 "천장까지" (메트릭 라벨로 사용자/세션) → 가치 폭발.

요약

OpenTelemetry는 서로 다른 도구 모음에서 관찰 가능성을 엔드 투 엔드 성능 언어로 전환합니다. 올바른 컨텍스트 전파, 깔끔한 의미론, 테일 샘플링 및 "메트릭 스트레이트 로그" 의 조합으로 iGaming 팀은 p95/p99를 제어하고 병목 현상 (DB, 대기열, PSP) 을 신속하게 분리하며 트래픽 피크에서도 자신있게 릴리스합니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

Telegram
@Gamble_GC
통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.