[jaeger]

이정훈·2023년 5월 3일
0

k8s

목록 보기
14/17
post-thumbnail
  • Jaeger는 분산 시스템에서 발생하는 문제를 해결하기 위한 오픈소스 분산 추적 시스템입니다. Jaeger tracing은 분산 시스템의 다양한 컴포넌트 간의 상호작용을 추적하여 애플리케이션의 성능 문제 또는 장애를 식별하고 해결하는 데 사용됩니다.

  • Jaeger tracing은 각각의 요청이나 트랜잭션을 추적하고 이를 시각적으로 표현하여 사용자가 분산 시스템의 상태를 파악할 수 있도록 합니다. 추적 정보에는 요청이 어떤 서비스에 도착했는지, 해당 서비스에서 어떤 작업이 수행되었는지, 각 서비스 간에 데이터가 어떻게 전달되었는지 등의 정보가 포함됩니다. 이를 통해 시스템에서 발생하는 병목 현상이나 오류의 원인을 식별하고 개선할 수 있습니다.

jaeger

  • 도커가 설치되어 있는 곳에서
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


  • 대쉬보드 볼수 있는 곳은 query http://[localhost]:16686
  • Django manage.py 파일 설정 중에 jaeger의 6831 이

django 설정

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()
  • view.py 설정
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은 중첩되거나 순서대로 정리되어 있을 수 있다.

  • 연결 된 것을 확인
  • 자세한 설명과 이해는 여러 블로그를 참고!

jaeger 홈페이지

참고!!

port 설명!

[Kubernetes] Jaeger + Istio를 이용한 tracing의 개념 이해 및 구현

profile
싱숭생숭늉

0개의 댓글