OpenTelemetry Next.js - <root span not yet received> 用于 Grafana 中跟踪的服务字段和空名称字段

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

我已经使用 OpenTelemetry 在我的 Next.js 应用程序上实现了跟踪(我的实现如下)。该应用程序将跟踪发送到我的 Grafana 代理,然后将它们转发到 Tempo。

但是,当使用 Tempo 跟踪表查看 Grafana 中的跟踪时,大多数跟踪的“服务”字段为“尚未收到根跨度”,且“名称”字段为空(请参阅下面的链接)。但是,当您单击“跟踪 ID”以显示完整跟踪时,会显示正确的“服务”和“名称”字段。

有谁知道为什么会发生这种情况以及是否可以解决?

Grafana trace table

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { PeriodicExportingMetricReader, ConsoleMetricExporter } = require('@opentelemetry/sdk-metrics');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc');
const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-grpc');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');

const sdk = new NodeSDK({
 traceExporter: new OTLPTraceExporter(),
  metricReader: new PeriodicExportingMetricReader({
    exporter: new OTLPMetricExporter(),
  }),
  instrumentations: [
    getNodeAutoInstrumentations({
      '@opentelemetry/instrumentation-fs': {
        enabled: false,
      },
      '@opentelemetry/instrumentation-http': {
          // This gives your request spans a more meaningful name than `HTTP GET`
          requestHook: (span, request) => {
            span.updateName( `${request.method} ${request.url || request.path}` );
            // The below is not working
            //span.setAttribute('http.route', request.path);
          },
       },
    }),
  ]
});

sdk.start();
next.js grafana open-telemetry tempo
1个回答
0
投票

如果您在本地运行应用程序,此行为是否相同?

如果没有,这表明您的系统不是 OTEL 链上第一个生成跟踪的系统。收集器不会显示服务名称,因为它正在等待上游系统发送跟踪信息。

要修复此问题,您可以识别上游服务(入口 nginx、消息系统、云 api 网关),然后将跟踪转发到 tempo。

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