Some checks failed
Create issues from TODOs / todos (push) Failing after 3s
Close inactive issues / close-issues (push) Has been cancelled
Deploy GitHub Pages / deploy-preview (push) Has been cancelled
CI / ⚙️ Variables Setup (push) Has been cancelled
CI / ⚙️ Test Guard (push) Has been cancelled
CI / 🚀 Notify external services - draft (push) Has been cancelled
CI / 📦 Build Packages (push) Has been cancelled
CI / 📦 Meteor Build (coverage) (push) Has been cancelled
CI / 📦 Meteor Build (production) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [account-service presence-service omnichannel-transcript-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [account-service presence-service omnichannel-transcript-service], fips) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [authorization-service queue-worker-service ddp-streamer-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [authorization-service queue-worker-service ddp-streamer-service], fips) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], coverage) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], fips) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [account-service presence-service omnichannel-transcript-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [authorization-service queue-worker-service ddp-streamer-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [rocketchat], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [rocketchat], coverage) (push) Has been cancelled
CI / 🚢 Publish Docker Images (ghcr.io) (push) Has been cancelled
CI / 📦 Track Image Sizes (push) Has been cancelled
CI / 🔎 Code Check - Action Lint (push) Has been cancelled
CI / 🔎 Code Check (push) Has been cancelled
CI / 🔨 Test Storybook (push) Has been cancelled
CI / 🔨 Test Unit (push) Has been cancelled
CI / 🔨 Test API (CE) (push) Has been cancelled
CI / 🔨 Test API Livechat (CE) (push) Has been cancelled
CI / 🔨 Test UI (CE) (push) Has been cancelled
CI / 🔨 Test API (EE) (push) Has been cancelled
CI / 🔨 Test API Livechat (EE) (push) Has been cancelled
CI / 🔨 Test API Apps (deno-runtime - EE) (push) Has been cancelled
CI / 🔨 Test UI (EE) (push) Has been cancelled
CI / 🔨 Test API (FIPS) (push) Has been cancelled
CI / 🔨 Test API Livechat (FIPS) (push) Has been cancelled
CI / 🔨 Test UI (FIPS) (push) Has been cancelled
CI / 🔨 Test Federation Matrix (push) Has been cancelled
CI / 📊 Report Coverage (push) Has been cancelled
CI / ✅ Tests Done (push) Has been cancelled
CI / 🚀 Publish build assets (push) Has been cancelled
CI / 🚀 Publish Docker Images (DockerHub) (push) Has been cancelled
CI / 🚀 Notify external services (push) Has been cancelled
CI / Update Version Durability (push) Has been cancelled
Release / Release (push) Has been cancelled
Auto-close duplicate issues / auto-close-duplicates (push) Failing after 1s
Code scanning - action / CodeQL-Build (push) Failing after 1s
72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
import type { MiddlewareHandler } from 'hono';
|
|
import type { Gauge, Histogram, Summary } from 'prom-client';
|
|
|
|
import type { CachedSettings } from '../../../settings/CachedSettings';
|
|
|
|
export const metricsMiddleware =
|
|
({
|
|
basePathRegex,
|
|
excludePathRegex,
|
|
api,
|
|
settings,
|
|
endpointTimeSummary,
|
|
endpointTimeHistogram,
|
|
responseSizeHistogram,
|
|
activeRequestsGauge,
|
|
}: {
|
|
basePathRegex?: RegExp;
|
|
excludePathRegex?: RegExp;
|
|
api: { version?: string };
|
|
settings: CachedSettings;
|
|
endpointTimeSummary: Summary;
|
|
endpointTimeHistogram: Histogram;
|
|
responseSizeHistogram: Histogram;
|
|
activeRequestsGauge: Gauge;
|
|
}): MiddlewareHandler =>
|
|
async (c, next) => {
|
|
// Several metrics middlewares share the same `/api` mount (v1, experimental, apps, default), so
|
|
// each one has to ignore the paths that belong to the others or a request gets sampled more than
|
|
// once. The versioned ones opt in by prefix; the catch-all opts out of the prefixes it does not own.
|
|
if (basePathRegex && !basePathRegex.test(c.req.path)) {
|
|
return next();
|
|
}
|
|
|
|
if (excludePathRegex?.test(c.req.path)) {
|
|
return next();
|
|
}
|
|
|
|
const rocketchatRestApiEnd = endpointTimeSummary.startTimer();
|
|
const rocketchatRestApiHistEnd = endpointTimeHistogram.startTimer();
|
|
|
|
const methodLabel = { method: c.req.method.toLowerCase() };
|
|
activeRequestsGauge.inc(methodLabel);
|
|
|
|
await next();
|
|
|
|
activeRequestsGauge.dec(methodLabel);
|
|
|
|
const { method, path, routePath } = c.req;
|
|
|
|
// get rid of the base path (i.e.: /api/v1/)
|
|
const entrypoint = basePathRegex ? routePath.replace(basePathRegex, '') : routePath;
|
|
|
|
const histogramLabels = {
|
|
status: c.res.status,
|
|
method: method.toLowerCase(),
|
|
version: api.version,
|
|
entrypoint: basePathRegex && entrypoint.startsWith('method.call') ? decodeURIComponent(path.replace(basePathRegex, '')) : entrypoint,
|
|
};
|
|
|
|
rocketchatRestApiEnd({
|
|
...histogramLabels,
|
|
...(settings.get('Prometheus_API_User_Agent') && { user_agent: c.req.header('user-agent') }),
|
|
});
|
|
|
|
rocketchatRestApiHistEnd(histogramLabels);
|
|
|
|
const contentLength = parseInt(c.res.headers.get('content-length') || '0', 10);
|
|
if (contentLength > 0) {
|
|
responseSizeHistogram.observe(histogramLabels, contentLength);
|
|
}
|
|
};
|