如何将 AWS X-Ray 与 Nest.js 结合使用?

sun*_*ong 5 nestjs

AWS X-Ray 支持 Express 和 Restify 中间件,但不支持 Nest.js。Nest.js 无法打开 AWSXRay 的段和关闭段,因为它使用打字稿装饰进行路由。如何将 AWS X-Ray 与 Nest.js 结合使用

Jay*_*iel 3

嗯,这是一种非常有趣且难以处理的情况。您当然可以openSegement在标准 Nest 中间件(看起来就像 Express 中间件)中设置调用,但这closeSegment有点困难。我认为(我在这里进行了长期尝试,因为我没有真正的方法来测试这一点)您可以创建一个拦截器并将其注入HttpAdapter其中,在发出请求之前检查传入路由,看看它是否是您的路由想要用 X-Ray 覆盖,如果是这样,则标记一个布尔值,并在可观察的响应 ( next.handle()) 中,您可以获取HttpAdapter实例并调用该closeSegment函数。换句话说(这将是非常粗糙的代码):

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { HttpAdapterHost } from '@nesjts/core';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import * as xRay from 'aws-xray-sdk-express';

@Injectable
export class XRayInterceptor implements NestInterceptor {
  constructor(private readonly httpAdapter: HttpAdapterHost) {}

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    let coverRoute = false;
    const req = context.switchToHttp().getRequest();
    if (req.path === 'yourPath') {
      coverRoute = true;
    }
    return next.handle()
      .pipe(
        tap(() => (coverRoute && this.httpAdapter.use(xRay.xrayExpress.closeSegment()))
      );
}
Run Code Online (Sandbox Code Playgroud)

您也许还可以在拦截器中进行设置openSegment,但同样,所有这些都未经测试,可能无法按预期工作。我只是想办法让这一切成为可能。如果无法访问错误处理中间件,您的选择将是查看拦截器和过滤器,并且似乎是closeSegement像过滤器一样的错误处理程序,所以我不确定您将如何捕获错误。也许过滤器是最好的途径,您可能只需要尝试这里的想法。希望有人能够提供更多见解。