このトピックでは、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はシステムで消費された時間を自動的に記録します。 時間は、コールドスタート時間、イニシャライザ関数の実行時間、及び関数の実行時間を含む。 次の図のシステムスパンの詳細については、「スパン名の説明」をご参照ください。
ビジネス側の関数で消費された時間を記録できます。 たとえば、[カスタムスパンの作成] を使用して、関数内で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)