0.1.10 • Published 3 months ago

sf-nest-trace v0.1.10

Weekly downloads
-
License
UNLICENSED
Repository
-
Last release
3 months ago

sf nest trace

配置使trace生效

在src目录创建trace.ts

const traceConfig = config().trace
// @ts-ignore
initTracingWithProvider({
  ...traceConfig,
  ignoreIncomingRequestHook: (request) => {
  const urls = [
    '/deploy/ready',
    '/deploy/live',
  ]
  for (const url of urls) {
    if (request.url === url) {
      return true
    }
  }
  return false
}
})

在main.ts导入trace.ts, 注意必须在@nestjs/core之前, nest-winston之后

import {
  WINSTON_MODULE_NEST_PROVIDER,
  WINSTON_MODULE_PROVIDER,
  WinstonModule,
} from 'nest-winston'
import './trace.js'

在module模块添加新的module

SfNestTraceModule.forRootAsync({
  imports: [ConfigModule],
  inject: [ConfigService],
  useFactory: (confSvc: ConfigService) => {
    const config = confSvc.get('trace');
    return {
      ...config,
    };
  },
})

可以在想要添加span的代码添加@Span()手动创建span

@Span()
async getSoftRoutingConnectionInfo(id: string) {
const resp = await firstValueFrom(
  this.httpService.post('http://localhost:8083/soft-router/conn-info',
    {},
    {
      headers:{
        Authorization: scopeUtils.getRequest().token
      }
    }))
return resp.data
}

示例配置文件(config.trace)

isTraceOn: 标记是否启用trace withConsoleExporter: 是否启用console输出 endpoint: opentelemetry服务 metadata: 其他内容: 如字节需要添加"X-ByteAPM-AppKey" serviceName: 服务名称

trace: {
    endpoint: process.env.TRACE_GRPC_ENDPOINT || 'http://apmplus-cn-shanghai.volces.com:4317',
    isTraceOn: process.env.IS_TRACE_ON || "1",
    withConsoleExporter: false,
    metadata: {
      "X-ByteAPM-AppKey": process.env.TRACE_APP_KEY || '',
    },
    serviceName: process.env.TRACE_APP_KEY || 'sf_qa'
  }

请求返回traceId

默认配置会放在http response header里的TraceId头 如果需要在自己的接口内容返回可以这样

import { trace } from '@opentelemetry/api'
@Injectable()
export class ResultInterceptor implements NestInterceptor {
  intercept(ctx: ExecutionContext, next: CallHandler) {
    const response = ctx.switchToHttp().getResponse();
    response.statusCode = HttpStatusCode.Ok;
    const requestId = scopeUtils.getRequestId();
    return next.handle().pipe(
      map((data) => {
          const result = {
            code: 0,
            message: 'success',
            data: data,
            traceId: trace.getActiveSpan()?.spanContext().traceId || ''
          }
          return result;
        }
      )
    )
  }}