Как я могу решить ошибку fluentd-plugin-slack при запуске демона Fluentd: неопределенный метод unescape для URI:Module (NoMethodError)

Вопрос или проблема

Я пытаюсь настроить Fluentd для отправки сообщений в Slack. Я установил Fluentd через curl и fluentd-plugin-slack через fluent-gem install fluent-plugin-slack, однако при попытке запустить fluentd с помощью systemctl start fluentd я получаю следующие ошибки:

2024-06-03 21:05:47 +0000 [warn]: 'time_format' указан без 'time_key', будет проигнорирован
/opt/fluent/lib/ruby/gems/3.2.0/gems/fluent-plugin-slack-0.6.7/lib/fluent/plugin/out_slack.rb:137:in `configure': неопределенный метод `unescape' для URI:Module (NoMethodError)

        @channel = URI.unescape(@channel) # совместимость с ранней версией
                      ^^^^^^^^^

Мой файл /etc/fluent/fluentd.conf выглядит следующим образом:

<source>
  @type tail
  path /var/log/secure
  pos_file /var/log/td-agent/selinux_secure.pos
  tag selinux.secure
  <parse>
    @type syslog
  </parse>
</source>

<match selinux.secure>
  @type copy
  <store>
    @type stdout
  </store>
  <store>
    @type slack
    webhook_url $SLACK_WEBHOOK_URL
    channel $SLACK_CHANNEL
    message_keys message
    flush_interval 5s
    buffer_chunk_limit 1m
    buffer_queue_limit 1
  </store>
</match>

Есть идеи? (отредактировано)

Чтобы исправить это, вы можете изменить код плагина в следующей строке:

Файл:
/opt/fluent/lib/ruby/gems/3.2.0/gems/fluent-plugin-slack-0.6.7/lib/fluent/plugin/out_slack.rb:137

Измените:

@channel = URI.unescape(@channel) # совместимость с ранней версией

На:

require 'cgi'
@channel = CGI.unescape(@channel) # совместимость с ранней версией

Пожалуйста, обратите внимание, что fluent-plugin-slack больше не активно поддерживается, поэтому вам придется вручную исправить его, чтобы решить такие проблемы. В качестве альтернативы рассмотрите возможность перехода на более активно поддерживаемый плагин или исследование других способов интеграции Fluentd с Slack.

Ответ или решение

Как решить ошибку fluentd-plugin-slack: undefined method unescape для URI:Module (NoMethodError)

Если вы столкнулись с ошибкой undefined method 'unescape' for URI:Module (NoMethodError) при запуске службы Fluentd с использованием плагина fluent-plugin-slack, это может быть связано с изменениями в библиотеке URI в версии Ruby 3.x. В данной статье мы подробно разберем, как исправить эту проблему, исходя из вашего описания и конфигурации.

Причина ошибки

Ваш лог-файл указывает на строку кода в плагине fluent-plugin-slack:

@channel = URI.unescape(@channel) # old version compatibility

С версии Ruby 3.0 метод unescape был удален из модуля URI. Вместо этого рекомендуется использовать класс CGI, который обеспечивает функциональность для декодирования URL.

Пошаговое руководство по исправлению

  1. Измените код плагина:

    Вам нужно будет внести изменение в код плагина, чтобы использовать CGI.unescape вместо URI.unescape.

    • Откройте файл out_slack.rb по следующему пути:

      /opt/fluent/lib/ruby/gems/3.2.0/gems/fluent-plugin-slack-0.6.7/lib/fluent/plugin/out_slack.rb
    • Найдите строку:

      @channel = URI.unescape(@channel) # old version compatibility
    • Измените её на:

      require 'cgi'
      @channel = CGI.unescape(@channel) # old version compatibility
  2. Сохраните изменения и закройте редактор.

  3. Перезапустите службу Fluentd:

    Для применения изменений необходимо перезапустить службу:

    sudo systemctl restart fluentd
  4. Проверьте логи сервиса:

    Для диагностики возможных дополнительных ошибок, проверьте системные логи:

    sudo journalctl -u fluentd

Важно отметить

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...