我正在尝试在环回 4 中实现开放遥测跟踪。
根据 opentelemetry for HTTP、express、redis、psotgres 的自动仪器库,在加载任何此类应用程序模块之前需要加载所有 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 请求,那么上下文传播会正确发生,但是如果我通过创建一个休息连接器来使用推荐的环回方式,那么它就不会发生。我已经在应用程序中安装了所有必需的模块。
我有一个基于微服务的架构,其中一个请求可以从一个服务传递到另一个服务,我需要跟踪整个请求周期。
任何帮助将不胜感激。