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

时间:2019-07-24 04:36:28

标签: nestjs

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

1 个答案:

答案 0 :(得分:0)

嗯,这是可能非常有趣且难以使用的情况之一。当然,您可以在标准Nest中间件(看起来像Express中间件)中设置openSegement调用,但是closeSegment有点困难。我认为(并且我在这里进行了很长的尝试,因为我没有真正的方法来测试),您可以创建一个拦截器并将HttpAdapter注入其中,在发出请求之前检查传入的路由,看看是否这是您要使用X射线覆盖的路线,如果这样标记为布尔值,并且在可观察到的响应(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()))
      );
}

您也许还可以在拦截器中设置openSegment,但同样,所有这些未经测试,可能无法按预期工作。我正在尝试思考一种可能使之成为可能的方法。如果没有访问错误处理中间件的权限,您的选择将是着眼于拦截器和过滤器,并且看来closeSegement就像过滤器一样,将是一个错误处理程序,因此我不确定您如何捕获错误。也许过滤器是最好的方法,您可能只需要从这里开始思考。希望有人能提供更多见识。