Monitoring
Framework integrations
Each one times every request or command by its route or command name, records server errors, and keeps the slowest calls. None of them needs the framework installed to import.
← Monitoring docsUpdated
Browse the docs
What they record
Web frameworks record http.server.duration tagged with the route template (GET /orders/:id, never the real id), the method and the status class (2xx to 5xx). Discord libraries record discord.command.duration tagged with the command and whether it failed, plus the gateway latency and guild count. The Performance tab is built from these.
FastAPI and Starlette
Any ASGI app works the same way.
Python
from fastapi import FastAPI from sillydev import monitoring from sillydev.monitoring.asgi import MonitoringMiddleware monitoring.init() app = FastAPI() app.add_middleware(MonitoringMiddleware)
Flask and Django
Wrap the WSGI app. For Django, also add sillydev.monitoring.wsgi.DjangoRouteMiddleware to MIDDLEWARE so requests are named by their URL pattern.
Flask
from sillydev import monitoring from sillydev.monitoring.wsgi import MonitoringMiddleware monitoring.init() app.wsgi_app = MonitoringMiddleware(app.wsgi_app)
Django (wsgi.py)
from django.core.wsgi import get_wsgi_application from sillydev import monitoring from sillydev.monitoring.wsgi import MonitoringMiddleware monitoring.init() application = MonitoringMiddleware(get_wsgi_application())
aiohttp
Python
from aiohttp import web from sillydev import monitoring from sillydev.monitoring.aiohttp import middleware monitoring.init() app = web.Application(middlewares=[middleware])
discord.py
Times prefix and slash commands and records their errors, without replacing discord.py's own error output.
Python
from sillydev import monitoring from sillydev.monitoring.discord import monitor_bot monitoring.init(service="my-bot") bot = monitor_bot(commands.Bot(command_prefix="!", intents=intents))
Express
The middleware goes first and the error handler after your routes.
JavaScript
import express from 'express';
import { monitoring } from 'sillydev/monitoring';
import { monitoringMiddleware, monitoringErrorHandler } from 'sillydev/monitoring/express';
monitoring.init();
const app = express();
app.use(monitoringMiddleware());
// ...your routes
app.use(monitoringErrorHandler());Fastify
The plugin applies to every route, like one wrapped in fastify-plugin.
JavaScript
import Fastify from 'fastify';
import { monitoring } from 'sillydev/monitoring';
import { monitoringPlugin } from 'sillydev/monitoring/fastify';
monitoring.init();
const app = Fastify();
await app.register(monitoringPlugin);Hono
JavaScript
import { Hono } from 'hono';
import { monitoring } from 'sillydev/monitoring';
import { monitoringMiddleware } from 'sillydev/monitoring/hono';
monitoring.init();
const app = new Hono();
app.use(monitoringMiddleware());discord.js
Times every slash command and context menu command until your listeners finish, and records the errors they throw.
JavaScript
import { Client, GatewayIntentBits } from 'discord.js';
import { monitoring } from 'sillydev/monitoring';
import { monitorClient } from 'sillydev/monitoring/discord';
monitoring.init({ service: 'my-bot' });
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
monitorClient(client);Read next