このトピックでは、背景、シナリオ、コア機能、サンプリングルールの設定、およびFunction Compute統合トレース分析機能を有効にする方法について説明します。

背景情報

Alibaba Cloud Tracing Analysisは、OpenTracing標準に基づくオープンソースコミュニティと完全に互換性があります。 これは、分散アプリケーションの開発者に、完全な分散呼び出しチェーンのクエリと診断、分散トポロジの動的な発見、およびアプリケーションパフォーマンスのリアルタイムの要約を提供します。

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

シナリオ

Function ComputeでサービスのTracing Analysisを設定した後、Function Computeでリクエストの実行時間を記録できます。 関数のコールドスタート時間を表示し、関数の実行時間を記録することもできます。 Tracing Analysisは、次の問題のトラブルシューティングに役立ちます。

  • 関数の各実行がタイムアウトした場合に、関数のパフォーマンスのボトルネックを特定します。
  • 関数の実行時間が短い場合、エンドツーエンドのレイテンシが長い原因を特定します。
  • リクエストに分散システム内の複数のクラウドサービスが含まれる場合、関数のパフォーマンスのボトルネックを分析して診断します。

コア機能

Function Computeでのトレース分析は、トレース全体を接続します。 Tracing Analysisは、次のコア機能を提供します。

  • Function Computeの主要なステップに費やされた時間を自動的に記録します。 詳細については、「Function Computeのキーステップに費やされた時間を自動的に記録する」をご参照ください。
  • 上流サービスに接続します。 リクエストヘッダーにSpanContextが含まれている場合、Function ComputeはSpanContextに基づいて子スパンを作成します。 詳細については、「上流サービスへの接続」をご参照ください。
  • ダウンストリームサービスの連結: Function Computeは、関数内の呼び出しリンクを追跡するのに役立つように、リンクコンテキストを関数contextパラメーターに渡します。 詳細については、「下流サービスへの接続」をご参照ください。
  • アプリケーショントポロジを表示できます。
  • 無効なAPI操作の実行を表示し、エラーの原因を特定できます。

Function Computeのキーステップに費やされた時間を自動的に記録する

サービスに対してTracing Analysisを有効にすると、デフォルトで次のトレースを表示できます。

コールドスタート

スパン名:

  • InvokeFunction: Function Computeでの現在のリクエストの合計実行時間。
  • ColdStart: 関数システムレイヤーでのコールドスタートの時間。 コールするたびにコールドスタートが発生するわけではありません。 コールドスタートは、実行環境を再適用した場合にのみ実行されます。
    • PrepareCode: 関数のコードまたはカスタムイメージをダウンロードするのにかかる時間。 PrepareCodeスパンで示される時間が長すぎる場合は、コードパッケージを単純化して、コードの準備にかかる時間を短縮します。
    • RuntimeInitialization: 実行環境の開始にかかる時間。インスタンスの開始にかかる時間と、インスタンスのヘルスチェックの実行にかかる時間を含みます。 カスタムランタイムとカスタムイメージの場合、RuntimeInitializationスパンで示される時間が長すぎる場合は、対応するHTTPサーバーとイメージの起動動作を確認します。
  • Initializer: 初期化子関数の実行にかかる時間。 初期化子関数は、コンテナがコールドスタートした場合にのみ実行されます。
  • 呼び出し: 関数の実行時間。 関数で呼び出しのコンテキストを取得し、関数呼び出しの期間を詳細に記録できます。

アプリケーション名: Function Compute生成されたアプリケーションの名前はFC:ServiceName/FunctionName

リクエストにコールドスタートが発生しない場合、トレースにはColdStartスパンとInitializerスパンは含まれません。 トレースを次の図に示します。

ウォームスタート

上流サービスへの接続

サービスに対してTracing Analysisを有効にした後、リクエストヘッダーにSpanContextが含まれている場合、Function ComputeはSpanContextに基づいて子スパンを作成します。

Function Computeは、次のSpanContextヘッダーを識別します。

  • x-fc-tracing-opentracing-span-context: リンクコンテキスト情報SpanContext情報を渡すために使用されます。
  • x-fc-tracing-opentracing-span-context-baggage-: コンテキスト間で手荷物情報を渡すために使用します。

    手荷物が複数ある場合は、x-fc-tracing-opentracing-span-context-baggage-key1: val1x-fc-tracing-opentracing-span-context-baggage-key2: val2などの複数のヘッダーをアップロードする必要があります。

SpanContextは、関数が呼び出されたときにSpanContextヘッダーを追加することで挿入できます。

Node.jsは次の例で使用されます。

'use strict';
const FCClient = require('@alicloud/fc2');

var client = new FCClient('<account id>', {
    accessKeyID: '<access key id>',
    accessKeySecret: '<access key secret>',
    region: 'cn-shanghai',
});

var serviceName = '<service name>';
var funcName = '<function name>';

async function test() {
    try {

        // inject spanContext headers
        var headers = {
            'x-fc-tracing-opentracing-span-context': '124ed43254b54966:124ed43254b5****:0:1',
            'x-fc-tracing-opentracing-span-context-baggage-key': 'val'
        };
        var resp = await client.invokeFunction(serviceName, functionName, 'event', headers = headers);
    } catch (err) {
        console.error(err);
    }
}

下流サービスへの接続

Function Computeは、SpanContextを関数にインポートして、関数の内部トレースを追跡するのに役立ちます。

  • 組み込みランタイムでは、SpanContextはcontext.tracingを使用して取得できます。
  • カスタムランタイムまたはカスタムコンテナの場合、リクエストヘッダーを使用してFunction Computeリンクコンテキスト情報を取得できます。
    • x-fc-tracing-opentracing-span-context: Function ComputeのInvokeFunctionのSpanContext。 スパンは、関数内のSpanContextに基づいて作成されます。
    • x-fc-tracing-opentracing-span-baggages: Base64-encodedのクロスコンテキストbaggages。
    • x-fc-tracing-jaeger-endpoint: Jaegerサーバーのエンドポイント。 関数内のスパンをこのエンドポイントに直接アップロードできます。

たとえば、context.tracingの構造は次のとおりです。

{
  "openTracingSpanContext": "5f22f355044a957a:5708f3a95a4ed10:5f22f355044a****:1",
  "openTracingSpanBaggages": {
    "key1": "val1",
    "key2": "val2"
  },
  "jaegerEndpoint": "http://tracing-analysis-dc-zb-internal.aliyuncs.com/adapt_fcfc@fcfc@fcfc/api/traces"
}

次のコードは、関数からSpanContextを取得する方法の例を示しています。

  • Node.js:
    exports.handler = (event, context, callback) => {
      var params = {
            openTracingSpanContext: context.tracing.openTracingSpanContext,
            openTracingSpanBaggages:context.tracing.openTracingSpanBaggages,
            // jaegerEndpoint is confidential, do not print it out easily
            // jaegerEndpoint:context.tracing.jaegerEndpoint
        }
      console.log('tracing params',params)
      callback(null,'success');
    }
  • PHP:
    function handler($event, $ctx) {
        $logger = $GLOBALS['fcLogger'];
        $openTracingSpanContext = $ctx['tracing']['openTracingSpanContext'];
        $openTracingSpanBaggages = $ctx['tracing']['openTracingSpanBaggages'];
        // jaegerEndpoint is confidential, do not print it out easily
        $jaegerEndpoint = $ctx['tracing']['jaegerEndpoint'];
        $logger->info($openTracingSpanContext);
        $logger->info($openTracingSpanBaggages['key1']);
      return 'success';
    }
  • Java:
    package example;
    import com.aliyun.fc.runtime.Context;
    import com.aliyun.fc.runtime.StreamRequestHandler;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    public class HelloFC implements StreamRequestHandler {
    
        public void handleRequest(
                InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
            String spanContext = context.getTracing().getOpenTracingSpanContext();
            String jaegerEndpoint = context.getTracing().getJaegerEndpoint();
            String spanBaggage = context.getTracing().getOpenTracingSpanBaggages().get("key1");
            outputStream.write(new String("success").getBytes());
        }
    }
  • カスタムランタイムまたはカスタムコンテナでは、ヘッダーを取得するだけで済みます。 Goは次の例で使用されます。
      spanContext := req.Header.Get('x-fc-tracing-opentracing-span-context')
      spanBaggages := req.Header.Get('x-fc-tracing-opentracing-span-baggages')
      jaegerEndpoint := req.Header.Get('x-fc-tracing-jaeger-endpoint')

サンプリングルールのカスタマイズ

サンプリングルールをカスタマイズするには、Tracing Analysisコンソールにログインし、リモートサンプリングルールを設定します。 詳細については、「t1909074.html#task_2535073」をご参照ください。 設定が完了すると、サンプリングを実行するように設定したリモートサンプリングルールが使用されます。

関数Tracing Analysisで対応するサービス名をfc-tracingで計算します。 デフォルトのサンプリングルールはRatelimitingSamplerで、1秒あたり1リクエストのレートでサンプリングされます。

デフォルトでは、Function Computeは次のサンプリングルールを使用します。

{
  "default_strategy": {
    "type": "ratelimiting" 、
    "param": 1、
  }
}

有効化の方法

Tracing Analysisを有効にする方法については、「トレース分析の有効化」をご参照ください。