UNPKG

@zerosuxx/opentelemetry-nestjs

Version:

OpenTelemetry module for Nestjs with auto instrumentation and resource detection. Initially forked from https://github.com/overbit/opentelemetry-nestjs.git

78 lines (64 loc) 2.51 kB
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper'; import { Constants } from '../../Constants'; import { ModulesContainer } from '@nestjs/core'; import { Controller, Injectable } from '@nestjs/common/interfaces'; import { PATH_METADATA } from '@nestjs/common/constants'; import { PATTERN_METADATA } from '@nestjs/microservices/constants'; import { TraceWrapper } from '../TraceWrapper'; import { SpanKind } from '@opentelemetry/api'; import { MetadataScanner } from '../../MetaScanner'; export class BaseTraceInjector { protected readonly metadataScanner: MetadataScanner = new MetadataScanner(); constructor(protected readonly modulesContainer: ModulesContainer) {} protected *getControllers(): Generator<InstanceWrapper<Controller>> { for (const module of this.modulesContainer.values()) { for (const controller of module.controllers.values()) { if (controller && controller.metatype?.prototype) { yield controller as InstanceWrapper<Controller>; } } } } protected *getProviders(): Generator<InstanceWrapper<Injectable>> { for (const module of this.modulesContainer.values()) { for (const provider of module.providers.values()) { if (provider && provider.metatype?.prototype) { yield provider as InstanceWrapper<Injectable>; } } } } protected isPath(prototype): boolean { return Reflect.hasMetadata(PATH_METADATA, prototype); } protected isMicroservice(prototype): boolean { return Reflect.hasMetadata(PATTERN_METADATA, prototype); } protected isAffected(prototype): boolean { return Reflect.hasMetadata(Constants.TRACE_METADATA_ACTIVE, prototype); } protected getTraceName(prototype): string { return Reflect.getMetadata(Constants.TRACE_METADATA, prototype); } protected isDecorated(prototype): boolean { return Reflect.hasMetadata(Constants.TRACE_METADATA, prototype); } protected reDecorate(source, destination) { const keys = Reflect.getMetadataKeys(source); for (const key of keys) { const meta = Reflect.getMetadata(key, source); Reflect.defineMetadata(key, meta, destination); } } protected wrap( prototype: Record<any, any>, traceName, attributes = {}, spanKind?: SpanKind, ) { return TraceWrapper.wrap(prototype, traceName, attributes, spanKind); } protected affect(prototype) { Reflect.defineMetadata(Constants.TRACE_METADATA_ACTIVE, 1, prototype); } }