Hvordan lage et slakk plugin i Java

Java Top

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Introduksjon

Slack er et populært chatsystem som brukes av mennesker og selskaper over hele verden. En av tingene som gjør det så populært er muligheten til å skrive våre egne tilpassede plugins som kan samhandle med mennesker og kanaler i en enkelt slakk. Dette bruker deres HTTP API.

Slack tilbyr ikke en offisiell SDK for å skrive plugins med Java. Imidlertid er det et offisielt godkjent SDK for fellesskap som vi skal bruke. Dette gir oss tilgang til nesten hele Slack API fra en Java-kodebase uten at vi trenger å bekymre oss for de nøyaktige detaljene i API.

Vi bruker dette for å bygge en liten systemovervåking bot. Dette vil med jevne mellomrom hente diskplass for den lokale datamaskinen og varsle folk hvis noen stasjoner blir for fulle.

2. Få API-legitimasjon

Før vi kan gjøre noe med Slack, må vi lage en ny app og en Bot og koble den til kanalene våre.

For det første, la oss gå til //api.slack.com/apps. Dette er basen hvor vi administrerer Slack-appene våre. Herfra kan vi lage en ny app.

Når vi gjør dette, må vi skrive inn et navn på appen og et Slack-arbeidsområde for å opprette det i.

Når vi har gjort dette, er appen opprettet og er klar for oss å jobbe med. Den neste skjermen lar oss lage en Bot. Dette er en falsk bruker som pluginet vil fungere som.

Som med alle vanlige brukere, må vi gi dette et visningsnavn og et brukernavn. Dette er innstillingene som andre brukere i Slack-arbeidsområdet vil se for denne botbrukeren hvis de noen gang kommuniserer med den.

Nå som vi har gjort dette, kan vi velge "Installer app" fra sidemenyen og legg til appen i vårt Slack-arbeidsområde. Når vi har gjort dette, kan appen samhandle med arbeidsområdet vårt.

Dette vil da gi oss tokens vi trenger for at pluginet vårt skal kommunisere med Slack.

Hver bot som samhandler med et annet Slack-arbeidsområde, vil ha et annet sett med tokens. Applikasjonen vår trenger verdien “Bot User OAuth Access Token” for når vi kjører den.

Til slutt må vi inviter boten til alle kanaler den skal være involvert i. Dette fungerer ved å bare sende det meldinger fra kanalen - @system_monitoring i dette tilfellet.

3. Legge til slakk i prosjektet vårt

Før vi kan bruke den, må vi først legge til Slack SDK-avhengigheter i vår pom.xml fil:

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

3. Søknadsstruktur

Kjernen i applikasjonen vår er muligheten til å sjekke for feil i systemet. Vi representerer dette med konseptet Feilkontroll. Dette er et enkelt grensesnitt med en enkelt metode, utløst for å se etter feil og rapportere dem:

offentlig grensesnitt ErrorChecker {void check (); }

Vi vil også ha mulighet til å rapportere eventuelle feil som er funnet. Dette er et annet enkelt grensesnitt som tar en problemstilling og rapporterer det på riktig måte:

offentlig grensesnitt ErrorReporter {void reportProblem (strengproblem); }

Bruken av et grensesnitt her lar oss ha forskjellige måter å rapportere problemer på. For eksempel kan vi ha en som sender e-post, kontakter et feilrapporteringssystem eller sender meldinger til vårt Slack-system for at folk skal få en umiddelbar varsling.

Designet bak dette er at hver ErrorChecker instans får sin egen ErrorReporter å bruke. Dette gir oss fleksibiliteten til å ha forskjellige feilreportere som forskjellige brikker kan bruke, fordi noen feil kan være viktigere enn andre. For eksempel, hvis diskene er over 90% fulle som kan kreve en melding til en Slack-kanal, men hvis de er over 98% fulle, vil vi kanskje i stedet sende private meldinger til bestemte personer.

4. Kontrollere diskplass

Feilkontrollen vår vil sjekke mengden diskplass på det lokale systemet. Ethvert filsystem som har mindre enn en bestemt prosentandel gratis, anses å være en feil og vil bli rapportert som sådan.

Vi bruker NIO2 FileStore API introdusert i Java 7 for å skaffe denne informasjonen på tvers av plattformer.

La oss ta en titt på feilkontrollen vår:

offentlig klasse DiskSpaceErrorChecker implementerer ErrorChecker {privat statisk slutt Logger LOG = LoggerFactory.getLogger (DiskSpaceErrorChecker.class); private ErrorReporter errorReporter; privat dobbel grense; public DiskSpaceErrorChecker (ErrorReporter errorReporter, double limit) {this.errorReporter = errorReporter; this.limit = limit; } @ Overstyr offentlig tomkontroll () {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 ("Feil ved henting av diskplass for fillagring {}", fileStore, e);}}); }}

Her henter vi listen over alle filbutikker på det lokale systemet og sjekker deretter hver enkelt individuelt. Alt som har mindre enn den definerte grensen som brukbar plass, vil generere en feil ved å bruke feilrapporteren vår.

5. Sende feil til slakke kanaler

Vi må nå kunne rapportere feilene våre. Vår første reporter vil være en som sender meldinger til en Slack-kanal. Dette gjør at alle i kanalen kan se meldingen, i håp om at noen vil reagere på den.

Dette bruker en SlackClient, fra Slack SDK, og navnet på kanalen du skal sende meldingene til. Det implementerer også vårt ErrorReporter grensesnitt slik at vi enkelt kan koble den til hvilken feilkontroll som vil bruke 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. Søknadskabling

Vi er nå i stand til å koble applikasjonen og få den til å overvåke systemet vårt. Av hensyn til denne opplæringen skal vi bruke Java Timer og TimerTask som er en del av kjernen JVM, men vi kan like gjerne bruke Spring eller andre rammer for å bygge dette.

Foreløpig vil dette ha en singel DiskSpaceErrorChecker som rapporterer eventuelle disker som er under 10% brukbare til vår "generelle" kanal, og som går hvert 5. minutt:

offentlig klasse MainClass {offentlig statisk finale lang MINUTTER = 1000 * 60; public static void main (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 = new Timer (); timer.scheduleAtFixedRate (ny TimerTask () {@Override public void run () {diskSpaceErrorChecker10pct.check ();}}, 0, 5 * MINUTES); }}

Vi må erstatte “” med symbolet som ble oppnådd tidligere, og så er vi klare til å kjøre. Så snart vi gjør det, hvis alt er riktig, vil pluginet vårt sjekke de lokale stasjonene og sende beskjed til Slack hvis det er noen feil.

7. Sende feil som private meldinger

Deretter skal vi legge til en feilrapporter som sender private meldinger i stedet. Dette kan være nyttig for mer presserende feil siden det vil umiddelbart pinge en bestemt bruker i stedet for å stole på at noen i kanalen reagerer.

Vår feilrapporter her er mer komplisert fordi den trenger å samhandle med en enkelt, målrettet bruker:

offentlig klasse SlackUserErrorReporter implementerer ErrorReporter {private SlackClient slackClient; privat strengbruker; public SlackUserErrorReporter (SlackClient slackClient, String user) {this.slackClient = slackClient; this.user = bruker; } @ 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 (kanal -> {slackClient.postMessage (ChatPostMessageParams.builder () .setText (problem) .setChannelId (channel.getId ()) .build ()). join (). unwrapOrElseThrow ();} ); }}

Det vi må gjøre her er å finne brukeren vi sender meldinger til - slått opp etter e-postadresse, siden dette er den eneste tingen som ikke kan endres. Neste, vi åpner en chat-kanal for brukeren, og deretter legger vi feilmeldingen til den kanalen.

Dette kan deretter kobles til i hoved- metode, og vi vil varsle en enkelt bruker 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 kjøre dette og få private meldinger for feil også.

8. Konklusjon

Vi har her sett hvordan vi kan innlemme Slack i vårt verktøy, slik at vi kan få tilbakemelding til enten hele teamet eller til individuelle medlemmer. Det er mye mer vi kan gjøre med Slack API, så hvorfor ikke se hva mer vi kan innlemme.

Som vanlig kan kildekoden for denne artikkelen finnes på GitHub.

Java bunn

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

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