【发布时间】:2021-02-27 13:17:54
【问题描述】:
我正在尝试在环回 4 中实现 opentelemetry 跟踪。
根据用于 HTTP、express、redis、psotgres 的 opentelemetry 的自动仪器库,在加载任何此类应用程序模块之前需要加载所有 opentelemetry 模块。但是当我尝试在应用程序中这样做时,它总是会给出一条消息:
某些模块(redis、express)在加载各自的插件时已经需要,某些插件可能无法工作。确保在其他模块中需要之前设置 SDK。
以下是我尝试过的示例代码。
安装以下软件包:
@opentelemetry/node
@opentelemetry/tracing
@opentelemetry/exporter-jaeger
@opentelemetry/plugin-http
@opentelemetry/plugin-https
@opentelemetry/plugin-express
在 index.ts 的顶部
import { JaegerExporter } from '@opentelemetry/exporter-jaeger';
import { NodeTracerProvider } from '@opentelemetry/node';
import { SimpleSpanProcessor, ConsoleSpanExporter } from '@opentelemetry/tracing';
在 index.ts 文件中的 main 函数的顶部
const option = {
serviceName: 'basic-service',
tags: [], // optional
// You can use the default UDPSender
host: 'localhost', // optional
port: 6832, // optional
// OR you can use the HTTPSender as follows
// endpoint: 'http://localhost:14268/api/traces',
}
// Configure span processor to send spans to the exporter
const exporter = new JaegerExporter(option);
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
provider.register();
然后在application.ts文件中导入以下内容:
import openTelemetry, { Span, Tracer } from '@opentelemetry/api';
然后我在application.ts中添加了这个中间件
const middle: Middleware = async (ctx, next) => {
const trace = openTelemetry.trace.getTracer('loopback:tracer');
let span: Span;
span = trace.startSpan(ctx.request.url);
span.setAttribute('key', 'value');
span.addEvent('invoking next');
const res = await next();
return res;
}
然后在application.ts中的构造函数中绑定这个中间件:
this.middleware(middle);
如果我使用Axios 发出 HTTP 请求,那么上下文传播会正确发生,但如果我通过创建一个休息连接器来使用推荐的环回方式,那么它就不会发生。我已经在应用程序中安装了所有必需的模块。
我有一个基于微服务的架构,其中一个请求可以从一个服务传递到另一个服务,我需要跟踪整个请求周期。
任何帮助都将在这里得到赞赏。
【问题讨论】:
-
为了以后的交叉引用,这个问题已经在这里重新发布:github.com/strongloop/loopback-next/issues/6791
标签: loopbackjs loopback4 opentracing open-telemetry