lib/fluent/plugin/out_slack.rb in fluent-plugin-slack-0.5.5 vs lib/fluent/plugin/out_slack.rb in fluent-plugin-slack-0.6.0

- old
+ new

@@ -12,15 +12,17 @@ config_set_default :include_tag_key, true config_param :webhook_url, :string, default: nil # incoming webhook config_param :slackbot_url, :string, default: nil # slackbot config_param :token, :string, default: nil # api token - config_param :username, :string, default: 'fluentd' - config_param :color, :string, default: 'good' + config_param :username, :string, default: nil + config_param :color, :string, default: nil config_param :icon_emoji, :string, default: nil config_param :icon_url, :string, default: nil - config_param :mrkdwn, :bool, default: false + config_param :mrkdwn, :bool, default: true + config_param :link_names, :bool, default: true + config_param :parse, :string, default: nil config_param :auto_channels_create, :bool, default: false config_param :https_proxy, :string, default: nil config_param :channel, :string config_param :channel_keys, default: nil do |val| @@ -54,29 +56,23 @@ if @webhook_url if @webhook_url.empty? raise Fluent::ConfigError.new("`webhook_url` is an empty string") end - # following default values are for old version compatibility - @title ||= '%s' - @title_keys ||= %w[tag] - @message ||= '[%s] %s' - @message_keys ||= %w[time message] @slack = Fluent::SlackClient::IncomingWebhook.new(@webhook_url) elsif @slackbot_url if @slackbot_url.empty? raise Fluent::ConfigError.new("`slackbot_url` is an empty string") end - @message ||= '%s' - @message_keys ||= %w[message] + if @username or @color or @icon_emoji or @icon_url + log.warn "out_slack: `username`, `color`, `icon_emoji`, `icon_url` parameters are not available for Slackbot Remote Control" + end @slack = Fluent::SlackClient::Slackbot.new(@slackbot_url) elsif @token if @token.empty? raise Fluent::ConfigError.new("`token` is an empty string") end - @message ||= '%s' - @message_keys ||= %w[message] @slack = Fluent::SlackClient::WebApi.new else raise Fluent::ConfigError.new("One of `webhook_url` or `slackbot_url`, or `token` is required") end @slack.log = log @@ -84,10 +80,12 @@ if @https_proxy @slack.https_proxy = @https_proxy end + @message ||= '%s' + @message_keys ||= %w[message] begin @message % (['1'] * @message_keys.length) rescue ArgumentError raise Fluent::ConfigError, "string specifier '%s' for `message` and `message_keys` specification mismatch" end @@ -107,17 +105,20 @@ end if @icon_emoji and @icon_url raise Fluent::ConfigError, "either of `icon_emoji` or `icon_url` can be specified" end - @icon_emoji ||= ':question:' unless @icon_url if @mrkdwn # Enable markdown for attachments. See https://api.slack.com/docs/formatting @mrkdwn_in = %w[text fields] end + if @parse and !%w[none full].include?(@parse) + raise Fluent::ConfigError, "`parse` must be either of `none` or `full`" + end + @post_message_opts = @auto_channels_create ? {auto_channels_create: true} : {} end def format(tag, time, record) [tag, time, record].to_msgpack @@ -140,29 +141,35 @@ private def build_payloads(chunk) if @title build_title_payloads(chunk) + elsif @color + build_color_payloads(chunk) else build_plain_payloads(chunk) end end def common_payload return @common_payload if @common_payload @common_payload = {} - @common_payload[:username] = @username + @common_payload[:username] = @username if @username @common_payload[:icon_emoji] = @icon_emoji if @icon_emoji @common_payload[:icon_url] = @icon_url if @icon_url + @common_payload[:mrkdwn] = @mrkdwn if @mrkdwn + @common_payload[:link_names] = @link_names if @link_names + @common_payload[:parse] = @parse if @parse @common_payload[:token] = @token if @token @common_payload end def common_attachment return @common_attachment if @common_attachment @common_attachment = {} - @common_attachment[:mrkdwn_in] = @mrkdwn_in if @mrkdwn_in + @common_attachment[:color] = @color if @color + @common_attachment[:mrkdwn_in] = @mrkdwn_in if @mrkdwn_in @common_attachment end Field = Struct.new("Field", :title, :value) @@ -177,32 +184,45 @@ end ch_fields.map do |channel, fields| { channel: channel, attachments: [{ - :color => @color, :fallback => fields.values.map(&:title).join(' '), # fallback is the message shown on popup :fields => fields.values.map(&:to_h) }.merge(common_attachment)], }.merge(common_payload) end end - def build_plain_payloads(chunk) + def build_color_payloads(chunk) messages = {} chunk.msgpack_each do |tag, time, record| channel = build_channel(record) messages[channel] ||= '' messages[channel] << "#{build_message(record)}\n" end messages.map do |channel, text| { channel: channel, attachments: [{ - :color => @color, :fallback => text, :text => text, }.merge(common_attachment)], + }.merge(common_payload) + end + end + + def build_plain_payloads(chunk) + messages = {} + chunk.msgpack_each do |tag, time, record| + channel = build_channel(record) + messages[channel] ||= '' + messages[channel] << "#{build_message(record)}\n" + end + messages.map do |channel, text| + { + channel: channel, + text: text, }.merge(common_payload) end end def build_message(record)