将传入的 http b3 标头视为自己的跟踪 ID 和跨度 ID

问题描述

我在接受 HTTP API 请求的后端使用 nestjs。和 Jaeger-client-node 提供跟踪器和 Span。

我有一个拦截器可以在 HTTP 请求的开始和结束期间开始和结束跨度。

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
    intercept(context: ExecutionContext,next: CallHandler): Observable<any> {
        const request = context.switchToHttp().getRequest<AuthRequest>();
        if (request && request.url.indexOf('/api') == 0) {
            const traceId = request?.headers['x-b3-traceid'];
            const spanId = request?.headers['x-b3-spanid'];

            const span = tracer.startSpan(request.url);
            tracer.inject(span,FORMAT_TEXT_MAP,request?.headers); // NOT WORKING
            // tracer.inject(span,FORMAT_HTTP_HEADERS,request?.headers); // NOT WORKING

            // tracer.extract(FORMAT_TEXT_MAP,request?.headers); // NOT WORKING
            // tracer.extract(FORMAT_HTTP_HEADERS,request?.headers); // NOT WORKING

            console.log("started");
        }
        return next
            .handle()
            .pipe(
                tap(() => {
                        httpContext.get('span').finish();
                        console.log("ended");
                    },),);
    }
}

基本上,我想做一些类似 spring cloud sleuth 的事情,它可以尊重传入请求的 b3 标头并使用 Sl4j log.info("message") 并通过 b3 传播发出外部 http 请求。

PS:我也尝试过 Zipkin 和 OpenTelemetry 的 nodejs 库

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)