]>
Commit | Line | Data |
---|---|---|
1 | import { CONFIG } from '@server/initializers/config' | |
2 | import { UserModel } from '@server/models/account/user' | |
3 | import { ActorFollowModel } from '@server/models/activitypub/actor-follow' | |
4 | import { VideoRedundancyModel } from '@server/models/redundancy/video-redundancy' | |
5 | import { VideoModel } from '@server/models/video/video' | |
6 | import { VideoCommentModel } from '@server/models/video/video-comment' | |
7 | import { VideoFileModel } from '@server/models/video/video-file' | |
8 | import { ServerStats, VideoRedundancyStrategyWithManual } from '@shared/models' | |
9 | ||
10 | class StatsManager { | |
11 | ||
12 | private static instance: StatsManager | |
13 | ||
14 | private readonly instanceStartDate = new Date() | |
15 | ||
16 | private inboxMessagesProcessed = 0 | |
17 | private inboxMessagesWaiting = 0 | |
18 | ||
19 | private constructor () {} | |
20 | ||
21 | updateInboxStats (inboxMessagesProcessed: number, inboxMessagesWaiting: number) { | |
22 | this.inboxMessagesProcessed = inboxMessagesProcessed | |
23 | this.inboxMessagesWaiting = inboxMessagesWaiting | |
24 | } | |
25 | ||
26 | async getStats () { | |
27 | const { totalLocalVideos, totalLocalVideoViews, totalVideos } = await VideoModel.getStats() | |
28 | const { totalLocalVideoComments, totalVideoComments } = await VideoCommentModel.getStats() | |
29 | const { totalUsers, totalDailyActiveUsers, totalWeeklyActiveUsers, totalMonthlyActiveUsers } = await UserModel.getStats() | |
30 | const { totalInstanceFollowers, totalInstanceFollowing } = await ActorFollowModel.getStats() | |
31 | const { totalLocalVideoFilesSize } = await VideoFileModel.getStats() | |
32 | ||
33 | const videosRedundancyStats = await this.buildRedundancyStats() | |
34 | ||
35 | const data: ServerStats = { | |
36 | totalLocalVideos, | |
37 | totalLocalVideoViews, | |
38 | totalLocalVideoFilesSize, | |
39 | totalLocalVideoComments, | |
40 | totalVideos, | |
41 | totalVideoComments, | |
42 | ||
43 | totalUsers, | |
44 | totalDailyActiveUsers, | |
45 | totalWeeklyActiveUsers, | |
46 | totalMonthlyActiveUsers, | |
47 | ||
48 | totalInstanceFollowers, | |
49 | totalInstanceFollowing, | |
50 | ||
51 | videosRedundancy: videosRedundancyStats, | |
52 | ||
53 | totalActivityPubMessagesProcessed: this.inboxMessagesProcessed, | |
54 | activityPubMessagesProcessedPerSecond: this.buildActivityPubMessagesProcessedPerSecond(), | |
55 | totalActivityPubMessagesWaiting: this.inboxMessagesWaiting | |
56 | } | |
57 | ||
58 | return data | |
59 | } | |
60 | ||
61 | private buildActivityPubMessagesProcessedPerSecond () { | |
62 | const now = new Date() | |
63 | const startedSeconds = (now.getTime() - this.instanceStartDate.getTime()) / 1000 | |
64 | ||
65 | return this.inboxMessagesProcessed / startedSeconds | |
66 | } | |
67 | ||
68 | private buildRedundancyStats () { | |
69 | const strategies = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES | |
70 | .map(r => ({ | |
71 | strategy: r.strategy as VideoRedundancyStrategyWithManual, | |
72 | size: r.size | |
73 | })) | |
74 | ||
75 | strategies.push({ strategy: 'manual', size: null }) | |
76 | ||
77 | return Promise.all( | |
78 | strategies.map(r => { | |
79 | return VideoRedundancyModel.getStats(r.strategy) | |
80 | .then(stats => Object.assign(stats, { strategy: r.strategy, totalSize: r.size })) | |
81 | }) | |
82 | ) | |
83 | } | |
84 | ||
85 | static get Instance () { | |
86 | return this.instance || (this.instance = new this()) | |
87 | } | |
88 | } | |
89 | ||
90 | // --------------------------------------------------------------------------- | |
91 | ||
92 | export { | |
93 | StatsManager | |
94 | } |