Scalingo ajoute le support des signaux UNIX pour les applications

8 février 2023 - 3 min de lecture
Scalingo ajoute le 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'.

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()
// ...

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

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'.

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.03 MB

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 !

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

Essayez gratuitement Scalingo

30 jours d'essai gratuit / Pas de CB nécessaire / Hébergé en France