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

Function Compute:カスタムスパンの作成

最終更新日:Sep 09, 2024

サービスの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つの方法は次のステップを含みます:

  1. 関数にJaegerまたはOpenTelemetryの依存関係を追加します。 サードパーティの依存関係を追加する方法の詳細については、「関数のサードパーティの依存関係のインストール」をご参照ください。

  2. 関数からFunction ComputeのトレースのSpanContextを取得し、function ComputeのSpanContextに基づいてカスタムスパンを作成し、実行時間を記録する必要があるコードフラグメントの前後にインストルメンテーションを追加します。

  3. Function ComputeコンソールまたはTracing Analysisコンソールの [関数の詳細] ページの [Tracing Analysis] タブでトレース情報を表示します。

JaegerのSDKを使用する

次のトピックでは、サポートされているランタイム環境でJaeger用SDKを使用してカスタムスパンを作成するために使用されるサンプルコードを示します。

このセクションでは、Serverless Devsを使用してカスタムスパンを作成し、Node.jsランタイム環境で関数を作成および配置する方法について説明します。

説明

Serverless Devsを使用して、依存関係をインストールし、コードをパッケージ化してFunction Computeにデプロイできます。 他の方法でコードをパッケージ化してデプロイすることもできます。 Serverless Devsの詳細については、Serverless Devsとは何ですか?.

  1. コードディレクトリを作成します。

    mkdir jaeger-demo
  2. Node.jsランタイムテンプレートを初期化します。

    1. 次のコマンドを実行して、コードディレクトリに移動します。

      cd jaeger-demo
    2. コードディレクトリで次のコマンドを実行して、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)
    3. プロジェクトの名前を指定し、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
    4. エイリアスを選択してEnterキーを押します。

    5. ビジネス要件に基づいてプロジェクトを展開するかどうかを指定します。

      この例では、プロジェクトに依存関係をインストールする必要があります。 したがって、の後すぐにプロジェクトを展開しますか? (Y/n) コマンド出力でが返される、nと入力します。

  3. 次のコマンドを実行して、プロジェクトのコードディレクトリに移動します。

    cd start-fc-event-nodejs12/code
  4. コードディレクトリで次のコマンドを実行して、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"
    }
  5. 次のコマンドを実行して、Jaegerの依存関係をインストールします。

    npm i jaeger-client --save

    サンプル出力:

    added 15 packages in 1s
  6. 関数コードを書き込みます。

    次のコードが使用されます:

    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')
    }
  7. s.yamlファイルを編集します。

    1. 次のコマンドを実行して、プロジェクトディレクトリに移動します。

      cd ..
    2. 次のコマンドを実行して、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
  8. 次のコマンドを実行して依存関係をインストールします。

    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
  9. 次のコマンドを実行して、プロジェクトをデプロイします。

    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
  10. 結果を確認します。

    Function Computeコンソールでトレースを表示します。 作成したカスタムスパンは、Function Computeのスパンに接続されます。 user-defined-span

OpenTelemetryの使用

次のトピックでは、サポートされているランタイム環境でOpenTelemetryを使用してカスタムスパンを作成するために使用されるサンプルコードを示します。

このセクションでは、Serverless Devsを使用してカスタムスパンを作成し、Pythonランタイム環境で関数を作成およびデプロイする方法について説明します。

説明

Serverless Devsを使用して、依存関係をインストールし、コードをパッケージ化してFunction Computeにデプロイできます。 他の方法でコードをパッケージ化してデプロイすることもできます。 Serverless Devsの詳細については、Serverless Devsとは何ですか?.

  1. コードディレクトリを作成します。

    mkdir opentelemetry-demo
  2. コードディレクトリに移動します。

    cd opentelemeytry-demo
  3. Pythonランタイムテンプレートを初期化します。

    1. 次のコマンドを実行して、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)
    2. プロジェクトの名前を指定し、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
    3. エイリアスを選択してEnterキーを押します。

    4. ビジネス要件に基づいてプロジェクトを展開するかどうかを指定します。

      この例では、プロジェクトに依存関係をインストールする必要があります。 したがって、の後すぐにプロジェクトを展開しますか? (Y/n) コマンド出力でが返される、nと入力します。

  4. OpenTelemetryの依存関係をインストールします。

    1. 次のコマンドを実行して、コードディレクトリに移動します。

      cd start-fc-event-python3/code
    2. コードディレクトリにrequirements.txtファイルを作成し、次の内容に基づいてファイルを変更します。

      opentelemetry-api==1.12.0
      opentelemetry-sdk==1.12.0
      opentelemetry-exporter-jaeger==1.12.0
  5. 次のコマンドを実行して関数コードを書き込みます。

    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キーを押して編集ページを終了します。

  6. s.yamlファイルを編集します。

    1. 次のコマンドを実行して、プロジェクトディレクトリに移動します。

      cd ..
    2. 次のコマンドを実行して、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キーを押して編集ページを終了します。

  7. 次のコマンドを実行して依存関係をインストールします。

    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
  8. 次のコマンドを実行して、プロジェクトをデプロイします。

    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
  9. 結果を確認します。

    Function Computeコンソールでトレースを表示します。 作成したカスタムスパンは、Function Computeのスパンに接続されます。 cold-start