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 {
cpuCount?: number;
cpuModel?: string;
memoryCount?: number;
version?: string;
diskUse?: string;
}
export class MetricsAssetCountDto {
photo?: number;
image?: number;
video?: number;
total?: number;
}
export class MetricsDto {

View File

@ -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);

View File

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

View File

@ -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<AssetEntity>) {}
async sendMetrics(payload: MetricsDto): Promise<void> {
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 } });
}
}