GH GambleHub

분산 추적: OpenTelemetry

분산 추적: OpenTelemetry

1) 왜 OTel과 그것이주는 것

OpenTelemetry (OTel) 는 단일 OTLP 프로토콜을 사용하여 원격 측정 (트레일, 메트릭, 로그) 을위한 개방형 표준 및 SDK/에이전트/수집기 세트입니다. 목표:
  • 요청 경로의 종단 간 가시성 (게이트웨이 → 서비스 → DB/캐시/대기열).
  • 빠른 RCA/디버그 저하 및 릴리스 (카나리아/청록색).
  • SLO 및 자동 롤백 (데이터 기반 운영 솔루션) 으로 연결하십시오.
  • 공급 업체 불가지론: 하나의 APM에 바인딩하지 않고 모든 백엔드로 내보냅니다.

참조 원칙: 표준화, 스마트 샘플, 기본적으로 보안, 모든 것과 관련이 있습니다.

2) 기본: 컨텍스트, 스팬, 속성

추적-호출 트리/그래프; 스팬 - 작동 (RPC, SQL, 대기열 호출).
스팬 종류: 'SERVER', 'CLIENT', 'PRODUCER', 'CONSUMER', 'INTERNAL'.
W3C 추적 컨텍스트: 'traceparent', 'tracestate' 헤더; 컨텍스트는 서비스를 제공합니다.
속성-키 값 (낮은 카디널리티!), 이벤트-타임 스탬프, 상태-오류 코드/설명.
링크-링크는 엄격한 계층 외부에 있습니다 (async/fan-out/fan-in에 중요).

스팬 이름 지정:
  • 모든 편지 선택 (c)
  • DB: 'DB SELECT '/' DB INSERT'
  • 대기열: 'QUEUE 게시 주제 = X '/' QUEUE 소비 주제 = X'

3) 시맨틱 컨벤션 (semconv)

안정적인 속성 스키마 사용:
  • HTP/GRPC: 'http. 방법 '', http. 경로 ',' http. (PHP 3 = 3.0.6, PHP 4) 전체 '.
  • DB: 'db. 시스템 = postgresql ',' db. '(안전 짜기 만!)', db. 이름 '.
  • 메시징: '메시징. 시스템 = kafka ',' 메시징. 작업 = 수신 ', 메시징. 목적지 '.
  • 클라우드/K8/호스트: '클라우드. 지역 ',' k8. 포드. 이름 ',' 컨테이너. id '.
  • 자원 속성 (필수): '서비스. 이름 ',' 서비스. 버전 '', 배포 환경 '.

SDK/Collector 리소스에서 'schemaUrl' 을 통해 스키마 안정성을 지정하십시오.

4) 샘플링: 머리, 꼬리, 적응 형

헤드 기반 (SDK): 사전에 저렴한 결정; 높은 QPS에는 좋지만 "흥미로운" 트랙을 놓칠 수 있습니다.
테일 기반 (수집기): 트랙 완료 후 결정; 상태, 대기 시간, 속성별 규칙을 허용합니다.
적응 형/동적: p95 오류/성장을 위해 샘플 점유율을 높입니다.

생산 수준의 레시피: 전 세계적으로 1-5% + "중요한" 꼬리 선택: '상태 = ERROR', '대기 시간> p95', "돈 경로", PSP/KYC 오류.

5) 상관: 메트릭, 로그, 트레일

Exemplars: 미터법 히스토그램에 'trace _ id' 가있는 레이블 (트랙으로의 빠른 점프).
로그: 'trace _ id '/' span _ id' 를 추가하고 로그에서 추적으로 전환하십시오.
SpanMetrics (프로세서) 는 SLO/경고에 대한 RED 메트릭 ('요청, 오류, 지속 시간') 추적에서 집계됩니다.

6) 배포 아키텍처

각 노드의 에이전트 (DaemonSet) 는 응용 프로그램 (OTLP) 및 전달에서 수집합니다.
게이트웨이 (클러스터/지역) -라우팅/샘플링/농축 파이프 라인이있는 중앙 수집기 (많은 복제품).

OTLP: gRPC '4317', HTP '4318'; 그림% 1개의 캡션을 편집했습니

"에이전트 + 게이트웨이" 의 전문가: 격리, 버퍼링, 로컬 역압, 단순화 된 네트워크.

7) OpenTelemetry Collector-기본 템플릿 (게이트웨이)

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, 경로, 코드}' 및 'chimes _ bucket' 이 있습니다.

9) K8: 수집기 배포 (DaemonSet + 배포)

에이전트 (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 }

게이트웨이 (배포) -여러 복제본, 서비스 클러스터 IP/Ingress, CPU/QPS 별 HPA.

10) 보안 및 개인 정보 보호

TLS/mTLе자체 SDK → 에이전트 → 게이트웨이 → 백엔드.
게이트웨이 입력에서 인증 (기본/OAuth/헤더); 원점을 제한합니다.
PII 개정: 필터/마스크 속성 ('사용자. 이메일 ',' 카드. ') 수집기 프로세서에서.
한계: SDK에서는 이벤트 크기/속성 수 (카디널리티 보호) 를 제한하십시오.
백엔드 + 개별 프로젝트/테넌트 네임 스페이스의 RBAC.

수집기의 필터 예:
yaml processors:
attributes/redact:
actions:
- key: user. email action: delete
- key: payment. card action: delete

11) 계측: 빠른 시작

노드. 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
// 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

파이썬 (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 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) 비동기: 대기열, 버스, 크론

'링크' 를 통한 커뮤니케이션을 통한 PRODUCER/CONSUMER (메시지에는 자체 수명주기가 있음).
메시지 헤더로 전파되는 컨텍스트 ('수하물 '/' 수하물').
배치 소비시 메시지 당 스팬을 생성하거나 메시징 속성으로 집계하십시오. 배치. 크기 '.
크론/작업의 경우: 기본 이벤트에 대한 링크 + 링크를 실행할 새로운 추적 (있는 경우).

13) 수하물 및 타겟팅

수하물에 최소 안정적인 키 ('테넌트 _ id', '지역', 'vip _ tier') 를 저장하십시오. PII 금지.
세그먼트별로 메트릭을 후속 집계하려면 게이트웨이/게이트웨이 로거를 푸시하십시오.

14) 릴리스 및 SLO 게이팅과의 통합

카나리아 단계 → 경로/하위 세그먼트에서 'traces _ spanmetrics _' 를 확인하십시오.
분해 중 (5xx/p95) -자동 정지 및 롤백 (Argo Rollout Analysistemple + PromQL).
메트릭스의 인스턴스는 릴리스 간격의 "나쁜" 트랙으로 직접 연결됩니다.

15) 한계 및 성능

'OTEL _ SPAN _ ATTRIBUTE _ COUNT _ LIMIT', 'OTEL _ SPAN _ EVENT _ COUNT _ LIMIT', 'OTEL _ ATTRIBUTE _ VANUE _ LENH _ GTMIT'.
확률/주파수에 의한 샘플/추적 예외.

SDK 및 수집기의 배치 프로세서; 버스트가 발생할 때 트랙을 잃지 않도록 대기열을 유지하십시오

16) 상호 운용성 및 마이그레이션

전파기: W3C 사용; 이중 전파 B3/X-Ray 판독 값을 지원합니다.
수출: OTLP → APM (Jaeger/Tempo/Elastic/X-Ray 등).
안정적인 버전의 semconv-' schemaUrl '을 수정하고 업그레이드를 계획하십시오.

17) 반 패턴

속성의 높은 카디널리티 (레이블의 'user _ id', 동적 키).
trace _ id가없는 로그 → 상관 관계가 없습니다.
응용 프로그램에서 인터넷 APM으로 직접 내보냅니다 (게이트웨이없이, TLS/mTLS없이).
판매에서 "100%" 만 수집하는 것은 비싸고 무의미합니다.
'db에서 사용자 데이터가 포함 된 SQL 쿼리 덤프. 성명서 '.
일관되지 않은 서비스/버전 이름-메트릭이 "무너지고 있습니다".

18) 구현 점검표 (0-45 일)

0-10 일

2-3 중요 서비스에서 SDK/자동 계측을 사용하십시오.
TLS로 에이전트 (DaemonSet) + 게이트웨이 (배포), OTLP 4317/4318 설정.
서비스 추가. 이름 ',' 서비스. 버전 '', 배포 어디에서나 환경.

11-25 일

오류/대기 시간/" 돈 "경로에 의한 테일 샘플링.
SpanMetrics → Prometheus에는 Exemplars 및 RED/SLO 대시 보드가 포함됩니다.
API 게이트웨이/NGINX/mesh를 통해 W3C를 전파하십시오. 상관 통나무.

26-45 일

커버 큐/DB/캐시; async에 대한 링크.
수집가의 PII 판 정책; SDK의 속성 제한.
릴리스 및 자동 롤백의 SLO 게이팅을 통합합니다.

19) 성숙도 지표

95% 이상을 추적하는 수신 요청 범위 (샘플링 헤드/테일 포함).
Exemplars의 메트릭 점유율은 80% 이상입니다.
"메트릭에서 트레이스까지" RCA 시간은 2 분 (p50) 입니다.

속성/이벤트 (스캐너) 에서 0 PII 누출

모든 서비스에는 서비스가 있습니다. 이름/버전/환경 '및 일관된 의미론.

20) 부록: 유용한 조각

NGINX 선전:
nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;
proxy_set_header baggage   $http_baggage;
프로 메테우스 텍사스 (Grafana):

histogram_quantile(0. 95, sum(rate(traces_spanmetrics_duration_bucket{route="/withdraw"}[5m])) by (le))

정책: PII 속성 금지 (의사 린터)

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

21) 결론

OpenTelemetry는 관찰 가능성을 표준화 된 관리 가능한 회로로 전환합니다: 통합 의미론, 안전한 전파, 스마트 샘플링 및 메트릭 및 로그와의 강력한 상관 관계. 에이전트 + 게이트웨이를 구축하고 테일 샘플링, 스패트릭 및 Examplars를 추가하고 PII 및 카디널리티를 모니터링하며 추적은 디버깅뿐만 아니라 자동화 된 SRE/릴리스 솔루션을위한 도구가되어 각 릴리스의 MTTR 및 위험을 줄입니다.

Contact

문의하기

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

Telegram
@Gamble_GC
통합 시작

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

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

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