misskey/packages/backend/src/core/chart/ChartManagementService.ts

83 lines
2.4 KiB
TypeScript
Raw Normal View History

/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Injectable } from '@nestjs/common';
2022-09-17 20:27:08 +02:00
2023-01-01 09:45:49 +01:00
import { bindThis } from '@/decorators.js';
2022-09-17 20:27:08 +02:00
import FederationChart from './charts/federation.js';
import NotesChart from './charts/notes.js';
import UsersChart from './charts/users.js';
import ActiveUsersChart from './charts/active-users.js';
import InstanceChart from './charts/instance.js';
import PerUserNotesChart from './charts/per-user-notes.js';
2023-01-01 09:45:49 +01:00
import PerUserPvChart from './charts/per-user-pv.js';
2022-09-17 20:27:08 +02:00
import DriveChart from './charts/drive.js';
import PerUserReactionsChart from './charts/per-user-reactions.js';
import PerUserFollowingChart from './charts/per-user-following.js';
import PerUserDriveChart from './charts/per-user-drive.js';
import ApRequestChart from './charts/ap-request.js';
import type { OnApplicationShutdown } from '@nestjs/common';
2022-09-17 20:27:08 +02:00
@Injectable()
export class ChartManagementService implements OnApplicationShutdown {
private charts;
private saveIntervalId: NodeJS.Timeout;
2022-09-17 20:27:08 +02:00
constructor(
private federationChart: FederationChart,
private notesChart: NotesChart,
private usersChart: UsersChart,
private activeUsersChart: ActiveUsersChart,
private instanceChart: InstanceChart,
private perUserNotesChart: PerUserNotesChart,
2023-01-01 09:45:49 +01:00
private perUserPvChart: PerUserPvChart,
2022-09-17 20:27:08 +02:00
private driveChart: DriveChart,
private perUserReactionsChart: PerUserReactionsChart,
private perUserFollowingChart: PerUserFollowingChart,
private perUserDriveChart: PerUserDriveChart,
private apRequestChart: ApRequestChart,
) {
this.charts = [
2022-09-17 20:27:08 +02:00
this.federationChart,
this.notesChart,
this.usersChart,
this.activeUsersChart,
this.instanceChart,
this.perUserNotesChart,
2023-01-01 09:45:49 +01:00
this.perUserPvChart,
2022-09-17 20:27:08 +02:00
this.driveChart,
this.perUserReactionsChart,
this.perUserFollowingChart,
this.perUserDriveChart,
this.apRequestChart,
];
}
@bindThis
public async start() {
2022-09-17 20:27:08 +02:00
// 20分おきにメモリ情報をDBに書き込み
this.saveIntervalId = setInterval(() => {
for (const chart of this.charts) {
2022-09-17 20:27:08 +02:00
chart.save();
}
}, 1000 * 60 * 20);
}
2023-05-29 06:21:26 +02:00
@bindThis
public async dispose(): Promise<void> {
clearInterval(this.saveIntervalId);
if (process.env.NODE_ENV !== 'test') {
await Promise.all(
this.charts.map(chart => chart.save()),
);
}
2022-09-17 20:27:08 +02:00
}
2023-05-29 06:21:26 +02:00
@bindThis
async onApplicationShutdown(signal: string): Promise<void> {
await this.dispose();
}
2022-09-17 20:27:08 +02:00
}