Skip to content

Slack API requests not respecting the rate limiting

The bot initialization (i.e. POST request to Slack's rtm.connect) doesn't respect the Slack rate limiting.

Likely a limitation of https://github.com/slack-ruby/slack-ruby-client/issues/168 but we could improve that by adding an artificial rate limiter when the exception occurs in config.ru.

Related backtrace from the logs
Slack::Web::Api::Errors::TooManyRequestsError: Retry after 27 seconds
  /usr/local/bundle/gems/slack-ruby-client-0.13.1/lib/slack/web/faraday/response/raise_error.rb:8:in `on_complete'
  /usr/local/bundle/gems/faraday-0.15.4/lib/faraday/response.rb:9:in `block in call'
  /usr/local/bundle/gems/faraday-0.15.4/lib/faraday/response.rb:61:in `on_complete'
  /usr/local/bundle/gems/faraday-0.15.4/lib/faraday/response.rb:8:in `call'
  /usr/local/bundle/gems/faraday-0.15.4/lib/faraday/response.rb:8:in `call'
  /usr/local/bundle/gems/faraday-0.15.4/lib/faraday/request/url_encoded.rb:15:in `call'
  /usr/local/bundle/gems/faraday-0.15.4/lib/faraday/request/multipart.rb:15:in `call'
  /usr/local/bundle/gems/faraday-0.15.4/lib/faraday/rack_builder.rb:143:in `build_response'
  /usr/local/bundle/gems/faraday-0.15.4/lib/faraday/connection.rb:387:in `run_request'
  /usr/local/bundle/gems/faraday-0.15.4/lib/faraday/connection.rb:175:in `post'
  /usr/local/bundle/gems/slack-ruby-client-0.13.1/lib/slack/web/faraday/request.rb:25:in `request'
  /usr/local/bundle/gems/slack-ruby-client-0.13.1/lib/slack/web/faraday/request.rb:10:in `post'
  /usr/local/bundle/gems/slack-ruby-client-0.13.1/lib/slack/web/api/endpoints/rtm.rb:41:in `rtm_start'
  /usr/local/bundle/gems/slack-ruby-client-0.13.1/lib/slack/real_time/client.rb:110:in `build_socket'
  /usr/local/bundle/gems/slack-ruby-client-0.13.1/lib/slack/real_time/client.rb:50:in `start!'
  /usr/local/bundle/gems/slack-ruby-bot-0.11.2/lib/slack-ruby-bot/server.rb:37:in `start!'
  /usr/local/bundle/gems/slack-ruby-bot-0.11.2/lib/slack-ruby-bot/server.rb:29:in `block (2 levels) in run'
  /usr/local/bundle/gems/slack-ruby-bot-0.11.2/lib/slack-ruby-bot/server.rb:69:in `handle_exceptions'
  /usr/local/bundle/gems/slack-ruby-bot-0.11.2/lib/slack-ruby-bot/server.rb:27:in `block in run'
  /usr/local/bundle/gems/slack-ruby-bot-0.11.2/lib/slack-ruby-bot/server.rb:26:in `loop'
  /usr/local/bundle/gems/slack-ruby-bot-0.11.2/lib/slack-ruby-bot/server.rb:26:in `run'
  /usr/local/bundle/gems/slack-ruby-bot-0.11.2/lib/slack-ruby-bot/bot.rb:6:in `run'
  config.ru:6:in `block in <main>'
  /usr/local/bundle/gems/rack-2.0.6/lib/rack/builder.rb:55:in `instance_eval'
  /usr/local/bundle/gems/rack-2.0.6/lib/rack/builder.rb:55:in `initialize'
  config.ru:in `new'
  config.ru:in `<main>'
  /usr/local/bundle/gems/rack-2.0.6/lib/rack/builder.rb:49:in `eval'
  /usr/local/bundle/gems/rack-2.0.6/lib/rack/builder.rb:49:in `new_from_string'
  /usr/local/bundle/gems/rack-2.0.6/lib/rack/builder.rb:40:in `parse_file'
  /usr/local/bundle/gems/puma-3.12.0/lib/puma/configuration.rb:318:in `load_rackup'
  /usr/local/bundle/gems/puma-3.12.0/lib/puma/configuration.rb:243:in `app'
  /usr/local/bundle/gems/puma-3.12.0/lib/puma/runner.rb:145:in `load_and_bind'
  /usr/local/bundle/gems/puma-3.12.0/lib/puma/single.rb:96:in `run'
  /usr/local/bundle/gems/puma-3.12.0/lib/puma/launcher.rb:184:in `run'
  /usr/local/bundle/gems/puma-3.12.0/lib/puma/cli.rb:78:in `run'
  /usr/local/bundle/gems/puma-3.12.0/bin/puma:10:in `<top (required)>'
  /usr/local/bundle/bin/puma:23:in `load'
  /usr/local/bundle/bin/puma:23:in `<top (required)>'