Hoe maak je een Slack-plug-in in Java

Java Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Inleiding

Slack is een populair chatsysteem dat door mensen en bedrijven over de hele wereld wordt gebruikt. Een van de dingen die het zo populair maken, is de mogelijkheid om onze eigen aangepaste plug-ins te schrijven die binnen een enkele speling kunnen communiceren met mensen en kanalen. Dit maakt gebruik van hun HTTP-API.

Slack biedt geen officiële SDK voor het schrijven van plug-ins met Java. Er is echter een officieel goedgekeurde community-SDK die we gaan gebruiken. Dit geeft ons toegang tot bijna de hele Slack API vanuit een Java-codebase zonder dat we ons zorgen hoeven te maken over de exacte details van de API.

We zullen hiervan gebruik maken om een ‚Äč‚Äčkleine systeembewakingsbot te bouwen. Dit zal periodiek de schijfruimte voor de lokale computer vrijmaken en mensen waarschuwen als een schijf te vol raakt.

2. Verkrijgen van API-inloggegevens

Voordat we iets met Slack kunnen doen, moeten we dat doen maak een nieuwe app en een bot en verbind deze met onze kanalen.

Laten we eerst //api.slack.com/apps bezoeken. Dit is de basis van waaruit we onze Slack-apps beheren. Vanaf hier kunnen we een nieuwe app maken.

Wanneer we dit doen, moeten we een naam voor de app en een Slack-werkruimte invoeren om deze te maken.

Zodra we dit hebben gedaan, is de app gemaakt en kunnen we ermee aan de slag. In het volgende scherm kunnen we een bot maken. Dit is een nepgebruiker waarvoor de plug-in zal werken.

Zoals bij elke normale gebruiker, moeten we dit een weergavenaam en een gebruikersnaam geven. Dit zijn de instellingen die andere gebruikers in de Slack-werkruimte voor deze botgebruiker zullen zien als ze er ooit interactie mee hebben.

Nu we dit hebben gedaan, kunnen we "App installeren" selecteren in het zijmenu en voeg de app toe aan onze Slack-werkruimte. Zodra we dit hebben gedaan, kan de app communiceren met onze werkruimte.

Dit geeft ons dan de tokens die we nodig hebben om onze plug-in te laten communiceren met Slack.

Elke bot die interactie heeft met een andere Slack-werkruimte, heeft een andere set tokens. Onze applicatie heeft de waarde "Bot User OAuth Access Token" nodig voor wanneer we het uitvoeren.

Ten slotte moeten we nodig de bot uit op alle kanalen waarbij hij betrokken zou moeten zijn. Dit werkt door het simpelweg een bericht te sturen vanaf het kanaal - @system_monitoring in dit geval.

3. Slack aan ons project toevoegen

Voordat we het kunnen gebruiken, moeten we eerst de Slack SDK-afhankelijkheden toevoegen aan onze pom.xml het dossier:

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

3. Applicatiestructuur

De kern van onze applicatie is de mogelijkheid om te controleren op fouten in het systeem. We zullen dit vertegenwoordigen met het concept van een foutcontrole. Dit is een eenvoudige interface met een enkele methode, geactiveerd om op fouten te controleren en deze te rapporteren:

openbare interface ErrorChecker {void check (); }

We willen ook de middelen hebben om geconstateerde fouten te rapporteren. Dit is een andere eenvoudige interface die een probleemstelling opneemt en op de juiste manier rapporteert:

openbare interface ErrorReporter {void reportProblem (String-probleem); }

Door hier een interface te gebruiken, hebben we verschillende manieren om problemen te rapporteren. We kunnen er bijvoorbeeld een hebben die e-mails verstuurt, contact opneemt met een foutrapportagesysteem of berichten naar ons Slack-systeem stuurt zodat mensen onmiddellijk een melding kunnen ontvangen.

Het ontwerp hierachter is dat elk ErrorChecker instantie krijgt zijn eigen exemplaar ErrorReporter gebruiken. Dit geeft ons de flexibiliteit om verschillende foutmeldingsprogramma's te hebben die door verschillende controleurs kunnen worden gebruikt, omdat sommige fouten misschien belangrijker zijn dan andere. Als de schijven bijvoorbeeld voor meer dan 90% vol zijn, kan er een bericht naar een Slack-kanaal nodig zijn, maar als ze voor meer dan 98% vol zijn, willen we misschien in plaats daarvan privéberichten naar specifieke mensen sturen.

4. Schijfruimte controleren

Onze foutcontrole controleert de hoeveelheid schijfruimte op het lokale systeem. Elk bestandssysteem dat minder dan een bepaald percentage vrij heeft, wordt als een fout beschouwd en zal als zodanig worden gerapporteerd.

We maken gebruik van de NIO2 FileStore API geïntroduceerd in Java 7 om deze informatie op een platformonafhankelijke manier te verkrijgen.

Laten we nu eens kijken naar onze foutcontrole:

openbare klasse DiskSpaceErrorChecker implementeert ErrorChecker {privé statische laatste Logger LOG = LoggerFactory.getLogger (DiskSpaceErrorChecker.class); privé ErrorReporter errorReporter; privé dubbele limiet; openbare DiskSpaceErrorChecker (ErrorReporter errorReporter, dubbele limiet) {this.errorReporter = errorReporter; this.limit = limiet; } @Override public void check () {FileSystems.getDefault (). GetFileStores (). ForEach (fileStore -> {probeer {long totalSpace = fileStore.getTotalSpace (); long usableSpace = fileStore.getUsableSpace (); dubbel bruikbaarPercentage = (( double) usableSpace) / totalSpace; if (totalSpace> 0 && usablePercentage <limiet) {String error = String.format ("Bestandsopslag% s heeft slechts% d %% bruikbare schijfruimte", fileStore.name (), (int) (usablePercentage * 100)); errorReporter.reportProblem (fout);}} catch (IOException e) {LOG.error ("Fout bij het ophalen van schijfruimte voor bestandsopslag {}", fileStore, e);}}); }}

Hier halen we de lijst met alle bestandsarchieven op het lokale systeem op en controleren we ze allemaal afzonderlijk. Alles dat minder dan onze gedefinieerde limiet als bruikbare ruimte heeft, genereert een fout met behulp van onze foutenrapportage.

5. Fouten verzenden naar Slack-kanalen

We moeten nu onze fouten kunnen rapporteren. Onze eerste reporter zal er een zijn die berichten naar een Slack-kanaal stuurt. Hierdoor kan iedereen in het kanaal het bericht zien, in de hoop dat iemand erop zal reageren.

Dit maakt gebruik van een SlackClient, van de Slack SDK, en de naam van het kanaal waarnaar de berichten moeten worden verzonden. Het implementeert ook onze ErrorReporter interface zodat we het gemakkelijk kunnen aansluiten op de foutcontrole die het wil gebruiken:

openbare klasse SlackChannelErrorReporter implementeert ErrorReporter {privé SlackClient slackClient; privé String-kanaal; openbare SlackChannelErrorReporter (SlackClient slackClient, String-kanaal) {this.slackClient = slackClient; this.channel = kanaal; } @Override public void reportProblem (String-probleem) {slackClient.postMessage (ChatPostMessageParams.builder () .setText (probleem) .setChannelId (kanaal) .build ()) .join (). UntrapOrElseThrow (); }}

6. Applicatiebedrading

We zijn nu in staat om de applicatie te bedraden en ons systeem te laten monitoren. In het belang van deze tutorial gaan we de Java gebruiken Timer en TimerTask die deel uitmaken van de kern van JVM, maar we kunnen net zo goed Spring of een ander framework gebruiken om dit te bouwen.

Voorlopig zal dit er een hebben DiskSpaceErrorChecker die alle schijven die minder dan 10% bruikbaar zijn, rapporteert aan ons "algemene" kanaal, en die elke 5 minuten wordt uitgevoerd:

openbare klasse MainClass {openbare statische laatste lange MINUTES = 1000 * 60; public static void main (String [] args) gooit IOException {SlackClientRuntimeConfig runtimeConfig = SlackClientRuntimeConfig.builder () .setTokenSupplier (() -> "") .build (); SlackClient slackClient = SlackClientFactory.defaultFactory (). Build (runtimeConfig); ErrorReporter slackChannelErrorReporter = nieuwe SlackChannelErrorReporter (slackClient, "algemeen"); ErrorChecker diskSpaceErrorChecker10pct = nieuwe DiskSpaceErrorChecker (slackChannelErrorReporter, 0.1); Timer timer = nieuwe timer (); timer.scheduleAtFixedRate (nieuwe TimerTask () {@Override public void run () {diskSpaceErrorChecker10pct.check ();}}, 0, 5 * MINUTEN); }}

We moeten "" vervangen door het token dat eerder is verkregen, en dan zijn we klaar om te starten. Zodra we dat doen, zal onze plug-in, als alles correct is, de lokale stations controleren en de Slack een bericht sturen als er fouten zijn.

7. Fouten verzenden als privéberichten

Vervolgens gaan we een foutrapportage toevoegen die in plaats daarvan privéberichten verzendt. Dit kan handig zijn voor meer urgente fouten, aangezien dit het geval zal zijn onmiddellijk een specifieke gebruiker pingen in plaats van te vertrouwen op iemand in het kanaal om te reageren.

Onze foutmelding hier is ingewikkelder omdat hij moet communiceren met een enkele, gerichte gebruiker:

openbare klasse SlackUserErrorReporter implementeert ErrorReporter {private SlackClient slackClient; privé String-gebruiker; openbare SlackUserErrorReporter (SlackClient slackClient, String-gebruiker) {this.slackClient = slackClient; this.user = gebruiker; } @Override public void reportProblem (String problem) {UsersInfoResponse usersInfoResponse = slackClient .lookupUserByEmail (UserEmailParams.builder () .setEmail (gebruiker) .build ()) .join (). UntrapOrElseThrow (); ImOpenResponse imOpenResponse = slackClient.openIm (ImOpenParams.builder () .setUserId (usersInfoResponse.getUser (). GetId ()) .build ()) .join (). UntrapOrElseThrow (); imOpenResponse.getChannel (). ifPresent (kanaal -> {slackClient.postMessage (ChatPostMessageParams.builder () .setText (probleem) .setChannelId (kanaal.getId ()) .build ()) .join (). unsrapOrElseThrow ();} ); }}

Wat we hier moeten doen, is de gebruiker vinden die we berichten sturen - opgezocht op e-mailadres, aangezien dit het enige is dat niet kan worden gewijzigd. De volgende, we openen een IM-kanaal voor de gebruiker, en dan posten we onze foutmelding op dat kanaal.

Dit kan dan worden bedraad in de hoofd methode, en we zullen een enkele gebruiker direct waarschuwen:

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

Als we klaar zijn, kunnen we dit uitvoeren en ook privéberichten voor fouten ontvangen.

8. Conclusie

We hebben hier gezien hoe we Slack kunnen integreren in onze tooling, zodat we feedback kunnen laten sturen naar het hele team of naar individuele leden. Er is veel meer dat we kunnen doen met de Slack API, dus waarom zou u niet kijken wat we nog meer kunnen opnemen?

Zoals gewoonlijk is de broncode voor dit artikel te vinden op GitHub.

Java onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS