Der Blog

DIY Arduino YUN-Integration für PagerDuty Warnmeldungen

von Tony Albanese 26. August 2014 | 4 Minuten Lesezeit

Mit ein wenig Code-Inspiration aus dem Gmail-Lampe , Daniel Gentleman von Gedankenfix ( @Gedankenfix ) hat eine tolle PagerDuty Arduino-Integration erstellt, indem er einen Arduino YUN, eine 3D-gedruckte Kugel und den Neopixel Ring von Adafruit kombiniert hat, um eine visuelle Statusprüfung seines PagerDuty Dashboards zu erstellen. Sehen Sie sich das Video seines Geräts (und seiner Katze) unten in Aktion an:

Mithilfe der API von PagerDuty meldet sich das Gerät alle 15 Sekunden bei PagerDuty an, um seinen Status zu aktualisieren. Das Gerät ist so konfiguriert, dass es sowohl bestätigte als auch ausgelöste Warnungen erkennt. Wenn es bestätigte oder ausgelöste Warnungen erkennt, wechselt die Farbe der Kugel von Orange zu Rot und gibt einen kurzen orangenen Impuls ab. Daniel weist darauf hin, dass dies beabsichtigt ist, um zu erkennen, dass Warnungen in beiden Zuständen vorliegen, die Lampe jedoch für die Dauer eines 15-Sekunden-Zyklus rot bleibt, um den kritischeren Status anzuzeigen. Wenn alle Warnungen behoben sind, leuchtet die Lampe grün.

Sicherstellen der Zuverlässigkeit der Integration

Wie viele DIY-Projekte begann die PagerDuty -Statuslampe als Spaßprojekt. Doch Daniel erkannte, dass diese Lampe ein echtes Bedürfnis nach einem schnellen visuellen Hinweis auf seine offenen Vorfälle erfüllte, das in Zukunft möglicherweise als visuelles Signal für andere dienen könnte, ihn in Ruhe zu lassen, wenn seine Lampe rot ist. Um die Integration zuverlässig zu machen, fügte Daniel dem Arduino eine einfache Funktion hinzu, um nach WLAN zu suchen und sicherzustellen, dass immer eine Verbindung hergestellt wird.

Indem Sie im Home-Verzeichnis ein Shell-Skript ping -c 1 erstellen und die PagerDuty -API-Aufrufe in einen Test für einen Ping einbinden. Daniel teilte uns mit, dass er in seiner endgültigen Version das Gerät jede Sekunde Bing.com pingen lässt (viel häufiger als die Aufrufe von PagerDuty, die alle 15 Sekunden erfolgen). Wenn die Verbindung verloren geht, wird die Lampe zu einem blauen Licht verblassen.

WP_20140814_13_13_41_Pro

Zukünftige Möglichkeiten

Da das Gerät sehr einfache Shell-Skripte und einen E/A-Pin auf dem Arduino Yun verwendet, ist es laut Daniel möglich, dies zu erweitern, um anzuzeigen, wer Bereitschaftsdienst hat, die Lichter je nachdem, welches Team Alarm hat, wechseln zu lassen und sogar einen Roboter basierend auf PagerDuty -API-Aufrufen physisch zu bewegen.

Bereit, Ihr eigenes zu bauen?

WP_20140814_13_14_07_Pro

Folgendes benötigen Sie:

Quellcode:

// Dieser Code ist für eine PagerDuty Statuslampe mit einem Arduino Yun
// mit einem Adafruit NeoPixel-Ring (12 LEDs) an Pin 6.
// Es sind drei Dateien im Stammverzeichnis des Benutzers erforderlich:
// ack.sh (Curl-Anfrage an die API von PagerDuty, um nach bestätigten Warnungen zu suchen)
// trig.sh (Curl-Anfrage an die API von PagerDuty, um nach ausgelösten Warnungen zu suchen)
// cacert.pem (von http://curl.haxx.se/ca/cacert.pem für SSL-Curl-Anfragen)
//
// Beispiel ack.sh (ändert status=acknowledged zu status=triggered für trig.sh
// curl -H „Inhaltstyp: application/json“ -H „Autorisierung: Token
token=[Ihr Token]“ -X GET -G –data-urlencode „status=bestätigt“
https://[IhrePagerDutyURL]. pagerduty.com/api/v1/incidents/count
–cacert /root/cacert.pem
//

// Erhalten Sie ein PagerDuty API-Token von
https://[IhrePagerDutyURL]. pagerduty.com/api_keys
#enthalten<Adafruit_NeoPixel.h>
#PIN 6 definieren
#enthalten<Process.h>
Adafruit_NeoPixel-Streifen = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// Bridge initialisieren
Bridge.begin();
//Seriell initialisieren
Seriell.begin(9600);

// verschiedene Beispielprozesse ausführen
Streifen.beginnen();
strip.show(); // Initialisiere alle Pixel auf „Aus“
colorWipe(strip.Color(0, 0, 255), 50); // Blau
Verzögerung (100);
}
void schleife() {
ackd = runAckd();
: Trig = runTrigger();
wenn ((ackd == 0) und (trig == 0)) {
colorWipe(strip.Color(0, 255, 0), 50); // Grün
}
wenn (ackd >= 1){
colorWipe(Streifen.Farbe(255, 153, 0), 50); // Orange
}
wenn (trig >= 1){
colorWipe(strip.Color(255, 0, 0), 50); // Rot
}
Verzögerung (15000);
}
int runTrigger() {
Prozess p;// Erstellen Sie einen Prozess und nennen Sie ihn „p“
p.runShellCommand(„/root/trig.sh“);

// Auf ausgelöste Ereignisse prüfen
// Eine Prozessausgabe kann mit den Stream-Methoden gelesen werden
while (p.running()); // nichts tun, bis der Prozess beendet ist, also
Sie erhalten die gesamte Ausgabe
int result = p.parseInt(); /* nach einer Ganzzahl suchen */
Serial.print(„Ausgelöst:“); /* Etwas serielles Debuggen */
Serial.println(Ergebnis);

// Stellen Sie sicher, dass das letzte Datenbit gesendet wird.
Serial.flush();
Ergebnis zurückgeben;
}
int runAckd() {
Prozess p;// Erstellen Sie einen Prozess und nennen Sie ihn „p“
p.runShellCommand(„/root/ack.sh“);

// Auf ausgelöste Ereignisse prüfen
// Eine Prozessausgabe kann mit den Stream-Methoden gelesen werden
while (p.running()); // nichts tun, bis der Prozess beendet ist, also
Sie erhalten die gesamte Ausgabe
int result = p.parseInt(); /* nach einer Ganzzahl suchen */
Serial.print(„Ackd:“); /* Etwas serielles Debuggen */
Serial.println(Ergebnis);

// Stellen Sie sicher, dass das letzte Datenbit gesendet wird.
Serial.flush();
Ergebnis zurückgeben;
}
void colorWipe(uint32_t c, uint8_t warte) {
für (uint16_t i = 0; i
Streifen.SetPixelColor(i, c);
Strip-Show();
Verzögerung (Warten);
}
}

Haben Sie ein eigenes DIY PagerDuty Projekt? Lassen Sie es uns wissen, indem Sie eine E-Mail senden support@pagerduty.com .