Рубрики
Без рубрики

Как создать плагин Slack на Java

Краткий и практический обзор того, как создать плагин Slack на Java.

Автор оригинала: Graham Cox.

1. введение

Slack – это популярная система чата, используемая людьми и компаниями по всему миру. Одна из вещей, которая делает его таким популярным, – это возможность писать собственные плагины, которые могут взаимодействовать с людьми и каналами в рамках одной слабины. Это использует их HTTP API.

Slack не предлагает официального SDK для написания плагинов с Java. Тем не менее, существует официально одобренный SDK сообщества , который мы собираемся использовать. Это дает нам доступ почти ко всем API Slack из кодовой базы Java без необходимости беспокоиться о точных деталях API.

Мы используем это для создания небольшого бота для мониторинга системы. Это будет периодически извлекать дисковое пространство для локального компьютера и предупреждать людей, если какие-либо диски становятся слишком заполненными.

2. Получение учетных данных API

Прежде чем мы сможем что-либо сделать с Slack, нам нужно создать новое приложение и загрузиться и подключить его к нашим каналам .

Во-первых, давайте посетим https://api.slack.com/apps . Это база, с которой мы управляем нашими приложениями Slack. Отсюда мы можем создать новое приложение.

Когда мы это сделаем, нам нужно ввести имя приложения и рабочую область Slack для его создания.

Как только мы это сделаем, приложение будет создано и готово к работе. Следующий экран позволяет нам создать бота. Это фальшивый пользователь, в роли которого будет выступать плагин.

Как и в случае с любым обычным пользователем, мы должны дать ему отображаемое имя и имя пользователя. Это настройки, которые другие пользователи в рабочей области Slack увидят для этого пользователя бота, если они когда-либо будут взаимодействовать с ним.

Теперь, когда мы это сделали, мы можем выбрать “Установить приложение” в боковом меню и добавить приложение в нашу рабочую область Slack . Как только мы это сделаем, приложение сможет взаимодействовать с вашим рабочим пространством.

Это даст нам токены, необходимые для нашего плагина для связи со Slack.

Каждый бот, взаимодействующий с другим рабочим пространством Slack, будет иметь другой набор токенов. Наше приложение нуждается в значении “Токен доступа пользователя бота OAuth”, когда мы его запускаем.

Наконец, нам нужно пригласить бота на любые каналы, в которых он должен участвовать . Это работает, просто отправляя сообщение с канала — @system_monitoring в данном случае.

3. Добавление слабины в наш проект

Прежде чем мы сможем его использовать, нам сначала нужно добавить зависимости Slack SDK в ваш pom.xml файл:


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


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

3. Структура приложения

Ядром нашего приложения является возможность проверки на наличие ошибок в системе. Мы представим это с помощью концепции проверки ошибок. Это простой интерфейс с одним методом, запускаемым для проверки ошибок и сообщения о них:

public interface ErrorChecker {
    void check();
}

Мы также хотим иметь возможность сообщать о любых обнаруженных ошибках. Это еще один простой интерфейс, который примет заявление о проблеме и сообщит о ней соответствующим образом:

public interface ErrorReporter {
    void reportProblem(String problem);
}

Использование интерфейса здесь позволяет нам по-разному сообщать о проблемах. Например, у нас может быть один, который отправляет электронные письма, связывается с системой отчетов об ошибках или отправляет сообщения в нашу систему Slack, чтобы люди могли получить немедленное уведомление.

Дизайн этого заключается в том, что каждому экземпляру Error Checker предоставляется свой собственный Error Reporter для использования. Это дает нам гибкость в использовании разных репортеров ошибок для разных шашек, потому что некоторые ошибки могут быть более важными, чем другие. Например, если диски заполнены более чем на 90%, для этого может потребоваться сообщение на канал Slack, но если они заполнены более чем на 98%, мы можем вместо этого отправить личные сообщения определенным людям.

4. Проверка Места На Диске

Наша программа проверки ошибок проверит объем дискового пространства в локальной системе. Любая файловая система, в которой меньше определенного процента свободного места, считается ошибкой и будет сообщена как таковая.

Мы будем использовать API NIO2 FileStore , представленный в Java 7, для получения этой информации кросс-платформенным способом.

Теперь давайте взглянем на нашу проверку ошибок:

public class DiskSpaceErrorChecker implements ErrorChecker {
    private static final Logger LOG = LoggerFactory.getLogger(DiskSpaceErrorChecker.class);

    private ErrorReporter errorReporter;

    private double limit;

    public DiskSpaceErrorChecker(ErrorReporter errorReporter, double 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("File store %s only has %d%% usable disk space",
                        fileStore.name(), (int)(usablePercentage * 100));
                    errorReporter.reportProblem(error);
                }
            } catch (IOException e) {
                LOG.error("Error getting disk space for file store {}", fileStore, e);
            }
        });
    }
}

Здесь мы получаем список всех хранилищ файлов в локальной системе, а затем проверяем каждое из них по отдельности. Любой, у которого меньше определенного нами предела полезного пространства, создаст ошибку с помощью нашего репортера ошибок.

5. Отправка ошибок в каналы Slack

Теперь нам нужно иметь возможность сообщать о наших ошибках. Наш первый репортер будет тем, кто отправляет сообщения на канал Slack. Это позволяет любому участнику канала увидеть сообщение в надежде, что кто-то отреагирует на него.

При этом используется клиент Slack из SDK Slack и имя канала для отправки сообщений. Он также реализует наш интерфейс ErrorReporter , так что мы можем легко подключить его к любому средству проверки ошибок, которое захочет его использовать:

public class SlackChannelErrorReporter implements ErrorReporter {
    private SlackClient slackClient;

    private String channel;

    public SlackChannelErrorReporter(SlackClient slackClient, String channel) {
        this.slackClient = slackClient;
        this.channel = channel;
    }

    @Override
    public void reportProblem(String problem) {
        slackClient.postMessage(
          ChatPostMessageParams.builder()
            .setText(problem)
            .setChannelId(channel)
            .build()
        ).join().unwrapOrElseThrow();
    }
}

6. Применение Проводки

Теперь мы можем подключить приложение и заставить его контролировать нашу систему. Для этого урока мы будем использовать таймер Java и TimerTask, которые являются частью основной JVM, но мы могли бы так же легко использовать Spring или любой другой фреймворк для его создания.

На данный момент это будет иметь единственную проверку ошибок дискового пространства , которая сообщает о любых дисках, которые менее чем на 10% пригодны для использования в нашем “общем” канале, и которая выполняется каждые 5 минут:

public class MainClass {
    public static final long MINUTES = 1000 * 60;

    public static void main(String[] args) throws IOException {
        SlackClientRuntimeConfig runtimeConfig = SlackClientRuntimeConfig.builder()
          .setTokenSupplier(() -> "")
          .build();

        SlackClient slackClient = SlackClientFactory.defaultFactory().build(runtimeConfig);

        ErrorReporter slackChannelErrorReporter = new SlackChannelErrorReporter(slackClient, "general");

        ErrorChecker diskSpaceErrorChecker10pct = 
          new DiskSpaceErrorChecker(slackChannelErrorReporter, 0.1);

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                diskSpaceErrorChecker10pct.check();
            }
        }, 0, 5 * MINUTES);
    }
}

Нам нужно заменить “<Ваш токен API>” на токен, который был получен ранее, и тогда мы готовы к запуску. Как только мы это сделаем, если все правильно, наш плагин проверит локальные диски и сообщит о слабине, если есть какие-либо ошибки.

7. Отправка ошибок в виде личных сообщений

Затем мы добавим репортера ошибок, который вместо этого отправляет личные сообщения. Это может быть полезно для более срочных ошибок, так как он будет немедленно пинговать конкретного пользователя, а не полагаться на кого-то в канале, чтобы отреагировать .

Наш репортер ошибок здесь сложнее, потому что он должен взаимодействовать с одним целевым пользователем:

public class SlackUserErrorReporter implements ErrorReporter {
    private SlackClient slackClient;

    private String user;

    public SlackUserErrorReporter(SlackClient slackClient, String user) {
        this.slackClient = slackClient;
        this.user = user;
    }

    @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();
        });
    }
}

То, что мы должны сделать здесь, — это найти пользователя, с которым мы обмениваемся сообщениями, по адресу электронной почты, поскольку это единственное, что нельзя изменить. Затем мы открываем канал обмена мгновенными сообщениями для пользователя, а затем отправляем наше сообщение об ошибке на этот канал .

Затем это может быть подключено в методе main , и мы предупредим одного пользователя напрямую:

ErrorReporter slackUserErrorReporter = new SlackUserErrorReporter(slackClient, "[email protected]");

ErrorChecker diskSpaceErrorChecker2pct = new DiskSpaceErrorChecker(slackUserErrorReporter, 0.02);

timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        diskSpaceErrorChecker2pct.check();
    }
}, 0, 5 * MINUTES);

После этого мы можем запустить это и получить личные сообщения об ошибках.

8. Заключение

Мы видели здесь, как мы можем включить Slack в наш инструментарий, чтобы мы могли отправлять отзывы либо всей команде, либо отдельным членам. С помощью Slack API мы можем сделать гораздо больше, так почему бы не посмотреть, что еще мы можем включить.

Как обычно, исходный код этой статьи можно найти на GitHub .