]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/lib/stat-manager.ts
Allow to specify transcoding and import jobs concurrency
[github/Chocobozzz/PeerTube.git] / server / lib / stat-manager.ts
CommitLineData
99afa081
C
1import { CONFIG } from '@server/initializers/config'
2import { UserModel } from '@server/models/account/user'
3import { ActorFollowModel } from '@server/models/activitypub/actor-follow'
4import { VideoRedundancyModel } from '@server/models/redundancy/video-redundancy'
5import { VideoModel } from '@server/models/video/video'
6import { VideoCommentModel } from '@server/models/video/video-comment'
7import { VideoFileModel } from '@server/models/video/video-file'
8import { ServerStats, VideoRedundancyStrategyWithManual } from '@shared/models'
9
10class 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
92export {
93 StatsManager
94}