ManageIQ/azure-armrest

View on GitHub
lib/azure/armrest/insights/metrics_service.rb

Summary

Maintainability
A
1 hr
Test Coverage
F
30%
module Azure
  module Armrest
    module Insights
      class MetricsService < ArmrestService
        # Creates and returns a new MetricsService object.
        #
        def initialize(armrest_configuration, options = {})
          super(armrest_configuration, 'metrics', 'Microsoft.Insights', options)
        end

        # Return the metric definitions for the given +provider+, +resource_type+,
        # and +resource_name+ for +resource_group+. You may pass a :filter option as well.
        #
        # NOTE: This uses the older REST API. If you want the newer API, use the
        # list_definitions method below.
        #
        # Example:
        #
        #   metrics = Azure::Armrest::Insights::MetricsService.new(conf)
        #
        #   metrics.list('Microsoft.SQL', 'servers', 'myServer/databases/myDB', 'mygroup')
        #   metrics.list('Microsoft.Compute', 'virtualMachines', 'myVm', 'mygroup')
        #
        def list(provider, resource_type, resource_name, resource_group = nil, options = {})
          resource_group ||= configuration.resource_group

          raise ArgumentError, "no resource group provided" unless resource_group

          url = build_url(provider, resource_type, resource_name, resource_group, options)

          response = rest_get(url)

          Azure::Armrest::ArmrestCollection.create_from_response(
            response,
            Azure::Armrest::Insights::MetricDefinition
          )
        end

        # Returns a list metrics for +resource_id+, which can be either a
        # resource object or a plain resource string. You may also provide
        # hash of filtering +options+ to limit the results. The possible
        # options are:
        #
        #   * :timespan        => The timespan of the query in "start/end" format.
        #   * :interval        => The interval (timegrain) of the query.
        #   * :metricnames     => A comma separated list of metrics to retrieve.
        #   * :aggregation     => A comma separated list of aggregration types to retrieve.
        #   * :segment         => The name of the dimension to segment the metric values by.
        #   * :top             => The maximum number of records to retrieve. Defaults to 10.
        #   * :orderby         => The aggregation to use for sorting.
        #   * :filter          => An expression used to filter the results.
        #   * :resultType      => Reduces the set of data collected. Syntax is dependent on operation.
        #   * :metricnamespace => Metric namespace to query metric definitions for.
        #
        # If no filter expression is defined, the first metric defined
        # for that resource will be returned using the primary aggregation
        # type in the metric defintion over a time period of the last hour.
        #
        #   vms = Azure::Armrest::VirtualMachineService.new(conf)
        #   mts = Azure::Armrest::Insights::MetricService.new(conf)
        #
        #   vm = vms.get('your_vm', 'your_resource_group')
        #
        #   options = {
        #     :metricnames => "'Percentage CPU'"
        #     :timespan    => "2020-02-13T02:20:00Z/2020-02-14T04:20:00Z"
        #     :aggregation => "Average",
        #     :interval    => "PT1M"
        #   }
        #
        #   definitions = mts.list_metrics(vm.id, options)
        #
        def list_metrics(resource, options = {})
          resource_id = resource.respond_to?(:id) ? resource.id : resource
          options[:filter] = options if options.is_a?(String) # For backwards compatibility

          url = File.join(
            configuration.environment.resource_url,
            resource_id,
            'providers/microsoft.insights/metrics'
          )

          url << "?api-version=#{api_version}"

          # The :filter option requires a leading '$'
          options.each do |key, value|
            key.to_s == 'filter' ? url << "&$" : url << "&"
            url << "#{key}=#{value}"
          end

          response = rest_get(url)

          Azure::Armrest::ArmrestCollection.create_from_response(response, Azure::Armrest::Insights::Metric)
        end

        # Get a list of metrics definitions for +resource_id+, which can be
        # either a resource object or a plain resource string. You may also
        # provide a +filter+ to limit the results.
        #
        # Note that the output for this method is different than the list
        # method, which uses an older api-version.
        #
        # Example:
        #
        #   vms = Azure::Armrest::VirtualMachineService.new(conf)
        #   mts = Azure::Armrest::Insights::MetricService.new(conf)
        #
        #   vm = vms.get('your_vm', 'your_resource_group')
        #
        #   # With or without filter
        #   definitions = mts.list_definitions(vm.id)
        #   definitions = mts.list_definitions(vm.id, "name.value eq 'Percentage CPU'")
        #
        def list_definitions(resource, filter = nil)
          resource_id = resource.respond_to?(:id) ? resource.id : resource
          version = configuration.provider_default_api_version(provider, 'metricDefinitions')

          url = File.join(
            configuration.environment.resource_url,
            resource_id,
            'providers/microsoft.insights/metricdefinitions'
          )

          url << "?api-version=#{version}"
          url << "&$filter=#{filter}" if filter

          response = rest_get(url)

          Azure::Armrest::ArmrestCollection.create_from_response(
            response,
            Azure::Armrest::Insights::MetricDefinition
          )
        end

        private

        # Build a URL for the older version of the metrics definitions API.
        #
        def build_url(provider, resource_type, resource_name, resource_group, options)
          url = File.join(
            base_url,
            'resourceGroups',
            resource_group,
            'providers',
            provider,
            resource_type,
            resource_name,
            'metricDefinitions'
          )

          url << "?api-version=2014-04-01"
          url << "&$filter=#{options[:filter]}" if options[:filter]

          url
        end
      end # MetricsService
    end # Insights
  end # Armrest
end # Azure