הגדרת Grafana Tempo למעקב מבוזר

כאשר מדדים מצביעים על חריגה ולוגים מתעדים שגיאה, אך לא ניתן לחבר אותם לתמונה אחת, distributed tracing בא להציל. אנו מגדירים את Grafana Tempo עבור הפרויקט שלכם—מביקורת instrumentation ועד הטמעה והכשרת הצוות. אנו מספקים פתרון turnkey, ומבטיחים פעולה אמינה ותמיכה מתמשכת.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

מדדים מצביעים על חריגת זמן אחזור, יומנים מתעדים שגיאה, אבל חיבורם לתמונה אחת נכשל. אנו נתקלים לעיתים קרובות במצב זה: RPS עלה, האחוזון ה-99 ירד ל-800 אלפיות השנייה, והגורם הוא בקשה אחת שנוגעת ב-10 מיקרוסרוויסים. ללא tracing, מציאת נקודה זו היא מחט בערמת שחת. Grafana Tempo הוא מנוע tracing מבוזר שמשתלב בצורה חלקה עם Prometheus ו-Loki בממשק Grafana אחיד. אנו מציעים פתרון מפתח: מביקורת instrumentation ועד הגדרת correlation והדרכת צוות. בקשו ביקורת על המערכת שלכם—קבלו תוכנית יישום תוך יום אחד. צרו קשר כדי לדון בפרטים.

כיצד להגדיר את Grafana Tempo ל-Tracing מבוזר?

Tempo אינו בונה אינדקסים על תוכן ה-trace. הוא מאחסן נתונים ישירות באחסון אובייקטים (S3, GCS), ומבצע אינדקס רק על Trace ID. זה מניב חיסכון קיצוני בעלויות אחסון—עד 70% בהשוואה ל-Jaeger, הדורש Elasticsearch או Cassandra. בפועל, Tempo עולה פחות משמעותית: אחסון של 1 TB של traces ב-S3 עולה פי כמה פחות. עבור פרויקט עם 20 מיקרוסרוויסים ועומס של 5000 spans בשנייה, החיסכון באחסון עולה על $2000 בחודש. החיסרון: חיפוש לפי מאפיינים ללא שפת שאילתות ייעודית אינו אפשרי. עם זאת, זרימת העבודה "נמצאה חריגה במדדים → ניווט ל-trace ספציפי" מכסה 90% מתרחישי האבחון. לחיפוש אד-הוק, השתמשו ב-TraceQL, הזמין מאז Tempo 2.0.

Tempo מול Jaeger: עלות אחסון

קריטריון Jaeger (עם Elasticsearch) Tempo (S3)
עלות אחסון (1 TB לחודש) גבוהה נמוכה (חיסכון של עד 90%)
אינדוקס מלא על כל המאפיינים רק Trace ID
חיפוש מאפיינים כן באמצעות TraceQL או correlation
שמירה מוגבלת לגודל האשכול כמעט בלתי מוגבלת

החיסכון נובע מהשמטת האינדקס היקר. אנו משתמשים ב-tail sampling ב-OpenTelemetry Collector כדי לסנן רעש: כל השגיאות והבקשות האיטיות נשמרות, האחרות בהסתברות של 10%. זה מקטין את נפח הנתונים המאוחסן בחצי מבלי לאבד ערך אבחוני.

השוואת שיטות דגימה

פרמטר Head-based sampling Tail sampling
החלטת דגימה בצד היישום (לפני שליחה) ב-Collector (לאחר איסוף כל ה-spans)
בקרת שגיאות לא ניתן להבטיח שכל השגיאות נשמרות מדיניות אפשרית (כל השגיאות נשמרות)
משאבים עומס נמוך על Collector דורש OTLP receiver ו-buffering
גמישות הסתברות קבועה מדיניות מרובה (latency, status_code)

לסביבות production, אנו ממליצים על tail sampling—הוא מספק שלמות מקסימלית של traces קריטיים.

Instrumentation של יישומים עם OpenTelemetry

Tempo מקבל traces דרך OTLP (מומלץ), Jaeger או Zipkin. דוגמה ל-instrumentation בפייתון:

from opentelemetry import trace
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()
exporter = OTLPSpanExporter(endpoint="http://otel-collector:4317", insecure=True)
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)

tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("process_order") as span:
    span.set_attribute("order.id", order_id)
    result = process(order_id)

ה-traces נשלחים ל-OpenTelemetry Collector, שמבצע דגימה ומעביר ל-Tempo. אנו ממליצים להשתמש ב-OpenTelemetry כסטנדרט ל-instrumentation.

OpenTelemetry Collector: מרכזייה מרכזית

---
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
  jaeger:
    protocols:
      grpc:
        endpoint: 0.0.0.0:14250
processors:
  batch:
    timeout: 5s
    send_batch_size: 1024
  tail_sampling:
    decision_wait: 10s
    policies:
      - name: errors-policy
        type: status_code
        status_code: {status_codes: [ERROR]}
      - name: slow-policy
        type: latency
        latency: {threshold_ms: 1000}
      - name: probabilistic
        type: probabilistic
        probabilistic: {sampling_percentage: 10}
exporters:
  otlp/tempo:
    endpoint: http://tempo:4317
    tls:
      insecure: true
service:
  pipelines:
    traces:
      receivers: [otlp, jaeger]
      processors: [batch, tail_sampling]
      exporters: [otlp/tempo]

פריסת Tempo

פריסת Tempo ב-Docker Compose
---
services:
  tempo:
    image: grafana/tempo:2.4.0
    command: ["-config.file=/etc/tempo.yaml"]
    volumes:
      - ./tempo.yaml:/etc/tempo.yaml
      - tempo-data:/tmp/tempo
    ports:
      - "3200:3200"
      - "4317:4317"
---
---
server:
  http_listen_port: 3200
distributor:
  receivers:
    otlp:
      protocols:
        grpc:
        http:
storage:
  trace:
    backend: local # для разработки; в production: s3
    local:
      path: /tmp/tempo/blocks
compactor:
  compaction:
    block_retention: 336h
metrics_generator:
  registry:
    external_labels:
      source: tempo
      cluster: docker-compose
  storage:
    path: /tmp/tempo/generator/wal
  remote_write:
    - url: http://prometheus:9090/api/v1/write
      send_exemplars: true

metrics_generator יוצר אוטומטית מדדים של Prometheus מתוך traces—service graphs ו-span metrics. זה מבטל את הצורך ב-instrumentation ידני של בקשות HTTP.

שילוב Grafana Tempo עם Prometheus ו-Loki

הגדירו את מקור הנתונים ב-Grafana: הגדירו סוג Tempo, כתובת URL http://tempo:3200, וב-jsonData הפעילו tracesToLogsV2 (UID של מקור הנתונים Loki) ו-serviceMap (UID של Prometheus). לאחר מכן, ב-Explore, לחיצה על מדד חושפת כפתור "הצג traces קשורים", ומתוך trace ניתן לנווט ליומנים.

TraceQL: חיפוש Traces לפי מאפיינים

TraceQL היא שפת שאילתות עבור Tempo, דומה ל-PromQL. דוגמאות: from opentelemetry import trace 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() exporter = OTLPSpanExporter(endpoint="http://otel-collector:4317", insecure=True) provider.add_span_processor(BatchSpanProcessor(exporter)) trace.set_tracer_provider(provider) tracer = trace.get_tracer(__name__) with tracer.start_as_current_span("process_order") as span: span.set_attribute("order.id", order_id) result = process(order_id) receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 jaeger: protocols: grpc: endpoint: 0.0.0.0:14250 processors: batch: timeout: 5s send_batch_size: 1024 tail_sampling: decision_wait: 10s policies: - name: errors-policy type: status_code status_code: {status_codes: [ERROR]} - name: slow-policy type: latency latency: {threshold_ms: 1000} - name: probabilistic type: probabilistic probabilistic: {sampling_percentage: 10} exporters: otlp/tempo: endpoint: http://tempo:4317 tls: insecure: true service: pipelines: traces: receivers: [otlp, jaeger] processors: [batch, tail_sampling] exporters: [otlp/tempo]

services: tempo: image: grafana/tempo:2.4.0 command: ["-config.file=/etc/tempo.yaml"] volumes: - ./tempo.yaml:/etc/tempo.yaml - tempo-data:/tmp/tempo ports: - "3200:3200" - "4317:4317"

TraceQL פותר את המגבלה המרכזית של Tempo—כעת ניתן לחפש traces לא רק לפי ID אלא גם לפי מאפיינים שרירותיים. התיעוד הרשמי של TraceQL מכיל תיאור מלא של התחביר.

כיצד ליישם Tracing מבוזר עם Grafana Tempo?

  1. ביקורת instrumentation: בדקו אם קיימים OTel SDK, Jaeger, Zipkin. בחרו אסטרטגיית דגימה.
  2. פריסת Tempo + Collector: פרסו בסביבתכם, הגדירו אחסון אובייקטים (S3, GCS).
  3. הגדירו מקור נתונים ב-Grafana: הגדירו correlations עם Prometheus ו-Loki.
  4. הפעילו metrics_generator: קבלו מדדים אוטומטיים ו-service graphs.
  5. תיעוד והדרכה: ספקו הוראות להוספת tracing לשירותים חדשים.

מה כוללת העבודה

  • פריסת Tempo ו-Collector עם תצורת דגימה אופטימלית.
  • שילוב עם מחסנית הניטור הקיימת (Prometheus, Loki).
  • הגדרת התראות המבוססות על traces (לדוגמה, ירידת SLO).
  • תיעוד והדרכה מעשית לצוות.
  • אחריות ל-correlation נכון בין מדדים, traces ויומנים.

לוח זמנים: 2 עד 5 ימים בהתאם למורכבות התשתית. אנו צוות עם ניסיון של 5+ שנים ב-observability, שיישם tracing מבוזר על למעלה מ-30 פרויקטים. נבחן את הפרויקט שלכם תוך יום עסקים אחד. קבלו ייעוץ כדי לדון בפרטים. צרו קשר, ונמצא את הפתרון האופטימלי.