サービスのTracing Analysisを有効にすると、Function Computeはシステムで消費された時間を記録します。 時間には、コールドスタート時間、Initializerフックの実行時間、および関数の実行時間が含まれます。 ビジネス側の関数の消費時間を記録するには、カスタムスパンを作成します。 たとえば、ApsaraDB RDSやApsara File Storage NAS (NAS) などのサービスへのアクセスにかかった時間を関数内で記録できます。 このトピックでは、Serverless Devsを使用してカスタムスパンを作成する方法について説明します。
前提条件
手順
Function Computeのトレースに基づいてカスタムスパンを作成し、カスタムスパンをFunction Computeのトレースに接続できます。 Function Computeのトレース分析では、次の方法を使用して、OpenTracing仕様のJaeger実装に基づいてカスタムスパンを作成できます。
JaegerとOpenTelemetryの詳細については、「Jaeger」と「OpenTelemetry」をご参照ください。
2つの方法は次のステップを含みます:
関数にJaegerまたはOpenTelemetryの依存関係を追加します。 サードパーティの依存関係を追加する方法の詳細については、「関数のサードパーティの依存関係のインストール」をご参照ください。
関数からFunction ComputeのトレースのSpanContextを取得し、function ComputeのSpanContextに基づいてカスタムスパンを作成し、実行時間を記録する必要があるコードフラグメントの前後にインストルメンテーションを追加します。
Function ComputeコンソールまたはTracing Analysisコンソールの [関数の詳細] ページの [Tracing Analysis] タブでトレース情報を表示します。
JaegerのSDKを使用する
次のトピックでは、サポートされているランタイム環境でJaeger用SDKを使用してカスタムスパンを作成するために使用されるサンプルコードを示します。
このセクションでは、Serverless Devsを使用してカスタムスパンを作成し、Node.jsランタイム環境で関数を作成および配置する方法について説明します。
Serverless Devsを使用して、依存関係をインストールし、コードをパッケージ化してFunction Computeにデプロイできます。 他の方法でコードをパッケージ化してデプロイすることもできます。 Serverless Devsの詳細については、Serverless Devsとは何ですか?.
コードディレクトリを作成します。
mkdir jaeger-demo
Node.jsランタイムテンプレートを初期化します。
次のコマンドを実行して、コードディレクトリに移動します。
cd jaeger-demo
コードディレクトリで次のコマンドを実行して、Node.js 12プロジェクトを初期化します。
s init devsapp/start-fc-event-nodejs12
素晴らしい:
Serverless Awesome: https://github.com/Serverless-Devs/package-awesome Please input your project name (init dir) (start-fc-event-nodejs12)
プロジェクトの名前を指定し、Enterキーを押します。
デフォルトでは、Serverless Devsはstart-fc-event-nodejs12という名前のプロジェクトを生成します。 ビジネス要件に基づいてプロジェクトの名前を変更できます。 この例では、デフォルトのプロジェクト名が使用されます。
素晴らしい:
Serverless Awesome: https://github.com/Serverless-Devs/package-awesome Please input your project name (init dir) start-fc-event-nodejs12 file decompression completed please select credential alias (Use arrow keys) ❯ default
エイリアスを選択してEnterキーを押します。
ビジネス要件に基づいてプロジェクトを展開するかどうかを指定します。
この例では、プロジェクトに依存関係をインストールする必要があります。 したがって、
の後すぐにプロジェクトを展開しますか? (Y/n) コマンド出力で
が返される、n
と入力します。
次のコマンドを実行して、プロジェクトのコードディレクトリに移動します。
cd start-fc-event-nodejs12/code
コードディレクトリで次のコマンドを実行して、package.jsonファイルを初期化します。
npm init -y
のサンプル出力:
Wrote to /test/jjyy/start-fc-event-nodejs12/code/package.json: { "name": "code", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
次のコマンドを実行して、Jaegerの依存関係をインストールします。
npm i jaeger-client --save
サンプル出力:
added 15 packages in 1s
関数コードを書き込みます。
次のコードが使用されます:
var initTracer = require('jaeger-client').initTracer; var spanContext = require('jaeger-client').SpanContext; module.exports.handler = function(event, context, callback) { console.log('invoking...',context.tracing); var config = { serviceName: 'e2e-test', reporter: { // Provide the traces endpoint; this forces the client to connect directly to the Collector and send // spans over HTTP collectorEndpoint: context.tracing.jaegerEndpoint, flushIntervalMs: 10, }, sampler: { type: "const", param: 1 }, }; var options = { tags: { 'version': 'fc-e2e-tags', }, }; var tracer = initTracer(config, options); var invokSpanContextStr = context.tracing.openTracingSpanContext; console.log('spanContext', invokSpanContextStr); var invokSpanContext = spanContext.fromString(invokSpanContextStr); var span = tracer.startSpan("CustomSpan", { childOf: invokSpanContext }); span.finish(); var params = { openTracingSpanContext: context.tracing.openTracingSpanContext, openTracingSpanBaggages: context.tracing.openTracingSpanBaggages, jaegerEndpoint: context.tracing.jaegerEndpoint } callback(null,'success') }
s.yamlファイルを編集します。
次のコマンドを実行して、プロジェクトディレクトリに移動します。
cd ..
次のコマンドを実行して、s.yamlファイルを編集します。
vim s.yaml
次のサンプルコードは、ファイルの例を示しています。
edition: 1.0.0 name: hello-world-app access: default vars: # The global variable. region: "cn-hangzhou" service: name: "hello-world-service" description: 'hello world by serverless devs' tracingConfig: Enable # Enable Tracing Analysis. services: helloworld: # The name of the service or module. component: fc # The name of the component. Serverless Devs is similar to a game console, which must be used with game cards to play games. Components are similar to game cards. Game players can insert different game cards into a game console to play different games. Likewise, different components can be used to obtain different business capabilities. props: region: ${vars.region} # For more information about how to use variables, visit: https://www.serverless-devs.com/serverless-devs/yaml. service: ${vars.service} function: name: "start-fc-event-nodejs14" description: 'hello world by serverless devs' runtime: nodejs12 codeUri: ./code handler: index.handler memorySize: 128 timeout: 60
次のコマンドを実行して依存関係をインストールします。
s build --use-docker
サンプル出力:
[2021-11-12T18:33:43.856] [INFO ] [S-CLI] - Start ... [2021-11-12T18:33:44.677] [INFO ] [FC-BUILD] - Build artifact start... [2021-11-12T18:33:44.701] [INFO ] [FC-BUILD] - Use docker for building. [2021-11-12T18:33:44.988] [INFO ] [FC-BUILD] - Build function using image: registry.cn-beijing.aliyuncs.com/aliyunfc/runtime-nodejs12:build-1.9.21 [2021-11-12T18:33:45.011] [INFO ] [FC-BUILD] - skip pulling image registry.cn-beijing.aliyuncs.com/aliyunfc/runtime-nodejs12:build-1.9.21... [2021-11-12T18:33:47.915] [INFO ] [FC-BUILD] - Build artifact successfully. Tips for next step ====================== * Invoke Event Function: s local invoke * Invoke Http Function: s local start * Deploy Resources: s deploy End of method: build
次のコマンドを実行して、プロジェクトをデプロイします。
s deploy -y
サンプル出力:
[2021-11-12T18:35:26.015] [INFO ] [S-CLI] - Start ... [2021-11-12T18:35:26.633] [INFO ] [FC-DEPLOY] - Using region: cn-hangzhou [2021-11-12T18:35:26.634] [INFO ] [FC-DEPLOY] - Using access alias: default [2021-11-12T18:35:26.634] [INFO ] [FC-DEPLOY] - Using accessKeyID: LTAI4G4cwJkK4Rza6xd9**** ...... Make service fc-deploy-service success. Make function fc-deploy-service/event-nodejs12 success. [2021-11-12T18:35:37.661] [INFO ] [FC-DEPLOY] - Checking Service fc-deploy-service exists [2021-11-12T18:35:37.718] [INFO ] [FC-DEPLOY] - Checking Function event-nodejs12 exists Tips for next step ====================== * Display information of the deployed resource: s info * Display metrics: s metrics * Display logs: s logs * Invoke remote function: s invoke * Remove Service: s remove service * Remove Function: s remove function * Remove Trigger: s remove trigger * Remove CustomDomain: s remove domain fc-deploy-test: region: cn-hangzhou service: name: fc-deploy-service function: name: event-nodejs12 runtime: nodejs12 handler: index.handler memorySize: 128 timeout: 60
結果を確認します。
Function Computeコンソールでトレースを表示します。 作成したカスタムスパンは、Function Computeのスパンに接続されます。
OpenTelemetryの使用
次のトピックでは、サポートされているランタイム環境でOpenTelemetryを使用してカスタムスパンを作成するために使用されるサンプルコードを示します。
このセクションでは、Serverless Devsを使用してカスタムスパンを作成し、Pythonランタイム環境で関数を作成およびデプロイする方法について説明します。
Serverless Devsを使用して、依存関係をインストールし、コードをパッケージ化してFunction Computeにデプロイできます。 他の方法でコードをパッケージ化してデプロイすることもできます。 Serverless Devsの詳細については、Serverless Devsとは何ですか?.
コードディレクトリを作成します。
mkdir opentelemetry-demo
コードディレクトリに移動します。
cd opentelemeytry-demo
Pythonランタイムテンプレートを初期化します。
次のコマンドを実行して、Python 3プロジェクトを初期化します。
s init devsapp/start-fc-event-python3
コマンド出力のサンプル: Serverless Awesome:
Serverless Awesome: https://github.com/Serverless-Devs/package-awesome Please input your project name (init dir) (start-fc-event-python3)
プロジェクトの名前を指定し、Enterキーを押します。
デフォルトでは、Serverless Devsはstart-fc-event-python3という名前のプロジェクトを生成します。 ビジネス要件に基づいてプロジェクトの名前を変更できます。 この例では、デフォルトのプロジェクト名が使用されます。
素晴らしい:
Serverless Awesome: https://github.com/Serverless-Devs/package-awesome Please input your project name (init dir) start-fc-event-python3 file decompression completed please select credential alias (Use arrow keys) ❯ default
エイリアスを選択してEnterキーを押します。
ビジネス要件に基づいてプロジェクトを展開するかどうかを指定します。
この例では、プロジェクトに依存関係をインストールする必要があります。 したがって、
の後すぐにプロジェクトを展開しますか? (Y/n) コマンド出力で
が返される、n
と入力します。
OpenTelemetryの依存関係をインストールします。
次のコマンドを実行して、コードディレクトリに移動します。
cd start-fc-event-python3/code
コードディレクトリにrequirements.txtファイルを作成し、次の内容に基づいてファイルを変更します。
opentelemetry-api==1.12.0 opentelemetry-sdk==1.12.0 opentelemetry-exporter-jaeger==1.12.0
次のコマンドを実行して関数コードを書き込みます。
vim index.py
次のコードが使用されます。
# -*- coding: utf-8 -*- import time from opentelemetry import trace from opentelemetry.exporter.jaeger.thrift import JaegerExporter from opentelemetry.sdk.resources import SERVICE_NAME, Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import SimpleSpanProcessor from opentelemetry.trace import NonRecordingSpan 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): # create a JaegerExporter jaeger_exporter = JaegerExporter( collector_endpoint=endpoint ) # Create a SimpleSpanProcessor and add the exporter to it span_processor = SimpleSpanProcessor(jaeger_exporter) # add to the tracer trace.get_tracer_provider().add_span_processor(span_processor) 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)
関数コードを編集した後、:WQと入力し、enterキーを押して編集ページを終了します。
s.yamlファイルを編集します。
次のコマンドを実行して、プロジェクトディレクトリに移動します。
cd ..
次のコマンドを実行して、s.yamlファイルを編集します。
vim s.yaml
次のサンプルコードは、ファイルの例を示しています。
edition: 1.0.0 name: hello-world-app access: default vars: # The global variable. region: "cn-hangzhou" service: name: "hello-world-service" description: 'hello world by serverless devs' tracingConfig: Enable # Enable Tracing Analysis. services: helloworld: # The name of the service or module. component: fc # The name of the component. Serverless Devs is similar to a game console, which must be used with game cards to play games. Components are similar to game cards. Game players can insert different game cards into a game console to play different games. Likewise, different components can be used to obtain different business capabilities. props: region: ${vars.region} # For more information about how to use variables, visit: https://www.serverless-devs.com/serverless-devs/yaml#Variable value. service: ${vars.service} function: name: "start-fc-event-python3" description: 'hello world by serverless devs' runtime: python3.9 codeUri: ./code handler: index.handler memorySize: 128 timeout: 60
コードを編集した後、:WQと入力し、enterキーを押して編集ページを終了します。
次のコマンドを実行して依存関係をインストールします。
s build --use-docker
サンプル出力:
[2021-11-12T18:53:05.818] [INFO ] [S-CLI] - Start ... [2021-11-12T18:53:06.638] [INFO ] [FC-BUILD] - Build artifact start... [2021-11-12T18:53:06.659] [INFO ] [FC-BUILD] - Use docker for building. [2021-11-12T18:53:06.888] [INFO ] [FC-BUILD] - Build function using image: registry.cn-beijing.aliyuncs.com/aliyunfc/runtime-python3.6:build-1.9.21 [2021-11-12T18:53:06.942] [INFO ] [FC-BUILD] - skip pulling image registry.cn-beijing.aliyuncs.com/aliyunfc/runtime-python3.6:build-1.9.21... [2021-11-12T18:53:10.570] [INFO ] [FC-BUILD] - Build artifact successfully. Tips for next step ====================== * Invoke Event Function: s local invoke * Invoke Http Function: s local start * Deploy Resources: s deploy End of method: build
次のコマンドを実行して、プロジェクトをデプロイします。
s deploy -y
サンプル出力:
[2021-11-12T18:55:02.640] [INFO ] [S-CLI] - Start ... [2021-11-12T18:55:03.455] [INFO ] [FC-DEPLOY] - Using region: cn-hangzhou [2021-11-12T18:55:03.456] [INFO ] [FC-DEPLOY] - Using access alias: default [2021-11-12T18:55:03.456] [INFO ] [FC-DEPLOY] - Using accessKeyID: LTAI4G4cwJkK4Rza6xd9**** [2021-11-12T18:55:03.457] [INFO ] [FC-DEPLOY] - Using accessKeySecret: eCc0GxSpzfq1DVspnqqd6nmYNN**** Using fc deploy type: sdk, If you want to deploy with pulumi, you can [s cli fc-default set deploy-type pulumi] to switch. [2021-11-12T18:55:04.142] [INFO ] [FC-DEPLOY] - Checking Service fc-deploy-service exists [2021-11-12T18:55:04.722] [INFO ] [FC-DEPLOY] - Checking Function event-py3 exists [2021-11-12T18:55:04.831] [INFO ] [FC-DEPLOY] - Fc detects that you have run build command for function: event-py3. [2021-11-12T18:55:04.831] [INFO ] [FC-DEPLOY] - Using codeUri: /test/jjyy/opentelemetry-demo/start-fc-event-python3/.s/build/artifacts/fc-deploy-service/event-py3 [2021-11-12T18:55:04.835] [INFO ] [FC-DEPLOY] - Fc add/append some content to your origin environment variables for finding dependencies generated by build command. { "LD_LIBRARY_PATH": "/code/.s/root/usr/local/lib:/code/.s/root/usr/lib:/code/.s/root/usr/lib/x86_64-linux-gnu:/code/.s/root/usr/lib64:/code/.s/root/lib:/code/.s/root/lib/x86_64-linux-gnu:/code/.s/root/python/lib/python2.7/site-packages:/code/.s/root/python/lib/python3.6/site-packages:/code:/code/lib:/usr/local/lib", "PATH": "/code/.s/root/usr/local/bin:/code/.s/root/usr/local/sbin:/code/.s/root/usr/bin:/code/.s/root/usr/sbin:/code/.s/root/sbin:/code/.s/root/bin:/code:/code/node_modules/.bin:/code/.s/python/bin:/code/.s/node_modules/.bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/sbin:/bin", "NODE_PATH": "/code/node_modules:/usr/local/lib/node_modules", "PYTHONUSERBASE": "/code/.s/python" } Make service fc-deploy-service success. Make function fc-deploy-service/event-py3 success. [2021-11-12T18:55:10.693] [INFO ] [FC-DEPLOY] - Checking Service fc-deploy-service exists [2021-11-12T18:55:10.737] [INFO ] [FC-DEPLOY] - Checking Function event-py3 exists Tips for next step ====================== * Display information of the deployed resource: s info * Display metrics: s metrics * Display logs: s logs * Invoke remote function: s invoke * Remove Service: s remove service * Remove Function: s remove function * Remove Trigger: s remove trigger * Remove CustomDomain: s remove domain fc-deploy-test: region: cn-hangzhou service: name: fc-deploy-service function: name: event-py3 runtime: python3 handler: index.handler memorySize: 128 timeout: 60
結果を確認します。
Function Computeコンソールでトレースを表示します。 作成したカスタムスパンは、Function Computeのスパンに接続されます。