gpt4 book ai didi

node.js - Open-Telemetry 跨度未显示在 GCP Cloud Trace 中

转载 作者:行者123 更新时间:2023-12-05 05:45:19 29 4
gpt4 key购买 nike

我正在 Google Cloud Platform 的 Cloud Run 中检测 node.js 服务。

我遇到了一个问题,即自定义跨度没有出现在 Trace 中

我知道跟踪是有效的,因为 HTTP/TCP 跨度(您在 GCP 中免费获得)显示正确嵌套——如果没有配置,它们不会自动嵌套,这向我表明下面的配置是有效的:

tracing.ts:

import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
import {
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
import { TraceExporter } from "@google-cloud/opentelemetry-cloud-trace-exporter";
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { registerInstrumentations } from "@opentelemetry/instrumentation";
import { ExpressInstrumentation } from "@opentelemetry/instrumentation-express";
import * as opentelemetry from "@opentelemetry/api";
import { AsyncHooksContextManager } from "@opentelemetry/context-async-hooks";
import { SemanticResourceAttributes } from "@opentelemetry/semantic-conventions";
import { Resource } from "@opentelemetry/resources"

export const provider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: "my-service-name",
})
});

// this *should* work automatically in GCP??
provider.addSpanProcessor(new SimpleSpanProcessor(new TraceExporter({
resourceFilter: /^service\./
})));

provider.register();

opentelemetry.trace.setGlobalTracerProvider(provider);

const contextManager = new AsyncHooksContextManager();
contextManager.enable();
opentelemetry.context.setGlobalContextManager(contextManager);

export const tracer = opentelemetry.trace.getTracer("basic");

// this works (spans are correctly associated with parents)
registerInstrumentations({
instrumentations: [
getNodeAutoInstrumentations({
"@opentelemetry/instrumentation-http": {},
"@opentelemetry/instrumentation-express": {},
}),
],
});

显示的跨度是那些在代码中发出的跨度,例如以下经过编辑的生产代码:

import { tracer } from "../tracing";

// ...

export const doWork = async (
req: Request,
res: Response
) => {

// ... but this does *NOT* work: these spans appear nowhere
// start span
const span = tracer.startSpan("doWork");
const ctx = opentelemetry.trace.setSpan(opentelemetry.context.active(), span);
opentelemetry.propagation.extract(ctx, req.headers);

try {
// ... do work here with ctx to emit child spans

res.status(200).send("ok");
} catch (e) {
res.status(500).send("error");
}

span.end();
};

我不清楚为什么这些跨度没有出现在任何地方。

部署 Cloud Run 实例的服务帐户具有 roles/cloudtrace.agent 角色:

- members:
- serviceAccount:<my service account name>@<project id>.iam.gserviceaccount.com
role: roles/cloudtrace.agent

我不确定是否需要添加额外的权限(或者它们可能需要添加到哪个实体)。

到目前为止我已经尝试过了

  • 使用和不使用 Provider 配置进行部署(没有区别)
  • 使用 Open-Telemetry OTLPTraceExporter 在 GCP 中导出 span(仍然没有任何显示)
  • 改用 Stackdriver trace-agent(与 webpack 不兼容)
  • 使用带有 Open-Telemetry 收集器的 OTLPTraceExporter 在本地运行所有这些(一切都按预期工作 - 跟踪全部显示)
  • 在 GCP 中使用 ConsoleSpanExporter(跨度在日志中正确显示)

我真的很迷茫。

最佳答案

在 GCP documentation 中检查过,此服务仅支持 Google Compute Engine 和 GKE。

不过可以引用Cloud Run Support在 Github 中,如果您在 Cloud Run 和 Stackoverflow 上运行 OpenTelemetry discussion .

关于node.js - Open-Telemetry 跨度未显示在 GCP Cloud Trace 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71416066/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com