日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

創建自定義Span

啟用鏈路追蹤后,函數計算會自動記錄請求在系統側的耗時,包含冷啟動耗時、Initializer函數的耗時和函數的執行時間等。如果您還需查看函數內業務側的耗時,例如在函數內訪問RDS或NAS等服務的耗時,需創建自定義Span來實現。本文介紹如何通過Serverless Devs創建自定義Span。

前提條件

流程說明

您可以基于函數計算的鏈路創建自定義Span,將自定義的Span串聯到函數計算的調用鏈中。函數計算的鏈路分析基于OpenTracing協議的Jaeger實現,提供以下兩種方式創建自定義Span。

關于Jaeger和OpenTelemetry的詳細信息,請分別參見JaegerOpenTelemetry

兩種方式的流程說明如下。

  1. 在函數中引入Jaeger或OpenTelemetry依賴包。引入三方依賴的具體操作,請參見為函數安裝第三方依賴

  2. 在函數中獲取函數計算調用鏈的Span Context,根據函數計算的Span Context,創建自定義Span,在需要記錄耗時的代碼片段前后添加埋點。

  3. 完成后,您可以在函數詳情頁面的鏈路追蹤頁簽或鏈路追蹤控制臺查看調用鏈信息。

使用Jaeger SDK

目前,支持使用Jaeger SDK方式創建自定義Span的運行環境及其示例代碼如下所示。

本文以Node.js運行時為例,介紹如何通過Serverless Devs創建自定義Span以及創建并部署函數。

說明

您可以使用Serverless Devs安裝依賴包,并打包部署到函數計算,您也可以通過其他方式打包并部署。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. 設置項目名稱,然后按回車鍵。

      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. 按需選擇別名,然后按回車鍵。

    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: # 全局變量
        region: "cn-hangzhou"
        service:
          name: "hello-world-service"
          description: 'hello world by serverless devs'
          tracingConfig: Enable # 開啟鏈路追蹤功能
      
      services:
        helloworld: # 業務名稱/模塊名稱
          component: fc # 組件名稱,Serverless Devs工具本身類似于一種游戲機,不具備具體的業務能力,組件類似于游戲卡,用戶通過向游戲機中插入不同的游戲卡實現不同的功能,即通過使用不同的組件實現不同的具體業務能力
          props:
            region: ${vars.region} # 關于變量的使用方法,可以參考: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. 結果驗證。

    函數計算控制臺查看調用鏈,可以看到您剛創建的自定義Span已與函數計算的系統Span連接起來。user-defined-span

使用OpenTelemetry

目前,支持使用OpenTelemetry方式創建自定義Span的運行環境及其示例代碼如下所示。

本文以Python運行時為例,介紹如何通過Serverless Devs創建自定義Span以及創建并部署函數。

說明

您可以使用Serverless Devs安裝依賴包,并打包部署到函數計算,您也可以通過其他方式打包并部署。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: https://github.com/Serverless-Devs/package-awesome
      
       Please input your project name (init dir) (start-fc-event-python3)
    2. 設置項目名稱,然后按回車鍵。

      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. 按需選擇別名,然后按回車鍵。

    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,然后按回車鍵,退出編輯頁面。

  6. 編輯s.yaml文件。

    1. 執行以下命令,進入項目目錄。

      cd ..
    2. 執行以下命令,編輯s.yaml文件。

      vim s.yaml

      文件示例如下。

      edition: 1.0.0
      name: hello-world-app
      access: default
      
      vars: # 全局變量
        region: "cn-hangzhou"
        service:
          name: "hello-world-service"
          description: 'hello world by serverless devs'
          tracingConfig: Enable # 開啟鏈路追蹤功能
      
      services:
        helloworld: # 業務名稱/模塊名稱
          component: fc # 組件名稱,Serverless Devs 工具本身類似于一種游戲機,不具備具體的業務能力,組件類似于游戲卡,用戶通過向游戲機中插入不同的游戲卡實現不同的功能,即通過使用不同的組件實現不同的具體業務能力
          props:
            region: ${vars.region} # 關于變量的使用方法,可以參考:https://www.serverless-devs.com/serverless-devs/yaml#變量賦值
            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,然后按回車鍵,退出編輯頁面。

  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. 結果驗證。

    函數計算控制臺查看調用鏈,可以看到您剛創建的自定義Span已與函數計算的系統Span連接起來。cold-start