Browse Source

Added Performance Logging Interceptor

pull/5027/head
Dan 1 year ago
parent
commit
1f380a91c3
  1. 55
      apps/api/src/aop/logging.interceptor.ts
  2. 2
      apps/api/src/app/account-balance/account-balance.service.ts
  3. 2
      apps/api/src/main.ts
  4. 2
      apps/api/src/services/data-provider/data-provider.service.ts
  5. 2
      apps/api/src/services/symbol-profile/symbol-profile.service.ts

55
apps/api/src/aop/logging.interceptor.ts

@ -0,0 +1,55 @@
import { Logger } from '@nestjs/common';
import {
Injectable,
NestInterceptor,
ExecutionContext,
CallHandler
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
const dict = {};
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const methodName =
context.getClass().name + ':' + context.getHandler().name;
Logger.debug(`Before ${methodName}...`);
const now = Date.now();
return next
.handle()
.pipe(
tap(() => Logger.debug(`After ${methodName}... ${Date.now() - now}ms`))
);
}
}
export function LogPerformance(
target: any,
propertyKey: string,
descriptor: PropertyDescriptor
) {
const originalMethod = descriptor.value;
if (Object.keys(dict).includes(propertyKey)) {
dict[propertyKey] += 1;
} else {
dict[propertyKey] = 1;
}
descriptor.value = function (...args: any[]) {
const time = Date.now();
const result = originalMethod.apply(this, args);
const now = Date.now();
if (now - time > 100) {
Logger.debug(`${propertyKey} returned within: ${now - time} ms`);
} else if (dict[propertyKey] > 100) {
Logger.debug(`${propertyKey} was called the 100th time`);
dict[propertyKey] = 0;
}
return result;
};
return descriptor;
}

2
apps/api/src/app/account-balance/account-balance.service.ts

@ -1,3 +1,4 @@
import { LogPerformance } from '@ghostfolio/api/aop/logging.interceptor';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { AccountBalancesResponse, Filter } from '@ghostfolio/common/interfaces'; import { AccountBalancesResponse, Filter } from '@ghostfolio/common/interfaces';
@ -40,6 +41,7 @@ export class AccountBalanceService {
}); });
} }
@LogPerformance
public async getAccountBalances({ public async getAccountBalances({
filters, filters,
user, user,

2
apps/api/src/main.ts

@ -5,6 +5,7 @@ import type { NestExpressApplication } from '@nestjs/platform-express';
import * as bodyParser from 'body-parser'; import * as bodyParser from 'body-parser';
import helmet from 'helmet'; import helmet from 'helmet';
import { LoggingInterceptor } from './aop/logging.interceptor';
import { AppModule } from './app/app.module'; import { AppModule } from './app/app.module';
import { environment } from './environments/environment'; import { environment } from './environments/environment';
import { HtmlTemplateMiddleware } from './middlewares/html-template.middleware'; import { HtmlTemplateMiddleware } from './middlewares/html-template.middleware';
@ -25,6 +26,7 @@ async function bootstrap() {
type: VersioningType.URI type: VersioningType.URI
}); });
app.setGlobalPrefix('api', { exclude: ['sitemap.xml'] }); app.setGlobalPrefix('api', { exclude: ['sitemap.xml'] });
app.useGlobalInterceptors(new LoggingInterceptor());
app.useGlobalPipes( app.useGlobalPipes(
new ValidationPipe({ new ValidationPipe({
forbidNonWhitelisted: true, forbidNonWhitelisted: true,

2
apps/api/src/services/data-provider/data-provider.service.ts

@ -1,3 +1,4 @@
import { LogPerformance } from '@ghostfolio/api/aop/logging.interceptor';
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
@ -332,6 +333,7 @@ export class DataProviderService {
return result; return result;
} }
@LogPerformance
public async getQuotes({ public async getQuotes({
items, items,
requestTimeout, requestTimeout,

2
apps/api/src/services/symbol-profile/symbol-profile.service.ts

@ -1,3 +1,4 @@
import { LogPerformance } from '@ghostfolio/api/aop/logging.interceptor';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { UNKNOWN_KEY } from '@ghostfolio/common/config';
import { import {
@ -39,6 +40,7 @@ export class SymbolProfileService {
}); });
} }
@LogPerformance
public async getSymbolProfiles( public async getSymbolProfiles(
aUniqueAssets: UniqueAsset[] aUniqueAssets: UniqueAsset[]
): Promise<EnhancedSymbolProfile[]> { ): Promise<EnhancedSymbolProfile[]> {

Loading…
Cancel
Save