initial sample implementation of metrics
This commit is contained in:
@@ -11,6 +11,7 @@ import { JobService } from './job';
|
||||
import { LibraryService } from './library';
|
||||
import { MediaService } from './media';
|
||||
import { MetadataService } from './metadata';
|
||||
import { MetricsService } from './metrics';
|
||||
import { PartnerService } from './partner';
|
||||
import { PersonService } from './person';
|
||||
import { SearchService } from './search';
|
||||
@@ -34,6 +35,7 @@ const providers: Provider[] = [
|
||||
JobService,
|
||||
MediaService,
|
||||
MetadataService,
|
||||
MetricsService,
|
||||
LibraryService,
|
||||
PersonService,
|
||||
PartnerService,
|
||||
|
||||
@@ -14,6 +14,7 @@ export * from './job';
|
||||
export * from './library';
|
||||
export * from './media';
|
||||
export * from './metadata';
|
||||
export * from './metrics';
|
||||
export * from './partner';
|
||||
export * from './person';
|
||||
export * from './repositories';
|
||||
|
||||
@@ -81,6 +81,9 @@ export enum JobName {
|
||||
SIDECAR_DISCOVERY = 'sidecar-discovery',
|
||||
SIDECAR_SYNC = 'sidecar-sync',
|
||||
SIDECAR_WRITE = 'sidecar-write',
|
||||
|
||||
// metrics
|
||||
METRICS = 'metrics',
|
||||
}
|
||||
|
||||
export const JOBS_ASSET_PAGINATION_SIZE = 1000;
|
||||
@@ -95,6 +98,7 @@ export const JOBS_TO_QUEUE: Record<JobName, QueueName> = {
|
||||
[JobName.CLEAN_OLD_AUDIT_LOGS]: QueueName.BACKGROUND_TASK,
|
||||
[JobName.PERSON_CLEANUP]: QueueName.BACKGROUND_TASK,
|
||||
[JobName.PERSON_DELETE]: QueueName.BACKGROUND_TASK,
|
||||
[JobName.METRICS]: QueueName.BACKGROUND_TASK,
|
||||
|
||||
// conversion
|
||||
[JobName.QUEUE_VIDEO_CONVERSION]: QueueName.VIDEO_CONVERSION,
|
||||
|
||||
2
server/src/domain/metrics/index.ts
Normal file
2
server/src/domain/metrics/index.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
export * from './metrics.dto';
|
||||
export * from './metrics.service';
|
||||
14
server/src/domain/metrics/metrics.dto.ts
Normal file
14
server/src/domain/metrics/metrics.dto.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
export class MetricsServerInfoDto {
|
||||
version?: string;
|
||||
diskUse?: string;
|
||||
}
|
||||
|
||||
export class MetricsAssetCountDto {
|
||||
photo?: number;
|
||||
video?: number;
|
||||
}
|
||||
|
||||
export class MetricsDto {
|
||||
serverInfo!: MetricsServerInfoDto;
|
||||
assetCount!: MetricsAssetCountDto;
|
||||
}
|
||||
50
server/src/domain/metrics/metrics.service.ts
Normal file
50
server/src/domain/metrics/metrics.service.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import {
|
||||
ICommunicationRepository,
|
||||
IServerInfoRepository,
|
||||
IStorageRepository,
|
||||
ISystemConfigRepository,
|
||||
IUserRepository,
|
||||
} from '../repositories';
|
||||
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,
|
||||
);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (metrics.assetCount) {
|
||||
const stats = await this.serverInfo.getStatistics();
|
||||
metricsPayload.assetCount.photo = stats.photos;
|
||||
metricsPayload.assetCount.video = stats.videos;
|
||||
}
|
||||
|
||||
await this.repository.sendMetrics(metricsPayload);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ export * from './library.repository';
|
||||
export * from './machine-learning.repository';
|
||||
export * from './media.repository';
|
||||
export * from './metadata.repository';
|
||||
export * from './metrics.repository';
|
||||
export * from './move.repository';
|
||||
export * from './partner.repository';
|
||||
export * from './person.repository';
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
ILibraryRefreshJob,
|
||||
ISidecarWriteJob,
|
||||
} from '../job/job.interface';
|
||||
import { SharedMetrics } from './metrics.repository';
|
||||
|
||||
export interface JobCounts {
|
||||
active: number;
|
||||
@@ -89,7 +90,10 @@ export type JobItem =
|
||||
| { name: JobName.LIBRARY_REMOVE_OFFLINE; data: IEntityJob }
|
||||
| { name: JobName.LIBRARY_DELETE; data: IEntityJob }
|
||||
| { name: JobName.LIBRARY_QUEUE_SCAN_ALL; data: IBaseJob }
|
||||
| { name: JobName.LIBRARY_QUEUE_CLEANUP; data: IBaseJob };
|
||||
| { name: JobName.LIBRARY_QUEUE_CLEANUP; data: IBaseJob }
|
||||
|
||||
// Metrics
|
||||
| { name: JobName.METRICS; data: SharedMetrics };
|
||||
|
||||
export type JobHandler<T = any> = (data: T) => boolean | Promise<boolean>;
|
||||
export type JobItemHandler = (item: JobItem) => Promise<void>;
|
||||
|
||||
12
server/src/domain/repositories/metrics.repository.ts
Normal file
12
server/src/domain/repositories/metrics.repository.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { MetricsDto } from '../metrics';
|
||||
|
||||
export const IMetricsRepository = 'IMetricsRepository';
|
||||
|
||||
export interface SharedMetrics {
|
||||
serverInfo: boolean;
|
||||
assetCount: boolean;
|
||||
}
|
||||
|
||||
export interface IMetricsRepository {
|
||||
sendMetrics(payload: MetricsDto): Promise<void>;
|
||||
}
|
||||
Reference in New Issue
Block a user