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

鏈路追蹤簡介

本文介紹函數計算集成鏈路追蹤功能的背景、使用場景、核心功能、采樣規則配置和開啟方式。

背景介紹

阿里云可觀測鏈路 OpenTelemetry版基于OpenTracing標準,兼容開源社區,為分布式應用的開發者提供了完整的分布式調用鏈查詢和診斷,分布式拓撲動態發現,應用性能實時匯總等功能。

函數計算與鏈路追蹤集成,支持使用Jaeger上傳鏈路信息,使您能夠跟蹤函數的執行,幫助您快速分析和診斷Serverless架構下的性能瓶頸,提高Serverless場景的開發診斷效率。

使用場景

當函數計算與鏈路追蹤集成后,您可以記錄請求在函數計算的耗時時間、查看函數的冷啟動時間、記錄函數內部時間的消耗等。鏈路追蹤功能可以幫助您排查以下問題:

  • 函數執行總超時,需要定位函數的性能瓶頸。

  • 函數執行時間很短,但是端對端時延很長時,需要定位相關原因。

  • 分布式系統中,請求橫跨多個云服務,需要分析和診斷函數的性能瓶頸。

核心功能

函數計算的鏈路追蹤功能可以串聯整個調用鏈,包含以下核心功能:

  • 自動記錄函數計算內部關鍵步驟耗時時間。更多信息,請參見自動記錄函數計算內部關鍵步驟耗時

  • 串聯上游服務:如果請求Header中帶有鏈路上下文信息,則函數計算會根據上下文創建子鏈路。更多信息,請參見串聯上游服務

  • 串聯下游服務:函數計算會將鏈路上下文傳入到函數Context參數中,幫助您追蹤函數內部調用鏈路。更多信息,請參見串聯下游服務

  • 查看應用拓撲。

  • 查看錯誤接口執行情況,定位錯誤原因。

自動記錄函數計算內部關鍵步驟耗時

服務開啟鏈路追蹤功能后,您默認可以看到以下調用鏈。

cold-start

Span名稱說明如下:

  • InvokeFunction:當前請求在函數計算的總停留時間。

  • ColdStart:函數系統層冷啟動的時間,冷啟動不是每次調用都出現,只在重新申請執行環境時會進行冷啟動。

    • PrepareCode:函數下載代碼或下載自定義鏡像的時間,如果PrepareCode時間過長,您可以適當精簡代碼包來縮短準備代碼的時間。

    • RuntimeInitialization:執行環境啟動的時間,包含啟動實例的時間、實例健康檢查時間。在自定義運行時和自定義鏡像中,如果RuntimeInitialization執行時間過長,需要檢查一下對應的HTTP Server和鏡像的啟動行為。

  • Initializer:初始化函數的執行時間,初始化函數當且僅當容器冷啟動的時候才會被執行。

  • Invocation:函數的執行時間,您可以在函數中獲取到Invocation的上下文,詳細記錄函數調用中的耗時。

應用名稱:函數計算生成的應用命名方式為FC:ServiceName/FunctionName

當請求沒有遇到冷啟動時,鏈路中沒有冷啟動時間和Initializer的時間。調用鏈如下所示。

warm-start

串聯上游服務

服務開啟鏈路追蹤后,如果請求Header中帶有鏈路上下文信息SpanContext,則函數計算會根據上下文創建子鏈路。

函數計算識別的鏈路上下文請求頭如下:

  • x-fc-tracing-opentracing-span-context:用于傳遞鏈路上下文信息SpanContext信息。

  • x-fc-tracing-opentracing-span-context-baggage-:用于傳遞跨上下文的Baggage信息。

    如果有多個Baggage則需要上傳多個Header,例如x-fc-tracing-opentracing-span-context-baggage-key1: val1x-fc-tracing-opentracing-span-context-baggage-key2: val2

在調用函數時添加鏈路上下文信息Header即可注入上下文信息。

以Node.js為例:

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

/*
阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。
建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。
本示例以將AccessKey和AccessSecretKey保存在環境變量實現身份驗證為例。
運行本示例前,請先在本地環境中設置環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
在FC Runtime運行環境下,配置執行權限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變量會自動被設置。
*/
var client = new FCClient('<account id>', {
    accessKeyID: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
    accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
    region: 'cn-shanghai',
});

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

async function test() {
    try {

        // 注入Span Context Header信息。
        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);
    }
}

串聯下游服務

函數計算會將鏈路上下文傳入到函數中,幫助追蹤函數內部的調用鏈路。

  • 對于內置Runtime,可以通過context.tracing獲取鏈路上下文信息。

  • 對于Custom Runtime或Custom Container,可以通過請求Header獲取函數計算鏈路上下文信息。

    • x-fc-tracing-opentracing-span-context:函數計算InvokeFunction的鏈路上下文,函數內基于此上下文創建追蹤段。

    • x-fc-tracing-opentracing-span-baggages:經過Base64編碼的跨上下文Baggage。

    • x-fc-tracing-jaeger-endpoint:Jaeger的Server端地址,您直接將函數中的追蹤段上傳至此地址。

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());
        }
    }
  • Custom Runtime或Custom Container獲取Header即可,以Golang語言為例:

      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')

自定義采樣規則

如果您需要自定義采樣規則,您可以登錄可觀測鏈路 OpenTelemetry版控制臺設置遠程采樣規則。更多信息,請參見使用Jaeger進行遠程采樣策略配置。配置完成后,函數計算會使用您設置的遠程采樣規則采樣。

函數計算在鏈路追蹤中對應的服務名稱為fc-tracing,默認使用的采樣規則為RatelimitingSampler,以每秒1個請求的速率采樣。

函數計算使用的默認采樣規則如下:

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

開啟方式

關于鏈路追蹤功能的開啟方式,請參見配置鏈路追蹤