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