Nodejs Nestjs分布式追踪插件nestjs-zipkin的使用

Nodejs Nestjs分布式追踪插件nestjs-zipkin的使用
nestjs-zipkin 是一个用于 NestJS 应用程序的分布式追踪插件,它基于 Zipkin 实现。Zipkin 是 Twitter 开源的一个分布式追踪系统,可以帮助你收集、分析和可视化微服务架构中的延迟信息。

安装

首先,你需要安装 nestjs-zipkin@opentracing/opentracing

npm install nestjs-zipkin @opentracing/opentracing

配置

接下来,你需要在你的 NestJS 应用程序中配置 nestjs-zipkin。通常,这会在 AppModule 中完成。

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { ZipkinInterceptor, ZipkinModule } from 'nestjs-zipkin';

@Module({
  imports: [
    ZipkinModule.register({
      baseUrl: 'http://localhost:9411', // Zipkin 的地址
      serviceName: 'your-service-name', // 你的服务名称
      logger: console, // 可选的日志记录器
    }),
  ],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: ZipkinInterceptor,
    },
  ],
})
export class AppModule {}

使用

一旦配置完成,你就可以在你的控制器或服务中使用分布式追踪了。nestjs-zipkin 提供了一个拦截器(Interceptor),可以自动处理追踪信息。

例如,在一个控制器中:

import { Controller, Get } from '@nestjs/common';
import { Trace } from 'nestjs-zipkin';

@Controller('example')
export class ExampleController {
  @Get()
  @Trace() // 这会触发 Zipkin 拦截器
  get(): string {
    return 'Hello World!';
  }
}

自定义追踪

你也可以自定义追踪信息,比如设置标签或注释:

import { Controller, Get } from '@nestjs/common';
import { Trace } from 'nestjs-zipkin';

@Controller('example')
export class ExampleController {
  @Get()
  @Trace({
    tags: { 'http.status_code': '200' }, // 设置 HTTP 状态码
    name: 'CustomOperationName', // 自定义操作名称
  })
  get(): string {
    return 'Hello World!';
  }
}

注意事项

  • 确保 Zipkin 服务器已经启动并且可以通过 baseUrl 访问。
  • 如果你在 Docker 或 Kubernetes 环境中运行,确保服务之间可以正确通信。
  • 在生产环境中,建议使用更健壮的配置和错误处理机制。

通过这些步骤,你应该能够在 NestJS 应用程序中成功集成并使用 nestjs-zipkin 来实现分布式追踪功能。


3 回复

当然,NestJS-Zipkin 是一个非常有趣的工具,它能帮助你在分布式系统中追踪请求。想象一下,你的代码就像是一支探险队,在复杂的迷宫里穿梭。而 NestJS-Zipkin 就像是你的向导,帮你记录下每一步的足迹。

首先,你需要安装这个插件,你可以把它想象成给你的探险队添加了一些高科技装备:

npm install --save @golevelup/nestjs-zipkin

然后,你需要配置它,就像是设置好探险地图一样:

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { HttpTraceInterceptor } from '@golevelup/nestjs-zipkin';

@Module({
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: HttpTraceInterceptor,
    },
  ],
})
export class TraceModule {}

最后,启动你的应用,让探险开始吧!现在,每当你发送一个请求,Zipkin 就会记录下这条“龙”的轨迹,让你能够追踪到每一个细节。


nestjs-zipkin 是一个用于 NestJS 应用程序的分布式追踪插件,它基于 Zipkin 进行工作。Zipkin 是 Twitter 开源的一款分布式追踪系统,可以帮助我们理解大规模分布式系统的时序数据及相关性。

要开始使用 nestjs-zipkin,首先需要安装必要的依赖包:

npm install [@nestjs](/user/nestjs)/zipkin zipkin-instrumentation-http zipkin-transport-http

接下来,你需要配置 Zipkin 的客户端,并将其集成到你的 NestJS 应用中。

以下是一个简单的示例:

  1. 创建 Zipkin 配置

    在你的项目中创建一个文件,比如 zipkin.config.ts:

    import { createTracer, Tags } from 'zipkin';
    import { HttpLogger } from 'zipkin-transport-http';
    
    export const zipkinProvider = {
      provide: 'ZIPKIN',
      useFactory: () => {
        return createTracer({
          serviceName: 'your-service-name', // 服务名称
          reporter: new HttpLogger({
            endpoint: 'http://localhost:9411/api/v2/spans', // Zipkin 收集端点
          }),
          // 可选:如果你使用了 HTTP 而不是 thrift
          ctxImpl: require('zipkin-context-cls').CLS,
          localServiceName: 'your-service-name', // 本地服务名
        });
      },
    };
    
  2. 将 Zipkin 配置集成到 NestJS

    创建一个模块,例如 zipkin.module.ts,并在此模块中引入 Zipkin 配置:

    import { Module } from '[@nestjs](/user/nestjs)/common';
    import { zipkinProvider } from './zipkin.config';
    
    [@Module](/user/Module)({
      providers: [zipkinProvider],
    })
    export class ZipkinModule {}
    
  3. 创建一个拦截器来自动为请求添加追踪

    创建一个文件,如 zipkin.interceptor.ts:

    import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '[@nestjs](/user/nestjs)/common';
    import { Observable } from 'rxjs';
    import { map } from 'rxjs/operators';
    import { createHttpClient } from 'zipkin-instrumentation-http';
    
    [@Injectable](/user/Injectable)()
    export class ZipkinInterceptor implements NestInterceptor {
      private httpClient;
    
      constructor(private readonly tracer) {
        this.httpClient = createHttpClient({ tracer });
      }
    
      intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
        const req = context.switchToHttp().getRequest();
        const method = req.method;
        const url = req.url;
        
        return this.httpClient.request({method, url})
          .then(response => response.body);
      }
    }
    
  4. 在控制器中应用拦截器

    最后,在你的控制器上使用这个拦截器:

    import { Controller, Get } from '[@nestjs](/user/nestjs)/common';
    import { ZipkinInterceptor } from './zipkin.interceptor';
    
    [@Controller](/user/Controller)()
    export class AppController {
      @Get()
      @UseInterceptors(ZipkinInterceptor)
      getHello(): string {
        return 'Hello World!';
      }
    }
    

以上步骤应该能让你在 NestJS 中开始使用 nestjs-zipkin 进行分布式追踪。注意,你需要确保 Zipkin 服务器已经运行,并且监听在指定的地址和端口上。

nestjs-zipkin 是一个用于 NestJS 的分布式追踪插件,基于 Zipkin 实现。首先,你需要安装它和相关的依赖:

npm install @nestjs/zipkin zipkin zipkin-instrumentation-fetch zipkin-protobuf

然后,在你的 NestJS 应用中配置并启用它:

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { ZipkinInterceptor, ZipkinOptionsFactory, ZipkinTransport } from '@nestjs/zipkin';

@Module({
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: ZipkinInterceptor,
    },
  ],
})
export class GlobalModule implements ZipkinOptionsFactory {
  createZipkinOptions() {
    return {
      host: 'http://localhost',
      port: 9411,
      serviceName: 'your-service-name',
      transport: ZipkinTransport.HTTP,
    };
  }
}

确保你的 Zipkin 服务器正在运行,并且配置中的 hostport 正确指向它。这样可以对你的服务请求进行分布式追踪。

回到顶部