module KibanaUrl

Constructs URLs for Kibana queries.

Constants

SORT_MODES

possible sort modes

STANDARD_PATH

stuff after the base URL

TIME_SCOPE_MODES

possible time scoping modes

Attributes

config[RW]

Public Class Methods

configure() { |config| ... } click to toggle source
# File lib/kibana_url.rb, line 36
def configure
  self.config ||= {}
  yield config
end
generate( log_spout: config&.[](:index_patterns)&.keys&.first, columns: ['_source'], query: '*', sort: { log_param_name: 'time', mode: :desc }, refresh_interval: nil, time_scope: { mode: :relative } ) click to toggle source
# File lib/kibana_url.rb, line 68
def generate(
  log_spout: config&.[](:index_patterns)&.keys&.first,
  columns: ['_source'],
  query: '*',
  sort: { log_param_name: 'time', mode: :desc },
  refresh_interval: nil,
  time_scope: { mode: :relative }
)
  if config.nil? ||
     config[:index_patterns].empty? || config[:kibana_base_url].empty?
    raise NotConfiguredError
  end

  # There are two params in Kibana URLs.
  # Each have multiple arguments comma separated.
  a_params = []
  a_params << columns_param(columns)
  a_params << spout_param(log_spout)
  a_params << interval_param
  a_params << query_param(query)
  a_params << sort_param(sort)
  a_params_str = a_params.compact.join(',') # comma delimit params

  g_params = []
  g_params << refresh_interval_param(refresh_interval)
  g_params << time_scope_param(time_scope)
  g_params_str = g_params.compact.join(',') # comma delimit params

  "#{config[:kibana_base_url]}#{STANDARD_PATH}?" \
    "_g=(#{g_params_str})&_a=(#{a_params_str})"
end

Private Class Methods

columns_param(column_names) click to toggle source

Method to construct columns params in query. “columns:!(col_1,col_2,…,col_n)”

# File lib/kibana_url.rb, line 104
def columns_param(column_names)
  column_names.map! { |name| escape(name) }
  "columns:!(#{column_names.join(',')})"
end
date_time_str(time) click to toggle source

Translates a time into a date-time string for Kibana

# File lib/kibana_url.rb, line 162
def date_time_str(time)
  "#{time.utc.strftime('%Y-%m-%d')}T#{time.utc.strftime('%H:%M:%S.%L')}Z"
end
escape(str) click to toggle source

Alias for URL escaping.

# File lib/kibana_url.rb, line 167
def escape(str)
  CGI.escape(str)
end
interval_param() click to toggle source

Method for interval - unclear what this does. “interval:auto”

# File lib/kibana_url.rb, line 117
def interval_param
  "interval:auto"
end
query_param(raw_query_str) click to toggle source

Method for query param. “query:(query_string:(analyze_wildcard:!t,query:'<url escaped query>'))”

# File lib/kibana_url.rb, line 123
def query_param(raw_query_str)
  "query:(query_string:(analyze_wildcard:" \
    "!t,query:'#{escape(raw_query_str)}'))"
end
refresh_interval_param(seconds) click to toggle source

Method to set the refresh interval. “refreshInterval:(display:'<num seconds string>',” \ “pause:!f,section:1,value:<num milliseconds>)”

# File lib/kibana_url.rb, line 137
def refresh_interval_param(seconds)
  return nil unless seconds
  "refreshInterval:(display:'#{seconds}%20seconds'," \
    "pause:!f,section:1,value:#{seconds * 1000})"
end
sort_param(log_param_name: 'time', mode: :desc) click to toggle source

Method to set a particular sort on the logs. “sort:!(<log param name>,<sort mode: :desc or :asc>)”

# File lib/kibana_url.rb, line 130
def sort_param(log_param_name: 'time', mode: :desc)
  "sort:!(#{escape(log_param_name)},#{mode})"
end
spout_param(spout_name) click to toggle source

Method determines correct index pattern (stream from which to draw logs). “index:'<spout name>'”

# File lib/kibana_url.rb, line 111
def spout_param(spout_name)
  "index:'#{config[:index_patterns][spout_name]}'"
end
time_scope_param( mode: :relative, from: Time.now - (15 * 60), to: Time.now ) click to toggle source

Method to set a time scope for the query. Creates “time:(from:<from Time>,mode:<mode>,to:<from Time>)” or nil

# File lib/kibana_url.rb, line 145
def time_scope_param(
  mode: :relative,
  from: Time.now - (15 * 60),
  to: Time.now
)
  if mode == :relative
    to_str = 'now'
    num_seconds_ago = Time.now.to_i - from.to_i
    from_str = "now-#{num_seconds_ago}s"
  elsif mode == :absolute
    to_str = date_time_str(to)
    from_str = date_time_str(from)
  end
  "time:(from:'#{from_str}',mode:#{mode},to:'#{to_str}')"
end