mirror of
https://github.com/immich-app/immich.git
synced 2025-07-07 18:24:10 -04:00
collect more metrics, move everything related to metrics repo
This commit is contained in:
parent
874f707c92
commit
e9197cde67
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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>;
|
||||
}
|
||||
|
@ -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 } });
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user