class InfluxdbLogger::InnerLogger

Public Class Methods

new(options, level, initialized_tags, influxdb_tags) click to toggle source
# File lib/influxdb-logger/logger.rb, line 103
def initialize(options, level, initialized_tags, influxdb_tags)
  self.level = level
  @messages_type = (options[:messages_type] || :array).to_sym
  @tag = options[:tag]
  @severity_key = (options[:severity_key] || :severity).to_sym
  @batch_size = options[:batch_size]
  @interval = options[:interval]
  @series = options[:series]
  @retention = options[:retention]
  @global_tags = {}
  @last_flush_time = Time.now.to_ms
  @value_filter = options[:value_filter] || {}
  @time_precision = options[:time_precision] || 'ns'

  @influxdb_logger = InfluxDB::Client.new(
    **options.slice(:host, :port, :database, :retry, :username, :password, :async),
    time_precision: @time_precision,
    discard_write_errors: true
  )

  @influxdb_tags = influxdb_tags
  @severity = 0
  @messages = []
  @initialized_tags = initialized_tags
  after_initialize if respond_to? :after_initialize
end

Public Instance Methods

[](key) click to toggle source
# File lib/influxdb-logger/logger.rb, line 130
def [](key)
  @global_tags[key]
end
[]=(key, value) click to toggle source
# File lib/influxdb-logger/logger.rb, line 134
def []=(key, value)
  @global_tags[key] = value
end
add(severity, message = nil, progname = nil, &block) click to toggle source
# File lib/influxdb-logger/logger.rb, line 138
def add(severity, message = nil, progname = nil, &block)
  return true if severity < level
  message = (block_given? ? block.call : progname) if message.blank?
  return true if message.blank?
  add_message(severity, message)
  true
end
add_message(severity, message) click to toggle source
# File lib/influxdb-logger/logger.rb, line 154
def add_message(severity, message)
  @severity = severity if @severity < severity

  values =
    case message
      when ::String
        {
          message_type: 'String',
          message: utf8_encoded(message)
        }
      when ::Hash
        message.slice!(*@value_filter[:only]) if @value_filter[:only].present?
        message.except!(*@value_filter[:except]) if @value_filter[:except].present?
        message.merge({
          message_type: 'Hash'
        })
      when ::Exception
        {
          message_type: 'Exception',
          message: message.message,
          class: message.class,
          backtrace: message.backtrace
        }
      else
        {
          message_type: 'Others',
          message: message.inspect
        }
    end

  if @tags
    @initialized_tags.keys.zip(@tags).each do |k, v|
      values[k] = v
    end
  end
  message = {
    series: @series,
    timestamp: Time.now.to_precision(@time_precision),
    tags: values.slice(*@influxdb_tags).merge(@global_tags),
    values: values.except(*@influxdb_tags).merge({
      severity: format_severity(@severity)
    }).transform_values {|value|
      case value
        when ::Numeric, ::String
          value
        when ::Hash
          value.to_json
        when ::Symbol
          value.to_s
        else
          value.inspect
      end
    }
  }

  @messages << message
  flush if @messages.size >= @batch_size || (Time.now.to_ms - @last_flush_time) > @interval
end
close() click to toggle source
# File lib/influxdb-logger/logger.rb, line 222
def close
end
flush() click to toggle source
# File lib/influxdb-logger/logger.rb, line 213
def flush
  return if @messages.empty?
  @influxdb_logger.write_points(@messages, @time_precision, @retention)
  @severity = 0
  @messages.clear
  @last_flush_time = Time.now.to_ms
  @tags = nil
end
format_severity(severity) click to toggle source
# File lib/influxdb-logger/logger.rb, line 233
def format_severity(severity)
  InfluxdbLogger::Logger::SEV_LABEL[severity] || 'ANY'
end
level() click to toggle source
# File lib/influxdb-logger/logger.rb, line 225
def level
  @level
end
level=(l) click to toggle source
# File lib/influxdb-logger/logger.rb, line 229
def level=(l)
  @level = l
end
utf8_encoded(message) click to toggle source
# File lib/influxdb-logger/logger.rb, line 146
def utf8_encoded(message)
  if message.encoding == Encoding::UTF_8
    message
  else
    message.dup.force_encoding(Encoding::UTF_8)
  end
end