Nous sommes heureux d'annoncer qu'une nouvelle fonctionnalité a été mise en place !
Il est maintenant possible d'envoyer un signal à une application hébergée par Scalingo.
Sur la plateforme Scalingo, l'envoi de signaux est un moyen utile de déclencher des événements tout en étant le propriétaire ou la personne collaboratrice d'une application. Cela peut être particulièrement utile à des fins de débogage.
Dans cet article, nous allons voir comment envoyer un signal défini par l'utilisateur (SIGUSR1 et SIGUSR2) à une application hébergée par Scalingo. Pour plus d'informations, vous pouvez consulter la page de documentation Scalingo à propos de Send-Signal.).
Pourquoi envoyer un signal à une application ?
Chez Scalingo, nous utilisons souvent le gestionnaire de signaux pour :
Obtenir les traces d'exécutions de la pile
Récupérer les informations concernant les allocations de mémoire sur le tas
Imprimer le nombre de Goroutines
Imprimer la consommation de mémoire
etc...
Comment envoyer un signal à une application ?
Un signal peut être envoyé avec notre CLI :
$ scalingo -a mon-app ps
+-------+---------+-------------+------+---------------------+
| NOM | STATUT | COMMANDE | TAILLE | CRÉÉE À |
+-------+---------+-------------+------+---------------------+
| web-1 | en cours d'exécution | sample-test | M | 2023/01/05 09:24:33 |
| web-2 | en cours d'exécution | sample-test | M | 2023/01/05 09:24:33 |
+-------+---------+-------------+------+---------------------+
$ scalingo -a my-app send-signal
$ scalingo -a mon-app ps
+-------+---------+-------------+------+---------------------+
| NOM | STATUT | COMMANDE | TAILLE | CRÉÉE À |
+-------+---------+-------------+------+---------------------+
| web-1 | en cours d'exécution | sample-test | M | 2023/01/05 09:24:33 |
| web-2 | en cours d'exécution | sample-test | M | 2023/01/05 09:24:33 |
+-------+---------+-------------+------+---------------------+
$ scalingo -a my-app send-signal
$ scalingo -a mon-app ps
+-------+---------+-------------+------+---------------------+
| NOM | STATUT | COMMANDE | TAILLE | CRÉÉE À |
+-------+---------+-------------+------+---------------------+
| web-1 | en cours d'exécution | sample-test | M | 2023/01/05 09:24:33 |
| web-2 | en cours d'exécution | sample-test | M | 2023/01/05 09:24:33 |
+-------+---------+-------------+------+---------------------+
$ scalingo -a my-app send-signal
$ scalingo -a mon-app ps
+-------+---------+-------------+------+---------------------+
| NOM | STATUT | COMMANDE | TAILLE | CRÉÉE À |
+-------+---------+-------------+------+---------------------+
| web-1 | en cours d'exécution | sample-test | M | 2023/01/05 09:24:33 |
| web-2 | en cours d'exécution | sample-test | M | 2023/01/05 09:24:33 |
+-------+---------+-------------+------+---------------------+
$ scalingo -a my-app send-signal
Exemple sur une application Node.js Express
L'exemple suivant est un échantillon de ce que l'on peut trouver sur notre compte GitHub Scalingo et qui peut être déployé rapidement sur la plateforme.
Dans cet exemple, nous allons attraper un SIGUSR1 et imprimer l'utilisation de la mémoire de notre processus.
La partie catch peut être résumée par ce code :
process.on("SIGUSR1", () => {
const used = process.memoryUsage();
console.log("Printing memory usage")
for (let key in used) {
console.log(`- ${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}
});
var express = require('express')
var app = express()
process.on("SIGUSR1", () => {
const used = process.memoryUsage();
console.log("Printing memory usage")
for (let key in used) {
console.log(`- ${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}
});
var express = require('express')
var app = express()
process.on("SIGUSR1", () => {
const used = process.memoryUsage();
console.log("Printing memory usage")
for (let key in used) {
console.log(`- ${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}
});
var express = require('express')
var app = express()
process.on("SIGUSR1", () => {
const used = process.memoryUsage();
console.log("Printing memory usage")
for (let key in used) {
console.log(`- ${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}
});
var express = require('express')
var app = express()
Ici, nous devons écrire notre point d'entrée dans le Procfile. Si nous ne le faisons pas, le point d'entrée par défaut d'une application node sera npm start qui ne transmet pas les signaux à app.js. Plus d'informations sur le processus qui capte le signal peuvent être trouvées dans notre documentation Scalingo.
Une fois déployé sur Scalingo, nous pouvons facilement envoyer un signal à notre application conteneurisée :
$ scalingo -a my-app send-signal --signal SIGUSR1 web-1
-----> Envoi du signal 'SIGUSR1' au conteneur 'web-1'
$ scalingo -a my-app send-signal --signal SIGUSR1 web-1
-----> Envoi du signal 'SIGUSR1' au conteneur 'web-1'
$ scalingo -a my-app send-signal --signal SIGUSR1 web-1
-----> Envoi du signal 'SIGUSR1' au conteneur 'web-1'
$ scalingo -a my-app send-signal --signal SIGUSR1 web-1
-----> Envoi du signal 'SIGUSR1' au conteneur 'web-1'
Ceci produira le log suivant dans notre application :
2023-01-10 15:13:22.147625033 +0100 CET [web-1] Printing memory Usage
2023-01-10 15:13:22.147633815 +0100 CET [web-1] - heapTotal 6.7 MB
2023-01-10 15:13:22.147633065 +0100 CET [web-1] - rss 38.89 MB
2023-01-10 15:13:22.147634619 +0100 CET [web-1] - heapUsed 4.59 MB
2023-01-10 15:13:22.147635164 +0100 CET [web-1] - external 1.39 MB
2023-01-10 15:13:22.147635509 +0100 CET [web-1] - arrayBuffers 0
2023-01-10 15:13:22.147625033 +0100 CET [web-1] Printing memory Usage
2023-01-10 15:13:22.147633815 +0100 CET [web-1] - heapTotal 6.7 MB
2023-01-10 15:13:22.147633065 +0100 CET [web-1] - rss 38.89 MB
2023-01-10 15:13:22.147634619 +0100 CET [web-1] - heapUsed 4.59 MB
2023-01-10 15:13:22.147635164 +0100 CET [web-1] - external 1.39 MB
2023-01-10 15:13:22.147635509 +0100 CET [web-1] - arrayBuffers 0
2023-01-10 15:13:22.147625033 +0100 CET [web-1] Printing memory Usage
2023-01-10 15:13:22.147633815 +0100 CET [web-1] - heapTotal 6.7 MB
2023-01-10 15:13:22.147633065 +0100 CET [web-1] - rss 38.89 MB
2023-01-10 15:13:22.147634619 +0100 CET [web-1] - heapUsed 4.59 MB
2023-01-10 15:13:22.147635164 +0100 CET [web-1] - external 1.39 MB
2023-01-10 15:13:22.147635509 +0100 CET [web-1] - arrayBuffers 0
2023-01-10 15:13:22.147625033 +0100 CET [web-1] Printing memory Usage
2023-01-10 15:13:22.147633815 +0100 CET [web-1] - heapTotal 6.7 MB
2023-01-10 15:13:22.147633065 +0100 CET [web-1] - rss 38.89 MB
2023-01-10 15:13:22.147634619 +0100 CET [web-1] - heapUsed 4.59 MB
2023-01-10 15:13:22.147635164 +0100 CET [web-1] - external 1.39 MB
2023-01-10 15:13:22.147635509 +0100 CET [web-1] - arrayBuffers 0
En bref
Dans cet article, nous avons découvert la nouvelle fonctionnalité permettant d'envoyer un signal à une application hébergée par Scalingo. Comme nous l'avons vu, cette fonctionnalité est très utile pour le débogage. Un nouveau champ de possibilités maintenant s'ouvre à vous, allez l'explorer !