Jaeger는 분산 시스템에서 발생하는 문제를 해결하기 위한 오픈소스 분산 추적 시스템입니다. Jaeger tracing은 분산 시스템의 다양한 컴포넌트 간의 상호작용을 추적하여 애플리케이션의 성능 문제 또는 장애를 식별하고 해결하는 데 사용됩니다.
Jaeger tracing은 각각의 요청이나 트랜잭션을 추적하고 이를 시각적으로 표현하여 사용자가 분산 시스템의 상태를 파악할 수 있도록 합니다. 추적 정보에는 요청이 어떤 서비스에 도착했는지, 해당 서비스에서 어떤 작업이 수행되었는지, 각 서비스 간에 데이터가 어떻게 전달되었는지 등의 정보가 포함됩니다. 이를 통해 시스템에서 발생하는 병목 현상이나 오류의 원인을 식별하고 개선할 수 있습니다.
docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
jaegertracing/all-in-one:1.6
http://[localhost]:16686
pip install opentelemetry-sdk
pip install opentelemetry-instrumentation-django
pip install requests
pip install opentelemetry-instrumentation-dbapi
pip install opentelemetry-exporter-jaeger
pip install mysqlclient
필요한 설치 파일
manage.py 설정
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import json
import os
import sys
import MySQLdb
from opentelemetry.instrumentation.dbapi import trace_integration
from opentelemetry.instrumentation.django import DjangoInstrumentor
from opentelemetry import trace
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
def request_hook(span, request):
span.set_attribute(
"appsignal.request.parameters",
json.dumps({
"GET": request.GET,
"POST": request.POST
})
)
pass
def response_hook(span, request, response):
span.set_attribute(
"appsignal.request.parameters",
json.dumps({
"GET": request.GET,
"POST": request.POST
})
)
pass
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
DjangoInstrumentor().instrument(request_hook=request_hook, response_hook=response_hook, is_sql_commentor_enabled=True)
trace_integration(MySQLdb, "connect", "mysql")
trace.set_tracer_provider(
TracerProvider(
resource=Resource.create({SERVICE_NAME: "my-django"})
)
)
jaeger_exporter = JaegerExporter(
agent_host_name='[jaeger 설치 IP]',
agent_port=6831,
)
# Create a BatchSpanProcessor and add the exporter to it
span_processor = BatchSpanProcessor(jaeger_exporter)
# add to the tracer
trace.get_tracer_provider().add_span_processor(span_processor)
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
from django.http import JsonResponse
from django.shortcuts import render
from web.models import Data
from opentelemetry import trace
# 사용하려면 import시켜줘야 한다.
# Create your views here.
def read(request):
tracer = trace.get_tracer(__name__)
# 모을 것이다!
datas = Data.objects.all().values()
data_list = []
with tracer.start_as_current_span('DB 데이터 조회 수 data_List에 담는 코드'):
# 추가! span 작업단위로 묶어줄거고 이름은 ('')있는 것으로!
for data in datas:
print(data)
data_list.append(data)
context = {"result": data_list}
return JsonResponse(context)
Trace : 시스템을 통하는 데이터/실행 경로. 1개 이상의 Span으로 이루어져 있다. 쉽게 설명하자면 클라이언트가 특정 기능 요청 후 응답을 리턴받을 때까지를 Trace라고 이해하면 된다.
Span : Jaeger의 논리적인 작업단위. 각 Span에는 작업명. 시작시간. 기간등이 정보가 포함되어 있다. Span은 중첩되거나 순서대로 정리되어 있을 수 있다.