collect more metrics, move everything related to metrics repo

This commit is contained in:
Daniel Dietzler 2023-12-11 23:18:21 +01:00
parent 874f707c92
commit e9197cde67
No known key found for this signature in database
GPG Key ID: A1C0B97CD8E18DFF
4 changed files with 49 additions and 33 deletions

View File

@ -1,11 +1,14 @@
export class MetricsServerInfoDto { export class MetricsServerInfoDto {
cpuCount?: number;
cpuModel?: string;
memoryCount?: number;
version?: string; version?: string;
diskUse?: string;
} }
export class MetricsAssetCountDto { export class MetricsAssetCountDto {
photo?: number; image?: number;
video?: number; video?: number;
total?: number;
} }
export class MetricsDto { export class MetricsDto {

View File

@ -1,47 +1,25 @@
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import { import { serverVersion } from '../domain.constant';
ICommunicationRepository,
IServerInfoRepository,
IStorageRepository,
ISystemConfigRepository,
IUserRepository,
} from '../repositories';
import { IMetricsRepository, SharedMetrics } from '../repositories/metrics.repository'; import { IMetricsRepository, SharedMetrics } from '../repositories/metrics.repository';
import { ServerInfoService } from '../server-info';
import { MetricsDto } from './metrics.dto'; import { MetricsDto } from './metrics.dto';
@Injectable() @Injectable()
export class MetricsService { export class MetricsService {
private serverInfo: ServerInfoService; constructor(@Inject(IMetricsRepository) private repository: IMetricsRepository) {}
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,
);
}
async shareMetrics(metrics: SharedMetrics) { async shareMetrics(metrics: SharedMetrics) {
const metricsPayload = new MetricsDto(); const metricsPayload = new MetricsDto();
if (metrics.serverInfo) { if (metrics.serverInfo) {
metricsPayload.serverInfo.version = this.serverInfo.getVersion().toString(); metricsPayload.serverInfo.version = serverVersion.toString();
metricsPayload.serverInfo.diskUse = (await this.serverInfo.getInfo()).diskUse; metricsPayload.serverInfo.cpuCount = this.repository.getCpuCount();
metricsPayload.serverInfo.cpuModel = this.repository.getCpuModel();
metricsPayload.serverInfo.memoryCount = this.repository.getMemoryCount();
} }
if (metrics.assetCount) { if (metrics.assetCount) {
const stats = await this.serverInfo.getStatistics(); metricsPayload.assetCount.image = await this.repository.getImageCount();
metricsPayload.assetCount.photo = stats.photos; metricsPayload.assetCount.video = await this.repository.getVideoCount();
metricsPayload.assetCount.video = stats.videos; metricsPayload.assetCount.total = await this.repository.getAssetCount();
} }
await this.repository.sendMetrics(metricsPayload); await this.repository.sendMetrics(metricsPayload);

View File

@ -8,5 +8,11 @@ export interface SharedMetrics {
} }
export interface IMetricsRepository { export interface IMetricsRepository {
getAssetCount(): Promise<number>;
getCpuCount(): number;
getCpuModel(): string;
getMemoryCount(): number;
getImageCount(): Promise<number>;
getVideoCount(): Promise<number>;
sendMetrics(payload: MetricsDto): Promise<void>; sendMetrics(payload: MetricsDto): Promise<void>;
} }

View File

@ -1,11 +1,40 @@
import { MetricsDto } from '@app/domain/metrics'; import { MetricsDto } from '@app/domain/metrics';
import { IMetricsRepository } from '@app/domain/repositories/metrics.repository'; import { IMetricsRepository } from '@app/domain/repositories/metrics.repository';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import axios from 'axios'; import axios from 'axios';
import os from 'os';
import { Repository } from 'typeorm';
import { AssetEntity, AssetType } from '../entities';
@Injectable() @Injectable()
export class MetricsRepository implements IMetricsRepository { export class MetricsRepository implements IMetricsRepository {
constructor(@InjectRepository(AssetEntity) private assetRepository: Repository<AssetEntity>) {}
async sendMetrics(payload: MetricsDto): Promise<void> { async sendMetrics(payload: MetricsDto): Promise<void> {
await axios.post('IMMICH-DATA-DOMAIN', payload); 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 } });
}
} }