GH GambleHub

Distributed Tracing: OpenTelemetry

Distributed Tracing: OpenTelemetry

1) Ինչու է OTel-ը և ի՞ նչ է այն տալիս։

OpenTelemetry (OTel) - բաց կոմպոզիցիա և SDK/գործակալների/կոլեկցիոներների հավաքածու հեռուստաչափության համար (treiss, metrics, logs), OTLP-ի միասնական կոդով։ Նպատակները

Հարցման ուղիների (gateway wwww.BD/kash/հերթերի) միջոցով։

Արագ RCA/դեգրադացիայի և ածխաջրածինների (kanarek/blue-green)։

Կապը SLO-ի և Avto-արձագանքների հետ (տվյալների վիրահատական լուծումներ)։

Գենդոր ագնոստիկ 'արտահանումը ցանկացած backend, առանց մեկ APM-ի։

Օժանդակ սկզբունքները ՝ standardize, sample smart, secure by no, www.relate everything։

2) Հիմքեր ՝ համատեքստ, սպան, ատրիբուտներ

Trace-ը զանգերի ծառ/գրաֆիկ է։ Մոսկվան վիրահատություն է (RPC, SQL, հերթի մարտահրավեր)։

Span Kind: `SERVER`, `CLIENT`, `PRODUCER`, `CONSUMER`, `INTERNAL`.

W3C Trace Express: վերնագրեր «traceparent», «tracestate»; համատեքստը փոխանցվում է հղիության ընթացքում։

Attributes-ը բանալին է (ցածր կարդինալություն), Events-ը ժամանակի ընթացքում, Status-ը սխալների կոդ/նկարագրություն է։

Links - սպանների կապը խիստ հիերարխիայից դուրս (կարևոր է async/fan-out/fan-in)։

Սպանների անունը

HTTP: "HTTP + METHOD + (" GET/withdr.ru "որպես ռուսական)

DB: `DB SELECT` / `DB INSERT`

Queue: `QUEUE publish topic=X` / `QUEUE consume topic=X`

3) Սեմանտիկ կոնվենցիաները (semconv)

Օգտագործեք կայուն ատրիբուտային սխեմաներ

HTTP/GRPC: `http. method`, `http. route`, `http. status_code`, `url. full`.
DB: `db. system=postgresql`, `db. stations '(միայն անվտանգ գոյատևումը), "db. name`.
Messaging: `messaging. system=kafka`, `messaging. operation=receive`, `messaging. destination`.
Cloud/K8s/Host: `cloud. region`, `k8s. pod. name`, `container. id`.
Resource attributes (պարտադիր): <108։ name`, `service. version`, `deployment. environment`.

Նշված սխեմաները նշեք «schemaUr» -ի միջոցով SDK/Collector ռեսուրսների մեջ։

4) Sampling: head, tail, adaptive

Head-based (SDK) 'լուծում է նախապես, էժան; լավ է high-QPS-ի համար, բայց կարող է բաց թողնել «հետաքրքիր» ճանապարհները։

Tail-based (Collector): լուծում է ուղու ավարտից հետո։ թույլ է տալիս կանոններ կարգավիճակի, լատենտության, կատալոգների վերաբերյալ։

Adaptive/Դինամիկ 'բարձրացնում է սեմպլի մասնաբաժինը սխալների/p95 աճի դեպքում։

Պրոդ մակարդակի բաղադրատոմսը 'Head 1-5% գլոբալ + Tail ընտրությունը «կարևոր» ՝ «status = ERROR», «latency> p95», «դրամական երթուղիներ», PFC/KYC սխալները։

5) Հարաբերակցություն ՝ մետրեր, լույսեր, թրեյսներ,

Exemplars: wwww.ttrace _ id '-ի հետ հիստոգրամներում (արագ ցատկ դեպի ուղին)։

Լոգներ 'ավելացրեք «trace _ id »/« բանաձև _ id» և անցեք լոգանքներից դեպի ուղի։

Metra.ru (processor): Այն համախմբում է RED-metrics («reques.ru, errors, duration») SLO/alerts-ի համար։

6) Ճարտարապետությունը

Agent (DaemonExpress) յուրաքանչյուր հանդիպման ժամանակ հավաքում է ծրագրերից (OTLP) և ֆորվարդիտը։

Gateway-ը (Cluster/Region) կենտրոնական Collector-ն է (շատ կրկնօրինակներ), որոնք ունեն ուղղման/sempling/հարստացման։

OTLP: gRPC `4317`, HTTP `4318`; միացրեք TFC/mTSA-ը։

«Agent + gateway» -ի առավելությունները 'մեկուսացում, բուֆերիզացիա, տեղական backpressure, պարզեցված ցանց։

7) OpenTelemetry Collector-ը հիմնական ձևանմուշ է (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) Windows Metrance և 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 _ spanmetrance _ calls + www.ru, rope, code + և" duration _ bucket "SLO/alerts համար։

9) K8s: www.Collector (DaemonExpress + Deploy.ru)

Agent (DaemonExpress) հատվածը

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 (Deploy.ru) - մի քանի կրկնօրինակներ, WindClusterIP/Ingress, HPA CPU/QPS։

10) Անվտանգությունն ու գաղտնիությունը

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

Վավերացում (Basic/OAuth/Headers) Gateway-ի մուտքի մոտ։ սահմանափակեք ծագումը։

PII խմբագրությունը 'ֆիլտրել/դիմակավորել ատրիբուտները ("user. email ', «card.») Collector պրոցեսորում։

Լիմիտներ ՝ MSK-ում սահմանափակեք իրադարձության չափը/ատրիբուտների քանակը (պաշտպանությունը կարդինալությունից)։

RBAC-ը backende + առանձին նյարդային ծրագրեր/տենանտներ։

Օրինակ է Collector-ում

yaml processors:
attributes/redact:
actions:
- key: user. email action: delete
- key: payment. card action: delete

11) Փոփոխությունը 'արագ սկսելը

Node. 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 (Spring)

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) Ասինխրոնշչինա 'հերթեր, անվադողեր, c.ru)

MSER/CONSUMER-ը կապով «links» -ի միջոցով (հաղորդագրությունները ունեն իրենց կյանքի ցիկլը)։

Օգտագործեք համատեքստը հաղորդագրությունների վերնագրերում («traceparent »/« baggage»)։

Batch-consume-ում ստեղծեք սպանի վրա հաղորդագրություն կամ համադրեք «draging» -ի հետ։ batch. size`.

Com/job-ի համար 'նոր trace գործարկելու + links առաջնային իրադարձությունների (եթե կա)։

13) Baggage և targeting

Պահեք առնվազն կայուն պարամետրեր («tenium _ id», «region», «vip _ tier») baggage; արգելեք PII-ը։

Անցեք gateway/gateway-gloger-ի միջոցով, որպեսզի հաջորդ միավորի մետրը։

14) Ինտեգրումը և SLO-geiting-ը

Կանարյան քայլերը նախատեսվում է ստուգել «traces _ spanmetrance _» երթուղիներով/յուզ հատվածներով։

Քայքայման ժամանակ (5xx/p95) - Argo Rollouts AnalysTemplate + PromQL)։

Մետրոպրիկի տրամագծերը ուղղակիորեն տանում են մետրոպոլիտենի խողովակաշարի «վատ» ուղու։

15) Լիմիտներ և արտադրողականություն

Ограничивайте: `OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT`, `OTEL_SPAN_EVENT_COUNT_LIMIT`, `OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT`.

Համեմատեք բացառությունները/stacktrace հավանականությամբ/հաճախականությամբ։

Batch պրոցեսորը MSK-ում և Collector-ում։ պահեք հերթերը, որպեսզի չկորցնեք հետքերը։

16) Համատեղելիությունը և գործընկերությունը

Քարոզիչներ 'օգտագործեք W3C; աջակցեք B3/X-Ray կարդալու ժամանակ (dj-propagation)։

Էքսպորտը ՝ OTLP 24APM (Jaeger/Tempo/Elastic/X-Ray և այլն)։

Semconv-ի կայուն տարբերակները, գրանցեք «schemaUrle» և պլանավորեք apreds։

17) Anti-patterna

Ատրիբուտների բարձր կարդինալությունը («user _ id» label, դինամիկ բանալիներ)։

Logs առանց «trace _ id»։

Էքսպորտը ուղղակիորեն ինտերնետային APM ծրագրերից (առանց gateway, առանց TMS/mTLS)։

«Ընդամենը» 100 տոկոսը վաճառքում թանկ և անիմաստ է։

SQL հարցումների տիկնայք օգտագործողի տվյալների հետ 'db։ statement`.

Չհամաձայնեցված անունը 2019/տարբերակն է, մետրերը «քնում են»։

18) Ներդրման թուղթ (0-45 օր)

0-10 օր

Միացրեք MSK/ավտոտրանսպորտացումը 2-3 քննադատական ծառայություններում։

Տեղադրեք Agent (DaemonExpress) + Gateway (Deployae), OTLP 4317/4318 TLS-ի հետ։

Ավելացնել '108։ name`, `service. version`, `deployment. envi.ru-ը ամենուր է։

11-25 օր

Tail-sampling սխալներով/լատենտ/» դրամական» երթուղիներով։

Metra.ru Prometheus-ը, միացրեք Exemplars-ը և RED/SLO-ի dashbords։

Propagation W3C-ը API-դարպասի/NGINX/mesh-ի միջոցով։ հարաբերել լույսերը։

26-45 օր

Ծածկել հերթերը/BD/kash; links async.

PII-2019 քաղաքականությունները Collector-ում; MSK-ում ատրիբուտների սահմանները։

Ինտեգրել SLO-gating և Auto-rapat։

19) Հասունության մետրերը

Ուղու մուտքային հարցումների ծածկումը 95 տոկոսն է (հաշվի առնելով sampling head/tail)։

Exemplars-ից մետրի մասնաբաժինը 80 տոկոսն է։

RCA «ժամանակը մետրից ուղու վրա» 362 րոպե (p50)։

0 PII արտահոսք կատալոգներում/իրադարձություններում (սկաներ)։

Բոլոր ծառայությունները ունեն <108։ name/version/envi.ru/և համաձայնեցված սեմանտիկա։

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

Policy: PII-ատրիբուտների արգելքը (կեղծ-լինտեր)

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

21) Եզրակացություն

OpenTelemetry-ը դիտարկումը վերածում է ստանդարտացված, կառավարվող պարամետրերի 'միասնական սեմանտիկա, ապահով քարոզչություն, խելացի սեմպլինգ և ուժեղ հարաբերակցություն մետրիկների և լոգարանների հետ։ Կառուցեք agent + gateway, ավելացրեք tail-sampling, spanmetrance և Exemplars, հետևեք PII-ին և կարդինալությանը, և ուղեղը կդառնա գործիք ոչ միայն կարգաբերման համար, այլ նաև MSE/Releae ավտոմատ լուծումների համար, կրճատելով MTTTR-ը և յուրաքանչյուր ռիսկի ռիսկերի ժամանակ։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Telegram
@Gamble_GC
Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։