我已经使用 OpenTelemetry 在我的 Next.js 应用程序上实现了跟踪(我的实现如下)。该应用程序将跟踪发送到我的 Grafana 代理,然后将它们转发到 Tempo。
但是,当使用 Tempo 跟踪表查看 Grafana 中的跟踪时,大多数跟踪的“服务”字段为“尚未收到根跨度”,且“名称”字段为空(请参阅下面的链接)。但是,当您单击“跟踪 ID”以显示完整跟踪时,会显示正确的“服务”和“名称”字段。
有谁知道为什么会发生这种情况以及是否可以解决?
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();
如果您在本地运行应用程序,此行为是否相同?
如果没有,这表明您的系统不是 OTEL 链上第一个生成跟踪的系统。收集器不会显示服务名称,因为它正在等待上游系统发送跟踪信息。
要修复此问题,您可以识别上游服务(入口 nginx、消息系统、云 api 网关),然后将跟踪转发到 tempo。