class ScoutSignalfx::PeriodicCallback

This is ran after each reporting period (once per-minute).

Public Instance Methods

call(reporting_period, metadata) click to toggle source
# File lib/scout_signalfx/periodic_callback.rb, line 4
def call(reporting_period, metadata)
  @reporting_period = reporting_period
  @metadata = metadata

  return if controller_metrics.empty?
  ScoutSignalfx.signalfx_client.send(
    gauges: guages,
    counters: counters,
  )
end

Private Instance Methods

controller_error_metrics() click to toggle source
# File lib/scout_signalfx/periodic_callback.rb, line 44
def controller_error_metrics
  @controller_error_metrics ||= metrics.select { |meta,metric| meta.type == 'Errors' && meta.name =~ /\AController/ }
end
controller_metrics() click to toggle source
# File lib/scout_signalfx/periodic_callback.rb, line 40
def controller_metrics
  @controller_metrics ||= metrics.select { |meta,metric| meta.type == 'Controller' }
end
counters() click to toggle source
# File lib/scout_signalfx/periodic_callback.rb, line 59
def counters
  controller_metrics.map do |meta,metric|
      {
        metric: 'web.count',
        value: metric.call_count,
        timestamp: timestamp_ms,
        dimensions: dimensions_for_metric_name(meta.metric_name)
      }
  end + controller_error_metrics.map do |meta,metric|
    {
      metric: 'web.errors.count',
      value: metric.call_count,
      timestamp: timestamp_ms,
      dimensions: dimensions_for_metric_name(meta.name)
    }
  end
end
dimensions_for_metric_name(metric_name) click to toggle source
# File lib/scout_signalfx/periodic_callback.rb, line 77
def dimensions_for_metric_name(metric_name)
  [
    {key: 'host', value: ScoutApm::Agent.instance.context.environment.hostname}, 
    {key: 'transaction', value: signalfx_transaction_name(metric_name)},
    {key: 'app', value: ScoutApm::Agent.instance.context.config.value('name')}
  ]
end
guages() click to toggle source
# File lib/scout_signalfx/periodic_callback.rb, line 48
def guages
  controller_metrics.map do |meta,metric|
    {
      metric: 'web.duration_ms',
      value: (metric.total_call_time / metric.call_count.to_f)*1000,
      timestamp: timestamp_ms,
      dimensions: dimensions_for_metric_name(meta.metric_name)
    }
  end
end
metrics() click to toggle source
# File lib/scout_signalfx/periodic_callback.rb, line 17
def metrics
  @reporting_period.metrics_payload
end
signalfx_transaction_name(transaction_name) click to toggle source

Renames Scout metric names to a more SignalFx-ish format. Ex: Controllers/users/index => users.index

# File lib/scout_signalfx/periodic_callback.rb, line 36
def signalfx_transaction_name(transaction_name)
  @signalfx_transaction_name ||= transaction_name.sub!("Controller/",'').gsub("/",".")
end
timestamp() click to toggle source

The time associated w/the metrics

# File lib/scout_signalfx/periodic_callback.rb, line 22
def timestamp
  Time.at(@metadata[:agent_time].to_i)
end
timestamp_ms() click to toggle source
# File lib/scout_signalfx/periodic_callback.rb, line 26
def timestamp_ms
  timestamp.to_i*1000
end
transaction_name() click to toggle source
# File lib/scout_signalfx/periodic_callback.rb, line 30
def transaction_name
  metrics.keys.first.metric_name
end