将跟踪上下文注入 Go 中传入请求的标头中。 (KrakenD 的自定义插件)

问题描述 投票:0回答:1

我想在 Go 中创建一个自定义插件并将其加载到 KrakenD(text)中。 使用这个插件,我想生成一个 Trace span Context(Root) 并注入到每个传入请求的标头中并传播到另一个 BckEnd Api。

我有这段代码:

import (
    "context"
    "fmt"
    "net/http"

    // jaegerPropagator "go.opentelemetry.io/contrib/propagators/jaeger"
    "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/propagation"
    "go.opentelemetry.io/otel/sdk/trace"
    otelTrace "go.opentelemetry.io/otel/trace"
)



func newTraceProvider() (*trace.TracerProvider, error) {
    traceExporter, err := stdouttrace.New(
        stdouttrace.WithPrettyPrint())
    if err != nil {
        return nil, err
    }

    traceProvider := trace.NewTracerProvider(
        trace.WithBatcher(traceExporter),
    )
    return traceProvider, nil
}

// This method takes an "http.Handler" and returns another "http.Handler" that modifies the incoming request
func (req registrable) registerHandlers(ctx context.Context, extra map[string]interface{}, handler http.Handler) (http.Handler, error) {

    return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
                 otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{},   propagation.Baggage{}))


        // Set up trace provider.
        tracerProvider, err := newTraceProvider()
        fmt.Println(err)

        tracer := tracerProvider.Tracer(nameTracer)

        // Start a new server span using the tracer and the incoming request context
        newCtx, span := tracer.Start(
            ctx,
            "Root-Server-Span",
            otelTrace.WithSpanKind(otelTrace.SpanKindServer),
        )
        defer span.End() // Ensure the span is ended

        carrier := propagation.HeaderCarrier(req.Header)
        otel.GetTextMapPropagator().Inject(newCtx, carrier)


        // Call the next handler in the chain with the new context
        handler.ServeHTTP(w, req.WithContext(newCtx))
    }), nil
}

插件加载成功,但无法注入标头。

有谁了解以上情况可以帮助我吗?

go httprequest trace open-telemetry krakend
1个回答
0
投票

我忘记将插件的名称放入 krakend 中。 问题解决了!!!

© www.soinside.com 2019 - 2024. All rights reserved.