class NetuitiveD::MetricAggregator

Attributes

aggregatedSamples[R]
metrics[R]
samples[R]

Public Class Methods

new(apiEmissary) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 7
def initialize(apiEmissary)
  @metrics = []
  @samples = []
  @aggregatedSamples = {}
  @metricMutex = Mutex.new
  @apiEmissary = apiEmissary
end

Public Instance Methods

addCounterSample(metricId, val) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 75
def addCounterSample(metricId, val)
  addSampleWithType(metricId, val, 'COUNTER')
end
addSample(metricId, val) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 71
def addSample(metricId, val)
  addSampleWithType(metricId, val, 'GAUGE')
end
addSampleWithType(metricId, val, type) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 79
def addSampleWithType(metricId, val, type)
  NetuitiveD::ErrorLogger.guard('exception during addSampleWithType') do
    @metricMutex.synchronize do
      NetuitiveD::NetuitiveLogger.log.debug 'start addSample method'
      NetuitiveD::NetuitiveLogger.log.debug "Thread: #{Thread.current.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "self: #{object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "metrics id: #{@metrics.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "samples id: #{@samples.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "aggregatedSamples id: #{@aggregatedSamples.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "metrics before add: #{@metrics.count}"
      NetuitiveD::NetuitiveLogger.log.debug "samples before add: #{@aggregatedSamples.count + @samples.count}"
      if metricId.nil?
        NetuitiveD::NetuitiveLogger.log.info 'null metricId for addSample'
        return false
      end
      if val.nil?
        NetuitiveD::NetuitiveLogger.log.info "null value for addSample for metricId #{metricId}"
        return false
      end
      unless metricExists metricId
        NetuitiveD::NetuitiveLogger.log.info "adding new metric: #{metricId}"
        @metrics.push(NetuitiveD::IngestMetric.new(metricId, metricId, nil, type, nil, false))
      end
      @samples.push(NetuitiveD::IngestSample.new(metricId, Time.new, val, nil, nil, nil, nil, nil))
      NetuitiveD::NetuitiveLogger.log.info "netuitive sample added #{metricId} val: #{val}"
      NetuitiveD::NetuitiveLogger.log.debug "metrics after add: #{@metrics.count}"
      NetuitiveD::NetuitiveLogger.log.debug "samples after add: #{@aggregatedSamples.count + @samples.count}"
      NetuitiveD::NetuitiveLogger.log.debug 'end addSample method'
    end
  end
end
add_aggregate_counter_metrics(samples) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 30
def add_aggregate_counter_metrics(samples)
  return unless samples && !samples.nil?
  samples.each { |sample| aggregateCounterMetric(sample[:metric_id], sample[:val]) }
end
add_aggregate_metrics(samples) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 25
def add_aggregate_metrics(samples)
  return unless samples && !samples.nil?
  samples.each { |sample| aggregateMetric(sample[:metric_id], sample[:val]) }
end
add_counter_samples(samples) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 20
def add_counter_samples(samples)
  return unless samples && !samples.nil?
  samples.each { |sample| addCounterSample(sample[:metric_id], sample[:val]) }
end
add_samples(samples) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 15
def add_samples(samples)
  return unless samples && !samples.nil?
  samples.each { |sample| addSample(sample[:metric_id], sample[:val]) }
end
aggregateCounterMetric(metricId, val) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 122
def aggregateCounterMetric(metricId, val)
  aggregateMetricWithType(metricId, val, 'COUNTER')
end
aggregateMetric(metricId, val) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 118
def aggregateMetric(metricId, val)
  aggregateMetricWithType(metricId, val, 'GAUGE')
end
aggregateMetricWithType(metricId, val, type) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 126
def aggregateMetricWithType(metricId, val, type)
  NetuitiveD::ErrorLogger.guard('exception during aggregateMetricWithType') do
    @metricMutex.synchronize do
      NetuitiveD::NetuitiveLogger.log.debug 'start addSample method'
      NetuitiveD::NetuitiveLogger.log.debug "Thread: #{Thread.current.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "self: #{object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "metrics id: #{@metrics.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "samples id: #{@samples.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "aggregatedSamples id: #{@aggregatedSamples.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "metrics before aggregate: #{@metrics.count}"
      NetuitiveD::NetuitiveLogger.log.debug "samples before aggregate: #{@aggregatedSamples.count + @samples.count}"
      if metricId.nil?
        NetuitiveD::NetuitiveLogger.log.info 'null metricId for aggregateMetric'
        return false
      end
      if val.nil?
        NetuitiveD::NetuitiveLogger.log.info "null value for aggregateMetric for metricId #{metricId}"
        return false
      end
      if !metricExists metricId
        NetuitiveD::NetuitiveLogger.log.info "adding new metric: #{metricId}"
        @metrics.push(NetuitiveD::IngestMetric.new(metricId, metricId, nil, type, nil, false))
        @aggregatedSamples[metricId.to_s] = NetuitiveD::IngestSample.new(metricId, Time.new, val, nil, nil, nil, nil, nil)
      else
        if @aggregatedSamples[metricId.to_s].nil?
          NetuitiveD::NetuitiveLogger.log.info "cannot aggregate metric #{metricId} that already has samples for this interval"
          return false
        end
        previousVal = @aggregatedSamples[metricId.to_s].val
        @aggregatedSamples[metricId.to_s].val += val
        NetuitiveD::NetuitiveLogger.log.info "netuitive sample aggregated #{metricId} old val: #{previousVal} new val: #{@aggregatedSamples[metricId.to_s].val}"
      end
      NetuitiveD::NetuitiveLogger.log.debug "metrics after aggregate: #{@metrics.count}"
      NetuitiveD::NetuitiveLogger.log.debug "samples after aggregate: #{@aggregatedSamples.count + @samples.count}"
      NetuitiveD::NetuitiveLogger.log.debug 'end addSample method'
    end
  end
end
clearMetrics() click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 165
def clearMetrics
  NetuitiveD::ErrorLogger.guard('exception during clearMetrics') do
    NetuitiveD::NetuitiveLogger.log.debug 'start clearMetrics method'
    @metrics = []
    @samples = []
    @aggregatedSamples = {}
    NetuitiveD::NetuitiveLogger.log.info 'netuitive metrics cleared'
    NetuitiveD::NetuitiveLogger.log.debug 'end clearMetrics method'
  end
end
metricExists(metricId) click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 111
def metricExists(metricId)
  @metrics.each do |metric|
    return true if metric.id == metricId
  end
  false
end
sendMetrics() click to toggle source
# File lib/netuitived/metric_aggregator.rb, line 35
def sendMetrics
  NetuitiveD::ErrorLogger.guard('exception during sendMetrics') do
    elementString = nil
    addSample('netuitive.collection_interval', NetuitiveD::ConfigManager.interval)
    @metricMutex.synchronize do
      NetuitiveD::NetuitiveLogger.log.debug "self: #{object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "Thread: #{Thread.current.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "metrics id: #{@metrics.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "samples id: #{@samples.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "aggregatedSamples id: #{@aggregatedSamples.object_id}"
      NetuitiveD::NetuitiveLogger.log.debug "metrics before send: #{@metrics.count}"
      NetuitiveD::NetuitiveLogger.log.debug "samples before send: #{@aggregatedSamples.count + @samples.count}"

      if @metrics.empty?
        NetuitiveD::NetuitiveLogger.log.info 'no netuitive metrics to report'
        return
      end
      aggregatedSamplesArray = @aggregatedSamples.values
      aggregatedSamplesArray.each do |sample|
        sample.timestamp = Time.new
      end
      unless NetuitiveD::ConfigManager.elementTags.nil?
        @tags = []
        NetuitiveD::ConfigManager.elementTags.split(',').map(&:strip).each do |tag|
          @tags.push(NetuitiveD::IngestTag.new(tag.split(':')[0], tag.split(':')[1]))
        end
      end
      element = NetuitiveD::IngestElement.new(NetuitiveD::ConfigManager.elementName, NetuitiveD::ConfigManager.elementName, 'Ruby', nil, @metrics, @samples + aggregatedSamplesArray, @tags, nil)
      elements = [element]
      elementString = elements.to_json
      clearMetrics
    end
    @apiEmissary.sendElements(elementString)
  end
end