95 lines
3.2 KiB
TypeScript
95 lines
3.2 KiB
TypeScript
|
import { CONFIG } from '@server/initializers/config'
|
||
|
import { UserModel } from '@server/models/account/user'
|
||
|
import { ActorFollowModel } from '@server/models/activitypub/actor-follow'
|
||
|
import { VideoRedundancyModel } from '@server/models/redundancy/video-redundancy'
|
||
|
import { VideoModel } from '@server/models/video/video'
|
||
|
import { VideoCommentModel } from '@server/models/video/video-comment'
|
||
|
import { VideoFileModel } from '@server/models/video/video-file'
|
||
|
import { ServerStats, VideoRedundancyStrategyWithManual } from '@shared/models'
|
||
|
|
||
|
class StatsManager {
|
||
|
|
||
|
private static instance: StatsManager
|
||
|
|
||
|
private readonly instanceStartDate = new Date()
|
||
|
|
||
|
private inboxMessagesProcessed = 0
|
||
|
private inboxMessagesWaiting = 0
|
||
|
|
||
|
private constructor () {}
|
||
|
|
||
|
updateInboxStats (inboxMessagesProcessed: number, inboxMessagesWaiting: number) {
|
||
|
this.inboxMessagesProcessed = inboxMessagesProcessed
|
||
|
this.inboxMessagesWaiting = inboxMessagesWaiting
|
||
|
}
|
||
|
|
||
|
async getStats () {
|
||
|
const { totalLocalVideos, totalLocalVideoViews, totalVideos } = await VideoModel.getStats()
|
||
|
const { totalLocalVideoComments, totalVideoComments } = await VideoCommentModel.getStats()
|
||
|
const { totalUsers, totalDailyActiveUsers, totalWeeklyActiveUsers, totalMonthlyActiveUsers } = await UserModel.getStats()
|
||
|
const { totalInstanceFollowers, totalInstanceFollowing } = await ActorFollowModel.getStats()
|
||
|
const { totalLocalVideoFilesSize } = await VideoFileModel.getStats()
|
||
|
|
||
|
const videosRedundancyStats = await this.buildRedundancyStats()
|
||
|
|
||
|
const data: ServerStats = {
|
||
|
totalLocalVideos,
|
||
|
totalLocalVideoViews,
|
||
|
totalLocalVideoFilesSize,
|
||
|
totalLocalVideoComments,
|
||
|
totalVideos,
|
||
|
totalVideoComments,
|
||
|
|
||
|
totalUsers,
|
||
|
totalDailyActiveUsers,
|
||
|
totalWeeklyActiveUsers,
|
||
|
totalMonthlyActiveUsers,
|
||
|
|
||
|
totalInstanceFollowers,
|
||
|
totalInstanceFollowing,
|
||
|
|
||
|
videosRedundancy: videosRedundancyStats,
|
||
|
|
||
|
totalActivityPubMessagesProcessed: this.inboxMessagesProcessed,
|
||
|
activityPubMessagesProcessedPerSecond: this.buildActivityPubMessagesProcessedPerSecond(),
|
||
|
totalActivityPubMessagesWaiting: this.inboxMessagesWaiting
|
||
|
}
|
||
|
|
||
|
return data
|
||
|
}
|
||
|
|
||
|
private buildActivityPubMessagesProcessedPerSecond () {
|
||
|
const now = new Date()
|
||
|
const startedSeconds = (now.getTime() - this.instanceStartDate.getTime()) / 1000
|
||
|
|
||
|
return this.inboxMessagesProcessed / startedSeconds
|
||
|
}
|
||
|
|
||
|
private buildRedundancyStats () {
|
||
|
const strategies = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES
|
||
|
.map(r => ({
|
||
|
strategy: r.strategy as VideoRedundancyStrategyWithManual,
|
||
|
size: r.size
|
||
|
}))
|
||
|
|
||
|
strategies.push({ strategy: 'manual', size: null })
|
||
|
|
||
|
return Promise.all(
|
||
|
strategies.map(r => {
|
||
|
return VideoRedundancyModel.getStats(r.strategy)
|
||
|
.then(stats => Object.assign(stats, { strategy: r.strategy, totalSize: r.size }))
|
||
|
})
|
||
|
)
|
||
|
}
|
||
|
|
||
|
static get Instance () {
|
||
|
return this.instance || (this.instance = new this())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------
|
||
|
|
||
|
export {
|
||
|
StatsManager
|
||
|
}
|