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-oneBu komut Jaeger'ı başlatır. Web arayüzü http://localhost:16686 adresinde açılır.
Şimdi iki Flask servisi yazalım:
1from flask import Flask2from opentelemetry import trace, metrics3from opentelemetry.sdk.trace import TracerProvider4from opentelemetry.sdk.trace.export import BatchSpanProcessor5from opentelemetry.exporter.jaeger.thrift import JaegerExporter6from opentelemetry.instrumentation.flask import FlaskInstrumentor7from opentelemetry.instrumentation.requests import RequestsInstrumentor8import requests9import time1011jaeger_exporter = JaegerExporter(agent_host_name="localhost", agent_port=6831)12trace.set_tracer_provider(TracerProvider())13trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(jaeger_exporter))1415app = Flask(__name__)16FlaskInstrumentor().instrument_app(app)17RequestsInstrumentor().instrument()1819tracer = trace.get_tracer(__name__)2021@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]}2627@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()}3233if __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.py2python 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.
0 yorum