File: metric_collection.rb

package info (click to toggle)
ruby-aws-sdk 1.67.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,840 kB
  • sloc: ruby: 28,436; makefile: 7
file content (129 lines) | stat: -rw-r--r-- 3,937 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
#     http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.

module AWS
  class CloudWatch
    class MetricCollection

      include Core::Collection::WithNextToken

      # @api private
      def initialize options = {}
        @filters = options[:filters] || {}
        super
      end

      # Returns a new collection that will filter results when enumerated.
      #
      # @example Filtering by a namespace
      #
      #   traffic_metrics = metrics.filter('namespace', 'traffic')
      #
      # @example Filtering by a metric name
      #
      #   my_metric = metrics.filter('metric_name', 'my-metric').first
      #
      # @example Filtering by one or more dimensions
      #
      #   metrics = metrics.filter('dimensions', [
      #     { :name => 'n1', :value => 'v1' },
      #     { :name => 'n2', :value => 'v2' },
      #     { :name => 'n3', :value => 'v3' },
      #   ])
      #
      # @param [String,Symbol] name
      # @param [String,Array<String>] value
      # @return [MetricCollection]
      def filter name, value
        filters = @filters.merge(name.to_s.to_sym => value)
        MetricCollection.new(:filters => filters, :config => config)
      end

      # @param [String] namespace
      # @return [MetricCollection]
      def with_namespace namespace
        filter(:namespace, namespace)
      end

      # @param [String] name
      # @return [MetricCollection]
      def with_metric_name name
        filter(:metric_name, name)
      end

      # Returns a collection filtered by the given dimension:
      #
      #     metric = metrics.with_dimension('name', 'value').first
      #
      # You can chain calls to #with_dimension.  Additional dimensions are
      # added.
      #
      #     metrics = metrics.
      #       with_dimension('d1', 'v1').
      #       with_dimension('d2', 'v2').
      #       with_dimension('d3', 'v3')
      #
      #     metrics.each{|metric|} # filtered by all three dimensions
      #
      # @param [String] name
      # @param [String] value
      # @return [MetricCollection]
      def with_dimension name, value
        with_dimensions([{ :name => name, :value => value }])
      end

      # Returns a collection filtered by the given dimensions.
      #
      #     metrics.with_dimensions([
      #       { :name => 'd1', :value => 'v1' },
      #       { :name => 'd2', :value => 'v2' },
      #       { :name => 'd3', :value => 'v3' },
      #     ]).each do |metric|
      #       # ...
      #     end
      #
      # Multiple calls to #with_dimensions will add to previous dimensions.
      # @param [Array<Hash>] dimensions An array of dimensions.  Each dimension
      #   should be a Hash with a `:name` and `:value`.
      # @return [MetricCollection]
      def with_dimensions *dimensions
        filter(:dimensions, (@filters[:dimensions] || []) + dimensions.flatten )
      end

      protected

      def _each_item next_token, options = {}, &block

        options = @filters.merge(options)
        options[:next_token] = next_token if next_token

        resp = client.list_metrics(options)
        resp.data[:metrics].each do |details|

          metric = Metric.new_from(
            :list_metrics, details,
            details[:namespace],
            details[:metric_name],
            details.merge(:config => config))

          yield(metric)

        end

        resp.data[:next_token]

      end

    end
  end
end