{"id":413234,"date":"2024-06-29T23:00:19","date_gmt":"2024-06-29T23:00:19","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=413234"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=413234","title":{"rendered":"<span>Wie ich ein einfaches Monitoring von Kan\u00e4len mit Benachrichtigungen an Slack ohne Erfahrung gemacht habe<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>       Arbeiten im technischen Support brachte zus\u00e4tzlich zu allen Aufgaben die Pflicht mit sich, die Kommunikationskan\u00e4le zu \u00fcberwachen. Dies wurde \u00fcber den Grafana-Dienst realisiert, der die erforderlichen Metriken aus Zabbix bezog. Da die Art der Arbeit jedoch bedeutete, dass man nicht immer an seinem Arbeitsplatz sitzt, kam mir die Idee, dies ein wenig zu automatisieren und Benachrichtigungen auf das Telefon oder zum Beispiel in einen Messenger zu erhalten, falls ein Kommunikationskanal ausf\u00e4llt. Allerdings hatte ich keinen Zugriff auf das Zabbix-System und auch keinen erweiterten Zugriff auf Grafana.<\/p>\n<p>      Also habe ich mir \u00fcberlegt, wie ich das machen k\u00f6nnte. Nach einigem Nachdenken fand ich eine L\u00f6sung. Ich verstehe, dass meine L\u00f6sung nichts Revolution\u00e4res ist, aber vielleicht wird sie f\u00fcr einige n\u00fctzlich sein oder jemand wird etwas vorschlagen. Oder vielleicht wird auch jemand sagen, dass alles schlecht ist.<\/p>\n<p>      Die Funktionsweise ist einfach: Ich \u00fcberpr\u00fcfe mit dem Ping-Befehl die Erreichbarkeit des Kanals, und wenn der Ping nicht erfolgreich ist, ist der Kanal zu 99% nicht verf\u00fcgbar.<\/p>\n<p>     Zuerst habe ich den Bot selbst \u00fcber die Slack-API erstellt.<\/p>\n<ol>\n<li>\n<p>Ich bin auf die Slack-API gegangen: <a href=\"https:\/\/api.slack.com\/apps\" rel=\"noopener noreferrer nofollow\">https:\/\/api.slack.com\/apps<\/a><\/p>\n<\/li>\n<li>\n<p>Habe die Seite &#171;Ihre Apps&#187; ge\u00f6ffnet<\/p>\n<\/li>\n<li>\n<p>Einen Bot erstellt<\/p>\n<\/li>\n<\/ol>\n<p>      Anschlie\u00dfend habe ich einen Webhook erstellt und den Kanal ausgew\u00e4hlt, mit dem er interagieren soll. Es sah ungef\u00e4hr so aus: <a href=\"https:\/\/hooks.slack.com\/services\/xxxxxxxxxxx\/xxxxxxxxxxxxxxxx\/xxxxxxxxxxxxxxxx\" rel=\"noopener noreferrer nofollow\">https:\/\/hooks.slack.com\/services\/xxxxxxxxxxx\/xxxxxxxxxxxxxxxx\/xxxxxxxxxxxxxxxx<\/a><\/p>\n<p>      Au\u00dferdem wurde automatisch ein Bash-Code generiert, mit dem verschiedene Nachrichten vom Terminal aus gesendet werden k\u00f6nnen, zum Beispiel &#171;Hello World&#187;. Wir werden diesen Code verwenden, um Benachrichtigungen zu senden.<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4c7\/fd7\/f3c\/4c7fd7f3c5f39c0751315fbe821622e8.png\" width=\"781\" height=\"136\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4c7\/fd7\/f3c\/4c7fd7f3c5f39c0751315fbe821622e8.png\"\/><\/figure>\n<p>      Als n\u00e4chstes erstellen wir das Skript, das die erforderliche Arbeit f\u00fcr uns erledigt.<\/p>\n<pre><code>#!\/bin\/bash       provider1=xxx.xxx.xxx.xxx                    if \/bin\/ping -c 2 $sevlig > \/dev\/null 2> \/dev\/null     then echo '\u043a\u0430\u043d\u0430\u043b \u0432 \u043d\u043e\u0440\u043c\u0435';     else curl -X POST -H 'Content-type: application\/json' --data '{\"text\":\" \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043a\u0430\u043d\u0430\u043b provider1\"}' https:\/\/hooks.slack.com\/services\/xxxx\/xxxx\/xxxxxx; fi<\/code><\/pre>\n<p>       Erl\u00e4uterungen zum Code:<\/p>\n<ul>\n<li>\n<p><code>#!\/bin\/bash\u00a0\u2014 <\/code>Dies gibt an, in welcher Shell das Skript ausgef\u00fchrt werden soll<\/p>\n<\/li>\n<li>\n<p><code>provider1=xxx.xxx.xxx.xxx\u00a0\u2014 <\/code>Hier werden Variablen mit Werten zugewiesen, in diesem Fall die IP\u2011Adresse des Providers<\/p>\n<\/li>\n<li>\n<p><code>if \/bin\/ping \u2011c 2\u00a0$sevlig > \/dev\/null 2> \/dev\/null\u00a0\u2014 <\/code>Hier starten wir den Ping\u2011Befehl<\/p>\n<\/li>\n<li>\n<p><code>\/bin\/ping \u2011c 2\u00a0\u2014 <\/code>Dies ist der eigentliche Ping\u2011Befehl, wir senden zwei Pakete und warten auf eine Antwort<\/p>\n<\/li>\n<li>\n<p><code>> \/dev\/null 2> \/dev\/null\u00a0\u2014 <\/code>Die Ausgabe des Befehls wird in null umgeleitet, da uns der Ausf\u00fchrungstext des Befehls nicht interessiert, sondern nur der R\u00fcckgabecode<\/p>\n<\/li>\n<\/ul>\n<p>      Wenn der R\u00fcckgabecode 0 ist, bedeutet dies, dass alle Pakete ohne Verluste zugestellt wurden.<\/p>\n<ul>\n<li>\n<p><code>then echo 'Der Kanal funktioniert einwandfrei';<\/code><\/p>\n<\/li>\n<\/ul>\n<p>       In diesem Fall gibt das Skript eine Meldung aus, dass der R\u00fcckgabecode 0 war, d.h. es gab keinen Verlust, und dann endet die Ausf\u00fchrung des Skripts.<\/p>\n<p><code>else curl -X POST -H 'Content-type: application\/json' --data '{\"text\":\" Der Kanal von provider1 ist nicht erreichbar.\"}' https:\/\/hooks.slack.com\/services\/xxxxxxxx\/xxxxxxxxxxx\/xxxxxxxxxxxxxxxx;<\/code><\/p>\n<p>     Wenn der R\u00fcckgabecode nicht 0, sondern ein anderer ist, d.h. es gab Verluste, bedeutet dies, dass es Probleme mit der Erreichbarkeit des Kanals gibt. In diesem Fall wird der zweite Teil des Befehls ausgef\u00fchrt, und es wird \u00fcber Curl \u00fcber den Webhook eine Nachricht an den Slack-Kanal gesendet.<\/p>\n<p><code>fi<\/code> &#8212; Dies ist der Abschluss des Skripts.<\/p>\n<p>     Wir speichern dies alles als Bash-Skriptdatei und machen sie ausf\u00fchrbar.<\/p>\n<p>     Dann automatisieren wir die Ausf\u00fchrung des Skripts, damit es alle 10 Minuten selbstst\u00e4ndig gestartet wird. Daf\u00fcr habe ich &#171;crontab&#187; verwendet.<\/p>\n<pre><code># Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf \/var\/backups\/home.tgz \/home\/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h  dom mon dow   command         *\/10 * * * * \/home\/us\/1.sh<\/code><\/pre>\n<p>      Und hier sehen wir im Slack im Falle eines Kanalausfalls Folgendes:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/313\/dca\/535\/313dca53578b9276d95c5773eb9b328a.png\" alt=\"Der Text hier ist auf Russisch, da ich dieses Skript w\u00e4hrend meiner Arbeit in einem russischen Unternehmen erstellt habe.\" title=\"Der Text hier ist auf Russisch, da ich dieses Skript w\u00e4hrend meiner Arbeit in einem russischen Unternehmen erstellt habe.\" width=\"622\" height=\"73\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/313\/dca\/535\/313dca53578b9276d95c5773eb9b328a.png\"\/><\/p>\n<div><figcaption>Der Text hier ist auf Russisch, da ich dieses Skript w\u00e4hrend meiner Arbeit in einem russischen Unternehmen erstellt habe.<\/figcaption><\/div>\n<\/figure>\n<p>       Vielen Dank, dass Sie meinen Artikel gelesen haben.<br \/> Ich habe auch diesen Artikel auf Russisch in meinem Profil<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/750658\/\"> https:\/\/habr.com\/ru\/articles\/750658\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>       Arbeiten im technischen Support brachte zus\u00e4tzlich zu allen Aufgaben die Pflicht mit sich, die Kommunikationskan\u00e4le zu \u00fcberwachen. Dies wurde \u00fcber den Grafana-Dienst realisiert, der die erforderlichen Metriken aus Zabbix bezog. Da die Art der Arbeit jedoch bedeutete, dass man nicht immer an seinem Arbeitsplatz sitzt, kam mir die Idee, dies ein wenig zu automatisieren und Benachrichtigungen auf das Telefon oder zum Beispiel in einen Messenger zu erhalten, falls ein Kommunikationskanal ausf\u00e4llt. Allerdings hatte ich keinen Zugriff auf das Zabbix-System und auch keinen erweiterten Zugriff auf Grafana.<\/p>\n<p>      Also habe ich mir \u00fcberlegt, wie ich das machen k\u00f6nnte. Nach einigem Nachdenken fand ich eine L\u00f6sung. Ich verstehe, dass meine L\u00f6sung nichts Revolution\u00e4res ist, aber vielleicht wird sie f\u00fcr einige n\u00fctzlich sein oder jemand wird etwas vorschlagen. Oder vielleicht wird auch jemand sagen, dass alles schlecht ist.<\/p>\n<p>      Die Funktionsweise ist einfach: Ich \u00fcberpr\u00fcfe mit dem Ping-Befehl die Erreichbarkeit des Kanals, und wenn der Ping nicht erfolgreich ist, ist der Kanal zu 99% nicht verf\u00fcgbar.<\/p>\n<p>     Zuerst habe ich den Bot selbst \u00fcber die Slack-API erstellt.<\/p>\n<ol>\n<li>\n<p>Ich bin auf die Slack-API gegangen: <a href=\"https:\/\/api.slack.com\/apps\" rel=\"noopener noreferrer nofollow\">https:\/\/api.slack.com\/apps<\/a><\/p>\n<\/li>\n<li>\n<p>Habe die Seite &#171;Ihre Apps&#187; ge\u00f6ffnet<\/p>\n<\/li>\n<li>\n<p>Einen Bot erstellt<\/p>\n<\/li>\n<\/ol>\n<p>      Anschlie\u00dfend habe ich einen Webhook erstellt und den Kanal ausgew\u00e4hlt, mit dem er interagieren soll. Es sah ungef\u00e4hr so aus: <a href=\"https:\/\/hooks.slack.com\/services\/xxxxxxxxxxx\/xxxxxxxxxxxxxxxx\/xxxxxxxxxxxxxxxx\" rel=\"noopener noreferrer nofollow\">https:\/\/hooks.slack.com\/services\/xxxxxxxxxxx\/xxxxxxxxxxxxxxxx\/xxxxxxxxxxxxxxxx<\/a><\/p>\n<p>      Au\u00dferdem wurde automatisch ein Bash-Code generiert, mit dem verschiedene Nachrichten vom Terminal aus gesendet werden k\u00f6nnen, zum Beispiel &#171;Hello World&#187;. Wir werden diesen Code verwenden, um Benachrichtigungen zu senden.<\/p>\n<figure class=\"bordered full-width\"><\/figure>\n<p>      Als n\u00e4chstes erstellen wir das Skript, das die erforderliche Arbeit f\u00fcr uns erledigt.<\/p>\n<pre><code>#!\/bin\/bash       provider1=xxx.xxx.xxx.xxx                    if \/bin\/ping -c 2 $sevlig > \/dev\/null 2> \/dev\/null     then echo '\u043a\u0430\u043d\u0430\u043b \u0432 \u043d\u043e\u0440\u043c\u0435';     else curl -X POST -H 'Content-type: application\/json' --data '{\"text\":\" \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043a\u0430\u043d\u0430\u043b provider1\"}' https:\/\/hooks.slack.com\/services\/xxxx\/xxxx\/xxxxxx; fi<\/code><\/pre>\n<p>       Erl\u00e4uterungen zum Code:<\/p>\n<ul>\n<li>\n<p><code>#!\/bin\/bash\u00a0\u2014 <\/code>Dies gibt an, in welcher Shell das Skript ausgef\u00fchrt werden soll<\/p>\n<\/li>\n<li>\n<p><code>provider1=xxx.xxx.xxx.xxx\u00a0\u2014 <\/code>Hier werden Variablen mit Werten zugewiesen, in diesem Fall die IP\u2011Adresse des Providers<\/p>\n<\/li>\n<li>\n<p><code>if \/bin\/ping \u2011c 2\u00a0$sevlig > \/dev\/null 2> \/dev\/null\u00a0\u2014 <\/code>Hier starten wir den Ping\u2011Befehl<\/p>\n<\/li>\n<li>\n<p><code>\/bin\/ping \u2011c 2\u00a0\u2014 <\/code>Dies ist der eigentliche Ping\u2011Befehl, wir senden zwei Pakete und warten auf eine Antwort<\/p>\n<\/li>\n<li>\n<p><code>> \/dev\/null 2> \/dev\/null\u00a0\u2014 <\/code>Die Ausgabe des Befehls wird in null umgeleitet, da uns der Ausf\u00fchrungstext des Befehls nicht interessiert, sondern nur der R\u00fcckgabecode<\/p>\n<\/li>\n<\/ul>\n<p>      Wenn der R\u00fcckgabecode 0 ist, bedeutet dies, dass alle Pakete ohne Verluste zugestellt wurden.<\/p>\n<ul>\n<li>\n<p><code>then echo 'Der Kanal funktioniert einwandfrei';<\/code><\/p>\n<\/li>\n<\/ul>\n<p>       In diesem Fall gibt das Skript eine Meldung aus, dass der R\u00fcckgabecode 0 war, d.h. es gab keinen Verlust, und dann endet die Ausf\u00fchrung des Skripts.<\/p>\n<p><code>else curl -X POST -H 'Content-type: application\/json' --data '{\"text\":\" Der Kanal von provider1 ist nicht erreichbar.\"}' https:\/\/hooks.slack.com\/services\/xxxxxxxx\/xxxxxxxxxxx\/xxxxxxxxxxxxxxxx;<\/code><\/p>\n<p>     Wenn der R\u00fcckgabecode nicht 0, sondern ein anderer ist, d.h. es gab Verluste, bedeutet dies, dass es Probleme mit der Erreichbarkeit des Kanals gibt. In diesem Fall wird der zweite Teil des Befehls ausgef\u00fchrt, und es wird \u00fcber Curl \u00fcber den Webhook eine Nachricht an den Slack-Kanal gesendet.<\/p>\n<p><code>fi<\/code> &#8212; Dies ist der Abschluss des Skripts.<\/p>\n<p>     Wir speichern dies alles als Bash-Skriptdatei und machen sie ausf\u00fchrbar.<\/p>\n<p>     Dann automatisieren wir die Ausf\u00fchrung des Skripts, damit es alle 10 Minuten selbstst\u00e4ndig gestartet wird. Daf\u00fcr habe ich &#171;crontab&#187; verwendet.<\/p>\n<pre><code># Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf \/var\/backups\/home.tgz \/home\/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h  dom mon dow   command         *\/10 * * * * \/home\/us\/1.sh<\/code><\/pre>\n<p>      Und hier sehen wir im Slack im Falle eines Kanalausfalls Folgendes:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Der Text hier ist auf Russisch, da ich dieses Skript w\u00e4hrend meiner Arbeit in einem russischen Unternehmen erstellt habe.<\/figcaption><\/div>\n<\/figure>\n<p>       Vielen Dank, dass Sie meinen Artikel gelesen haben.<br \/> Ich habe auch diesen Artikel auf Russisch in meinem Profil<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/750658\/\"> https:\/\/habr.com\/ru\/articles\/750658\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-413234","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/413234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=413234"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/413234\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=413234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=413234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=413234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}