benchmark/metrics.rb (57 lines of code) (raw):
# frozen_string_literal: true
module Benchmark
# Namespace for putting metrics into CloudWatch.
module Metrics
# Put metrics into CloudWatch.
def self.put_metric(client:, dims:, timestamp:, metric_name:, metric_value:)
return unless metric_value.is_a?(Numeric) || metric_value.is_a?(Array)
metric_data = {
metric_name: metric_name,
timestamp: timestamp,
unit: metric_unit(metric_name),
dimensions: dims.map { |k, v| { name: k.to_s, value: v } }
}
case metric_value
when Numeric
metric_data[:value] = metric_value
client.put_metric_data(
namespace: metric_namespace,
metric_data: [metric_data]
)
when Array
# CloudWatch has a limit of 150 values
metric_value.each_slice(150) do |values|
metric_data[:values] = values
client.put_metric_data(
namespace: metric_namespace,
metric_data: [metric_data]
)
end
else
raise 'Unknown type for metric value'
end
end
def self.metric_namespace
case ENV.fetch('GH_REPO', nil)
when 'aws/aws-sdk-ruby'
'aws-sdk-ruby-v3-performance'
when 'aws/aws-sdk-ruby-staging'
'aws-sdk-ruby-v3-staging-performance'
when 'smithy-lang/smithy-ruby'
'hearth-performance'
when 'alextwoods/aws-sdk-ruby-v4' # temporary
'aws-sdk-ruby-v4-performance'
else
raise 'Unknown repository'
end
end
class << self
private
def metric_unit(metric_name)
unit_suffix = metric_name.split('_').last
{
'kb' => 'Kilobytes',
'b' => 'Bytes',
's' => 'Seconds',
'ms' => 'Milliseconds'
}.fetch(unit_suffix, 'None')
end
end
end
end