Skip to content

Commit

Permalink
perf: Skip reporting if there are no metrics (#191)
Browse files Browse the repository at this point in the history
* Skip reporting if there are no metrics

We'll still report the first time through the loop. This lets Judoscale know the adapter is set up correctly.

* Fix test
  • Loading branch information
adamlogic authored Dec 14, 2023
1 parent 9e36ead commit 0835f53
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 4 deletions.
9 changes: 9 additions & 0 deletions judoscale-ruby/lib/judoscale/reporter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -74,17 +74,26 @@ def stop!
@_thread&.terminate
@_thread = nil
@pid = nil
@reported = false
end

private

def report(config, metrics)
# Make sure we report at least once, even if there are no metrics,
# so Judoscale knows the adapter is installed and running.
if @reported && metrics.empty?
logger.debug "No metrics to report - skipping"
return
end

report = Report.new(Judoscale.adapters, config, metrics)
logger.info "Reporting #{report.metrics.size} metrics"
result = AdapterApi.new(config).report_metrics(report.as_json)

case result
when AdapterApi::SuccessResponse
@reported = true
logger.debug "Reported successfully"
when AdapterApi::FailureResponse
logger.error "Reporter failed: #{result.failure_message}"
Expand Down
20 changes: 16 additions & 4 deletions judoscale-ruby/test/reporter_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@ module Judoscale
Judoscale.configure do |config|
config.current_runtime_container = Config::RuntimeContainer.new("web.1")
config.api_base_url = "http://example.com/api/test-token"
config.test_job_config.enabled = true
end
}

after { Reporter.instance.stop! }

describe ".start" do
it "initializes the reporter with the current configuration and loaded adapters" do
reporter_mock = Minitest::Mock.new
Expand All @@ -39,10 +42,6 @@ module Judoscale
end

describe "#start!" do
after {
Reporter.instance.stop!
}

def run_reporter_start_thread
stub_reporter_loop {
reporter_thread = Reporter.instance.start!(Config.instance, Judoscale.adapters)
Expand Down Expand Up @@ -172,6 +171,19 @@ def stub_reporter_loop
assert_requested stub
end

it "only sends an empty (no metrics) report one time" do
metrics_collector = Test::TestEmptyMetricsCollector.new

expected_body = Report.new(Judoscale.adapters, Config.instance, metrics_collector.collect).as_json
stub = stub_request(:post, "http://example.com/api/test-token/v3/reports")
.with(body: JSON.generate(expected_body)).to_return({status: 200}).times(1)

Reporter.instance.run_metrics_collection Config.instance, [metrics_collector]
Reporter.instance.run_metrics_collection Config.instance, [metrics_collector]

assert_requested stub
end

it "logs reporting failures" do
metrics_collector = Test::TestWebMetricsCollector.new

Expand Down
6 changes: 6 additions & 0 deletions judoscale-ruby/test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ def collect
[Metric.new(:qt, 1, Time.now)]
end
end

class TestEmptyMetricsCollector < Judoscale::WebMetricsCollector
def collect
[]
end
end
end

add_adapter :test_web, {}, metrics_collector: Test::TestWebMetricsCollector
Expand Down

0 comments on commit 0835f53

Please sign in to comment.