全部產品
Search
文件中心

Application Real-Time Monitoring Service:通過Jaeger上報Python應用資料

更新時間:Aug 08, 2024

通過Jaeger為應用埋點並上報鏈路資料至Managed Service for OpenTelemetry後,Managed Service for OpenTelemetry即可開始監控應用,您可以查看應用拓撲、調用鏈路、異常事務、慢事務和SQL分析等一系列監控資料。本文介紹如何使用Jaeger為Python應用埋點並上報資料。

重要

為獲得更豐富的功能、更先進的鏈路追蹤能力,以及最佳使用體驗,建議您使用OpenTelemetry協議將應用接入Managed Service for OpenTelemetry

我們為您提供了詳細的OpenTelemetry接入指南和最佳實務,協助您快速上手Managed Service for OpenTelemetry。更多資訊,請參見接入應用

前提條件

擷取存取點資訊

  1. 登入ARMS控制台,在左側導覽列單擊接入中心

  2. 服務端應用地區單擊Jaeger卡片。

  3. 在彈出的Jaeger面板中選擇資料需要上報的地區。

    說明

    初次接入的地區將會自動進行資源初始化。

  4. 選擇串連方式上報方式,然後複製存取點資訊。

    • 串連方式:若您的服務部署在阿里雲上,且所屬地區與選擇的接入地區一致,推薦使用阿里雲內網方式,否則選擇公網方式。

    • 上報方式:根據用戶端支援的協議類型選擇HTTP或gRPC協議上報資料。

    image.png

背景資訊

資料是如何上報的?

  • 不通過Jaeger Agent而直接上報資料的原理如下圖所示。

  • 通過Jaeger Agent上報資料的原理如下圖所示。

注意事項

  • 針對Python語言,最新v1.25版本的Jaeger僅支援通過Jaeger Agent而不支援直接使用HTTP協議上報調用鏈路資料。更多資訊,請參見Jaeger官方文檔

  • 針對Python語言,最新v1.25版本的Jaeger僅支援通過UDP協議從Jaeger Client端上報至Jaeger Agent端。由於UDP協議並不保證通訊的可靠性,因此為了保證調用鏈路資料的可靠性,一般情況下需要將Jaeger Client端和Jaeger Agent端運行在同一個主機內。

步驟一:搭建環境

本文示範樣本中對Docker、Jaeger Agent、Jaeger Client和Python的版本要求如下。

Docker和Jaeger Agent環境

Docker版本:20.10.7

Jaeger Agent版本:1.25

  1. 在DockerHub中執行以下命令拉取v1.25版本的Jaeger Agent鏡像。

    docker pull jaegertracing/jaeger-agent:1.25
  2. 執行以下命令運行v1.25版本的Jaeger Agent。

    docker run -d --name jaeger-agent  -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778/tcp jaegertracing/jaeger-agent:1.25 --reporter.type=grpc --reporter.grpc.host-port=<endpoint>(填寫對應的存取點資訊) --agent.tags=<auth>(填寫對應的認證資訊)
    說明

    請將<endpoint><auth>替換成控制台叢集配置頁面相應用戶端地區的存取點資訊。擷取存取點資訊的方法,請參見前提條件。

Python和Jaeger Client環境

Python版本:3.8.5

Jaeger Client版本:4.6.0

在Python中安裝以下Python包配置Jaeger Client環境。

certifi==2021.5.30
charset-normalizer==2.0.4
idna==3.2
jaeger-client==4.6.0
opentracing==2.4.0
requests==2.26.0
six==1.16.0
threadloop==1.0.2
thrift==0.13.0
tornado==6.1
urllib3==1.26.6

步驟二:建立Tracer對象

  1. 建立包含如下內容的Python檔案。

    通過以下代碼建立Tracer對象,並通過Tracer對象建立Span來上報資料至Managed Service for OpenTelemetry後台。

    import logging
    import time
    from jaeger_client import Config
    
    
    def construct_span(tracer):
        with tracer.start_span('AliyunTestSpan') as span:
            span.log_kv({'event': 'test message', 'life': 42})
            print("tracer.tages: ", tracer.tags)
            with tracer.start_span('AliyunTestChildSpan', child_of=span) as child_span:
                span.log_kv({'event': 'down below'})
            return span
    
    
    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,
                },
                'local_agent': {
                    # 注意這裡是指定了JaegerAgent的host和port。
                    # 根據官方建議為了保證資料可靠性,JaegerClient和JaegerAgent運行在同一台主機內,因此reporting_host填寫為127.0.0.1。
                    'reporting_host': '127.0.0.1',
                    'reporting_port': 6831,
                },
                'logging': True,
            },
            #這裡填寫應用程式名稱
            service_name="mytest3",
            validate=True
        )
    
        # this call also sets opentracing.tracer
        tracer = config.initialize_tracer()
    
        span = construct_span(tracer)
    
        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
  2. 執行建立的Python檔案。

在控制台查看資料

  1. 登入ARMS控制台,在左側導覽列選擇應用監控 > 應用列表

  2. 應用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。

    說明

    語言列顯示image表徵圖的應用為接入應用監控的應用,顯示-表徵圖的應用為接入可觀測鏈路 OpenTelemetry 版的應用。

  3. 應用總覽頁面,您可以查看該應用的效能關鍵計量和拓撲圖詳情。

    圖1.應用總覽介面

  4. 在左側導覽列單擊應用詳情

    應用詳情頁面,您可以查看該應用的概覽資訊。圖2.應用詳情-概覽介面

  5. 應用詳情頁面單擊調用鏈路頁簽。

    調用鏈路頁簽,您可以查看該應用的調用鏈路。圖3.應用詳情-調用鏈路介面

參考資訊

此處提供了Jaeger常見的使用方法,更多資訊,請參見Jaeger官方文檔

  • 建立Trace。

    from jaeger_client import Config
    
    def init_jaeger_tracer(service_name='your-app-name'):
        config = Config(config={}, service_name=service_name)
        return config.initialize_tracer()
  • 建立和結束Span。

    # 開始無Parent的Span。
    tracer.start_span('TestSpan') 
    # 開始有Parent的Span。
    tracer.start_span('ChildSpan', child_of=span)
    # 結束Span。
     span.finish()
  • 透傳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={})