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

通過OpenTelemetry上報Go應用數據

通過OpenTelemetry為應用埋點并上報鏈路數據至可觀測鏈路 OpenTelemetry 版后,可觀測鏈路 OpenTelemetry 版即可開始監控應用,您可以查看應用拓撲、調用鏈路、異常事務、慢事務和SQL分析等一系列監控數據。本文介紹如何使用OpenTelemetry Go SDK進行手動埋點并上報數據。

說明

ARMS應用監控針對Golang語言提供了商業化版本的自研探針,提供了無侵入的埋點能力,擁有更加豐富的功能和更高的穩定性。詳細信息,請參見開始監控Golang應用

前提條件

獲取接入點信息

新版控制臺

  1. 登錄可觀測鏈路 OpenTelemetry 版控制臺,在左側導航欄單擊接入中心

  2. 開源框架區域單擊OpenTelemetry卡片。

  3. 在彈出的OpenTelemetry面板中選擇數據需要上報的地域。

    說明

    初次接入的地域將會自動進行資源初始化。

  4. 選擇連接方式上報方式,然后復制接入點信息。

    • 連接方式:若您的服務部署在阿里云上,且所屬地域與選擇的接入地域一致,推薦使用阿里云內網方式,否則選擇公網方式。

    • 上報方式:根據客戶端支持的協議類型選擇HTTP或gRPC協議上報數據。

    image.png

舊版控制臺

  1. 登錄可觀測鏈路 OpenTelemetry 版控制臺

  2. 在左側導航欄單擊集群配置,然后在右側頁面單擊接入點信息頁簽。

  3. 在頁面頂部選擇需要接入的地域,然后在集群信息區域打開顯示Token開關。

  4. 客戶端采集工具區域單擊OpenTelemetry

    相關信息列中,獲取接入點信息。ot舊版中.jpg

    說明

    如果應用部署于阿里云生產環境,則選擇阿里云VPC網絡接入點,否則選擇公網接入點。

背景信息

OpenTelemetry Go SDK提供了Go語言的分布式鏈路追蹤能力,您可以直接使用OTLP gRPC或者HTTP協議向鏈路追蹤服務端上報數據。

OpenTelemetry提供了若干半自動埋點插件(無需手動創建Span,只需要在代碼中使用這些插件提供的API),支持為常見的框架自動創建Span。支持的框架列表請參見OpenTelemetry官方文檔

示例Demo

oltp-exporter

使用gRPC協議上報

  1. 添加OpenTelemetry Go依賴。

    go get go.opentelemetry.io/otel
    go get go.opentelemetry.io/otel/trace
    go get go.opentelemetry.io/otel/sdk
    go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc // otlp grpc
  2. 初始化OpenTelemetry Go SDK。

    您可以選擇通過OpenTelemetry SDK直接上報或通過開源OpenTelemetry Collector轉發。

    • 如果選擇直接上報,請將otelAgentAddr和xtraceToken替換為前提條件獲取的接入點和鑒權Token。

    • 如果選擇使用OpenTelemetry Collector轉發,請將otelAgentAddr替換為您本地部署的服務地址,并刪除Header信息。

    func initProvider() func() {
        ctx := context.Background()
    
        otelAgentAddr, xtraceToken, ok := common.ObtainXTraceInfo()
    
        if !ok {
            log.Fatalf("Cannot init OpenTelemetry, exit")
            os.Exit(-1)
        }
    
        headers := map[string]string{"Authentication": xtraceToken}   //將xtraceToken替換為前提條件中獲取的鑒權Token。
        traceClient := otlptracegrpc.NewClient(
            otlptracegrpc.WithInsecure(),
            otlptracegrpc.WithEndpoint(otelAgentAddr),    //將otelAgentAddr替換為前提條件中獲取的接入點。
            otlptracegrpc.WithHeaders(headers),
            otlptracegrpc.WithDialOption(grpc.WithBlock()))
        log.Println("start to connect to server")
        traceExp, err := otlptrace.New(ctx, traceClient)
        handleErr(err, "Failed to create the collector trace exporter")
    
        res, err := resource.New(ctx,
            resource.WithFromEnv(),
            resource.WithProcess(),
            resource.WithTelemetrySDK(),
            resource.WithHost(),
            resource.WithAttributes(
                // 在可觀測鏈路 OpenTelemetry 版后端顯示的服務名稱。
                semconv.ServiceNameKey.String(common.ServerServiceName),
                semconv.HostNameKey.String(common.ServerServiceHostName),
            ),
        )
        handleErr(err, "failed to create resource")
    
        bsp := sdktrace.NewBatchSpanProcessor(traceExp)
        tracerProvider := sdktrace.NewTracerProvider(
            sdktrace.WithSampler(sdktrace.AlwaysSample()),
            sdktrace.WithResource(res),
            sdktrace.WithSpanProcessor(bsp),
        )
    
        // 設置全局propagator為tracecontext(默認不設置)。
        otel.SetTextMapPropagator(propagation.TraceContext{})
        otel.SetTracerProvider(tracerProvider)
    
        return func() {
            cxt, cancel := context.WithTimeout(ctx, time.Second)
            defer cancel()
            if err := traceExp.Shutdown(cxt); err != nil {
                otel.Handle(err)
            }
        }
    }
  3. 添加埋點。

    shutdown := initProvider()
        defer shutdown()
    
        //meter := global.Meter("demo-server-meter")
        serverAttribute := attribute.String("server-attribute", "foo")
        fmt.Println("start to gen chars for trace data")
        initTraceDemoData()
        fmt.Println("gen trace data done")
        tracer := otel.Tracer(common.TraceInstrumentationName)
    
        // 在OpenTelemetry中創建一個handler。
        handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
            //  模擬延遲
            var sleep int64
            switch modulus := time.Now().Unix() % 5; modulus {
            case 0:
                sleep = rng.Int63n(2000)
            case 1:
                sleep = rng.Int63n(15)
            case 2:
                sleep = rng.Int63n(917)
            case 3:
                sleep = rng.Int63n(87)
            case 4:
                sleep = rng.Int63n(1173)
            }
            ctx := req.Context()
            span := trace.SpanFromContext(ctx)
            span.SetAttributes(serverAttribute)
    
            actionChild(tracer, ctx, sleep)
    
            w.Write([]byte("Hello World"))
        })
        wrappedHandler := otelhttp.NewHandler(handler, "/hello")
    
        http.Handle("/hello", wrappedHandler)
        http.ListenAndServe(":7080", nil)
  4. 啟動應用程序。

    go run main.go

    可觀測鏈路 OpenTelemetry 版控制臺應用列表頁面選擇目標應用,查看鏈路數據。

使用HTTP協議上報

  1. 添加OpenTelemetry Go依賴。

    go get go.opentelemetry.io/otel
    go get go.opentelemetry.io/otel/trace
    go get go.opentelemetry.io/otel/sdk
    go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp // otlp http
  2. 初始化OpenTelemetry Go SDK,其中Endpoint和URLPath需替換為前提條件中獲取的接入點信息。

    您可以選擇通過OpenTelemetry SDK直接上報或通過開源OpenTelemetry Collector轉發。

    • 如果選擇直接上報,請將Endpoint和URLPath替換為前提條件獲取的接入點信息。

    • 如果選擇使用OpenTelemetry Collector轉發,請將Endpoint替換為您本地部署的服務地址,并刪除Header信息。

    func initProvider() func() {
        ctx := context.Background()
    
        traceClientHttp := otlptracehttp.NewClient(
            otlptracehttp.WithEndpoint("127.0.XX.XX:8080"),      //Endpoint需替換為前提條件中獲取的接入點信息。
            otlptracehttp.WithURLPath("/adapt_xxxxx/api/otlp/traces"),   //URLPath需替換為前提條件中獲取的接入點信息。
            otlptracehttp.WithInsecure())
        otlptracehttp.WithCompression(1)
    
        traceExp, err := otlptrace.New(ctx, traceClientHttp)
        handleErr(err, "Failed to create the collector trace exporter")
    
        res, err := resource.New(ctx,
            resource.WithFromEnv(),
            resource.WithProcess(),
            resource.WithTelemetrySDK(),
            resource.WithHost(),
            resource.WithAttributes(
                // 在可觀測鏈路 OpenTelemetry 版后端顯示的服務名稱。
                semconv.ServiceNameKey.String(common.ClientServiceName),
                semconv.HostNameKey.String(common.ClientServiceHostName),
            ),
        )
        handleErr(err, "failed to create resource")
    
        bsp := sdktrace.NewBatchSpanProcessor(traceExp)
        tracerProvider := sdktrace.NewTracerProvider(
            sdktrace.WithSampler(sdktrace.AlwaysSample()),
            sdktrace.WithResource(res),
            sdktrace.WithSpanProcessor(bsp),
        )
    
        // 設置全局propagator為tracecontext(默認不設置)。
        otel.SetTextMapPropagator(propagation.TraceContext{})
        otel.SetTracerProvider(tracerProvider)
    
        log.Println("OTEL init success")
    
        return func() {
            cxt, cancel := context.WithTimeout(ctx, time.Second)
            defer cancel()
            if err := traceExp.Shutdown(cxt); err != nil {
                otel.Handle(err)
            }
        }
    }
  3. 添加埋點。

    tracer := otel.Tracer(common.TraceInstrumentationName)
    
        method, _ := baggage.NewMember("method", "repl")
        client, _ := baggage.NewMember("client", "cli")
        bag, _ := baggage.New(method, client)
    
        defaultCtx := baggage.ContextWithBaggage(context.Background(), bag)
        for {
            ctx, span := tracer.Start(defaultCtx, "ExecuteRequest")
            makeRequest(ctx)
            span.End()
            time.Sleep(time.Duration(1) * time.Second)
        }
  4. 啟動應用程序。

    go run main.go

    可觀測鏈路 OpenTelemetry 版控制臺應用列表頁面選擇目標應用,查看鏈路數據。