このトピックでは、背景、シナリオ、コア機能、サンプリングルールの設定、および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: val1
やx-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を有効にする方法については、「トレース分析の有効化」をご参照ください。