mirror of
https://gitlab.com/soapbox-pub/ditto.git
synced 2025-12-06 11:29:46 +00:00
Merge branch 'metrics-resp' into 'main'
HTTP Response metrics See merge request soapbox-pub/ditto!410
This commit is contained in:
commit
a9afe03a37
4 changed files with 31 additions and 15 deletions
23
src/app.ts
23
src/app.ts
|
|
@ -108,6 +108,7 @@ import {
|
||||||
trendingStatusesController,
|
trendingStatusesController,
|
||||||
trendingTagsController,
|
trendingTagsController,
|
||||||
} from '@/controllers/api/trends.ts';
|
} from '@/controllers/api/trends.ts';
|
||||||
|
import { errorHandler } from '@/controllers/error.ts';
|
||||||
import { metricsController } from '@/controllers/metrics.ts';
|
import { metricsController } from '@/controllers/metrics.ts';
|
||||||
import { indexController } from '@/controllers/site.ts';
|
import { indexController } from '@/controllers/site.ts';
|
||||||
import { nodeInfoController, nodeInfoSchemaController } from '@/controllers/well-known/nodeinfo.ts';
|
import { nodeInfoController, nodeInfoSchemaController } from '@/controllers/well-known/nodeinfo.ts';
|
||||||
|
|
@ -151,18 +152,17 @@ if (Conf.cronEnabled) {
|
||||||
|
|
||||||
app.use('*', rateLimitMiddleware(300, Time.minutes(5)));
|
app.use('*', rateLimitMiddleware(300, Time.minutes(5)));
|
||||||
|
|
||||||
app.use('/api/*', logger(debug));
|
app.use('/api/*', metricsMiddleware, logger(debug));
|
||||||
app.use('/.well-known/*', logger(debug));
|
app.use('/.well-known/*', metricsMiddleware, logger(debug));
|
||||||
app.use('/users/*', logger(debug));
|
app.use('/users/*', metricsMiddleware, logger(debug));
|
||||||
app.use('/nodeinfo/*', logger(debug));
|
app.use('/nodeinfo/*', metricsMiddleware, logger(debug));
|
||||||
app.use('/oauth/*', logger(debug));
|
app.use('/oauth/*', metricsMiddleware, logger(debug));
|
||||||
|
|
||||||
app.get('/api/v1/streaming', streamingController);
|
app.get('/api/v1/streaming', metricsMiddleware, streamingController);
|
||||||
app.get('/relay', relayController);
|
app.get('/relay', metricsMiddleware, relayController);
|
||||||
|
|
||||||
app.use(
|
app.use(
|
||||||
'*',
|
'*',
|
||||||
metricsMiddleware,
|
|
||||||
cspMiddleware(),
|
cspMiddleware(),
|
||||||
cors({ origin: '*', exposeHeaders: ['link'] }),
|
cors({ origin: '*', exposeHeaders: ['link'] }),
|
||||||
signerMiddleware,
|
signerMiddleware,
|
||||||
|
|
@ -340,12 +340,7 @@ app.get('/', frontendController, indexController);
|
||||||
// Fallback
|
// Fallback
|
||||||
app.get('*', publicFiles, staticFiles, frontendController);
|
app.get('*', publicFiles, staticFiles, frontendController);
|
||||||
|
|
||||||
app.onError((err, c) => {
|
app.onError(errorHandler);
|
||||||
if (err.message === 'canceling statement due to statement timeout') {
|
|
||||||
return c.json({ error: 'The server was unable to respond in a timely manner' }, 500);
|
|
||||||
}
|
|
||||||
return c.json({ error: 'Something went wrong' }, 500);
|
|
||||||
});
|
|
||||||
|
|
||||||
export default app;
|
export default app;
|
||||||
|
|
||||||
|
|
|
||||||
11
src/controllers/error.ts
Normal file
11
src/controllers/error.ts
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
import { ErrorHandler } from '@hono/hono';
|
||||||
|
|
||||||
|
export const errorHandler: ErrorHandler = (err, c) => {
|
||||||
|
console.error(err);
|
||||||
|
|
||||||
|
if (err.message === 'canceling statement due to statement timeout') {
|
||||||
|
return c.json({ error: 'The server was unable to respond in a timely manner' }, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.json({ error: 'Something went wrong' }, 500);
|
||||||
|
};
|
||||||
|
|
@ -6,6 +6,12 @@ export const httpRequestCounter = new Counter({
|
||||||
labelNames: ['method'],
|
labelNames: ['method'],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const httpResponseCounter = new Counter({
|
||||||
|
name: 'http_responses_total',
|
||||||
|
help: 'Total number of HTTP responses',
|
||||||
|
labelNames: ['status', 'path'],
|
||||||
|
});
|
||||||
|
|
||||||
export const streamingConnectionsGauge = new Gauge({
|
export const streamingConnectionsGauge = new Gauge({
|
||||||
name: 'streaming_connections',
|
name: 'streaming_connections',
|
||||||
help: 'Number of active connections to the streaming API',
|
help: 'Number of active connections to the streaming API',
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,14 @@
|
||||||
import { MiddlewareHandler } from '@hono/hono';
|
import { MiddlewareHandler } from '@hono/hono';
|
||||||
|
|
||||||
import { httpRequestCounter } from '@/metrics.ts';
|
import { httpRequestCounter, httpResponseCounter } from '@/metrics.ts';
|
||||||
|
|
||||||
export const metricsMiddleware: MiddlewareHandler = async (c, next) => {
|
export const metricsMiddleware: MiddlewareHandler = async (c, next) => {
|
||||||
const { method } = c.req;
|
const { method } = c.req;
|
||||||
httpRequestCounter.inc({ method });
|
httpRequestCounter.inc({ method });
|
||||||
|
|
||||||
await next();
|
await next();
|
||||||
|
|
||||||
|
const { status } = c.res;
|
||||||
|
const path = c.req.matchedRoutes.find((r) => r.method !== 'ALL')?.path ?? c.req.routePath;
|
||||||
|
httpResponseCounter.inc({ status, path });
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue