Blog

Intégration Arduino YUN DIY pour les alertes PagerDuty

par Tony Albanese 26 août 2014 | 4 minutes de lecture

En utilisant un peu d'inspiration de code provenant du Lampe Gmail , Daniel Gentleman de Thoughtfix ( @Thoughtfix ) a créé une intégration Arduino PagerDuty exceptionnelle en combinant un Arduino YUN, une sphère imprimée en 3D et l'anneau Neopixel d'Adafruit pour visualiser l'état de son tableau de bord PagerDuty . Découvrez-le dans la vidéo de son appareil (et de son chat) en action ci-dessous :

Grâce à l'API de PagerDuty, l'appareil consulte PagerDuty toutes les 15 secondes pour mettre à jour son état. L'appareil est configuré pour afficher à la fois les alertes acquittées et déclenchées. Lorsqu'il détecte des alertes acquittées ou déclenchées, le globe devient orange puis rouge, émettant une brève pulsation orange. Daniel précise que cette opération est intentionnelle pour indiquer la présence d'alertes dans les deux états, mais que le voyant reste rouge pendant un cycle de 15 secondes pour indiquer l'état le plus critique. Une fois toutes les alertes résolues, le voyant s'allume en vert.

Maintenir la fiabilité de l'intégration

Comme beaucoup de projets DIY, la lampe d'état PagerDuty était initialement un projet ludique. Mais Daniel a compris que cette lampe répondait à un réel besoin : un signal visuel rapide pour ses incidents en cours, qui pourrait à l'avenir servir de signal visuel pour que les autres le laissent tranquille lorsque sa lampe est rouge. Pour fiabiliser l'intégration, Daniel a ajouté une fonction simple à l'Arduino pour vérifier la présence du Wi-Fi et garantir une connexion permanente.

En créant un script shell ping -c 1 dans le répertoire personnel et en englobant les appels à l'API PagerDuty dans un test de ping, Daniel nous a expliqué que dans sa version finale, l'appareil envoie un ping à Bing.com toutes les secondes (beaucoup plus fréquemment que les appels à PagerDuty, qui ont lieu toutes les 15 secondes). En cas de perte de connexion, la lampe passe au bleu.

WP_20140814_13_13_41_Pro

Possibilités futures

Étant donné que l'appareil utilise des scripts shell très simples et une broche d'E/S sur l'Arduino Yun, Daniel a expliqué qu'il est possible d'étendre cela pour montrer qui est de garde, faire changer les lumières en fonction de l'équipe qui a des alertes et même déplacer physiquement un robot en fonction des appels API PagerDuty .

Prêt à construire le vôtre ?

WP_20140814_13_14_07_Pro

Voici ce dont vous aurez besoin :

Code source :

// Ce code est destiné à une lampe d'état PagerDuty utilisant un Arduino Yun
// avec un anneau Adafruit NeoPixel (12 LED) sur la broche 6.
// Il nécessite trois fichiers dans le répertoire personnel de root :
// ack.sh (requête curl à l'API de PagerDuty pour vérifier les alertes reconnues)
// trig.sh (requête curl à l'API de PagerDuty pour vérifier les alertes déclenchées)
// cacert.pem (à partir de https://curl.haxx.se/ca/cacert.pem pour les requêtes SSL curl)
//
// Exemple ack.sh (changer status=acknowledged en status=triggered pour trig.sh
// curl -H « Type de contenu : application/json » -H « Autorisation : jeton »
token=[votre token]” -X GET -G –data-urlencode “status=acknowledged”
https://[YourPagerDutyURL]. pagerduty.com/api/v1/incidents/count
–cacert /root/cacert.pem
//

// Obtenir un jeton API PagerDuty à partir de
https://[YourPagerDutyURL]. pagerduty.com/api_keys
#inclure<Adafruit_NeoPixel.h>
#définir le code PIN 6
#inclure<Process.h>
Bande Adafruit_NeoPixel = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// Initialiser le pont
Pont.begin();
// Initialiser la série
Serial.begin(9600);

// exécuter divers exemples de processus
bande.commencer();
strip.show(); // Initialiser tous les pixels à 'off'
colorWipe(strip.Color(0, 0, 255), 50); // Bleu
délai(100);
}
boucle vide() {
int ackd = runAckd();
int trig = runTrigger();
si ((ackd == 0) && (trig == 0)){
colorWipe(strip.Color(0, 255, 0), 50); // Vert
}
si (ackd >= 1){
colorWipe(strip.Color(255, 153, 0), 50); // Orange
}
si (trig >= 1){
colorWipe(strip.Color(255, 0, 0), 50); // Rouge
}
délai(15000);
}
int runTrigger() {
Processus p;// Créez un processus et appelez-le « p »
p.runShellCommand(“/root/trig.sh”);

// Vérifier les événements déclenchés
// Une sortie de processus peut être lue avec les méthodes de flux
while (p.running()); // ne rien faire jusqu'à ce que le processus soit terminé, donc
vous obtenez l'intégralité du résultat
int result = p.parseInt(); /* rechercher un entier */
Serial.print(“Triggered:”); /* Quelques opérations de débogage série */
Serial.println(résultat);

// Assurez-vous que le dernier bit de données est envoyé.
Serial.flush();
renvoyer le résultat ;
}
int runAckd() {
Processus p;// Créez un processus et appelez-le « p »
p.runShellCommand(“/root/ack.sh”);

// Vérifier les événements déclenchés
// Une sortie de processus peut être lue avec les méthodes de flux
while (p.running()); // ne rien faire jusqu'à ce que le processus soit terminé, donc
vous obtenez l'intégralité du résultat
int result = p.parseInt(); /* rechercher un entier */
Serial.print(“Ackd:”); /* Quelques opérations de débogage série */
Serial.println(résultat);

// Assurez-vous que le dernier bit de données est envoyé.
Serial.flush();
renvoyer le résultat ;
}
void colorWipe(uint32_t c, uint8_t wait) {
pour(uint16_t i=0; i
bande.setPixelColor(i, c);
bande.show();
retarder(attendre);
}
}

Vous avez un projet PagerDuty à réaliser vous-même ? Contactez-nous par e-mail. support@pagerduty.com .