Feature/set up a performance logging service (#3703)
* Setup performance logging service * Update changelogpull/3706/head
parent
4505441691
commit
c4a28c6bff
@ -0,0 +1,80 @@
|
|||||||
|
import {
|
||||||
|
Injectable,
|
||||||
|
NestInterceptor,
|
||||||
|
ExecutionContext,
|
||||||
|
CallHandler
|
||||||
|
} from '@nestjs/common';
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
import { tap } from 'rxjs/operators';
|
||||||
|
|
||||||
|
import { PerformanceLoggingService } from './performance-logging.service';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class PerformanceLoggingInterceptor implements NestInterceptor {
|
||||||
|
public constructor(
|
||||||
|
private readonly performanceLoggingService: PerformanceLoggingService
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public intercept(
|
||||||
|
context: ExecutionContext,
|
||||||
|
next: CallHandler
|
||||||
|
): Observable<any> {
|
||||||
|
const startTime = performance.now();
|
||||||
|
|
||||||
|
const className = context.getClass().name;
|
||||||
|
const methodName = context.getHandler().name;
|
||||||
|
|
||||||
|
return next.handle().pipe(
|
||||||
|
tap(() => {
|
||||||
|
return this.performanceLoggingService.logPerformance({
|
||||||
|
className,
|
||||||
|
methodName,
|
||||||
|
startTime
|
||||||
|
});
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function LogPerformance(
|
||||||
|
target: any,
|
||||||
|
propertyKey: string,
|
||||||
|
descriptor: PropertyDescriptor
|
||||||
|
) {
|
||||||
|
const originalMethod = descriptor.value;
|
||||||
|
|
||||||
|
descriptor.value = async function (...args: any[]) {
|
||||||
|
const startTime = performance.now();
|
||||||
|
const performanceLoggingService = new PerformanceLoggingService();
|
||||||
|
|
||||||
|
const result = originalMethod.apply(this, args);
|
||||||
|
|
||||||
|
if (result instanceof Promise) {
|
||||||
|
// Handle async method
|
||||||
|
return result
|
||||||
|
.then((res: any) => {
|
||||||
|
performanceLoggingService.logPerformance({
|
||||||
|
startTime,
|
||||||
|
className: target.constructor.name,
|
||||||
|
methodName: propertyKey
|
||||||
|
});
|
||||||
|
|
||||||
|
return res;
|
||||||
|
})
|
||||||
|
.catch((error: any) => {
|
||||||
|
throw error;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Handle sync method
|
||||||
|
performanceLoggingService.logPerformance({
|
||||||
|
startTime,
|
||||||
|
className: target.constructor.name,
|
||||||
|
methodName: propertyKey
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return descriptor;
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
|
||||||
|
import { PerformanceLoggingInterceptor } from './performance-logging.interceptor';
|
||||||
|
import { PerformanceLoggingService } from './performance-logging.service';
|
||||||
|
|
||||||
|
@Module({
|
||||||
|
exports: [PerformanceLoggingInterceptor, PerformanceLoggingService],
|
||||||
|
providers: [PerformanceLoggingInterceptor, PerformanceLoggingService]
|
||||||
|
})
|
||||||
|
export class PerformanceLoggingModule {}
|
@ -0,0 +1,21 @@
|
|||||||
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class PerformanceLoggingService {
|
||||||
|
public logPerformance({
|
||||||
|
className,
|
||||||
|
methodName,
|
||||||
|
startTime
|
||||||
|
}: {
|
||||||
|
className: string;
|
||||||
|
methodName: string;
|
||||||
|
startTime: number;
|
||||||
|
}) {
|
||||||
|
const endTime = performance.now();
|
||||||
|
|
||||||
|
Logger.debug(
|
||||||
|
`Completed execution of ${methodName}() in ${((endTime - startTime) / 1000).toFixed(3)} seconds`,
|
||||||
|
className
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue