איתור מבוזר: OpenTelemetry
איתור מבוזר: OpenTelemetry
1) מדוע אוטל ומה היא נותנת
OpenTelemetry (ראשי תיבות של OpenTelemetry) הוא תקן פתוח של SDKs/סוכנים/אספנים לטלמטריה. מטרות:- ראות מקצה לקצה של שבילי בקשה (gateway # services # DB/cache/weekues).
- RCA/debug מהיר משפיל ומשחרר (קנריות/כחול-ירוק).
- קישור עם SLO וגלגולים אוטומטיים (פתרונות מבצעיים המבוססים על נתונים).
- ספק-אגנוסטי: ייצוא לכל גב, מבלי להתחייב ל-APM אחד.
עקרונות התייחסות: תקן, דגימה חכמה, מאובטח כברירת מחדל, מתאם הכל.
2) יסודות: הקשר, תוחלת, תכונות
עקבות - קורא עץ/גרף; Span - פעולה (RPC, SQL, תור קריאה).
ספאן סוג: ”שרת”, ”לקוח”, ”מפיק”, ”צרכן”, ”פנימי”.
הקשר W3C: "tracepart'," tracestate "כותרות; ההקשר נישא בין-רבעים.
תכונות - ערך מפתח (קרדינליות נמוכה), אירועים - בולי זמן, סטטוס - קוד שגיאה/תיאור.
קישורים - טווח קישור מחוץ להיררכיה קפדנית (חשוב עבור Async/fund-out/fund-in).
- HTTP: "HTTP 'method' (' GET/לסגת 'כמו מאפיין)
- DB: "DB SELECT'/' DB INSERTOPOS
- תור: "תור לפרסם נושא = X '/' תור 'לצרוך נושא = X&fost
3) מוסכמות סמנטיות (semconv)
השתמש בתרשימי מאפיין יציבים:- HTTP/GRPC: "http. שיטה ", http. מסלול ", http. status_code', url. מלא ".
- DB: 'db. מערכת = postgresql', 'db. הצהרה (לחיצה בטוחה בלבד), 'db. שם '.
- הודעות: 'הודעות. מערכת = קפקא ',' הודעות. מבצע = קבל ',' הודעות. היעד ".
- Cloud/K8s/Host: "ענן. אזור ', K8. תרמיל. שם ',' מיכל. תעודה מזהה.
- תכונות משאב (נדרש): 'שירות. שם, 'שירות. גרסה ”, פריסה”. סביבה ".
ציין יציבות באמצעות 'shemaUrl' במשאבי SDK/אספן.
4) דגימה: ראש, זנב, הסתגלות
מבוסס ראש (ב-SDK): מחליט מראש, זול; טוב ל-QPS גבוה אבל עלול לפספס מסלולים ”מעניינים”.
מבוסס זנב (In Collector): מחליט לאחר סיום המסלול; מאפשר חוקים לפי מעמד, איחוי, תכונות.
Adaptive/Dynamic: מעלה את נתח המדגם עבור p95 שגיאות/צמיחה.
מתכון רמת הייצור: Head 1-5% גלובלית + Tail בחירה של ”חשוב”: ”מצב = שגיאה”, ”latency> p95”, ”נתיבי כסף”, שגיאות PSP/KYC.
5) קורלציה: מדדים, יומנים, שבילים
דוגמאות: תוויות עם "trace _ id' בהיסטוגרמות מטריות (קפיצה מהירה למסלול).
יומנים: הוסף ”trace _ id'/” span _ id' ועבור מהלוגים לאיתור.
אגרגטים של SpanMetrics (מעבד) מ-RED Metrics ('בקשות, שגיאות, משך זמן') עקבות עבור SLOS/התראות.
6) ארכיטקטורת פריסה
סוכן (DaemonSet) בכל קודקוד אוסף מיישומים (OTLP) ומעבר.
שער (Cluster/Region) - אספן מרכזי (העתקים רבים) עם צינורות ניתוב/דגימה/העשרה.
OTLP: gRPC '4317', HTTP '4318'; אפשר TLS/mTLS.
יתרונות של ”סוכן + שער”: בידוד, חציצה, תרמיל גב מקומי, רשת מפושטת.
7) אספן OpenTelemetry - תבנית בסיסית (שער)
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
הוסף מעבד: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/התראות.
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 }
Gateway (פריסה) - מספר העתקים, Service Clough IP/Ingress, HPA על ידי CPU/QPS.
10) ביטחון ופרטיות
TLS/mTLS (ראשי תיבות של SDK # agent # Gateway # Backend.
אימות (Basic/OAuth/Headers) בקלט השער; להגביל את המקורות.
תיקון PII: תכונות מסנן/מסכה ('משתמש. דוא "ל", כרטיס ". ") במעבד האספנים.
גבולות: ב ־ SDK, הגבילו את גודל האירוע/מספר התכונות (הגנת קרדינליות).
RBAC בפרויקט backend + personal project/director name.
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 (אביב)
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
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) אסינכרוני: תורים, אוטובוסים, קרון
יצרן/צרכן עם תקשורת דרך 'קישורים' (הודעות יש מחזור חיים משלהם).
הפץ את ההקשר לכותרות מסרים ("tracepart'/" מטען").
כשצורכים אצווה, יוצרים תוחלת למסר או צבירה עם התכונה של התמסרות. אצווה. גודל ".
עבור cron/works: עקבות חדשות להריץ + קישורים לאירועים ראשוניים (אם בכלל).
13) מטען ומטרה
לאחסן מינימום של מפתחות יציבים ("terant _ id'," region "," vip _ tier ") במטען; אוסר על מח "ש.
דחוף דרך השער/שער לוגר עבור צבירה שלאחר מכן של מדדים אחר מקטע.
14) אינטגרציה עם שחרור וגייטינג SLO
צעדים קנריים = לבדוק עקבות '_ ספמטריים _' על נתיבים/תת-מקטעים.
במהלך דלדול (5xx/p95) - עצירה אוטומטית וגלגול (Argo Rollouts Template + PromQL).
מקרים מהמדדים מובילים ישירות למסלולים ”רעים” של מרווח השחרור.
15) גבולות וביצועים
”OTEL _ SPANCE _ COUNT _ LIMIT”, ”OTEL _ SPAN _ Event _ COUNT _ LIMIT”, ”OTEL _ RESPECT _ VALUE _ LIGHT _ LIME”.
יוצא מן הכלל מדגם/סטקטרייס על ידי הסתברות/תדר.
מעבד באץ 'ב-SDK ואספן; לשמור על תורים כדי להימנע מאובדן מסלולים כאשר פרצים מתרחשים.
16) יכולת ביניים ונדידה
תעמולה: השתמש ב ־ W3C; תמיכה דו-התפשטות B3/X-Ray קריאה.
ייצוא: OTLP = APM (Jager/Tempo/Elastic/X-Ray, וכו ').
גרסאות יציבות של סמקונב - לתקן 'סכימה' ותוכנית שדרוגים.
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 = פרומתאוס, כולל לוחות מחוונים של RED/SLO.
הפצת ה-W3C דרך שער ה-API/NGINX/mesh; יומני מתאם.
26-45 ימים
כיסוי תורים/DB/מטמון; קישורים עבור async.
מדיניות מהדורת PII באספן; מאפיין גבולות ב-SDK.
אינטגרל SLO גייטינג של שחרורים וחזרה אוטומטית.
19) מדדי בגרות
כיסוי בקשה נכנסת עם איתור 95% (כולל דגימת ראש/זנב).
הנתח של מדדים עם מופת 80%.
זמן RCA ”ממטרי לאיתור” lado 2 min (p50).
0 דליפות PII במאפיינים/אירועים (סורק).
לכל השירותים יש משרות. שם/גרסה/סביבה וסמנטיקה עקבית.
20) נספחים: קטעים שימושיים
תעמולה של NGINX:nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;
proxy_set_header baggage $http_baggage;
פרומתאוס למופת (גראפנה):
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 הופכת את יכולת התצפית למעגל סטנדרטי וניתן לניהול: סמנטיקה מאוחדת, התפשטות בטוחה, דגימה חכמה, וקורלציה חזקה עם מדדים ויומנים. בניית סוכן + שער, הוספת דגימת זנב, ספאנמטריקס ואקספלרס, ניטור PII וקרדינליות - והתחקות תהפוך לכלי לא רק לדיבוג, אלא גם לפתרונות אוטומטיים של SRE/שחרור, הפחתת MTTR וסיכונים עם כל שחרור.