diff --git a/src/controllers/metrics.ts b/src/controllers/metrics.ts index 4ef378a0..d168243b 100644 --- a/src/controllers/metrics.ts +++ b/src/controllers/metrics.ts @@ -1,17 +1,32 @@ import { register } from 'prom-client'; import { AppController } from '@/app.ts'; -import { dbAvailableConnectionsGauge, dbPoolSizeGauge } from '@/metrics.ts'; +import { + dbAvailableConnectionsGauge, + dbPoolSizeGauge, + relayPoolRelaysSizeGauge, + relayPoolSubscriptionsSizeGauge, +} from '@/metrics.ts'; import { Storages } from '@/storages.ts'; /** Prometheus/OpenMetrics controller. */ export const metricsController: AppController = async (c) => { const db = await Storages.database(); + const pool = await Storages.client(); // Update some metrics at request time. dbPoolSizeGauge.set(db.poolSize); dbAvailableConnectionsGauge.set(db.availableConnections); + relayPoolRelaysSizeGauge.reset(); + relayPoolSubscriptionsSizeGauge.reset(); + + for (const relay of pool.relays.values()) { + relayPoolRelaysSizeGauge.inc({ ready_state: relay.socket.readyState }); + relayPoolSubscriptionsSizeGauge.inc(relay.subscriptions.length); + } + + // Serve the metrics. const metrics = await register.metrics(); const headers: HeadersInit = { diff --git a/src/metrics.ts b/src/metrics.ts index 7bed083d..633d72f0 100644 --- a/src/metrics.ts +++ b/src/metrics.ts @@ -119,3 +119,14 @@ export const internalSubscriptionsSizeGauge = new Gauge({ name: 'ditto_internal_subscriptions_size', help: "Number of active subscriptions to Ditto's internal relay", }); + +export const relayPoolRelaysSizeGauge = new Gauge({ + name: 'ditto_relay_pool_relays_size', + help: 'Number of relays in the relay pool', + labelNames: ['ready_state'], +}); + +export const relayPoolSubscriptionsSizeGauge = new Gauge({ + name: 'ditto_relay_pool_subscriptions_size', + help: 'Number of active subscriptions to the relay pool', +});