OpenTelemetry计数器指标属性值显示'n.i'异常求助
问题:OpenTelemetry指标属性值显示'n.i'而非实际app_id
我创建了一个最小可复现项目,使用Fiber启动服务器,代码如下:
package main import ( "context" "os" "time" "github.com/gofiber/contrib/fiberzap" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/favicon" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/metric" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/metric/metricdata" "go.opentelemetry.io/otel/sdk/resource" semconv "go.opentelemetry.io/otel/semconv/v1.18.0" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var ( logger *zap.Logger ) func init() { var cfg zap.Config cfg = zap.NewDevelopmentConfig() // set time format cfg.EncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout(time.DateTime) // add color for console cfg.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder logger = zap.New(zapcore.NewCore(zapcore.NewConsoleEncoder(cfg.EncoderConfig), zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout)), zapcore.DebugLevel)) } func preferDeltaTemporalitySelector(kind sdkmetric.InstrumentKind) metricdata.Temporality { switch kind { case sdkmetric.InstrumentKindCounter, sdkmetric.InstrumentKindObservableCounter, sdkmetric.InstrumentKindHistogram: return metricdata.DeltaTemporality default: return metricdata.CumulativeTemporality } } func initProvider(ctx context.Context) func() { res, err := resource.New(ctx, resource.WithFromEnv(), resource.WithProcess(), resource.WithTelemetrySDK(), resource.WithHost(), resource.WithAttributes( semconv.ServiceName("server"), semconv.ServiceNamespace("demo"), semconv.ServiceVersion("0.1.0"), ), ) if err != nil { logger.Fatal("failed to create resource", zap.Error(err)) } otelAgentAddr, ok := os.LookupEnv("OTEL_EXPORTER_OTLP_ENDPOINT") if !ok { otelAgentAddr = "127.0.0.1:4317" } metricExp, err := otlpmetricgrpc.New( ctx, otlpmetricgrpc.WithInsecure(), otlpmetricgrpc.WithEndpoint(otelAgentAddr), otlpmetricgrpc.WithCompressor("gzip"), otlpmetricgrpc.WithTemporalitySelector(preferDeltaTemporalitySelector), ) meterProvider := sdkmetric.NewMeterProvider( sdkmetric.WithResource(res), sdkmetric.WithReader( sdkmetric.NewPeriodicReader( metricExp, sdkmetric.WithInterval(2*time.Second), ), ), ) otel.SetMeterProvider(meterProvider) return func() { cxt, cancel := context.WithTimeout(ctx, time.Second) defer cancel() // pushes any last exports to the receiver if err := meterProvider.Shutdown(cxt); err != nil { otel.Handle(err) } } } var ( meter metric.Meter ) func main() { ctx := context.Background() otelShutdownHook := initProvider(ctx) defer otelShutdownHook() meter = otel.Meter("demo-server") app := fiber.New(fiber.Config{ AppName: "demo-server", CaseSensitive: true, DisableKeepalive: true, EnablePrintRoutes: true, }) app.Use(favicon.New()) app.Use(fiberzap.New(fiberzap.Config{ Logger: logger, SkipURIs: []string{"/favicon.ico"}, Fields: []string{"time", "method", "path", "status", "respHeader:X-Request-ID", "ip", "port", "ua", "latency"}, Levels: []zapcore.Level{zapcore.WarnLevel}, })) requestCount, _ := meter.Int64Counter( "demo_server/request_counts", metric.WithDescription("The number of requests received"), ) app.Get("/hello/:app_id", func(c *fiber.Ctx) error { appID := c.Params("app_id") logger.Info("hello", zap.String("app_id", appID)) requestCount.Add(c.UserContext(), 1, metric.WithAttributes(attribute.String("interface", "hello"), attribute.String("app_id", appID))) return nil }) app.Get("/bye/:app_id", func(c *fiber.Ctx) error { appID := c.Params("app_id") logger.Info("bye", zap.String("app_id", appID)) requestCount.Add(c.UserContext(), 1, metric.WithAttributes(attribute.String("interface", "bye"), attribute.String("app_id", appID))) return nil }) app.Listen("0.0.0.0:2333") }
发送HTTP请求:curl http://127.0.0.1:2333/hello/1024,服务器可正确获取app_id=1024,但OpenTelemetry SDK上报给OpenTelemetry Collector的属性值却显示'n.i',恳请提供修复建议,谢谢!
内容的提问来源于stack exchange,提问作者charmer
相关产品推荐
相关产品推荐

