예거 액세스 파이썬 자습서 응용 프로그램 [미완성]

시는 : 예거와 파이썬 몇 가지 기사에 대해,이 문서 수집과 조합에서 공식 문서를 포함하여 많은 장소에서이다, 지적하십시오 잘못된 경우 지금이 아니라, 실제 검증을 수행, 나중에 사용하기 위해 참조를 제공하고, I 회의 후 그것의 과정에서 잘못된 장소를 수정합니다.


예거 액세스 파이썬 응용 프로그램

파이썬에서, 재규어 클라이언트 액세스를 사용하여. 또한, 분산 응용 프로그램 파이썬 추적 수집에 감지하는 데 사용할 수있는 클라이언트 라이브러리, 그리고 추적 저격병로 전송한다. 자세한 내용은 참조하십시오 OpenTracing 파이썬 API를 .

자식 주소의 재규어 클라이언트 : 재규어 클라이언트

1. 설치 저격병 클라이언트

pip install jaeger-client

2. (예) 추적기 객체를 생성하고 비즈니스 프로세스를 추적하는 물체 추적 프로그램에 의해 스팬을 생성한다.


import logging
import time
from jaeger_client import Config

if __name__ == "__main__":
    log_level = logging.DEBUG
    logging.getLogger('').handlers = []
    logging.basicConfig(format='%(asctime)s %(message)s', level=log_level)

    config = Config(
        config={ # usually read from some yaml config
            'sampler': {
                'type': 'const',
                'param': 1,
            },
            'logging': True,
        },  
        service_name='your-app-name',
        validate=True,
    )
    # this call also sets opentracing.tracer
    tracer = config.initialize_tracer()

    with tracer.start_span('TestSpan') as span:
        span.log_kv({'event': 'test message', 'life': 42})

        with tracer.start_span('ChildSpan', child_of=span) as child_span:
            span.log_kv({'event': 'down below'})

    time.sleep(2)   # yield to IOLoop to flush the spans - https://github.com/jaegertracing/jaeger-client-python/issues/50
    tracer.close()  # flush any buffered spans

참고 : 당신이 저격병, 저격병을 사용하는 모든 -에 - 하나의 도커 이미지 (또는 유사) 방식을 사용하고 별도의 용기에 응용 프로그램을 실행하려면 다음 코드를 사용하여 호스트와 포트가 작동 저격병 에이전트를 정의합니다. 저격병 범위가 UDP로 전송하기 때문에 UDP 배달을 보장하지 않는 동안,이 권장되지 않습니다, 유의하시기 바랍니다. (자세한 내용은 여기를 클릭 .)

    config = Config(
        config={ # usually read from some yaml config
            'sampler': {
                'type': 'const',
                'param': 1,
            },
            'local_agent': {
                'reporting_host': 'your-reporting-host',
                'reporting_port': 'your-reporting-port',
            },
            'logging': True,
        },  
        service_name='your-app-name',
        validate=True,
    )

3. 초기화 및 구성

참고 : 교착 상태가 발생할 수 있습니다 가져 오기 중에 추적기를 초기화하지 마십시오 (질문 참조 # 31 , # 60 ). 그러나 함수의 정의는 추적기 (아래 예 참조)을 반환하고 기능에 대한 모든 소개를 명시 적으로 호출 완료 후.

생산 환경은 초기화 추적의 방법을 권장합니다 :


from jaeger_client import Config

def init_jaeger_tracer(service_name='your-app-name'):
    config = Config(config={}, service_name=service_name, validate=True)
    return config.initialize_tracer()

, initialize_tracer 주 ()는 전역 변수 opentracing.tracer 설정합니다. 추가 추적을 생성해야하는 경우 (예를 들어, 원격 서비스의 범위 클라이언트에서 검출되지를 만들 수) () 메소드를 new_tracer 사용합니다.

프로 메테우스 오픈 소스 모니터링 시스템

이 모듈은 성능 함수 예거 통합 메테우스 초기화 방법을 추적 메테우스 jaeger_client 것


from jaeger_client.metrics.prometheus import PrometheusMetricsFactory

config = Config(
        config={},
        service_name='your-app-name',
        validate=True,
        metrics_factory=PrometheusMetricsFactory(namespace='your-app-name')
)
tracer = config.initialize_tracer()

4. 파이썬의 OpenTracing API 사용

공식 문서를 완료 파이썬 OpenTracing API에 대한

추적은 일반적으로 세 단계를 포함 :

  • 이 서비스는 과정에서 스팬 객체를 추적 만들 활동을 계속 / 추출 API를 OpenTracing 주입 사용 (HTTP 또는 다른 프로토콜을 통해) 새 요청을 수신합니다. 요청이 활성 추적을 포함하지 않는 경우, 서비스는 새로운 트랙과 새로운 뿌리 스팬을 시작합니다.
  • 이 서비스는 현재 스팬 (활성화 스팬라고 함) 로컬 스토리지 요구는 예를 들어, 서브 스팬을 만들 필요가있을 때 서비스가 다른 RPC 서비스로 전환 될 경우, 당신이 그것을 검색 할 수 있습니다에 저장되어 있어야합니다.
  • 다른 발신 서비스 콜 요청은 로컬 저장소로부터 검색되어야하는 경우 스팬의 현재 요청 (예를 들어, start_child_span () 헬퍼를 사용하여) 서브 스팬을 만들어야 서브 스팬 스테이션에 장착되어야한다 (예를 들어 하는 OpenTracing의 분사 / 추출 API에 의해 HTTP 헤더)를 사용.
    여기서, 상기 공정의 예이다. 단계 2 개시의 아이 ScopeManager Tracer.scope_manager 포함 같이, 로컬 스토리지 서비스 및 / 또는 사용되는 프레임 / 검파 라이브러리의 특정 요구를 달성하기 위해 요구. 자세한 내용은 아래를 참조하십시오.

(1) 수신 요청

어딘가에 핸들러 코드 서버 요청 :


def handle_request(request):
    span = before_request(request, opentracing.global_tracer())
    # store span in some request-local storage using Tracer.scope_manager,
    # using the returned `Scope` as Context Manager to ensure
    # `Span` will be cleared and (in this case) `Span.finish()` be called.
    with tracer.scope_manager.activate(span, True) as scope:
        # actual business logic
        handle_request_for_real(request)


def before_request(request, tracer):
    span_context = tracer.extract(
        format=Format.HTTP_HEADERS,
        carrier=request.headers,
    )
    span = tracer.start_span(
        operation_name=request.operation,
        child_of=span_context)
    span.set_tag('http.url', request.full_url)

    remote_ip = request.remote_ip
    if remote_ip:
        span.set_tag(tags.PEER_HOST_IPV4, remote_ip)

    caller_name = request.caller_name
    if caller_name:
        span.set_tag(tags.PEER_SERVICE, caller_name)

    remote_port = request.remote_port
    if remote_port:
        span.set_tag(tags.PEER_PORT, remote_port)

    return span

(2) 발신 요청

어딘가에 코드 서버에서 아웃 바운드 통화를 쓰기 :


from opentracing import tags
from opentracing.propagation import Format
from opentracing_instrumentation import request_context

# create and serialize a child span and use it as context manager
with before_http_request(
    request=out_request,
    current_span_extractor=request_context.get_current_span):

    # actual call
    return urllib2.urlopen(request)


def before_http_request(request, current_span_extractor):
    op = request.operation
    parent_span = current_span_extractor()
    outbound_span = opentracing.global_tracer().start_span(
        operation_name=op,
        child_of=parent_span
    )

    outbound_span.set_tag('http.url', request.full_url)
    service_name = request.service_name
    host, port = request.host_port
    if service_name:
        outbound_span.set_tag(tags.PEER_SERVICE, service_name)
    if host:
        outbound_span.set_tag(tags.PEER_HOST_IPV4, host)
    if port:
        outbound_span.set_tag(tags.PEER_PORT, port)

    http_header_carrier = {}
    opentracing.global_tracer().inject(
        span_context=outbound_span,
        format=Format.HTTP_HEADERS,
        carrier=http_header_carrier)

    for key, value in http_header_carrier.iteritems():
        request.add_header(key, value)

    return outbound_span

5. 기타

1. devoploment

개발자를 들어, 일부 매개 변수는 설정 사전을 통해 전달 될 수 있습니다. 자세한 내용은 참조 구성 클래스를 .

2. WSGI

각 요청을 처리하기 위해 더 자주 갈래의 자식 프로세스를 실행 WSGI 응용 프로그램에서. 예거 추적기 초기화, 그것은 새로운 배경 스레드를 시작할 수 있습니다. 프로세스 포크 경우, 나중에 문제가 발생할 수 있습니다 또는 (때문에 인터프리터 잠금의 독점에) 응용 프로그램을 일시 중지합니다. 자식 프로세스가 초기화 추적기 후 포크까지 따라서 권장합니다.

3. 작성 및 스팬을 종료

# 开始无 Parent 的 Span
tracer.start_span('TestSpan') 
# 开始有 Parent 的 Span
tracer.start_span('ChildSpan', child_of=span)
# 结束 Span
span.finish()

4. 전송 SpanContext

# 将 spanContext 传到下一个 Span 中(序列化)
tracer.inject(
        span_context=span.context, format=Format.TEXT_MAP, carrier=carrier
    )
# 解析传过来的 spanContxt(反序列化)
span_ctx = tracer.extract(format=Format.TEXT_MAP, carrier={})

추천

출처www.cnblogs.com/ChangAn223/p/11461188.html