diff --git a/server/src/domain/domain.constant.ts b/server/src/domain/domain.constant.ts index 557cd4b18b..d2856a4ba7 100644 --- a/server/src/domain/domain.constant.ts +++ b/server/src/domain/domain.constant.ts @@ -5,6 +5,7 @@ import pkg from 'src/../../package.json'; export const AUDIT_LOG_MAX_DURATION = Duration.fromObject({ days: 100 }); export const ONE_HOUR = Duration.fromObject({ hours: 1 }); +export const TWENTY_FOUR_HOURS = Duration.fromObject({ hours: 24 }); export interface IVersion { major: number; diff --git a/server/src/domain/metrics/metrics.service.ts b/server/src/domain/metrics/metrics.service.ts index 5b601a162c..caef82e8d5 100644 --- a/server/src/domain/metrics/metrics.service.ts +++ b/server/src/domain/metrics/metrics.service.ts @@ -1,13 +1,24 @@ import { Inject, Injectable } from '@nestjs/common'; import { serverVersion } from '../domain.constant'; +import { JobName } from '../job'; +import { IJobRepository } from '../repositories/job.repository'; import { IMetricsRepository, SharedMetrics } from '../repositories/metrics.repository'; import { MetricsDto } from './metrics.dto'; @Injectable() export class MetricsService { - constructor(@Inject(IMetricsRepository) private repository: IMetricsRepository) {} + constructor( + @Inject(IJobRepository) private jobRepository: IJobRepository, + @Inject(IMetricsRepository) private repository: IMetricsRepository, + ) {} - async shareMetrics(metrics: SharedMetrics) { + async handleQueueMetrics() { + // TODO config for what metrics should be fetched and if any at all + + await this.jobRepository.queue({ name: JobName.METRICS, data: { assetCount: true, serverInfo: true } }); + } + + async handleMetrics(metrics: SharedMetrics) { const metricsPayload = new MetricsDto(); if (metrics.serverInfo) { metricsPayload.serverInfo.version = serverVersion.toString(); diff --git a/server/src/immich/app.service.ts b/server/src/immich/app.service.ts index bbd086ba8a..abbd09c8de 100644 --- a/server/src/immich/app.service.ts +++ b/server/src/immich/app.service.ts @@ -3,12 +3,14 @@ import { DatabaseService, JobService, LibraryService, + MetricsService, ONE_HOUR, OpenGraphTags, ServerInfoService, SharedLinkService, StorageService, SystemConfigService, + TWENTY_FOUR_HOURS, WEB_ROOT_PATH, } from '@app/domain'; import { ImmichLogger } from '@app/infra/logger'; @@ -46,6 +48,7 @@ export class AppService { private configService: SystemConfigService, private jobService: JobService, private libraryService: LibraryService, + private metricsService: MetricsService, private serverService: ServerInfoService, private sharedLinkService: SharedLinkService, private storageService: StorageService, @@ -57,6 +60,11 @@ export class AppService { await this.serverService.handleVersionCheck(); } + @Interval(TWENTY_FOUR_HOURS.as('milliseconds')) + async onMetricsSend() { + await this.metricsService.handleQueueMetrics(); + } + @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT) async onNightlyJob() { await this.jobService.handleNightlyJobs(); diff --git a/server/src/microservices/app.service.ts b/server/src/microservices/app.service.ts index 1c59324191..29c3e7ce46 100644 --- a/server/src/microservices/app.service.ts +++ b/server/src/microservices/app.service.ts @@ -8,6 +8,7 @@ import { LibraryService, MediaService, MetadataService, + MetricsService, PersonService, SmartInfoService, StorageService, @@ -15,7 +16,6 @@ import { SystemConfigService, UserService, } from '@app/domain'; -import { MetricsService } from '@app/domain/metrics'; import { Injectable } from '@nestjs/common'; @Injectable() @@ -62,7 +62,7 @@ export class AppService { [JobName.VIDEO_CONVERSION]: (data) => this.mediaService.handleVideoConversion(data), [JobName.QUEUE_METADATA_EXTRACTION]: (data) => this.metadataService.handleQueueMetadataExtraction(data), [JobName.METADATA_EXTRACTION]: (data) => this.metadataService.handleMetadataExtraction(data), - [JobName.METRICS]: (data) => this.metricsService.shareMetrics(data), + [JobName.METRICS]: (data) => this.metricsService.handleMetrics(data), [JobName.LINK_LIVE_PHOTOS]: (data) => this.metadataService.handleLivePhotoLinking(data), [JobName.QUEUE_RECOGNIZE_FACES]: (data) => this.personService.handleQueueRecognizeFaces(data), [JobName.RECOGNIZE_FACES]: (data) => this.personService.handleRecognizeFaces(data),