GH GambleHub

Rozproszone odwzorowanie: OpenTelemetry

Rozproszone odwzorowanie: OpenTelemetry

1) Dlaczego OTel i co daje

OpenTelemetry (OTel) to otwarty standard i zestaw SDK/agentów/kolektorów do telemetrii (szlaki, mierniki, dzienniki) z jednym protokołem OTLP. Cele:
  • Widoczność ścieżek żądania na koniec (brama → usługi → DB/cache/kolejki).
  • Szybka degradacja RCA/debug i wydania (kanarki/niebiesko-zielone).
  • Link z SLO i auto-rollbacks (rozwiązania operacyjne oparte na danych).
  • Sprzedawca-agnostyk: eksport do dowolnego backendu, bez wiązania z jednym APM.

Zasady odniesienia: standaryzacja, próbka inteligentna, domyślnie bezpieczne, korelować wszystko.

2) Podstawy: kontekst, przęsła, atrybuty

Ślad - drzewo wywoławcze/wykres; Span - operacja (RPC, SQL, wywołanie kolejki).
Rodzaj przęsła: 'SERWER', 'KLIENT', 'PRODUCENT', 'KONSUMENT', 'WEWNĘTRZNY'.
Kontekst śladowy W3C: nagłówki "traceparent'," tracestate "; kontekst jest przewożony między służbami.
Atrybuty - wartość klucza (niska kardynalność!), Wydarzenia - znaczniki czasu, Status - kod błędu/opis.
Linki - łącze poza ścisłą hierarchią (ważne dla async/wentylatora/wentylatora).

Nazwa przęseł:
  • HTTP: „HTTP {METHOD}” („GET/withdraw” jako atrybut)
  • DB: „DB SELECT ”/„ DB INSERT”
  • Kolejka: 'QUEUE publish topic = X '/' QUEUE consume topic = X'

3) Konwencje semantyczne (semconv)

Użyj stabilnych schematów atrybutów:
  • HTTP/GRPC: "http. metoda „,” http. trasa ',' http. status_code', url. pełne ".
  • DB: 'db. system = postgresql', 'db. oświadczenie „(tylko bezpieczne wyciskanie!),” db. nazwa ".
  • Wiadomości: 'wiadomości. system = kafka ',' messaging. operation = receive ',' messaging. miejsce przeznaczenia ".
  • Cloud/K8s/Host: "chmura. region „,” k8s. pod. nazwa „,” pojemnik. id'.
  • Atrybuty zasobów (wymagane): 'service. nazwa „,” usługi. wersja „,” wdrożenie. środowisko ".

Określić stabilność schematu poprzez 'schemaUrl' w zasobach SDK/Collector.

4) Pobieranie próbek: głowa, ogon, adaptacyjny

Head-based (w SDK): decyduje z góry, tanio; dobre dla wysokiej QPS, ale może przegapić „ciekawe” utwory.
Oparty na ogonie (w Kolektorze): decyduje po zakończeniu toru; umożliwia reguły według statusu, opóźnienia, atrybutów.
Adaptive/Dynamic: Zwiększa udział próbki w błędach/wzroście p95.

Przepis poziomu produkcji: Głowica 1-5% globalnie + Wybór ogona „ważny”: 'status = ERROR', 'latency> p95', 'trasy pieniężne', błędy PSP/KYC.

5) Korelacja: mierniki, kłody, szlaki

Przykłady: etykiety z 'trace _ id' w histogramach metrycznych (szybki skok na tor).
Dzienniki: Dodaj 'trace _ id'/' span _ id' i przełącz z dzienników na śledzenie.
Agregaty SpanMetrics (procesor) z mierników RED („żądania, błędy, czas trwania”) dla SLO/wpisów.

6) Architektura wdrażania

Agent (DaemonSet) na każdym węźle zbiera z aplikacji (OTLP) i do przodu.
Gateway (Cluster/Region) - Centralny Kolektor (wiele replik) z rurociągami trasowania/pobierania próbek/wzbogacania.
OTLP: gRPC '4317', HTTP '4318'; Włącz TLS/mTLS.

Zalety „agent + gateway”: izolacja, buforowanie, lokalne obciążenie zwrotne, uproszczona sieć.

7) OpenTelemetry Collector - podstawowy szablon (gateway)

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) SpanMetrics i RED dla SLO

Dodaj procesor:
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] }

Teraz są 'traces _ spanmetrics _ calls {service, route, code}' i 'duration _ bucket' dla SLO/alerts.

9) K8s: wdrożenie kolektora (DaemonSet + Wdrożenie)

Fragment agenta (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 }

Gateway (Wdrożenie) - kilka replik, Usługa ClusterIP/Ingress, HPA przez CPU/QPS.

10) Bezpieczeństwo i prywatność

TLS/mTLS мебд, SDK → Agent → Gateway → Backend.
Uwierzytelnianie (Basic/OAuth/Headers) w wejściu Gateway; ograniczyć pochodzenie.
Wersja PII: atrybuty filtra/maski ('użytkownik. e-mail ',' karta. ") w procesorze kolekcjonerskim.
Limity: W SDK należy ograniczyć rozmiar zdarzenia/liczbę atrybutów (ochrona kardynalności).
RBAC w plecaku + indywidualny projekt/lokator przestrzeni nazw.

Przykład filtra w Kolektorze:
yaml processors:
attributes/redact:
actions:
- key: user. email action: delete
- key: payment. card action: delete

11) Oprzyrządowanie: Szybkie uruchomienie

Węzeł. 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 (wiosna)

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

Python (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)

Idź

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) Asynchroniczny: kolejki, autobusy, cron

PRODUCENT/KONSUMENT z komunikacją za pośrednictwem „linków” (komunikaty mają swój własny cykl życia).
Propagowanie kontekstu do nagłówków wiadomości („traceparent ”/„ bagaż”).
Po zużyciu partii należy utworzyć rozpiętość na wiadomość lub agregat z atrybutem 'messaging'. partia. rozmiar ".
Dla cron/jobs: nowy ślad do uruchomienia + linki do zdarzeń podstawowych (jeśli są).

13) Bagaż i celowanie

Przechowywać w bagażu minimum stabilnych kluczy ('lokator _ id',' region ',' vip _ tier '); zakazać PII.
Przesuń przez bramę/bramę rejestratora do późniejszej agregacji mierników według segmentów.

14) Integracja z wersjami i gating SLO

Kroki kanaryjskie → sprawdź 'traces _ spanmetrics _' na trasach/podkategoriach.
Podczas degradacji (5xx/p95) - auto-stop i rollback (Argo Rollouts Template + PromQL).
Instancje z metryki prowadzą bezpośrednio do „złych” torów odstępu uwalniania.

15) Ograniczenia i wydajność

Обраний ивавта: 'OTEL _ SPAN _ ATTRIBUTE _ COUNT _ LIMIT', 'OTEL _ SPAN _ EVENT _ COUNT _ LIMIT', 'OTEL _ ATTRIBUTE _ VALUE _ LENGTH _ LIMIT'.
Wyjątki próbki/stacktrace według prawdopodobieństwa/częstotliwości.
Procesor wsadowy w SDK i Kolektorze; przechowywać kolejki, aby uniknąć utraty torów w przypadku wybuchów.

16) Interoperacyjność i migracja

Propagatory: używać W3C; Wsparcie podwójnej propagacji B3/X-Ray czytania.
Eksport: OTLP → APM (Jaeger/Tempo/Elastic/X-Ray, itp.).
Stabilne wersje semconv - naprawić 'schemaUrl' i aktualizacje planu.

17) Anty-wzory

Wysoka kardynalność atrybutów ('user _ id' w etykiecie, klucze dynamiczne).
Dzienniki bez śladu _ id → brak korelacji.
Eksport bezpośrednio z aplikacji do APM internetowego (bez bramy, bez TLS/mTLS).
Zbieranie „tylko” 100% w sprzedaży jest drogie i bezcelowe.
Porzucanie zapytań SQL z danymi użytkownika w 'db. oświadczenie ".
Niespójna nazwa usługi/wersji - metryki są „kruszące”.

18) Lista kontrolna wdrażania (0-45 dni)

0-10 dni

Włącz SDK/automatyczne oprzyrządowanie na 2-3 krytycznych usług.
Konfiguracja agenta (DaemonSet) + Gateway (Wdrożenie), OTLP 4317/4318 z TLS.
Dodaj 'ervice. nazwa „,” usługi. wersja „,” wdrożenie. środowisko "wszędzie.

11-25 dni

Pobieranie próbek za pomocą błędów/opóźnień/tras” money”.
SpanMetrics → Prometeusz, zawierają przykłady i deski rozdzielcze RED/SLO.
rozmnażanie W3C przez bramę API/NGINX/siatkę; dzienniki korelacji.

26-45 dni

Kolejki okładek/DB/cache; linki do async.
Polityka edycji PII w Kolektorze; limity atrybutów w SDK.
Zintegruj gating SLO wersji i auto-rollback.

19) Wskaźniki zapadalności

Zasięg żądania przychodzącego ze śledzeniem ≥ 95% (w tym głowica/ogon do pobierania próbek).
Udział metryki z Exemplars ≥ 80%.
czas RCA „od metrycznego do śladu” ≤ 2 min (p50).
0 wycieków PII w atrybutach/zdarzeniach (skaner).
Wszystkie służby mają służbę. nazwa/wersja/środowisko "i spójne semantyki.

20) Dodatki: przydatne fragmenty

Propaganda NGINX:
nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;
proxy_set_header baggage   $http_baggage;
Prometeusz „Przykłady” (Grafana):

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

Polityka: zakaz atrybutów PII (pseudo-linter)

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

21) Wniosek

OpenTelemetry przekształca obserwowalność w znormalizowany, zarządzalny obwód: ujednoliconą semantykę, bezpieczną propagację, inteligentne pobieranie próbek oraz silną korelację z metrykami i dziennikami. Zbuduj agenta + bramę, dodaj próbkowanie ogona, spanmetry i przykłady, monitoruj PII i kardynalność - a śledzenie stanie się narzędziem nie tylko do debugowania, ale także do zautomatyzowanych rozwiązań SRE/Release, zmniejszając MTTR i ryzyko z każdym wydaniem.

Contact

Skontaktuj się z nami

Napisz do nas w każdej sprawie — pytania, wsparcie, konsultacje.Zawsze jesteśmy gotowi pomóc!

Telegram
@Gamble_GC
Rozpocznij integrację

Email jest wymagany. Telegram lub WhatsApp są opcjonalne.

Twoje imię opcjonalne
Email opcjonalne
Temat opcjonalne
Wiadomość opcjonalne
Telegram opcjonalne
@
Jeśli podasz Telegram — odpowiemy także tam, oprócz emaila.
WhatsApp opcjonalne
Format: kod kraju i numer (np. +48XXXXXXXXX).

Klikając przycisk, wyrażasz zgodę na przetwarzanie swoich danych.