From 616778ab6d03eeacb1221599a26796816c436e14 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sat, 4 Nov 2023 14:01:10 +0000 Subject: [PATCH] Add prometheus exporter for provider metrics --- src/modules/metrics/index.ts | 27 +++++++++++++++++++++++++++ src/routes/metrics.ts | 14 ++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/modules/metrics/index.ts b/src/modules/metrics/index.ts index 11b5b3d..b52e503 100644 --- a/src/modules/metrics/index.ts +++ b/src/modules/metrics/index.ts @@ -9,6 +9,15 @@ const log = scopedLogger('metrics'); export type Metrics = { user: Counter<'namespace'>; + providerMetrics: Counter< + | 'title' + | 'tmdb_id' + | 'season_id' + | 'episode_id' + | 'status' + | 'type' + | 'provider_id' + >; }; let metrics: null | Metrics = null; @@ -29,8 +38,26 @@ export async function setupMetrics(app: FastifyInstance) { help: 'user_help', labelNames: ['namespace'], }), + providerMetrics: new Counter({ + name: 'provider_metrics', + help: 'provider_metrics', + labelNames: [ + 'episode_id', + 'provider_id', + 'season_id', + 'status', + 'title', + 'tmdb_id', + 'type', + ], + }), }; + const promClient = app.metrics.client; + + promClient.register.registerMetric(metrics.user); + promClient.register.registerMetric(metrics.providerMetrics); + const orm = getORM(); const em = orm.em.fork(); log.info(`Syncing up metrics...`, { evt: 'sync' }); diff --git a/src/routes/metrics.ts b/src/routes/metrics.ts index f3d9f34..074e364 100644 --- a/src/routes/metrics.ts +++ b/src/routes/metrics.ts @@ -2,6 +2,7 @@ import { handle } from '@/services/handler'; import { makeRouter } from '@/services/router'; import { z } from 'zod'; import { ProviderMetric, status } from '@/db/models/ProviderMetrics'; +import { getMetrics } from '@/modules/metrics'; const metricsProviderSchema = z.object({ tmdbId: z.string(), @@ -45,6 +46,19 @@ export const metricsRouter = makeRouter((app) => { }); return metric; }); + + entities.forEach((entity) => { + getMetrics().providerMetrics.inc({ + episode_id: entity.episodeId, + provider_id: entity.providerId, + season_id: entity.seasonId, + status: entity.status, + title: entity.title, + tmdb_id: entity.tmdbId, + type: entity.type, + }); + }); + await em.persistAndFlush(entities); return true; }),