class BenchmarkDriver::Output::Rubybench

Common environment variables:

API_URL=rubybench.org
API_NAME
API_PASSWORD
RUBY_COMMIT_HASH or RUBY_VERSION

Benchmark-specific environment variables:

BENCHMARK_TYPE_SCRIPT_URL
BENCHMARK_TYPE_DIGEST
REPO_NAME
ORGANIZATION_NAME

Optional environment variables:

RUBY_ENVIRONMENT

Constants

VERSION

Public Instance Methods

bulk_output(job_context_result:, metrics:) click to toggle source

For maintainability, this doesn't support streaming progress output. @param [Hash{ BenchmarkDriver::Job => Hash{ BenchmarkDriver::Context => BenchmarkDriver::Result } }] job_context_result @param [Array<BenchmarkDriver::Metric>] metrics

# File lib/benchmark_driver/output/rubybench.rb, line 21
def bulk_output(job_context_result:, metrics:)
  metrics.each do |metric|
    job_context_result.each do |job, context_result|
      create_benchmark_run(job, metric, context_result)
    end
  end
end

Private Instance Methods

create_benchmark_run(job, metric, context_result) click to toggle source

Create BenchmarkRun record on RubyBench @param [BenchmarkDriver::Job] job @param [BenchmarkDriver::Metric] metric @param [Hash{ BenchmarkDriver::Context => BenchmarkDriver::Result }] context_result

# File lib/benchmark_driver/output/rubybench.rb, line 35
def create_benchmark_run(job, metric, context_result)
  http = Net::HTTP.new(ENV.fetch('API_URL', 'rubybench.org'), ENV['API_PORT'] || 443)
  http.use_ssl = ENV['API_NO_SSL'] != '1'
  request = Net::HTTP::Post.new('/benchmark_runs')
  request.basic_auth(ENV.fetch('API_NAME'), ENV.fetch('API_PASSWORD'))

  initiator_hash = {}
  if ENV.key?('RUBY_COMMIT_HASH')
    initiator_hash['commit_hash'] = ENV['RUBY_COMMIT_HASH']
  elsif ENV.key?('RUBY_VERSION')
    initiator_hash['version'] = ENV['RUBY_VERSION']
  end

  result_hash = {}
  context_result.each do |context, result|
    initiator_hash["benchmark_run[result][#{context.name}]"] = result.values.fetch(metric)
  end

  ruby_version = context_result.keys.first.executable.description
  if ENV['RUBY_ENVIRONMENT'] == 'true'
    environment = ruby_version
  else
    environment = { 'Ruby version' => ruby_version }.merge(context_result.values.first.environment).to_yaml
  end

  request.set_form_data({
    'benchmark_result_type[name]' => metric.name,
    'benchmark_result_type[unit]' => metric.unit,
    'benchmark_type[category]' => job.name,
    'benchmark_type[script_url]' => ENV.fetch('BENCHMARK_TYPE_SCRIPT_URL'),
    'benchmark_type[digest]' => ENV.fetch('BENCHMARK_TYPE_DIGEST'),
    'benchmark_type[from_user]' => ENV['BENCHMARK_USER_SCRIPT'] == '1',
    'benchmark_run[environment]' => environment,
    'repo' => ENV.fetch('REPO_NAME'),
    'organization' => ENV.fetch('ORGANIZATION_NAME'),
  }.merge(initiator_hash).merge(result_hash))

  response = http.request(request)
  puts "status: #{response.code}, body: #{response.body.inspect}"
end