Blog

Scalingo ajoute le support des signaux UNIX pour les applications

Chargement...

3 min de lecture

Scalingo ajoute le support des signaux UNIX pour les applications

Nous sommes ravis d’annoncer la sortie d’une nouvelle fonctionnalité : il est désormais possible d’envoyer un signal à une application hébergée sur Scalingo. L’envoi de signaux sur Scalingo permet de déclencher certains événements lorsque vous êtes propriétaire ou collaborateur d’une application. Cette fonctionnalité peut notamment s’avérer très utile pour le débogage.

support des signaux UNIX pour les applications

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 --signal SIGUSR1 web-1
-----> A envoyé le signal 'SIGUSR1' au conteneur 'web-1'.
$ 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 --signal SIGUSR1 web-1
-----> A envoyé le signal 'SIGUSR1' au conteneur 'web-1'.
$ 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 --signal SIGUSR1 web-1
-----> A envoyé le signal 'SIGUSR1' au conteneur 'web-1'.
$ 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 --signal SIGUSR1 web-1
-----> A envoyé le signal 'SIGUSR1' au conteneur 'web-1'.

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.

web: node app.js
web: node app.js
web: node app.js
web: node app.js

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 !

Quentin Escudier

Quentin est Junior Developer et a récemment rejoint l'équipe Infrastructure.

Restez informé

Recevez des articles et des mises à jour de la plateforme dans votre boîte de réception.

Prêt à déployer en toute confiance ?

Découvrez des déploiements sans temps d'arrêt, une mise à l'échelle automatique intelligente et une infrastructure entièrement gérée. Commencez à déployer vos applications sur Scalingo dès aujourd'hui.

Aucune carte de crédit requise • Déployez en quelques minutes • Annulez à tout moment

Dégradé arrière-plan section

Déployez une application ou base de données

Commencez à déployer

Rejoignez les équipes qui misent sur une plateforme conçue pour livrer rapidement, opérer sereinement, avec des valeurs européennes et un support humain.

Dégradé arrière-plan section

Déployez une application ou base de données

Commencez à déployer

Rejoignez les équipes qui misent sur une plateforme conçue pour livrer rapidement, opérer sereinement, avec des valeurs européennes et un support humain.

Dégradé arrière-plan section

Déployez une application ou base de données

Commencez à déployer

Rejoignez les équipes qui misent sur une plateforme conçue pour livrer rapidement, opérer sereinement, avec des valeurs européennes et un support humain.