【问题标题】:Google Cloud Trace NodeJS for bundled applications用于捆绑应用程序的 Google Cloud Trace NodeJS
【发布时间】:2022-07-30 08:07:43
【问题描述】:

我有一个使用express 的服务器端呈现的Web 应用程序,我们使用@google-cloud/trace-agent 向Google 发送跟踪信息,效果很好。但是 THEN.... 我们捆绑了我们的应用程序,所有的跟踪信息都消失了。我们仍然在谷歌云控制台中看到请求,但现在没有子跨度。

我浏览了文档并偶然发现了这段令人失望的段落:

跟踪捆绑或 webpacked 服务器代码。 不支持 Trace Agent 不支持捆绑的服务器代码,因此 webpack 或 @zeit/ncc 等捆绑程序将无法工作。

来自:https://github.com/googleapis/cloud-trace-nodejs#tracing-bundled-or-webpacked-server-code

我认为这只是意味着我需要开始自己的根跨度......但这似乎不是 API 的一部分。

这是否意味着我不能在捆绑的服务器中发送跨度?是否有一种编程方式可以手动启动快速根跨度?

    标签: node.js express google-app-engine webpack


    【解决方案1】:

    我最终从https://github.com/googleapis/cloud-trace-nodejs/blob/main/src/plugins/plugin-express.ts 复制了中间件功能,并通过app.use(...) 手动将其添加到我的快速应用程序中。

    为了完整起见,代码是:

    import { get as getTracer } from '@google-cloud/trace-agent';
    import type { RootSpanOptions } from '@google-cloud/trace-agent/build/src/plugin-types';
    import type { NextFunction, Request, Response } from 'express';
    
    export function googleCloudTracing(request: Request, response: Response, next: NextFunction): void {
      const tracer = getTracer();
    
      const options: RootSpanOptions = {
        name: request.path,
        traceContext: tracer.propagation.extract(key => request.get(key)),
        url: request.originalUrl,
        method: request.method,
        skipFrames: 1,
      };
    
      tracer.runInRootSpan(options, rootSpan => {
        // Set response trace context.
        const responseTraceContext = tracer.getResponseTraceContext(
          options.traceContext!,
          tracer.isRealSpan(rootSpan)
        );
        if (responseTraceContext) {
          // This propagates the likes of tracer.constants.TRACE_CONTEXT_HEADER_NAME for cross-service tracing.
          tracer.propagation.inject((k, v) => response.setHeader(k, v), responseTraceContext);
        }
    
        if (!tracer.isRealSpan(rootSpan)) {
          next();
          return;
        }
    
        tracer.wrapEmitter(request);
        tracer.wrapEmitter(response);
    
        const url = `${request.protocol}://${request.headers.host}${request.originalUrl}`;
        rootSpan.addLabel(tracer.labels.HTTP_METHOD_LABEL_KEY, request.method);
        rootSpan.addLabel(tracer.labels.HTTP_URL_LABEL_KEY, url);
        rootSpan.addLabel(tracer.labels.HTTP_SOURCE_IP, request.ip);
    
        response.on('finish', () => {
          request.route?.path && rootSpan.addLabel('express/request.route.path', request.route.path);
          rootSpan.addLabel(tracer.labels.HTTP_RESPONSE_CODE_LABEL_KEY, response.statusCode);
          rootSpan.endSpan();
          logger.info('Request tracing ended.');
        });
    
        next();
      });
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-05
      • 2019-01-18
      • 2015-05-18
      • 1970-01-01
      • 2011-08-06
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      相关资源
      最近更新 更多