Ako vytvoriť Slack Plugin v Jave

Java Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Úvod

Slack je populárny chatovací systém používaný ľuďmi a spoločnosťami z celého sveta. Jednou z vecí, ktorá ho robí tak populárnym, je schopnosť vytvárať naše vlastné doplnky, ktoré môžu pracovať s ľuďmi a kanálmi v rámci jedinej rezervy. Toto používa ich HTTP API.

Slack neponúka oficiálnu sadu SDK na písanie doplnkov v prostredí Java. Existuje však oficiálne schválená komunitná SDK, ktorú budeme používať. Toto nám dáva prístup k takmer všetkému Slack API z Java codebase bez toho, aby sme sa museli zaoberať presnými podrobnosťami API.

Toto využijeme na zostavenie malého robota na monitorovanie systému. Týmto sa periodicky načítava miesto na disku pre miestny počítač a upozorňuje ľudí, ak sa niektoré jednotky príliš zaplnia.

2. Získanie poverení API

Než budeme môcť so Slackom niečo urobiť, musíme vytvorte novú aplikáciu a robota a pripojte ju k našim kanálom.

Najskôr navštívime stránku //api.slack.com/apps. Toto je základňa, odkiaľ spravujeme naše aplikácie Slack. Odtiaľ môžeme vytvárať novú aplikáciu.

Keď to urobíme, musíme zadať názov aplikácie a pracovný priestor Slack, aby sme ju mohli vytvoriť.

Keď to urobíme, aplikácia bola vytvorená a je pripravená na spoluprácu. Ďalšia obrazovka nám umožňuje vytvoriť robota. Toto je falošný používateľ, za ktorého bude plugin konať.

Rovnako ako u každého bežného používateľa, aj tu musíme uviesť meno a meno používateľa. Toto sú nastavenia, ktoré ostatní používatelia v pracovnom priestore Slack uvidia pre tohto používateľa robota, ak s ním niekedy budú interagovať.

Teraz, keď sme to urobili, môžeme v bočnej ponuke zvoliť možnosť „Inštalovať aplikáciu“ a pridajte aplikáciu do nášho pracovného priestoru Slack. Keď to urobíme, môže aplikácia interagovať s našim pracovným priestorom.

Takto získate tokeny, ktoré potrebujeme na to, aby náš doplnok mohol komunikovať so Slackom.

Každý robot interagujúci s iným pracovným priestorom Slack bude mať inú sadu tokenov. Naša aplikácia vyžaduje pri spustení hodnotu „Bot User OAuth Access Token“.

Nakoniec musíme pozvať robota na akékoľvek kanály, do ktorých by mal byť zapojený. Funguje to tak, že ho jednoducho pošlete z kanála - @ system_monitoring v tomto prípade.

3. Pridanie rezervy do nášho projektu

Predtým, ako ho budeme môcť použiť, je potrebné najskôr do nášho pridať závislosti Slack SDK pom.xml spis:

 com.hubspot.slack slack-base $ {slack.version} com.hubspot.slack slack-java-client $ {slack.version} 

3. Štruktúra aplikácie

Jadrom našej aplikácie je schopnosť kontrolovať chyby v systéme. Zastúpime to koncepciou kontroly chýb. Jedná sa o jednoduché rozhranie s jedinou metódou, ktoré sa spúšťa s cieľom skontrolovať chyby a nahlásiť ich:

verejné rozhranie ErrorChecker {void check (); }

Chceme tiež mať prostriedky na hlásenie akýchkoľvek zistených chýb. Toto je ďalšie jednoduché rozhranie, ktoré prevezme vyhlásenie o probléme a vhodne ho nahlási:

verejné rozhranie ErrorReporter {void reportProblem (problém s reťazcom); }

Použitie tohto rozhrania nám umožňuje mať rôzne spôsoby hlásenia problémov. Napríklad môžeme mať taký, ktorý odosiela e-maily, kontaktuje systém hlásenia chýb alebo zasiela správy do nášho systému Slack, aby ľudia dostali okamžité upozornenie.

Za týmto dizajnom stojí každý Kontrola chýb inštancia má svoju vlastnú ErrorReporter použit. To nám dáva flexibilitu, aby sme mohli používať rôznych reportérov chýb pre rôzne kontroly, pretože niektoré chyby môžu byť dôležitejšie ako iné. Napríklad ak sú disky zaplnené na viac ako 90%, čo môže vyžadovať správu pre kanál Slack, ale ak sú zaplnené na viac ako 98%, mohli by sme namiesto toho chcieť namiesto nich posielať súkromné ​​správy konkrétnym ľuďom.

4. Kontrola miesta na disku

Náš nástroj na kontrolu chýb skontroluje veľkosť miesta na disku v lokálnom systéme. Akýkoľvek súborový systém, ktorý má menej ako určité konkrétne percento, sa považuje za chybu a bude sa o ňom hlásiť.

Využijeme NIO2 FileStore API zavedené v prostredí Java 7 na získanie týchto informácií multiplatformným spôsobom.

Poďme sa teraz pozrieť na našu kontrolu chýb:

verejná trieda DiskSpaceErrorChecker implementuje ErrorChecker {private static final Logger LOG = LoggerFactory.getLogger (DiskSpaceErrorChecker.class); súkromný ErrorReporter errorReporter; dvojitý súkromný limit; public DiskSpaceErrorChecker (ErrorReporter errorReporter, dvojitý limit) {this.errorReporter = errorReporter; this.limit = limit; } @Override public void check () {FileSystems.getDefault (). GetFileStores (). ForEach (fileStore -> {try {long totalSpace = fileStore.getTotalSpace (); long usableSpace = fileStore.getUsableSpace (); double usablePercentage = (( double) usableSpace) / totalSpace; if (totalSpace> 0 && usablePercentage <limit) {String error = String.format ("Úložisko súborov% s má iba% d %% využiteľného miesta na disku", fileStore.name (), (int) (usablePercentage * 100)); errorReporter.reportProblem (chyba);}} catch (IOException e) {LOG.error ("Chyba pri získavaní miesta na disku pre úložisko súborov {}", fileStore, e);}}); }}

Tu získavame zoznam všetkých úložísk súborov v lokálnom systéme a potom každú z nich kontrolujeme osobitne. Ktokoľvek, kto má menej ako náš definovaný limit ako využiteľný priestor, vygeneruje chybu pomocou nášho reportéra chýb.

5. Odosielanie chýb na uvoľnené kanály

Teraz musíme byť schopní nahlásiť naše chyby. Náš prvý reportér bude ten, ktorý posiela správy na kanál Slack. Toto umožňuje komukoľvek v kanáli vidieť správu v nádeji, že na ňu niekto zareaguje.

Toto používa a SlackClient, z Slack SDK a názov kanála, na ktorý sa majú správy odoslať. Implementuje tiež naše ErrorReporter rozhranie, aby sme ho mohli ľahko zapojiť do ľubovoľného nástroja na kontrolu chýb, ktorý ho chce použiť:

verejná trieda SlackChannelErrorReporter implementuje ErrorReporter {private SlackClient slackClient; súkromný reťazcový kanál; public SlackChannelErrorReporter (SlackClient slackClient, reťazcový kanál) {this.slackClient = slackClient; this.channel = kanál; } @Override public void reportProblem (problém s reťazcom) {slackClient.postMessage (ChatPostMessageParams.builder () .setText (problém) .setChannelId (kanál) .build ()) .join (). UnwrapOrElseThrow (); }}

6. Zapojenie aplikácie

Teraz sme v pozícii, keď môžeme zapojiť aplikáciu a nechať ju monitorovať náš systém. V záujme tohto tutoriálu budeme používať jazyk Java Časovač a TimerTask ktoré sú súčasťou základného JVM, ale rovnako ľahko by sme na ich vytvorenie mohli použiť Spring alebo akýkoľvek iný rámec.

Zatiaľ to bude mať jediný DiskSpaceErrorChecker ktorý hlási všetky disky, ktoré sú pre náš „všeobecný“ kanál použiteľné pod 10%, a ktoré sa spúšťajú každých 5 minút:

public class MainClass {public static final long MINUTES = 1000 * 60; public static void main (String [] args) hodí IOException {SlackClientRuntimeConfig runtimeConfig = SlackClientRuntimeConfig.builder () .setTokenSupplier (() -> "") .build (); SlackClient slackClient = SlackClientFactory.defaultFactory (). Build (runtimeConfig); ErrorReporter slackChannelErrorReporter = nový SlackChannelErrorReporter (slackClient, "všeobecné"); ErrorChecker diskSpaceErrorChecker10pct = nový DiskSpaceErrorChecker (slackChannelErrorReporter, 0,1); Časovač časovača = nový Časovač (); timer.scheduleAtFixedRate (new TimerTask () {@Override public void run () {diskSpaceErrorChecker10pct.check ();}}, 0, 5 * MINUTY); }}

Musíme nahradiť „“ tokenom, ktorý bol získaný skôr, a potom sme pripravení na spustenie. Akonáhle to urobíme, ak je všetko v poriadku, náš doplnok skontroluje miestne disky a v prípade akýchkoľvek chýb správu Slacku.

7. Posielanie chýb ako súkromné ​​správy

Ďalej pridáme reportér chýb, ktorý namiesto toho odosiela súkromné ​​správy. To môže byť užitočné pri urgentnejších chybách, pretože bude okamžite ping na konkrétneho používateľa namiesto toho, aby sa spoliehal na to, že niekto v kanáli zareaguje.

Náš reportér chýb je tu komplikovanejší, pretože potrebuje komunikáciu s jedným cieleným používateľom:

verejná trieda SlackUserErrorReporter implementuje ErrorReporter {private SlackClient slackClient; súkromný používateľ reťazca; public SlackUserErrorReporter (SlackClient slackClient, používateľ reťazca) {this.slackClient = slackClient; this.user = užívateľ; } @Override public void reportProblem (problém s reťazcom) {UsersInfoResponse usersInfoResponse = slackClient .lookupUserByEmail (UserEmailParams.builder () .setEmail (používateľ) .build ()) .join (). UnwrapOrElseThrow (); ImOpenResponse imOpenResponse = slackClient.openIm (ImOpenParams.builder () .setUserId (usersInfoResponse.getUser (). GetId ()) .build ()) .join (). UnwrapOrElseThrow (); imOpenResponse.getChannel (). ifPresent (kanál -> {slackClient.postMessage (ChatPostMessageParams.builder () .setText (problém) .setChannelId (channel.getId ()) .build ()) .join (). unwrapOrElseThrow ();} ); }}

To, čo tu musíme urobiť, je nájsť používateľa, ktorému zasielame správy, vyhľadaného podľa e-mailovej adresy, pretože to je jedna vec, ktorú nemožno zmeniť. Ďalšie, otvoríme používateľovi kanál IM a potom na tento kanál pošleme našu chybovú správu.

To potom môže byť zapojené v hlavný metódou a upozorníme priamo jedného používateľa:

ErrorReporter slackUserErrorReporter = nový SlackUserErrorReporter (slackClient, "[chránený e-mailom]"); ErrorChecker diskSpaceErrorChecker2pct = nový DiskSpaceErrorChecker (slackUserErrorReporter, 0,02); timer.scheduleAtFixedRate (nový TimerTask () {@Override public void run () {diskSpaceErrorChecker2pct.check ();}}, 0, 5 * MINUTY);

Po dokončení to môžeme spustiť a získať chyby aj v súkromných správach.

8. Záver

Videli sme tu, ako môžeme začleniť Slack do našich nástrojov, aby sme mohli zasielať spätnú väzbu buď celému tímu, alebo jednotlivým členom. Slack API môžeme robiť oveľa viac, tak prečo nevidieť, čo ešte môžeme začleniť.

Ako obvykle, zdrojový kód tohto článku nájdete na GitHub.

Java dole

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ