Votre bot Discord est-il en ligne sur tous ses shards ?

Un bot shardé peut tomber à moitié : un shard décroche, une partie des serveurs n'a plus le bot, et les outils de surveillance classiques ne voient rien. NorminUp suit chaque shard.

Equinox, le bot Discord de l'auteur de NorminUp, l'utilise en production.

Grille des shards, dans votre tableau de bord

Exemple
PrêtEn reconnexionMuet

Sur votre page de statut publique

Mon Bot9/10 shards en ligne

Badge pour votre README ou votre page top.gg

Ce que vous obtenez

Chaque shard suivi

Votre bot envoie l'état de ses shards toutes les 60 s. Un shard muet ou bloqué en reconnexion se voit tout de suite, sur une grille.

Des alertes qui nomment le shard

« Shards 3, 7 muets (8/10 prêts) » dans votre webhook Discord, un seul incident, puis la fin de panne quand tout revient.

Une page de statut pour vos utilisateurs

« 9/10 shards en ligne » sur votre page publique, et un badge pour votre README, compris dans l'offre gratuite.

En place en trois étapes

  1. 1

    Créez un compte

    Gratuit, sans carte bancaire. L'offre gratuite suit jusqu'à 2 shards.

  2. 2

    Ajoutez votre bot

    Nouveau service, type « Bot Discord (shards) ». Après l'enregistrement, copiez son jeton.

  3. 3

    Collez l'extrait

    Dans votre bot, avec le jeton dans NORMINUP_TOKEN. Les premiers shards apparaissent dans la minute.

Quelques lignes, sans dépendance

discord.js, discord.py ou n'importe quel langage : chaque processus de votre bot envoie l'état de ses shards. Le jeton se crée dans votre tableau de bord.

discord.js v14 ou v15, ESM ou CommonJS, sans dépendance. À coller après client.login() : couvre le sharding interne, ShardingManager et discord-hybrid-sharding.

norminup.js
1// NorminUp : envoie l'état des shards de ce processus toutes les 60 s.2// À coller après client.login(). discord.js v14 ou v15, ESM ou CommonJS, sans dépendance.3const NORMINUP_TOKEN = process.env.NORMINUP_TOKEN ?? 'YOUR_TOKEN';4// États des shards par valeur : Status de discord.js v14,5// puis WebSocketShardStatus de @discordjs/ws (v15).6const NORMINUP_STATUS_V14 = [7	'ready', 'connecting', 'reconnecting', 'idle', 'nearly',8	'disconnected', 'waiting_for_guilds', 'identifying', 'resuming'9];10const NORMINUP_STATUS_V15 = ['idle', 'connecting', 'resuming', 'ready'];11 12async function norminupShards() {13	const guilds = id => client.guilds.cache.filter(guild => guild.shardId === id).size;14	if (client.ws.shards) {15		return [...client.ws.shards.values()].map(shard => ({16			id: shard.id,17			status: NORMINUP_STATUS_V14[shard.status] ?? 'unknown',18			ping: shard.ping,19			guilds: guilds(shard.id)20		}));21	}22	const statuses = await client.ws.fetchStatus();23	return [...statuses].map(([id, status]) => ({24		id,25		status: NORMINUP_STATUS_V15[status] ?? 'unknown',26		ping: client.pings?.get(id) ?? -1,27		guilds: guilds(id)28	}));29}30 31setInterval(async () => {32	try {33		const known = [34			client.cluster?.info?.TOTAL_SHARDS,35			client.shard?.count,36			client.options.shardCount37		];38		const total = known.find(Number.isInteger) ?? await client.ws.getShardCount?.() ?? 1;39		const shards = await norminupShards();40		await fetch('https://api.norminup.com/api/heartbeat/shards', {41			method: 'POST',42			headers: {43				'Content-Type': 'application/json',44				Authorization: `Bearer ${NORMINUP_TOKEN}`45			},46			body: JSON.stringify({ v: 1, total, shards }),47			signal: AbortSignal.timeout(5000)48		});49	} catch (error) {50		// La surveillance ne doit jamais faire planter le bot : le ping suivant réessaie.51	}52}, 60_000).unref();

Shards suivis par offre

Gratuit
2 shards
Starter
8 shards
Pro
32 shards
Business
Sur devis

Un bot compte pour un seul service, quel que soit son nombre de shards.

Vos questions avant de coller du code

Non. Nous ne vous demandons jamais le token du bot. L'extrait envoie seulement, pour chaque shard, son numéro, son état, sa latence et son nombre de serveurs.

Non. L'extrait attend 5 secondes au plus, ignore toutes les erreurs et réessaie à la minute suivante. Il ne peut pas arrêter votre bot.

Un extrait discord.py est fourni, et n'importe quel langage qui sait envoyer une requête POST en JSON fonctionne (voir l'onglet « Autre langage »).

Oui : vous savez quand votre bot perd sa connexion à Discord, même si son processus tourne encore, et vos utilisateurs le voient sur votre page de statut.

Discord laisse 3 secondes à un bot pour accuser réception d’une commande, d’un bouton ou d’un menu. Passé ce délai, l’utilisateur voit l’un de ces messages, et rien ne plante de votre côté : aucune erreur, aucune alerte. Le module @norminup/discord compte ces interactions ratées, et NorminUp vous prévient.

Oui. Après un deferReply(), Discord laisse 15 minutes pour répondre. Une commande jamais terminée est comptée comme abandonnée, et le temps de réponse des autres est mesuré.

Prêt à voir vos shards ?

Créez votre compte, ajoutez votre bot, et la grille se remplit dès le premier ping.

Pas de carte requise • Annulez à tout moment