mirror of https://github.com/Chocobozzz/PeerTube
Introduce stats command
parent
dab047092b
commit
bc8090411d
|
@ -5,7 +5,6 @@ import * as chai from 'chai'
|
||||||
import { readdir } from 'fs-extra'
|
import { readdir } from 'fs-extra'
|
||||||
import * as magnetUtil from 'magnet-uri'
|
import * as magnetUtil from 'magnet-uri'
|
||||||
import { join } from 'path'
|
import { join } from 'path'
|
||||||
import { removeVideoRedundancy } from '@server/lib/redundancy'
|
|
||||||
import { HttpStatusCode } from '@shared/core-utils'
|
import { HttpStatusCode } from '@shared/core-utils'
|
||||||
import {
|
import {
|
||||||
checkSegmentHash,
|
checkSegmentHash,
|
||||||
|
@ -30,15 +29,7 @@ import {
|
||||||
waitJobs,
|
waitJobs,
|
||||||
waitUntilLog
|
waitUntilLog
|
||||||
} from '@shared/extra-utils'
|
} from '@shared/extra-utils'
|
||||||
import { getStats } from '@shared/extra-utils/server/stats'
|
import { VideoDetails, VideoPrivacy, VideoRedundancyStrategy, VideoRedundancyStrategyWithManual } from '@shared/models'
|
||||||
import {
|
|
||||||
ServerStats,
|
|
||||||
VideoDetails,
|
|
||||||
VideoPrivacy,
|
|
||||||
VideoRedundancy,
|
|
||||||
VideoRedundancyStrategy,
|
|
||||||
VideoRedundancyStrategyWithManual
|
|
||||||
} from '@shared/models'
|
|
||||||
|
|
||||||
const expect = chai.expect
|
const expect = chai.expect
|
||||||
|
|
||||||
|
@ -241,9 +232,7 @@ async function checkStatsGlobal (strategy: VideoRedundancyStrategyWithManual) {
|
||||||
statsLength = 2
|
statsLength = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
const res = await getStats(servers[0].url)
|
const data = await servers[0].statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
|
|
||||||
expect(data.videosRedundancy).to.have.lengthOf(statsLength)
|
expect(data.videosRedundancy).to.have.lengthOf(statsLength)
|
||||||
|
|
||||||
const stat = data.videosRedundancy[0]
|
const stat = data.videosRedundancy[0]
|
||||||
|
|
|
@ -19,8 +19,7 @@ import {
|
||||||
wait,
|
wait,
|
||||||
waitJobs
|
waitJobs
|
||||||
} from '@shared/extra-utils'
|
} from '@shared/extra-utils'
|
||||||
import { getStats } from '@shared/extra-utils/server/stats'
|
import { ActivityType, VideoPlaylistPrivacy } from '@shared/models'
|
||||||
import { ActivityType, ServerStats, VideoPlaylistPrivacy } from '@shared/models'
|
|
||||||
|
|
||||||
const expect = chai.expect
|
const expect = chai.expect
|
||||||
|
|
||||||
|
@ -58,8 +57,7 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should have the correct stats on instance 1', async function () {
|
it('Should have the correct stats on instance 1', async function () {
|
||||||
const res = await getStats(servers[0].url)
|
const data = await servers[0].statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
|
|
||||||
expect(data.totalLocalVideoComments).to.equal(1)
|
expect(data.totalLocalVideoComments).to.equal(1)
|
||||||
expect(data.totalLocalVideos).to.equal(1)
|
expect(data.totalLocalVideos).to.equal(1)
|
||||||
|
@ -74,8 +72,7 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should have the correct stats on instance 2', async function () {
|
it('Should have the correct stats on instance 2', async function () {
|
||||||
const res = await getStats(servers[1].url)
|
const data = await servers[1].statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
|
|
||||||
expect(data.totalLocalVideoComments).to.equal(0)
|
expect(data.totalLocalVideoComments).to.equal(0)
|
||||||
expect(data.totalLocalVideos).to.equal(0)
|
expect(data.totalLocalVideos).to.equal(0)
|
||||||
|
@ -90,8 +87,7 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should have the correct stats on instance 3', async function () {
|
it('Should have the correct stats on instance 3', async function () {
|
||||||
const res = await getStats(servers[2].url)
|
const data = await servers[2].statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
|
|
||||||
expect(data.totalLocalVideoComments).to.equal(0)
|
expect(data.totalLocalVideoComments).to.equal(0)
|
||||||
expect(data.totalLocalVideos).to.equal(0)
|
expect(data.totalLocalVideos).to.equal(0)
|
||||||
|
@ -110,8 +106,7 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
await servers[2].followsCommand.unfollow({ target: servers[0] })
|
await servers[2].followsCommand.unfollow({ target: servers[0] })
|
||||||
await waitJobs(servers)
|
await waitJobs(servers)
|
||||||
|
|
||||||
const res = await getStats(servers[2].url)
|
const data = await servers[2].statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
|
|
||||||
expect(data.totalVideos).to.equal(0)
|
expect(data.totalVideos).to.equal(0)
|
||||||
})
|
})
|
||||||
|
@ -120,8 +115,8 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
const server = servers[0]
|
const server = servers[0]
|
||||||
|
|
||||||
{
|
{
|
||||||
const res = await getStats(server.url)
|
const data = await server.statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
expect(data.totalDailyActiveUsers).to.equal(1)
|
expect(data.totalDailyActiveUsers).to.equal(1)
|
||||||
expect(data.totalWeeklyActiveUsers).to.equal(1)
|
expect(data.totalWeeklyActiveUsers).to.equal(1)
|
||||||
expect(data.totalMonthlyActiveUsers).to.equal(1)
|
expect(data.totalMonthlyActiveUsers).to.equal(1)
|
||||||
|
@ -130,8 +125,8 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
{
|
{
|
||||||
await userLogin(server, user)
|
await userLogin(server, user)
|
||||||
|
|
||||||
const res = await getStats(server.url)
|
const data = await server.statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
expect(data.totalDailyActiveUsers).to.equal(2)
|
expect(data.totalDailyActiveUsers).to.equal(2)
|
||||||
expect(data.totalWeeklyActiveUsers).to.equal(2)
|
expect(data.totalWeeklyActiveUsers).to.equal(2)
|
||||||
expect(data.totalMonthlyActiveUsers).to.equal(2)
|
expect(data.totalMonthlyActiveUsers).to.equal(2)
|
||||||
|
@ -142,8 +137,8 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
const server = servers[0]
|
const server = servers[0]
|
||||||
|
|
||||||
{
|
{
|
||||||
const res = await getStats(server.url)
|
const data = await server.statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
expect(data.totalLocalDailyActiveVideoChannels).to.equal(1)
|
expect(data.totalLocalDailyActiveVideoChannels).to.equal(1)
|
||||||
expect(data.totalLocalWeeklyActiveVideoChannels).to.equal(1)
|
expect(data.totalLocalWeeklyActiveVideoChannels).to.equal(1)
|
||||||
expect(data.totalLocalMonthlyActiveVideoChannels).to.equal(1)
|
expect(data.totalLocalMonthlyActiveVideoChannels).to.equal(1)
|
||||||
|
@ -157,8 +152,8 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
const resChannel = await addVideoChannel(server.url, server.accessToken, channelAttributes)
|
const resChannel = await addVideoChannel(server.url, server.accessToken, channelAttributes)
|
||||||
channelId = resChannel.body.videoChannel.id
|
channelId = resChannel.body.videoChannel.id
|
||||||
|
|
||||||
const res = await getStats(server.url)
|
const data = await server.statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
expect(data.totalLocalDailyActiveVideoChannels).to.equal(1)
|
expect(data.totalLocalDailyActiveVideoChannels).to.equal(1)
|
||||||
expect(data.totalLocalWeeklyActiveVideoChannels).to.equal(1)
|
expect(data.totalLocalWeeklyActiveVideoChannels).to.equal(1)
|
||||||
expect(data.totalLocalMonthlyActiveVideoChannels).to.equal(1)
|
expect(data.totalLocalMonthlyActiveVideoChannels).to.equal(1)
|
||||||
|
@ -167,8 +162,8 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
{
|
{
|
||||||
await uploadVideo(server.url, server.accessToken, { fixture: 'video_short.webm', channelId })
|
await uploadVideo(server.url, server.accessToken, { fixture: 'video_short.webm', channelId })
|
||||||
|
|
||||||
const res = await getStats(server.url)
|
const data = await server.statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
expect(data.totalLocalDailyActiveVideoChannels).to.equal(2)
|
expect(data.totalLocalDailyActiveVideoChannels).to.equal(2)
|
||||||
expect(data.totalLocalWeeklyActiveVideoChannels).to.equal(2)
|
expect(data.totalLocalWeeklyActiveVideoChannels).to.equal(2)
|
||||||
expect(data.totalLocalMonthlyActiveVideoChannels).to.equal(2)
|
expect(data.totalLocalMonthlyActiveVideoChannels).to.equal(2)
|
||||||
|
@ -179,9 +174,8 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
const server = servers[0]
|
const server = servers[0]
|
||||||
|
|
||||||
{
|
{
|
||||||
const resStats = await getStats(server.url)
|
const data = await server.statsCommand.get()
|
||||||
const dataStats: ServerStats = resStats.body
|
expect(data.totalLocalPlaylists).to.equal(0)
|
||||||
expect(dataStats.totalLocalPlaylists).to.equal(0)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -195,9 +189,8 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const resStats = await getStats(server.url)
|
const data = await server.statsCommand.get()
|
||||||
const dataStats: ServerStats = resStats.body
|
expect(data.totalLocalPlaylists).to.equal(1)
|
||||||
expect(dataStats.totalLocalPlaylists).to.equal(1)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -231,14 +224,12 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
await waitJobs(servers)
|
await waitJobs(servers)
|
||||||
|
|
||||||
{
|
{
|
||||||
const res = await getStats(servers[1].url)
|
const data = await servers[1].statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
expect(data.totalLocalVideoFilesSize).to.equal(0)
|
expect(data.totalLocalVideoFilesSize).to.equal(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const res = await getStats(servers[0].url)
|
const data = await servers[0].statsCommand.get()
|
||||||
const data: ServerStats = res.body
|
|
||||||
expect(data.totalLocalVideoFilesSize).to.be.greaterThan(500000)
|
expect(data.totalLocalVideoFilesSize).to.be.greaterThan(500000)
|
||||||
expect(data.totalLocalVideoFilesSize).to.be.lessThan(600000)
|
expect(data.totalLocalVideoFilesSize).to.be.lessThan(600000)
|
||||||
}
|
}
|
||||||
|
@ -253,8 +244,7 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const res1 = await getStats(servers[1].url)
|
const first = await servers[1].statsCommand.get()
|
||||||
const first = res1.body as ServerStats
|
|
||||||
|
|
||||||
for (let i = 0; i < 10; i++) {
|
for (let i = 0; i < 10; i++) {
|
||||||
await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video' })
|
await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video' })
|
||||||
|
@ -264,10 +254,9 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
|
|
||||||
await wait(6000)
|
await wait(6000)
|
||||||
|
|
||||||
const res2 = await getStats(servers[1].url)
|
const second = await servers[1].statsCommand.get()
|
||||||
const second: ServerStats = res2.body
|
|
||||||
|
|
||||||
expect(second.totalActivityPubMessagesProcessed).to.be.greaterThan(first.totalActivityPubMessagesProcessed)
|
expect(second.totalActivityPubMessagesProcessed).to.be.greaterThan(first.totalActivityPubMessagesProcessed)
|
||||||
|
|
||||||
const apTypes: ActivityType[] = [
|
const apTypes: ActivityType[] = [
|
||||||
'Create', 'Update', 'Delete', 'Follow', 'Accept', 'Announce', 'Undo', 'Like', 'Reject', 'View', 'Dislike', 'Flag'
|
'Create', 'Update', 'Delete', 'Follow', 'Accept', 'Announce', 'Undo', 'Like', 'Reject', 'View', 'Dislike', 'Flag'
|
||||||
]
|
]
|
||||||
|
@ -287,9 +276,7 @@ describe('Test stats (excluding redundancy)', function () {
|
||||||
|
|
||||||
await wait(6000)
|
await wait(6000)
|
||||||
|
|
||||||
const res3 = await getStats(servers[1].url)
|
const third = await servers[1].statsCommand.get()
|
||||||
const third: ServerStats = res3.body
|
|
||||||
|
|
||||||
expect(third.totalActivityPubMessagesWaiting).to.equal(0)
|
expect(third.totalActivityPubMessagesWaiting).to.equal(0)
|
||||||
expect(third.activityPubMessagesProcessedPerSecond).to.be.lessThan(second.activityPubMessagesProcessedPerSecond)
|
expect(third.activityPubMessagesProcessedPerSecond).to.be.lessThan(second.activityPubMessagesProcessedPerSecond)
|
||||||
})
|
})
|
||||||
|
|
|
@ -13,10 +13,6 @@ export * from './server'
|
||||||
export * from './requests/check-api-params'
|
export * from './requests/check-api-params'
|
||||||
export * from './requests/requests'
|
export * from './requests/requests'
|
||||||
|
|
||||||
export * from './server/clients'
|
|
||||||
export * from './server/config'
|
|
||||||
export * from './server/servers'
|
|
||||||
|
|
||||||
export * from './users/accounts'
|
export * from './users/accounts'
|
||||||
export * from './users/blocklist'
|
export * from './users/blocklist'
|
||||||
export * from './users/login'
|
export * from './users/login'
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
export * from './config'
|
||||||
export * from './contact-form-command'
|
export * from './contact-form-command'
|
||||||
export * from './debug-command'
|
export * from './debug-command'
|
||||||
export * from './follows-command'
|
export * from './follows-command'
|
||||||
|
@ -7,3 +8,5 @@ export * from './jobs-command'
|
||||||
export * from './plugins-command'
|
export * from './plugins-command'
|
||||||
export * from './plugins'
|
export * from './plugins'
|
||||||
export * from './redundancy-command'
|
export * from './redundancy-command'
|
||||||
|
export * from './servers'
|
||||||
|
export * from './stats-command'
|
||||||
|
|
|
@ -22,6 +22,7 @@ import { FollowsCommand } from './follows-command'
|
||||||
import { JobsCommand } from './jobs-command'
|
import { JobsCommand } from './jobs-command'
|
||||||
import { PluginsCommand } from './plugins-command'
|
import { PluginsCommand } from './plugins-command'
|
||||||
import { RedundancyCommand } from './redundancy-command'
|
import { RedundancyCommand } from './redundancy-command'
|
||||||
|
import { StatsCommand } from './stats-command'
|
||||||
|
|
||||||
interface ServerInfo {
|
interface ServerInfo {
|
||||||
app: ChildProcess
|
app: ChildProcess
|
||||||
|
@ -89,6 +90,7 @@ interface ServerInfo {
|
||||||
jobsCommand?: JobsCommand
|
jobsCommand?: JobsCommand
|
||||||
pluginsCommand?: PluginsCommand
|
pluginsCommand?: PluginsCommand
|
||||||
redundancyCommand?: RedundancyCommand
|
redundancyCommand?: RedundancyCommand
|
||||||
|
statsCommand?: StatsCommand
|
||||||
}
|
}
|
||||||
|
|
||||||
function parallelTests () {
|
function parallelTests () {
|
||||||
|
@ -308,6 +310,7 @@ async function runServer (server: ServerInfo, configOverrideArg?: any, args = []
|
||||||
server.jobsCommand = new JobsCommand(server)
|
server.jobsCommand = new JobsCommand(server)
|
||||||
server.pluginsCommand = new PluginsCommand(server)
|
server.pluginsCommand = new PluginsCommand(server)
|
||||||
server.redundancyCommand = new RedundancyCommand(server)
|
server.redundancyCommand = new RedundancyCommand(server)
|
||||||
|
server.statsCommand = new StatsCommand(server)
|
||||||
|
|
||||||
res(server)
|
res(server)
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { ServerStats } from '@shared/models'
|
||||||
|
import { HttpStatusCode } from '../../core-utils/miscs/http-error-codes'
|
||||||
|
import { AbstractCommand, OverrideCommandOptions } from '../shared'
|
||||||
|
|
||||||
|
export class StatsCommand extends AbstractCommand {
|
||||||
|
|
||||||
|
get (options: OverrideCommandOptions & {
|
||||||
|
useCache?: boolean // default false
|
||||||
|
} = {}) {
|
||||||
|
const { useCache = false } = options
|
||||||
|
const path = '/api/v1/server/stats'
|
||||||
|
|
||||||
|
const query = {
|
||||||
|
t: useCache ? undefined : new Date().getTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.getRequestBody<ServerStats>({
|
||||||
|
...options,
|
||||||
|
|
||||||
|
path,
|
||||||
|
query,
|
||||||
|
defaultExpectedStatus: HttpStatusCode.OK_200
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,23 +0,0 @@
|
||||||
import { makeGetRequest } from '../requests/requests'
|
|
||||||
import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
|
|
||||||
|
|
||||||
function getStats (url: string, useCache = false) {
|
|
||||||
const path = '/api/v1/server/stats'
|
|
||||||
|
|
||||||
const query = {
|
|
||||||
t: useCache ? undefined : new Date().getTime()
|
|
||||||
}
|
|
||||||
|
|
||||||
return makeGetRequest({
|
|
||||||
url,
|
|
||||||
path,
|
|
||||||
query,
|
|
||||||
statusCodeExpected: HttpStatusCode.OK_200
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
export {
|
|
||||||
getStats
|
|
||||||
}
|
|
Loading…
Reference in New Issue