class Lambdakiq::Metrics

Attributes

event[R]

Public Class Methods

log(event) click to toggle source
# File lib/lambdakiq/metrics.rb, line 6
def log(event)
  new(event).log
end
new(event) click to toggle source
# File lib/lambdakiq/metrics.rb, line 11
def initialize(event)
  @event = event
  @metrics = []
  @properties = {}
  instrument!
end

Public Instance Methods

log() click to toggle source
# File lib/lambdakiq/metrics.rb, line 18
def log
  logger.info JSON.dump(message)
end

Private Instance Methods

dimensions() click to toggle source
# File lib/lambdakiq/metrics.rb, line 45
def dimensions
  [
    { AppName: rails_app_name },
    { JobEvent: event.name },
    { JobName: job_name }
  ]
end
exception_name() click to toggle source
# File lib/lambdakiq/metrics.rb, line 40
def exception_name
  event.payload[:exception].try(:first) ||
    event.payload[:error]&.class&.name
end
instrument!() click to toggle source
# File lib/lambdakiq/metrics.rb, line 53
def instrument!
  put_metric 'Duration', event.duration.to_i, 'Milliseconds'
  put_metric 'Count', 1, 'Count'
  put_metric 'ExceptionCount', 1, 'Count' if exception_name
  set_property 'JobId', job.job_id
  set_property 'JobName', job_name
  set_property 'QueueName', job.queue_name
  set_property 'MessageId', job.provider_job_id if job.provider_job_id
  set_property 'ExceptionName', exception_name if exception_name
  set_property 'EnqueuedAt', job.enqueued_at if job.enqueued_at
  set_property 'Executions', job.executions if job.executions
  job.arguments.each_with_index do |argument, index|
    set_property "JobArg#{index+1}", argument
  end
end
job() click to toggle source
# File lib/lambdakiq/metrics.rb, line 24
def job
  event.payload[:job]
end
job_name() click to toggle source
# File lib/lambdakiq/metrics.rb, line 28
def job_name
  job.class.name
end
logger() click to toggle source
# File lib/lambdakiq/metrics.rb, line 32
def logger
  Lambdakiq.config.metrics_logger
end
message() click to toggle source
# File lib/lambdakiq/metrics.rb, line 81
def message
  {
    '_aws': {
      'Timestamp': timestamp,
      'CloudWatchMetrics': [
        {
          'Namespace': namespace,
          'Dimensions': [dimensions.map(&:keys).flatten],
          'Metrics': @metrics
        }
      ]
    }
  }.tap do |m|
    dimensions.each { |d| m.merge!(d) }
    m.merge!(@properties)
  end
end
namespace() click to toggle source
# File lib/lambdakiq/metrics.rb, line 36
def namespace
  Lambdakiq.config.metrics_namespace
end
put_metric(name, value, unit = nil) click to toggle source
# File lib/lambdakiq/metrics.rb, line 69
def put_metric(name, value, unit = nil)
  @metrics << { 'Name': name }.tap do |m|
    m['Unit'] = unit if unit
  end
  set_property name, value
end
rails_app_name() click to toggle source
# File lib/lambdakiq/metrics.rb, line 103
def rails_app_name
  Lambdakiq.config.metrics_app_name ||
    Rails.application.class.name.split('::').first
end
set_property(name, value) click to toggle source
# File lib/lambdakiq/metrics.rb, line 76
def set_property(name, value)
  @properties[name] = value
  self
end
timestamp() click to toggle source
# File lib/lambdakiq/metrics.rb, line 99
def timestamp
  Time.current.strftime('%s%3N').to_i
end