diff --git a/server/src/domain/metrics/metrics.dto.ts b/server/src/domain/metrics/metrics.dto.ts index b3a85e8cbe..7f70330a99 100644 --- a/server/src/domain/metrics/metrics.dto.ts +++ b/server/src/domain/metrics/metrics.dto.ts @@ -1,11 +1,14 @@ export class MetricsServerInfoDto { + cpuCount?: number; + cpuModel?: string; + memoryCount?: number; version?: string; - diskUse?: string; } export class MetricsAssetCountDto { - photo?: number; + image?: number; video?: number; + total?: number; } export class MetricsDto { diff --git a/server/src/domain/metrics/metrics.service.ts b/server/src/domain/metrics/metrics.service.ts index 9f97cabe06..5b601a162c 100644 --- a/server/src/domain/metrics/metrics.service.ts +++ b/server/src/domain/metrics/metrics.service.ts @@ -1,47 +1,25 @@ import { Inject, Injectable } from '@nestjs/common'; -import { - ICommunicationRepository, - IServerInfoRepository, - IStorageRepository, - ISystemConfigRepository, - IUserRepository, -} from '../repositories'; +import { serverVersion } from '../domain.constant'; import { IMetricsRepository, SharedMetrics } from '../repositories/metrics.repository'; -import { ServerInfoService } from '../server-info'; import { MetricsDto } from './metrics.dto'; @Injectable() export class MetricsService { - private serverInfo: ServerInfoService; - - constructor( - @Inject(ICommunicationRepository) communicationRepository: ICommunicationRepository, - @Inject(IMetricsRepository) private repository: IMetricsRepository, - @Inject(IUserRepository) userRepository: IUserRepository, - @Inject(IServerInfoRepository) serverInfoRepository: IServerInfoRepository, - @Inject(IStorageRepository) storageRepository: IStorageRepository, - @Inject(ISystemConfigRepository) configRepository: ISystemConfigRepository, - ) { - this.serverInfo = new ServerInfoService( - communicationRepository, - configRepository, - userRepository, - serverInfoRepository, - storageRepository, - ); - } + constructor(@Inject(IMetricsRepository) private repository: IMetricsRepository) {} async shareMetrics(metrics: SharedMetrics) { const metricsPayload = new MetricsDto(); if (metrics.serverInfo) { - metricsPayload.serverInfo.version = this.serverInfo.getVersion().toString(); - metricsPayload.serverInfo.diskUse = (await this.serverInfo.getInfo()).diskUse; + metricsPayload.serverInfo.version = serverVersion.toString(); + metricsPayload.serverInfo.cpuCount = this.repository.getCpuCount(); + metricsPayload.serverInfo.cpuModel = this.repository.getCpuModel(); + metricsPayload.serverInfo.memoryCount = this.repository.getMemoryCount(); } if (metrics.assetCount) { - const stats = await this.serverInfo.getStatistics(); - metricsPayload.assetCount.photo = stats.photos; - metricsPayload.assetCount.video = stats.videos; + metricsPayload.assetCount.image = await this.repository.getImageCount(); + metricsPayload.assetCount.video = await this.repository.getVideoCount(); + metricsPayload.assetCount.total = await this.repository.getAssetCount(); } await this.repository.sendMetrics(metricsPayload); diff --git a/server/src/domain/repositories/metrics.repository.ts b/server/src/domain/repositories/metrics.repository.ts index 970d54dc54..7ea46f059d 100644 --- a/server/src/domain/repositories/metrics.repository.ts +++ b/server/src/domain/repositories/metrics.repository.ts @@ -8,5 +8,11 @@ export interface SharedMetrics { } export interface IMetricsRepository { + getAssetCount(): Promise; + getCpuCount(): number; + getCpuModel(): string; + getMemoryCount(): number; + getImageCount(): Promise; + getVideoCount(): Promise; sendMetrics(payload: MetricsDto): Promise; } diff --git a/server/src/infra/repositories/metrics.repository.ts b/server/src/infra/repositories/metrics.repository.ts index c4b8a0e010..8081945e00 100644 --- a/server/src/infra/repositories/metrics.repository.ts +++ b/server/src/infra/repositories/metrics.repository.ts @@ -1,11 +1,40 @@ import { MetricsDto } from '@app/domain/metrics'; import { IMetricsRepository } from '@app/domain/repositories/metrics.repository'; import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; import axios from 'axios'; +import os from 'os'; +import { Repository } from 'typeorm'; +import { AssetEntity, AssetType } from '../entities'; @Injectable() export class MetricsRepository implements IMetricsRepository { + constructor(@InjectRepository(AssetEntity) private assetRepository: Repository) {} async sendMetrics(payload: MetricsDto): Promise { await axios.post('IMMICH-DATA-DOMAIN', payload); } + + getAssetCount() { + return this.assetRepository.count(); + } + + getCpuCount() { + return os.cpus().length; + } + + getCpuModel() { + return os.cpus()[0].model; + } + + getMemoryCount() { + return os.totalmem(); + } + + getImageCount() { + return this.assetRepository.count({ where: { isVisible: true, type: AssetType.IMAGE } }); + } + + getVideoCount() { + return this.assetRepository.count({ where: { isVisible: true, type: AssetType.VIDEO } }); + } }