כריתת עצים ואיתור אירועים
כריתת עצים ואיתור אירועים
1) מטרה ומסגרת
בולי עץ ושבילים הם הבסיס ליכולת התצפית.
יומנים מגיבים ל ”מה שקרה” ו ”באיזה הקשר”.
עקבות מגיבות ל ”איפה ולמה לאט/בטעות” בנתיב שאילתה מבוזר.
- מובנה כברירת מחדל (JSON); trace-first: כל רישום במסלול החם מחויב ל ”trace _ id'/” span _ id'.
- רעש מינימלי, אות מקסימלי: רמות, דגימה, אנטי-קרדינליות.
- אבטחה ופרטיות: מיסוך, עריכה, בקרת גישה.
- תרשימים של יומנים ואירועים.
2) טקסונומיה של אירועים
זרמים ואינדקסים נפרדים לפי יעד:1. רישומים טכניים (זמן ריצה, שגיאות, פסקי זמן ברשת, מגשים מחדש).
2. אירועים עסקיים (רישום, הפקדה, תעריף, משיכה, שלב KYC) - מתאימים לניתוחי מוצרים ואירועים לאורך נתיבי ”כסף”.
3. Audit הוא כתב עת בלתי ניתן לשינוי.
4. אבטחה (אימות, הסלמת חיסיון, סנקציה/דגלי PEP).
5. תשתית (אירועים K8s, ציפוי אוטומטי, HPA/VPA, צמתים/דיסק/רשת).
עבור כל זרם - כללים נפרדים לשמירה, אינדקס וגישה.
3) יומן מבני (תקן JSON)
json
{
"ts": "2025-11-03T14:28:15.123Z",
"level": "ERROR",
"service": "payments-api",
"env": "prod",
"region": "eu-central-1",
"trace_id": "8a4f0c2e9b1f42d7",
"span_id": "c7d1f3a4b8b6e912",
"parent_span_id": "a1b2c3d4e5f60789",
"logger": "withdraw.handler",
"event": "psp_decline",
"msg": "PSP declined transaction",
"http": { "method": "POST", "route": "/withdraw", "status": 502, "latency_ms": 842 },
"user": { "tenant_id": "t_9f2", "user_key": "hash_0a7c", "vip_tier": 3 },
"payment": { "psp": "acme", "amount": 120.50, "currency": "EUR", "idempotency_key": "u123:wd:7845" },
"safe": true, // пройдена проверка на секреты
"version": "1.14.2", // версия сервиса (SemVer)
"build": "sha-1f2a3b4",
"kubernetes": { "pod": "payments-7cbdf", "node": "ip-10-0-2-41" }
}
דרישות: סכימה שטוחה + מצורפת לפי תחום, שדות דרושים ('ts, level, service, env, trace_id, msg'), ערכים מספריים - מספרים, לא מחרוזות.
4) רמות, קרדינליות והיקף
רמות: ”DEBUG” (לא במכירות), ”INFO” (עובדות עסקיות), ”אזהרה” (חריגות), ”שגיאה” (שגיאות), ”קטלני” (קריסות).
קרדינליות: הימנע מתוויות שרירותיות של מפתחות/דינמיות. בלי ”זיהוי במפתח”.
דגימה של יומנים: קצב הגבלה חוזר על הודעות; אפשר ”Debug” רק סקופ ובזמן (דגל תכונה).
Idempotency: Log 'idempotency _ key' כדי לדכא אירועים כפולים על ידי הצרכנים.
5) פרטיות וביטחון
מסכה PII/סודות על סוכנים (רהוט Bit/Vector): כרטיסי מיסוך מפתחות ('דוא "ל', 'כרטיס', 'token', 'אישור').
Hash 'user _ key', להחזיק רק את ההקשר הנדרש (country, KYC-level, VIP-tier).
סעיפים נפרדים: חם (חיפוש מקוון) וקר (ארכיון ללא PII/עם הקשר מופשט).
ביקורת - append בלבד, אחסון תולעת, גישה רק על העיקרון של חיסיון מינימלי.
6) איתור: סטנדרטים והקשר
הקשר W3C: "tracepart'/" tracestate" כותרות, בתוספת מטען עבור מפתחות מאובטחים (למשל דייר _ id ',' אזור ').
מטרי קישור ועקבות: Exemplars - pass 'trace _ id' to the dismaging points of the histograms (מאיץ RCA).
דגימה: דגימה בסיסית 1-5% + דינמית ”בשגיאה/איטית p95” עד 100% לשאילתות בעייתיות.
קישורים: עבור תורים אסינכרוני/סאגות, קישור משתרע דרך ”קישורים”, לא רק ”הורה”.
7) איסוף וניתוב
סוכן: רהוט ביט/וקטור ליומנים; יצוא OTLP לאספן OpenTelemetry.
אספן: שער מרכזי (אצווה/טרנספורמציה/פילטר/ניתוב).
App → (OTLP logs/traces/metrics) → OTel Collector
→ logs: redact → route(security audit tech biz) → hot index / cold archive
→ traces: tail_sampling(errors p95>threshold) → APM backend
→ metrics: Prometheus exporter (for SLO/alerts)
אספן אוטל (שבר):
yaml processors:
batch: {}
attributes:
actions:
- key: env value: prod action: insert filter/logs:
logs:
include:
match_type: strict resource_attributes:
- key: service.name value: payments-api exporters:
otlp/traces: { endpoint: "apm:4317", tls: { insecure: true } }
loki: { endpoint: "http://loki:3100/loki/api/v1/push" }
prometheus: {}
service:
pipelines:
logs: { receivers: [otlp], processors: [attributes,batch], exporters: [loki] }
traces: { receivers: [otlp], processors: [batch], exporters: [otlp/traces] }
metrics: { receivers: [otlp], processors: [batch], exporters: [prometheus] }
8) כלי נגינה: דוגמאות SDK
8. צומת 1. js (פינו + אוטל)
js import pino from "pino";
import { context, trace } from "@opentelemetry/api";
const logger = pino({ level: process.env.LOG_LEVEL "info" });
function log(info) {
const span = trace.getSpan(context.active());
const base = span? { trace_id: span.spanContext().traceId, span_id: span.spanContext().spanId }: {};
logger.info({...base,...info });
}
// пример log({ event: "deposit.created", amount: 50, currency: "EUR", user: { user_key: "hash_0a7c" } });
8. 2 Java (SLF4J + Otel)
java
MDC.put("trace_id", Span.current().getSpanContext().getTraceId());
MDC.put("span_id", Span.current().getSpanContext().getSpanId());
log.info("psp_response status={} latency_ms={}", status, latency);
8. 3 פייתון (Structlog + Otel)
python import structlog from opentelemetry import trace log = structlog.get_logger()
def log_json(event, kwargs):
span = trace.get_current_span()
ctx = {}
if span and span.get_span_context().is_valid:
ctx = {"trace_id": span.get_span_context().trace_id, "span_id": span.get_span_context().span_id}
log.msg(event=event, ctx, kwargs)
8. 4 NGINX # איתור כותרת
nginx proxy_set_header traceparent $http_traceparent;
proxy_set_header tracestate $http_tracestate;
9) יומנים כאות להתראות ופעולות אוטומטיות
תבניות שגויות (”psp _ discovery”, ”fraze _ flag”) מצטברות ומתואמות עם SLO.
התראות על דפוס קצב: "5xx על/נסיגה> 0. 5% לכל 10 מ "מ," fraud_flag ספייק> + 200% של הבסיס "
פעולה אוטומטית: אם הרישום הוא 'withdrawals _ mode ידני _ true', אפשר להרוג-מתג דרך פלטפורמת הדגל.
כלל לדוגמה (פסאודו-ביטוי):
rate(count_over_time({service="payments-api", level="ERROR", event="psp_decline"}[5m])) > 5
10) שימור, אינדקס, אחסון
חם: 7-14 ימים (חקירה מבצעית).
חם: 30-90 יום (מגמות, RCA).
קר: 180-365 + (ארכיון, ביקורת חשבונות) - דחיסה, כיתות זולות, אולי ללא חיפוש טקסט מלא.
אינדקס: מפתחות קבועים ('שירות, env, רמה, אירוע, trace_id, משתמש. tenant_id'), איסור על אינדקס ”כל דבר ברצף”.
גודל האירוע מוגבל (לדוגמה, 32KB): ”תוספת האחסון היא האויב של MTTR”.
11) ביקורת חשבונות וחוסר תזוזה
כתוב אירועים ביקורת בזרם נפרד עם חתימות/חשיש, זמן שרת, ”מי/מה/מתי/למה”, קישור לכרטיס.
”מי כלל את 100% דגל הבונוס בדה?” -תשובה חייבת להיות בבקשות 1-2.
json
{
"ts": "2025-11-03T14:00:00.000Z",
"actor": "alice@company",
"action": "feature_flag.update",
"target": "bonus.enable_vip",
"old": {"rollout": 10},
"new": {"rollout": 100},
"reason": "campaign_2311",
"ticket": "OPS-3481",
"trace_id": "cf12ab.."
}
12) אירועים עסקיים ומודל נתונים
אירועים עסקיים אינם ”טקסט ביומנים”, אלא חוזה:- 'event _ type', 'event _ id',' event _ id', 'התרחש _ at', 'שחקן', 'נושא', 'סכום', 'מטבע', 'סטטוס', 'idmpotency _ key'.
- השתמש בארגז חיצוני ו ”לפחות פעם אחת” עם צרכנים אידיוטים.
13) קוברנטס ויומני צינור
סוכני Sidecar/DaemonSet עם חוצץ לדיסק (במהלך הפרעות רשת).
אנוטציות של רפידות לניתוב ('log. סוג ',' שימור. Tier ').
איסוף היומנים של בקרי K8s בנפרד (מדד אשכול).
ini
[FILTER]
Name modify
Match
Remove authorization, password, card_number
14) אנטי דפוסים
רישומי מחרוזת "לפי הצורך", היעדר "trace _ id'.
PII/סודות ביומנים, מטענים זורקים בשלמותם.
מיליוני מפתחות ייחודיים * ”התפוצצו” באינדקס.
דיבוג במבצע 24/7.
ערבוב ביקורת, אבטחה וטכנולוגים לאינדקס אחד.
אין מדיניות שימור ואין בדיקת שיקום גיבוי.
15) רשימת יישומים (0-45 ימים)
0-10 ימים
אפשר קישור W3C על שער/לקוחות, העברת כותרות.
תרגם רישומי יישומים ל ־ JSON, הוסף את ”trace _ id'/” span _ id'.
מכחיש את הסודות (מסווה על הסוכן), מאשר את רשימת השדות.
11-25 ימים
זרמים נפרדים: tech/biz/audit/security/infra, set restruction ו-ACL.
אפשר אספן אוטל, שגיאות דגימת זנב/שאילתות איטיות.
לוחות מחוונים ”קצב רישום/שגיאה לפי מסלול” + Jump-to-trace (מופת).
26-45 ימים
התראות ודפוס אירוע ומתאם עם SLO.
ארכיון/שחזור (מבחן ד "ר) ליומנים קרים.
תרשים יומן במודיע, חוזה לאירועים עסקיים.
16) מדדי בגרות
'trace _ id' request כיסוי la 95%.
הנתח של יומני JSON id 99%.
תקריות שנמצאו באמצעות ”קפיצה לעקבות” נפתרו <15 דקות (p50).
0 מקרי PII ברישומים (סורק דליפה).
שמירה נצפית לכל הזרמים (נוכיח את הביקורת באופן אוטומטי).
17) אפליקציות: מיני סניפטים
דור טרקפרנט W3C (פסאודו)
txt traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
PromQL - חבורת לוגים ו ־ SLO (דוגמה)
high_error_logs = rate(log_events_total{service="payments-api",level="ERROR"}[5m])
5xx_rate = sum(rate(http_requests_total{service="payments-api",status=~"5.."}[5m])) / sum(rate(http_requests_total{service="payments-api"}[5m]))
alert if high_error_logs > 10 and 5xx_rate > 0.005
OpenAPI - כותרות מתאם
yaml components:
parameters:
Traceparent:
name: traceparent in: header required: false schema: { type: string }
18) מסקנה
מעגל רישום ואיתור חזק הוא סכימה + דיסציפלינה: רישומי JSON מבניים, רישום יחיד של trace _ id, עיבוד PII מאובטח, ניתוב ושמירה על זרמים, כמו גם קשר הדוק עם SLO, התראה וגלגולים. עשה את המעבר מ ”מזבלה של טקסטים” לחוזי אירועים ומסלולים, והאבחנה של תקריות ייצור תהפוך מהירה, צפויה וניתנת לאימות.