Διανεμημένη ανίχνευση: OpenTelemetry
Διανεμημένη ανίχνευση: OpenTelemetry
1) Γιατί το Otel και τι δίνει
Το OpenTelemetry (Otel) είναι ένα ανοικτό πρότυπο και ένα σύνολο SDK/πρακτόρων/συλλεκτών για τηλεμετρία (μονοπάτια, μετρήσεις, αρχεία καταγραφής) με ένα ενιαίο πρωτόκολλο OTLP. Στόχοι:- Τελική ορατότητα των διαδρομών ζήτησης (υπηρεσίες → πύλης → DB/cache/ουρές αναμονής).
- Γρήγορη υποβάθμιση και απελευθέρωση RCA/αποσφαλμάτωσης (καναρίνια/μπλε-πράσινο).
- Σύνδεση με την SLO και αυτόματες ανατροπές (λειτουργικές λύσεις βάσει δεδομένων).
- Πωλητής-αγνωστικιστής: εξαγωγή σε οποιοδήποτε backend, χωρίς δέσμευση σε ένα APM.
Αρχές αναφοράς: τυποποίηση, δείγμα έξυπνων, ασφαλών εξ ορισμού, συσχετίζουν τα πάντα.
2) Βασικά: πλαίσιο, εύρος, χαρακτηριστικά
Ίχνος - δέντρο κλήσης/γράφημα; Χρονοδιάγραμμα - λειτουργία (RPC, SQL, κλήση αναμονής).
Span Kind: 'SERVER', 'CLIENT', 'PRODUCER', 'CONSUMER', 'INTERNAL'.
Πλαίσιο ιχνοστοιχείων W3C: κεφαλίδες «traceparent», «tracestate». το πλαίσιο μεταφέρεται διυπηρεσιακά.
Χαρακτηριστικά γνωρίσματα - τιμή κλειδιού (χαμηλή πληθικότητα!), Γεγονότα - χρονοσφραγίδες, Κατάσταση - κωδικός/περιγραφή σφάλματος.
Σύνδεσμοι - ο σύνδεσμος εκτείνεται εκτός αυστηρής ιεραρχίας (σημαντικός για async/fan-out/fan-in).
- HTTP: 'HTTP {ΜΕΘΟΔΟΣ}' ('GET/αποσύρετε' ως χαρακτηριστικό)
- DB: 'DB SELECT '/' DB INSPOST'
- Σειρά αναμονής: 'QUEUE publish topic = X '/' QUEUE consume topic = X'
3) Σημασιολογικές συμβάσεις (semconv)
Χρήση σταθερών σχημάτων χαρακτηριστικών:- HTTP/GRPC: 'http. μέθοδος ',' http. διαδρομή ',' http. , 'url. πλήρης ".
- DB: 'db. σύστημα = postgresql ',' db. δήλωση «(μόνο ασφαλής συμπίεση!),» db. όνομα ".
- Μηνύματα: 'messaging. σύστημα = κάφκα ',' μηνύματα. λειτουργία = λήψη μηνυμάτων «,». προορισμός ".
- : 'σύννεφο. περιφέρεια ',' k8s. κάψουλα. όνομα «,» εμπορευματοκιβώτιο. id '.
- Χαρακτηριστικά πόρων (απαιτούμενα): 'υπηρεσία. ονοματεπώνυμο "," υπηρεσία ". εξάπλωση της έκδοσης ','. περιβάλλον ".
Προσδιορίστε τη σταθερότητα σχήματος μέσω 'schemaUrl' στους πόρους SDK/Συλλεκτών.
4) Δειγματοληψία: κεφαλή, ουρά, προσαρμοστική
Head-based (σε SDK): αποφασίζει εκ των προτέρων, φθηνά· καλό για το high-QPS, αλλά μπορεί να χάσει «ενδιαφέροντα» κομμάτια.
Tail-based (in Collector): αποφασίζει μετά την ολοκλήρωση της τροχιάς. επιτρέπει κανόνες κατά καθεστώς, καθυστέρηση, χαρακτηριστικά γνωρίσματα.
Προσαρμοστική/Δυναμική: Αυξάνει το μερίδιο του δείγματος για σφάλματα/ανάπτυξη p95.
Συνταγή του επιπέδου παραγωγής: Κεφαλή 1-5% παγκοσμίως + Επιλογή ουράς του «σημαντικού»: 'status = 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] }
Τώρα υπάρχουν 'traces _ spanmetrics _ calls {service, route, code}' και 'performance _ cocket' για 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 }
Gateway (Εγκατάσταση) - διάφορα αντίγραφα, Service ClusterIP/Ingress, HPA by CPU/QPS.
10) Ασφάλεια και ιδιωτικότητα
TLS/mTLS между SDK → Agent → Gateway → Backend.
Επαλήθευση ταυτότητας (Basic/OAuth/Headers) στην είσοδο της πύλης. περιορίζουν την προέλευση.
Αναθεώρηση PII: χαρακτηριστικά φίλτρου/μάσκας ('χρήστης. email ',' card. ") στον συλλέκτη επεξεργαστή.
Όρια: Στο SDK, περιορίστε το μέγεθος/τον αριθμό των χαρακτηριστικών (προστασία της πληθικότητας).
RBAC στο backend + ατομικές θέσεις ονομάτων έργου/ενοικιαστή.
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
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)
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) Ασύγχρονη: ουρά, λεωφορεία, κρόν
ΠΑΡΑΓΩΓΟΣ/ΚΑΤΑΝΑΛΩΤΗΣ με επικοινωνία μέσω «συνδέσμων» (τα μηνύματα έχουν τον δικό τους κύκλο ζωής).
Πολλαπλασιάστε το πλαίσιο σε κεφαλίδες μηνυμάτων («traceparent »/« αποσκευές»).
Όταν η παρτίδα καταναλώνεται, δημιουργείται ένα εύρος ανά μήνυμα ή συγκεντρώνεται με το χαρακτηριστικό 'messaging. παρτίδα. μέγεθος ".
Για τα cron/θέσεις εργασίας: νέο ίχνος για να τρέξει + συνδέσεις με πρωτογενή γεγονότα (εάν υπάρχουν).
13) Αποσκευές και στόχευση
Αποθήκευση τουλάχιστον σταθερών κλειδιών ("ενοικιαστής _ i ," περιφέρεια "," vip _ tier ") στις αποσκευές. απαγορεύει την PII.
Σπρώξτε μέσα από την πύλη/πύλη καταγραφής για την επακόλουθη συγκέντρωση μετρήσεων ανά τμήμα.
14) Ενσωμάτωση στις εκλύσεις και SLO
Βήματα καναρινιών → ελέγξτε 'traces _ spanmetrics _' σε διαδρομές/υποτμήματα.
Κατά τη διάρκεια της αποικοδόμησης (5xx/p95) - αυτόματη διακοπή και ανατροπή (Argo Rollouts ExployTemplate + PromQL).
Περιπτώσεις από τις μετρήσεις οδηγούν απευθείας στα «κακά» κομμάτια του διαστήματος απελευθέρωσης.
15) Όρια και επιδόσεις
: 'OTEL _ SPAN _ ATTRIUTE _ COUNT _ LIMIT', 'OTEL _ SPAN _ EVENT _ COUNT _ LIMIT', 'OTEL _ ATTRIUTE _ VALUE _ LENGTH _ LIMIT.'.
Εξαιρέσεις δειγματοληψίας/στοίβαξης κατά πιθανότητα/συχνότητα.
Μεταποιητής παρτίδων σε SDK και συλλέκτης. να διατηρούν ουρές αναμονής για να αποφεύγεται η απώλεια κομματιών όταν συμβαίνουν εκρήξεις.
16) Διαλειτουργικότητα και μετανάστευση
Πολλαπλασιαστές: χρήση W3C. Υποστήριξη ανάγνωσης διπλής διάδοσης.
Εξαγωγή: OTLP-APM (Jaeger/Tempo/Elastic/X-Ray κ.λπ.).
Σταθερές εκδόσεις του semconv - fix 'schemaUrl' και αναβαθμίσεις σχεδιασμού.
17) Αντι-μοτίβα
Υψηλή πληθικότητα χαρακτηριστικών ('χρήστης _ id' στην ετικέτα, δυναμικά κλειδιά).
Αρχεία καταγραφής χωρίς ίχνος _ id → καμία συσχέτιση.
Εξαγωγή απευθείας από εφαρμογές στο Internet APM (χωρίς πύλη, χωρίς TLS/mTLS).
Η συλλογή «μόνο» 100% στις πωλήσεις είναι δαπανηρή και άσκοπη.
Απορρίψεις ερωτήσεων SQL με δεδομένα χρήστη στο 'db. δήλωση ".
Ασυνεπής ονομασία υπηρεσίας/έκδοσης - οι μετρήσεις «καταρρέουν».
18) Κατάλογος ελέγχου εφαρμογής (0-45 ημέρες)
0- 10 ηµέρες
Ενεργοποίηση SDK/αυτόματων οργάνων σε υπηρεσίες ζωτικής σημασίας 2-3.
Παράγοντας ρύθμισης (DaemonSet) + Πύλη (Ανάπτυξη), OTLP 4317/4318 με TLS.
Προσθήκη υπηρεσίας. ονοματεπώνυμο "," υπηρεσία ". εξάπλωση της έκδοσης ','. περιβάλλον "παντού.
11-25 ημέρες
Δειγματοληψία στην ουρά με σφάλματα/καθυστέρηση/διαδρομές» χρήματος».
Τα SpanMetrics → Prometheus περιλαμβάνουν τα Exemplars και τα RED/SLO dashboards.
Πολλαπλασιάστε το W3C μέσω της πύλης API/NGINX/ματιών· συσχετίζονται κορμοτεμάχια.
26-45 ημέρες
Καλύψτε ουρές αναμονής/DB/κρύπτη. συνδέσεις για το async.
Πολιτικές έκδοσης PII στο 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;
Prometheus с Exemplars (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 μετατρέπει την παρατηρησιμότητα σε ένα τυποποιημένο, διαχειρίσιμο κύκλωμα: ενοποιημένη σημασιολογία, ασφαλής διάδοση, έξυπνη δειγματοληψία και ισχυρή συσχέτιση με μετρήσεις και κορμούς. Κατασκευάστε μια πύλη +, προσθέστε ουραία δειγματοληψία, spanmetrics και examplars, παρακολουθήστε PII και καρδινότητα - και ο εντοπισμός θα γίνει ένα εργαλείο όχι μόνο για αποσφαλμάτωση, αλλά και για αυτόματες λύσεις SRE/Release, μειώνοντας MTTR και κινδύνους με κάθε απελευθέρωση.