すべてのプロダクト
Search
ドキュメントセンター

Function Compute:Tracing Analysis

最終更新日:Aug 30, 2024

このトピックでは、Pythonランタイム環境のTracing Analysis機能について説明します。

背景

Alibaba Cloud Tracing AnalysisはOpenTracing標準を採用しており、オープンソースコミュニティと互換性があります。 Tracing Analysisは、分散アプリケーションの開発者にさまざまな機能を提供します。 たとえば、開発者は分散トレースのクエリと診断、分散トポロジの動的な検出、アプリケーションのパフォーマンスのリアルタイムな要約を行うことができます。

Function ComputeはTracing Analysisと統合します。 Jaeger SDKまたはOpenTelemetryを使用してトレース情報をアップロードし、関数の呼び出しを追跡できます。 Tracing Analysisは、サーバーレスアーキテクチャのパフォーマンスボトルネックの分析と診断に役立ちます。 これにより、サーバーレスシナリオでの開発と診断の効率が向上します。

概要

Tracing Analysisは、Function Computeコンソールで設定できます。 詳細については、「トレース分析の有効化」をご参照ください。

サービスのTracing Analysisを有効にすると、Function Computeはシステムで消費された時間を自動的に記録します。 時間は、コールドスタート時間、イニシャライザ関数の実行時間、及び関数の実行時間を含む。 次の図のシステムスパンの詳細については、「スパン名の説明」をご参照ください。 Tracing Analysis

ビジネス側の関数で消費された時間を記録できます。 たとえば、[カスタムスパンの作成] を使用して、関数内でApsaraDB RDSやApsara File Storage NASなどのサービスにアクセスするのにかかる時間を記録できます。

サンプルコード

Function Computeのトレース分析では、OpenTracing仕様のJaeger実装に基づいて、OpenTelemetryを使用してカスタムスパンを作成できます。

Pythonコードでは、OpenTelemetry SDKを使用して手動でデータにタグを付け、そのデータをTracing Analysisサーバーに報告できます。 完全なサンプルコードについては、「python-tracing-openTelemetry」をご参照ください。

上記のコードでは、

  • プロジェクトディレクトリで依存関係ファイルrequirements.txtを設定します。

    opentelemetry-api==1.12.0
    opentelemetry-sdk==1.12.0
    opentelemetry-exporter-jaeger==1.12.0
  • Tracing Analysisサーバーにデータを報告します。

    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'

    を返す

  • トレーサオブジェクトを初期化して、トレーサへのアクセスを提供します。

    def init_tracer(endpoint):
        jaeger_exporter = JaegerExporter(
            collector_endpoint=endpoint
        )
    
        span_processor = SimpleSpanProcessor(jaeger_exporter)
    
        trace.get_tracer_provider().add_span_processor(span_processor)
  • Contextオブジェクトのトレース情報を取得し、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
  • 変換されたコンテキストを使用して、トレーサーと子スパンを作成します。 各スパンは、コールチェーン内の名前付きおよび時限連続実行フラグメントを表す。 スパンに基づいて子スパンを作成することもできます。

    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)