Class: ClearSkies::AWS::CloudWatch::Gauge

Inherits:
GreekFire::Gauge
  • Object
show all
Includes:
ActiveModel::Conversion
Defined in:
lib/clear_skies/aws/cloud_watch/gauge.rb

Direct Known Subclasses

Billing, ELBGauge, ElasticBeanstalkGauge, RDSGauge

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(namespace, metric_name, dimensions, statistics, description: nil, aws_parameters: nil, &block) ⇒ Gauge

Returns a new instance of Gauge.



12
13
14
15
16
17
18
19
20
21
22
# File 'lib/clear_skies/aws/cloud_watch/gauge.rb', line 12

def initialize(namespace, metric_name, dimensions, statistics, description:nil, aws_parameters:nil, &block)
  super("#{namespace.underscore.gsub("/", "_")}_#{metric_name.underscore}", description: description)
  @namespace = namespace
  @metric_name = metric_name
  @dimensions = dimensions
  @statistics = statistics.select { |stat| ["SampleCount", "Average", "Sum", "Minimum", "Maximum"].include?(stat.to_s) }
  @extended_statistics = statistics - @statistics
  @aws_parameters = aws_parameters || { }

  @block = block
end

Class Method Details

.cloudwatch_clientObject



24
25
26
# File 'lib/clear_skies/aws/cloud_watch/gauge.rb', line 24

def self.cloudwatch_client
  @client ||= Aws::CloudWatch::Client.new
end

.register(*args, &block) ⇒ Object



8
9
10
# File 'lib/clear_skies/aws/cloud_watch/gauge.rb', line 8

def self.register(*args, &block)
  GreekFire::Metric.register(self.new(*args, &block))
end

Instance Method Details

#aws_metricsObject



28
29
30
31
32
33
34
# File 'lib/clear_skies/aws/cloud_watch/gauge.rb', line 28

def aws_metrics
   Aws::CloudWatch::Resource.new(client: self.class.cloudwatch_client).metrics(
      namespace: @namespace,
      metric_name: @metric_name,
      dimensions: @dimensions.map {|dimension| {name: dimension} }
  ).select { |metrics| metrics.dimensions.count == @dimensions.count }
end

#labels_from_metric(metric) ⇒ Object



36
37
38
39
40
41
# File 'lib/clear_skies/aws/cloud_watch/gauge.rb', line 36

def labels_from_metric(metric)
  metric.dimensions.inject(ActiveSupport::HashWithIndifferentAccess.new) do |labels, dimension|
    labels[dimension.name.underscore] = dimension.value
    labels
  end
end

#metricsObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/clear_skies/aws/cloud_watch/gauge.rb', line 43

def metrics
  aws_metrics.map do |metric|
    labels = labels_from_metric(metric)

    next unless @block.call(labels) if @block

    stats = metric.get_statistics(
        start_time: Time.now.advance(@aws_parameters[:start_time] || {minutes: -6}),
        end_time: Time.now.advance(@aws_parameters[:end_time] || {minutes: -5}),
        period: @aws_parameters[:period] || 1,
        statistics: @statistics,
        extended_statistics: @extended_statistics,
        dimensions: metric.dimensions
    )

    stats.datapoints.map do |datapoint|
      datapoint.to_h.select {|k, v| ![:unit, :timestamp].include?(k) }.map do |key, value|
        if (key == :extended_statistics)
          value.map {|e_key, e_value| GreekFire::Metric.new(name, labels.merge({statistic: e_key}), e_value)}
        else
          GreekFire::Metric.new(name, labels.merge({statistic: key}), value)
        end
      end
    end

  end.flatten.compact
end