diff --git a/src/backend/common/database/drizzle/repositories/PlayRepository.ts b/src/backend/common/database/drizzle/repositories/PlayRepository.ts index 2177f2c2..14c9839d 100644 --- a/src/backend/common/database/drizzle/repositories/PlayRepository.ts +++ b/src/backend/common/database/drizzle/repositories/PlayRepository.ts @@ -705,6 +705,14 @@ group by state;`); group by state,componentId;`); return res; } + + public getCompactedPlayCountByComponent = async () => { + + const res = await this.db.all(sql`select componentId,compacted,count(*) from plays p +where compacted IS NOT NULL +group by componentId,compacted;`); + return res; + } } export const getTemporallyCloseDateCompareOp = (play: PlayObject, opts: {bufferTime?: number, useCompleted?: boolean} = {}): CompareDateOp => { diff --git a/src/backend/server/api.ts b/src/backend/server/api.ts index 6c63ad38..84bf1632 100644 --- a/src/backend/server/api.ts +++ b/src/backend/server/api.ts @@ -611,6 +611,22 @@ export const setupApi = (app: Express, logger: Logger, appLoggerStream: PassThro } } }); + const sourceRetention = new prom.Gauge({ + name: 'multiscrobbler_source_plays_compacted', + help: 'Count of compacted, stored plays by compaction type for Sources', + labelNames: ['name', 'type'], + async collect() { + const res = await playRepo.getCompactedPlayCountByComponent(); + for(const source of scrobbleSources.sources) { + const relevant = res.filter(x => x['componentId'] === source.componentId); + for(const s of ['input','transform','input-transform']) { + const rel = relevant.find(x => x['compacted'] === s); + const count = rel === undefined ? 0 : rel['count(*)']; + this.labels({name: source.getSafeExternalName(), type: s}).set(count); + } + } + } + }); const clientPlays = new prom.Gauge({ name: 'multiscrobbler_client_plays', help: 'Count of stored plays by state for Clients', @@ -627,6 +643,22 @@ export const setupApi = (app: Express, logger: Logger, appLoggerStream: PassThro } } }); + const clientRetention = new prom.Gauge({ + name: 'multiscrobbler_client_plays_compacted', + help: 'Count of compacted, stored plays by compaction type for Clients', + labelNames: ['name', 'type'], + async collect() { + const res = await playRepo.getCompactedPlayCountByComponent(); + for(const client of scrobbleClients.clients) { + const relevant = res.filter(x => x['componentId'] === client.componentId); + for(const s of ['input','transform','input-transform']) { + const rel = relevant.find(x => x['compacted'] === s); + const count = rel === undefined ? 0 : rel['count(*)']; + this.labels({name: client.getSafeExternalName(), type: s}).set(count); + } + } + } + }); const clientHistoricalPlays = new prom.Gauge({ name: 'multiscrobbler_client_historical_plays', help: 'Count of stored historical plays for Clients',