全部產品
Search
文件中心

:鏈路追蹤

更新時間:Jul 06, 2024

本文介紹Python運行環境的鏈路追蹤相關內容。

背景資訊

阿里雲鏈路追蹤服務(Tracing Analysis)基於OpenTracing標準,相容開源社區,為分布式應用的開發人員提供了完整的分布式調用鏈查詢和診斷、分布式拓撲動態發現、應用效能即時匯總等功能。

Function Compute與鏈路追蹤整合後,支援使用Jaeger SDKOpenTelemetry上傳鏈路資訊,使您能夠跟蹤函數的執行,協助您快速分析和診斷Serverless架構下的效能瓶頸,提高Serverless情境的開發診斷效率。

功能簡介

您可以在Function Compute控制台配置鏈路追蹤。具體操作,請參見配置鏈路追蹤

為服務開啟鏈路追蹤後,Function Compute會自動記錄請求在系統側的耗時,包含冷啟動耗時、Initializer函數的耗時和函數的執行時間等。關於下圖中系統Span的說明,請參見Span名稱說明鏈路追蹤

如您還需查看函數內業務側的耗時,例如,在函數內訪問RDS或NAS等服務的耗時,可以通過建立自訂Span來實現。

範例程式碼

Function Compute的鏈路分析基於OpenTracing協議的Jaeger實現,Python運行時提供使用OpenTelemetry的方式自訂Span。

在Python語言的代碼中,您可以通過OpenTelemetry SDK手動埋點將資料上報到鏈路追蹤服務端。完整的範例程式碼,請參見python-tracing-openTelemetry

範例程式碼解析如下。
  • 在工程目錄中配置依賴檔案requirements.txt
    opentelemetry-api==1.12.0
    opentelemetry-sdk==1.12.0
    opentelemetry-exporter-jaeger==1.12.0
  • 上報資料到鏈路追蹤服務端。
    trace.set_tracer_provider(
        TracerProvider(
            resource=Resource.create({SERVICE_NAME: "my-helloworld-service"})
        )
    )
    tracer = trace.get_tracer(__name__)
    def handler(event, context):
        init_tracer(context.tracing.jaeger_endpoint)
        span_context = get_fc_span(context.tracing.span_context)
        start_my_span(trace.set_span_in_context(NonRecordingSpan(span_context)))
        return 'hello world'
  • 初始化一個tracer對象,提供對Tracers的訪問。
    def init_tracer(endpoint):
        jaeger_exporter = JaegerExporter(
            collector_endpoint=endpoint
        )
    
        span_processor = SimpleSpanProcessor(jaeger_exporter)
    
        trace.get_tracer_provider().add_span_processor(span_processor)
  • 擷取上下文的Tracing資訊,轉換為SpanContext對象。
    def get_fc_span(jaeger_span_context):
        jaeger_span_context_arr = jaeger_span_context.split(":")
        tid = int(jaeger_span_context_arr[0], 16)
        sid = int(jaeger_span_context_arr[1], 16)
    
        span_context = trace.SpanContext(
            trace_id=tid,
            span_id=sid,
            is_remote=True,
            trace_flags=trace.TraceFlags(0x01),
        )
        return span_context
  • 建立tracer並通過轉換的Context建立子Span。每一個Span代表調用鏈中被命名並計時的連續性執行片段,您也可以基於該Span繼續建立子Span。
    def start_my_span(context):
        with tracer.start_as_current_span(name="fc-operation", context=context):
            time.sleep(0.15)
            with tracer.start_as_current_span("child"):
                time.sleep(0.1)