Distributed Tracing Kurulumu: OpenTelemetry ile İstek Akışını İzleme

Mikroservis mimarisinde bir isteğin hangi servisleri geçtiğini, ne kadar zaman harcadığını ve nerede hata oluştuğunu görmek çok önemli. OpenTelemetry bunu mümkün kılan açık standart bir araçtır.

Burada Python ile basit bir örnek yapacağız. İki servis kuruyoruz: biri API çağrısı yapan, diğeri veri döndüren. Her adımı izleyeceğiz.

Önce gerekli paketleri yükleyin:

1pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-jaeger opentelemetry-instrumentation-flask opentelemetry-instrumentation-requests

Şimdi Jaeger'ı Docker ile çalıştırın:

1docker run -d --name jaeger -p 6831:6831/udp -p 16686:16686 jaegertracing/all-in-one

Bu komut Jaeger'ı başlatır. Web arayüzü http://localhost:16686 adresinde açılır.

Şimdi iki Flask servisi yazalım:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1from flask import Flask
2from opentelemetry import trace, metrics
3from opentelemetry.sdk.trace import TracerProvider
4from opentelemetry.sdk.trace.export import BatchSpanProcessor
5from opentelemetry.exporter.jaeger.thrift import JaegerExporter
6from opentelemetry.instrumentation.flask import FlaskInstrumentor
7from opentelemetry.instrumentation.requests import RequestsInstrumentor
8import requests
9import time
10
11jaeger_exporter = JaegerExporter(agent_host_name="localhost", agent_port=6831)
12trace.set_tracer_provider(TracerProvider())
13trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(jaeger_exporter))
14
15app = Flask(__name__)
16FlaskInstrumentor().instrument_app(app)
17RequestsInstrumentor().instrument()
18
19tracer = trace.get_tracer(__name__)
20
21@app.route("/api/data")
22def get_data():
23with tracer.start_as_current_span("fetch_data"):
24time.sleep(0.1)
25return {"status": "success", "data": [1, 2, 3]}
26
27@app.route("/service1")
28def service1():
29with tracer.start_as_current_span("service1_process"):
30response = requests.get("http://localhost:5001/api/data")
31return {"result": response.json()}
32
33if __name__ == "__main__":
34app.run(port=5000, debug=False)

İkinci servisi farklı portta çalıştırın:

1# app.run(port=5001, debug=False)

Her iki servisi ayrı terminalde başlatın:

1python service1.py
2python service2.py

Şimdi http://localhost:5000/service1 adresine istek gönderin. Jaeger web arayüzüne (http://localhost:16686) gidip "service1" servisini seçin. İsteğin hangi span'lardan geçtiğini, her birinin ne kadar zaman aldığını görebilirsiniz.

Beklenen çıktı: Jaeger arayüzünde "service1_process" ve "fetch_data" span'larının ağaç yapısı görülür. Her span'ın süresi, başlangıç saati ve durum bilgisi yer alır.

Sık yapılan hata: Jaeger'ın çalışmadığını fark etmemek. Docker konteynerinin çalışıp çalışmadığını `docker ps` ile kontrol edin. Agent portu (6831) firewall tarafından engellenebilir.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz