Sådan oprettes et slap plugin i Java

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Introduktion

Slack er et populært chat-system, der bruges af mennesker og virksomheder over hele verden. En af de ting, der gør det så populært, er evnen til at skrive vores egne brugerdefinerede plugins, der kan interagere med mennesker og kanaler inden for en enkelt slap. Dette bruger deres HTTP API.

Slack tilbyder ikke en officiel SDK til skrivning af plugins med Java. Der er dog et officielt godkendt community SDK, som vi skal bruge. Dette giver os adgang til næsten hele Slack API fra en Java-codebase uden at vi behøver at bekymre os om de nøjagtige detaljer i API'en.

Vi bruger dette til at opbygge en lille systemovervågnings bot. Dette henter med jævne mellemrum diskpladsen til den lokale computer og advarer folk, hvis nogen drev bliver for fulde.

2. Opnåelse af API-legitimationsoplysninger

Før vi kan gøre noget med Slack, skal vi Opret en ny app og en bot og tilslut den til vores kanaler.

Lad os først besøge //api.slack.com/apps. Dette er basen, hvorfra vi administrerer vores Slack-apps. Herfra kan vi oprette en ny app.

Når vi gør dette, skal vi indtaste et navn til appen og et Slack-arbejdsområde for at oprette det i.

Når vi har gjort dette, er appen oprettet og klar til at arbejde med. Den næste skærm giver os mulighed for at oprette en Bot. Dette er en falsk bruger, som pluginet fungerer som.

Som med enhver normal bruger er vi nødt til at give dette et displaynavn og et brugernavn. Dette er de indstillinger, som andre brugere i Slack-arbejdsområdet vil se for denne botbruger, hvis de nogensinde interagerer med det.

Nu hvor vi har gjort dette, kan vi vælge "Installer app" fra sidemenuen og tilføj appen til vores Slack-arbejdsområde. Når vi har gjort dette, kan appen interagere med vores arbejdsområde.

Dette giver os derefter de tokens, som vi har brug for, for at vores plugin kan kommunikere med Slack.

Hver bot, der interagerer med et andet Slack-arbejdsområde, vil have et andet sæt tokens. Vores applikation har brug for "Bot User OAuth Access Token" -værdien, når vi kører den.

Endelig skal vi inviter boten til de kanaler, den skal være involveret i. Dette fungerer ved blot at sende det en besked fra kanalen - @system_monitoring I dette tilfælde.

3. Tilføje slap til vores projekt

Før vi kan bruge det, skal vi først tilføje Slack SDK-afhængigheder til vores pom.xml fil:

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

3. Applikationsstruktur

Kernen i vores applikation er evnen til at kontrollere for fejl i systemet. Vi repræsenterer dette med begrebet en fejlkontrol. Dette er en simpel grænseflade med en enkelt metode, udløst for at kontrollere for fejl og rapportere dem:

offentlig grænseflade ErrorChecker {ugyldig kontrol (); }

Vi vil også have midlerne til at rapportere eventuelle fejl, der er fundet. Dette er en anden simpel grænseflade, der tager en problemstilling og rapporterer det passende:

offentlig grænseflade ErrorReporter {ugyldig reportProblem (strengproblem); }

Brug af en grænseflade her giver os mulighed for at have forskellige måder at rapportere problemer på. For eksempel har vi muligvis en, der sender e-mails, kontakter et fejlrapporteringssystem eller sender meddelelser til vores Slack-system, så folk får en øjeblikkelig underretning.

Designet bag dette er, at hver Fejlkontrol instans får sin egen ErrorReporter at bruge. Dette giver os fleksibiliteten til at have forskellige fejlrapporter, som forskellige brikker kan bruge, fordi nogle fejl kan være vigtigere end andre. For eksempel, hvis diskene er over 90% fulde, kan det kræve en besked til en Slack-kanal, men hvis de er over 98% fulde, vil vi måske i stedet sende private beskeder til bestemte personer i stedet.

4. Kontrol af diskplads

Vores fejlkontrol vil kontrollere mængden af ​​diskplads på det lokale system. Ethvert filsystem, der har mindre end en bestemt procentdel gratis, betragtes som en fejl og vil blive rapporteret som sådan.

Vi bruger NIO2 FileStore API introduceret i Java 7 for at få disse oplysninger på tværs af platforme.

Lad os nu se på vores fejlkontrol:

offentlig klasse DiskSpaceErrorChecker implementerer ErrorChecker {privat statisk endelig Logger LOG = LoggerFactory.getLogger (DiskSpaceErrorChecker.class); private ErrorReporter errorReporter; privat dobbelt grænse offentlig DiskSpaceErrorChecker (ErrorReporter errorReporter, dobbelt grænse) {this.errorReporter = errorReporter; this.limit = grænse; } @ Overstyr offentlig tomrumskontrol () {FileSystems.getDefault (). GetFileStores (). ForEach (fileStore -> {prøv {long totalSpace = fileStore.getTotalSpace (); long usableSpace = fileStore.getUsableSpace (); double usablePercentage = ((( dobbelt) usableSpace) / totalSpace; hvis (totalSpace> 0 && usablePercentage <limit) {String error = String.format ("File store% s has only% d %% usable disk space", fileStore.name (), (int) (usablePercentage * 100)); errorReporter.reportProblem (error);}} catch (IOException e) {LOG.error ("Fejl ved hentning af diskplads til fillager {}", fileStore, e);}}); }}

Her henter vi listen over alle filbutikker på det lokale system og kontrollerer derefter hver enkelt individuelt. Enhver, der har mindre end vores definerede grænse som anvendelig plads, genererer en fejl ved hjælp af vores fejlrapporter.

5. Afsendelse af fejl til slap kanaler

Vi skal nu kunne rapportere vores fejl. Vores første reporter vil være en, der sender beskeder til en Slack-kanal. Dette gør det muligt for enhver i kanalen at se meddelelsen i håb om, at nogen vil reagere på den.

Dette bruger en SlackClient, fra Slack SDK og navnet på den kanal, som beskederne skal sendes til. Det implementerer også vores ErrorReporter interface, så vi let kan tilslutte den til den fejlkontrol, der ønsker at bruge den:

offentlig klasse SlackChannelErrorReporter implementerer ErrorReporter {private SlackClient slackClient; privat String kanal; offentlig SlackChannelErrorReporter (SlackClient slackClient, String channel) {this.slackClient = slackClient; this.channel = kanal; } @Override public void reportProblem (String problem) {slackClient.postMessage (ChatPostMessageParams.builder () .setText (problem) .setChannelId (channel) .build ()) .join (). UnwrapOrElseThrow (); }}

6. Ansøgningsledninger

Vi er nu i stand til at overføre applikationen og få den til at overvåge vores system. Af hensyn til denne vejledning skal vi bruge Java Timer og TimerTask der er en del af kernen i JVM, men vi kan lige så let bruge Spring eller andre rammer til at bygge dette.

For nu har dette en single DiskSpaceErrorChecker der rapporterer alle diske, der er under 10% anvendelige til vores "generelle" kanal, og som kører hvert 5. minut:

offentlig klasse MainClass {offentlig statisk endelig lang MINUTTER = 1000 * 60; offentlig statisk ugyldig hoved (String [] args) kaster IOException {SlackClientRuntimeConfig runtimeConfig = SlackClientRuntimeConfig.builder () .setTokenSupplier (() -> "") .build (); SlackClient slackClient = SlackClientFactory.defaultFactory (). Build (runtimeConfig); ErrorReporter slackChannelErrorReporter = ny SlackChannelErrorReporter (slackClient, "generelt"); ErrorChecker diskSpaceErrorChecker10pct = ny DiskSpaceErrorChecker (slackChannelErrorReporter, 0,1); Timer timer = ny Timer (); timer.scheduleAtFixedRate (ny TimerTask () {@ Override public void run () {diskSpaceErrorChecker10pct.check ();}}, 0, 5 * MINUTES); }}

Vi er nødt til at erstatte "" med det token, der blev opnået tidligere, og så er vi klar til at køre. Så snart vi gør det, hvis alt er korrekt, kontrollerer vores plugin de lokale drev og meddeler Slack, hvis der er fejl.

7. Afsendelse af fejl som private meddelelser

Dernæst tilføjer vi en fejlrapporter, der sender private beskeder i stedet. Dette kan være nyttigt for mere presserende fejl, da det vil straks pinge en bestemt bruger i stedet for at stole på, at nogen i kanalen reagerer.

Vores fejlrapporter her er mere kompliceret, fordi den skal interagere med en enkelt, målrettet bruger:

offentlig klasse SlackUserErrorReporter implementerer ErrorReporter {private SlackClient slackClient; privat streng bruger; public SlackUserErrorReporter (SlackClient slackClient, String user) {this.slackClient = slackClient; this.user = bruger; } @Override public void reportProblem (String problem) {UsersInfoResponse usersInfoResponse = slackClient .lookupUserByEmail (UserEmailParams.builder () .setEmail (user) .build ()) .join (). UnwrapOrElseThrow (); ImOpenResponse imOpenResponse = slackClient.openIm (ImOpenParams.builder () .setUserId (usersInfoResponse.getUser (). GetId ()) .build ()) .join (). UnwrapOrElseThrow (); imOpenResponse.getChannel (). ifPresent (channel -> {slackClient.postMessage (ChatPostMessageParams.builder () .setText (problem) .setChannelId (channel.getId ()) .build ()) .join (). unwrapOrElseThrow ();} ); }}

Hvad vi skal gøre her er at finde brugeren, som vi sender beskeder - slået op via e-mail-adresse, da dette er den eneste ting, der ikke kan ændres. Næste, vi åbner en IM-kanal for brugeren, og derefter sender vi vores fejlmeddelelse til den kanal.

Dette kan derefter forbindes i vigtigste metode, og vi advarer en enkelt bruger direkte:

ErrorReporter slackUserErrorReporter = ny SlackUserErrorReporter (slackClient, "[email protected]"); ErrorChecker diskSpaceErrorChecker2pct = ny DiskSpaceErrorChecker (slackUserErrorReporter, 0,02); timer.scheduleAtFixedRate (ny TimerTask () {@ Override public void run () {diskSpaceErrorChecker2pct.check ();}}, 0, 5 * MINUTES);

Når det er gjort, kan vi også køre dette og få private beskeder for fejl.

8. Konklusion

Vi har her set, hvordan vi kan indarbejde Slack i vores værktøj, så vi kan få feedback sendt til enten hele teamet eller til de enkelte medlemmer. Der er meget mere, vi kan gøre med Slack API, så hvorfor ikke se, hvad vi ellers kan inkorporere.

Som normalt kan kildekoden til denne artikel findes på GitHub.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

$config[zx-auto] not found$config[zx-overlay] not found