Blog

Intégration DIY Arduino YUN 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 Pensée fixe ( @Thoughtfix ) a construit une superbe intégration PagerDuty Arduino en combinant un Arduino YUN, une sphère imprimée en 3D et l'anneau Neopixel d'Adafruit pour créer une vérification visuelle de 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 :

À l'aide de l'API de PagerDuty, l'appareil s'enregistre auprès de PagerDuty toutes les 15 secondes pour mettre à jour son statut. L'appareil est configuré pour voir à la fois les alertes reconnues et déclenchées. Lorsqu'il découvre des alertes reconnues ou déclenchées, le globe devient orange puis rouge, lui donnant une brève impulsion orange. Daniel note que cela est intentionnel afin de vérifier qu'il y a des alertes dans les deux états, mais que le voyant restera rouge pendant la durée d'un cycle de 15 secondes pour indiquer l'état le plus critique. Lorsque toutes les alertes sont résolues, le voyant s'allume en vert.

Maintenir la fiabilité de l'intégration

Comme beaucoup de projets de bricolage, la lampe d'état PagerDuty a commencé comme un projet amusant. Mais Daniel a vu que cette lampe répondait à un réel besoin d'avoir un repère visuel rapide pour ses incidents ouverts, qui à l'avenir pourrait éventuellement être utilisé comme une file d'attente visuelle pour que d'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 le WiFi afin de garantir qu'une connexion est toujours établie.

En créant un script shell ping -c 1 dans le répertoire personnel et en encapsulant les appels de l'API PagerDuty dans un test pour un ping. Daniel nous a dit que dans sa version finale, l'appareil envoie un ping à Bing.com toutes les secondes (beaucoup plus fréquemment que les appels à PagerDuty, qui se produisent toutes les 15 secondes). Si la connexion est perdue, la lampe deviendra bleue.

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, en faisant changer les lumières en fonction de l'équipe qui a des alertes et même en déplaçant physiquement un robot basé sur les 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 concerne un voyant 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 http://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
//

// Obtention d'un jeton API PagerDuty depuis
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
Série.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
retard(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(); /* recherche un entier */
Serial.print(“Triggered:”); /* Un peu de débogage série */
Serial.println(résultat);

// Assurez-vous que le dernier bit de données est envoyé.
Série.flush();
retourner 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(); /* recherche un entier */
Serial.print(“Ackd:”); /* Un peu de débogage série */
Serial.println(résultat);

// Assurez-vous que le dernier bit de données est envoyé.
Série.flush();
retourner 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 votre propre projet DIY PagerDuty ? Faites-le nous savoir par email support@pagerduty.com .