GH GambleHub

ردیابی توزیع شده: OpenTelemetry

ردیابی توزیع شده: OpenTelemetry

1) چرا OTel و آنچه در آن می دهد

OpenTelemetry (OTel) یک استاندارد باز و مجموعه ای از SDK ها/عوامل/جمع کننده ها برای تله متری (مسیرهای پیاده روی، معیارها، سیاهههای مربوط) با یک پروتکل OTLP است. اهداف:
  • قابلیت مشاهده پایان به پایان مسیرهای درخواست (دروازه → خدمات → DB/کش/صف).
  • تخریب و انتشار سریع RCA/اشکال زدایی (قناری/آبی سبز).
  • پیوند با SLO و بازگشت خودکار (راه حل های عملیاتی بر اساس داده ها).
  • فروشنده آگنوستیک: صادرات به هر باطن، بدون اتصال به یک APM.

اصول مرجع: استاندارد، نمونه هوشمند، امن به طور پیش فرض، همبستگی همه چیز.

2) مبانی: زمینه، دامنه، ویژگی ها

ردیابی - تماس با درخت/نمودار ؛ محدوده - عملیات (RPC، SQL، تماس صف).
نوع دهانه: «سرور»، «مشتری»، «تولید کننده»، «مصرف کننده»، «داخلی».
زمینه ردیابی W3C: هدر های 'traceparent'، 'tracestate' ؛ زمینه interservice انجام شده است.
ویژگی ها - کلید ارزش (کاردینالیتی کم!), رویدادها - تمبر زمان, وضعیت - کد خطا/شرح.
پیوندها - پیوند خارج از یک سلسله مراتب دقیق (مهم برای async/fan-out/fan-in).

نام دامنه:
  • HTTP: 'HTTP {METHOD}' ('GET/برداشت' به عنوان ویژگی)
  • DB: «DB SELECT »/« DB INSERT»
  • Queue: 'QUEUE انتشار موضوع = X '/' QUEUE مصرف موضوع = X'

3) قراردادهای معنایی (semconv)

استفاده از طرحوارههای خصیصۀ پایدار:
  • HTTP/GRPC: 'http. روش '،' HTTP. مسیر '،' HTTP. status_code'، "URL. پر است.
  • DB: DB سیستم = postgresql '،' db. statement '(فقط فشار امن!)،' db. نام و نام خانوادگی.
  • پیام: "پیام سیستم = کافکا «،» پیام. عملیات = دریافت «،» پیام. مقصد ".
  • Cloud/K8s/Host: ابر. منطقه '،' k8s. غلاف. نام، ظرف. کارت شناسایی.
  • ویژگی های منبع (مورد نیاز): "سرویس. نام، خدمات. نسخه '،' استقرار. محیط زیست ".

ثبات طرح را از طریق «schemaUrl» در منابع SDK/Collector مشخص کنید.

4) نمونه برداری: سر، دم، تطبیقی

مبتنی بر سر (در SDK): تصمیم می گیرد در پیشبرد، ارزان ؛ برای QPS بالا خوب است اما ممکن است آهنگ های «جالب» را از دست ندهید.
Tail-based (در Collector): پس از اتمام مسیر تصمیم می گیرد ؛ اجازه می دهد تا قوانین توسط وضعیت، تاخیر، ویژگی.
Adaptive/Dynamic: سهم نمونه را برای خطاها/رشد p95 افزایش می دهد.

دستورالعمل سطح تولید: سر 1-5٪ در سطح جهانی + انتخاب دم «مهم»: «وضعیت = ERROR»، «تاخیر> p95»، «مسیرهای پول»، خطاهای PSP/KYC.

5) همبستگی: معیارها، سیاههها، مسیرها

نمونهها: برچسبهایی با 'trace _ id' در هیستوگرام متریک (پرش سریع به مسیر).
سیاهههای مربوط: اضافه کردن 'trace _ id '/' span _ id' و تغییر از سیاهههای مربوط به ردیابی.
SpanMetrics (پردازنده) از معیارهای RED («درخواست ها، خطاها، مدت زمان») برای SLO/هشدارها جمع می شود.

6) معماری استقرار

عامل (DaemonSet) در هر گره از برنامه ها (OTLP) و به جلو جمع می شود.
دروازه (خوشه/منطقه) - جمع کننده مرکزی (بسیاری از کپی ها) با خطوط لوله مسیریابی/نمونه برداری/غنی سازی.
OTLP: gRPC '4317'، HTTP '4318' ؛ فعالسازی TLS/mTLS.

مزایای «عامل + دروازه»: انزوا، بافر، فشار پشتی محلی، شبکه ساده شده.

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) SpanMetrics و RED برای SLO

اضافه کردن یک پردازنده:
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] }

در حال حاضر «ردیابی _ spanmetrics _ calls {service, route, code}» و «duration _ bucket» برای SLO/alerts وجود دارد.

9) K8s: استقرار جمع کننده (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 }

دروازه (استقرار) - چندین کپی، سرویس ClusterIP/Ingress، HPA توسط CPU/QPS.

10) امنیت و حریم خصوصی

TLS/mTLS между SDK → Agent → Gateway → Backend

احراز هویت (Basic/OAuth/Headers) در ورودی دروازه ؛ ریشه ها را محدود کنید

تجدید نظر PII: ویژگی های فیلتر/ماسک ('کاربر. ایمیل، کارت. ") در پردازنده جمع کننده.
محدودیت ها: در SDK، اندازه رویداد/تعداد ویژگی ها (حفاظت از کاردینالیتی) را محدود کنید.
RBAC در باطن + پروژه های فردی/فضای نام مستاجر.

مثالی از یک فیلتر در Collector:
yaml processors:
attributes/redact:
actions:
- key: user. email action: delete
- key: payment. card action: delete

11) ابزار دقیق: شروع سریع

گره ها جی اس

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) ناهمزمان: صف، اتوبوس، cron

تولید کننده/مصرف کننده با برقراری ارتباط از طریق «لینک ها» (پیام ها چرخه زندگی خود را دارند).
متن انتشار به هدر پیام ('traceparent '/' چمدان').
هنگام مصرف دسته ای، یک دامنه در هر پیام ایجاد کنید یا با ویژگی «messaging» جمع کنید. دسته ای. به اندازه.
برای cron/jobs: ردیابی جدید برای اجرا + لینک به رویدادهای اولیه (در صورت وجود).

13) چمدان و هدف قرار دادن

حداقل کلیدهای پایدار («tenant _ id»، «region»، «vip _ tier») را در چمدان ذخیره کنید. PII را ممنوع کنید.
از طریق gateway/gateway logger برای جمع آوری معیارهای بعدی توسط بخش فشار دهید.

14) ادغام با نسخه ها و دروازه SLO

مراحل قناری → بررسی 'آثار _ spanmetrics _' در مسیرهای/زیر بخش.
در طول تخریب (5xx/p95) - توقف خودکار و برگشت (Argo Rollout AnalysisTemplate + PromQL).
نمونه هایی از معیارها به طور مستقیم به آهنگ های «بد» فاصله انتشار منجر می شود.

15) محدودیت ها و عملکرد

Ограничивайте: 'OTEL _ SPAN _ ATTRIBUTE _ COUNT _ LIMIT', 'OTEL _ SPAN _ EVENT _ COUNT _ LIMIT', 'OTEL _ ATTRIBUTE _ VALUE _ LENGTH _ LIMIT'.
استثنائات sample/stacktrace با احتمال/فرکانس.
پردازنده دسته ای در SDK و جمع کننده ؛ نگه داشتن صف برای جلوگیری از از دست دادن آهنگ زمانی که انفجار رخ می دهد.

16) قابلیت همکاری و مهاجرت

تبلیغ کنندگان: استفاده از W3C ؛ پشتیبانی از انتشار دوگانه B3/X-Ray خواندن

صادرات: OTLP → APM (Jaeger/Tempo/Elastic/X-Ray، و غیره).
نسخه های پایدار semconv - رفع 'schemaUrl' و ارتقاء برنامه.

17) ضد الگوهای

کاردینالیتی بالای صفات ('user _ id' در برچسب، کلیدهای پویا).
سیاهههای مربوط بدون ردیابی _ id → بدون همبستگی.
صادرات به طور مستقیم از برنامه های کاربردی به اینترنت APM (بدون دروازه، بدون TLS/mTLS).
جمع آوری «تنها» 100٪ در فروش گران و بی معنی است.
تخلیه پرس و جوهای SQL با داده های کاربر در "db. بیانیه ".
خدمات ناسازگار/نام نسخه - معیارها «فرو ریختن» هستند.

18) چک لیست پیاده سازی (0-45 روز)

0-10 روز

SDK/خودکار ابزار دقیق را در 2-3 سرویس مهم فعال کنید.
پیکربندی عامل (DaemonSet) + دروازه (استقرار)، OTLP 4317/4318 با TLS.

خدمات اضافه کنید. نام، خدمات. نسخه '،' استقرار. محیط زیست در همه جا

11-25 روز

نمونه برداری دم توسط خطا/تاخیر/» پول» مسیرهای.
SpanMetrics → Prometheus، شامل نمونه ها و داشبورد RED/SLO است.
انتشار W3C از طریق دروازه API/NGINX/مش ؛ سیاهههای مربوط را مرتبط کنید.

26-45 روز

پوشش صف/DB/کش ؛ لینک برای async

سیاست های PII-edition در Collector ؛ محدودیت ها در 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 (pseudo-linter)

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

21) نتیجه گیری

OpenTelemetry قابلیت مشاهده را به یک مدار استاندارد و قابل کنترل تبدیل می کند: معنایی یکپارچه، انتشار ایمن، نمونه گیری هوشمند و ارتباط قوی با معیارها و سیاهههای مربوط. ساخت یک عامل + دروازه، اضافه کردن دم نمونه برداری، spanmetrics و Examplars، نظارت بر PII و cardinality - و ردیابی تبدیل به یک ابزار نه تنها برای اشکال زدایی، بلکه برای راه حل های خودکار SRE/انتشار، کاهش MTTR و خطرات با هر نسخه.

Contact

با ما در تماس باشید

برای هرگونه سؤال یا نیاز به پشتیبانی با ما ارتباط بگیرید.ما همیشه آماده کمک هستیم!

Telegram
@Gamble_GC
شروع یکپارچه‌سازی

ایمیل — اجباری است. تلگرام یا واتساپ — اختیاری.

نام شما اختیاری
ایمیل اختیاری
موضوع اختیاری
پیام اختیاری
Telegram اختیاری
@
اگر تلگرام را وارد کنید — علاوه بر ایمیل، در تلگرام هم پاسخ می‌دهیم.
WhatsApp اختیاری
فرمت: کد کشور و شماره (برای مثال، +98XXXXXXXXXX).

با فشردن این دکمه، با پردازش داده‌های خود موافقت می‌کنید.