diff --git a/lib/unleash/metrics_reporter.rb b/lib/unleash/metrics_reporter.rb index 3bf443c..65caa06 100755 --- a/lib/unleash/metrics_reporter.rb +++ b/lib/unleash/metrics_reporter.rb @@ -15,7 +15,23 @@ def initialize def generate_report metrics = Unleash.engine&.get_metrics + return nil if metrics.nil? + generate_report_from_bucket metrics + end + + def post + Unleash.logger.debug "post() Report" + + report = build_report + return unless report + + send_report(report) + end + + private + + def generate_report_from_bucket(bucket) { 'platformName': RUBY_ENGINE, 'platformVersion': RUBY_VERSION, @@ -24,20 +40,23 @@ def generate_report 'appName': Unleash.configuration.app_name, 'instanceId': Unleash.configuration.instance_id, 'connectionId': Unleash.configuration.connection_id, - 'bucket': metrics || {} + 'bucket': bucket } end - def post - Unleash.logger.debug "post() Report" - - report = self.generate_report + def build_report + report = generate_report + return nil if report.nil? && Time.now - self.last_time < LONGEST_WITHOUT_A_REPORT - if report[:bucket].empty? && (Time.now - self.last_time < LONGEST_WITHOUT_A_REPORT) # and last time is less then 10 minutes... - Unleash.logger.debug "Report not posted to server, as it would have been empty. (and has been empty for up to 10 min)" - return - end + report || generate_report_from_bucket({ + 'start': self.last_time.utc.iso8601, + 'stop': Time.now.utc.iso8601, + 'toggles': {} + }) + end + def send_report(report) + self.last_time = Time.now headers = (Unleash.configuration.http_headers || {}).dup headers.merge!({ 'UNLEASH-INTERVAL' => Unleash.configuration.metrics_interval.to_s }) response = Unleash::Util::Http.post(Unleash.configuration.client_metrics_uri, report.to_json, headers) diff --git a/spec/unleash/metrics_reporter_spec.rb b/spec/unleash/metrics_reporter_spec.rb index f26d7fe..0c6e01d 100644 --- a/spec/unleash/metrics_reporter_spec.rb +++ b/spec/unleash/metrics_reporter_spec.rb @@ -127,21 +127,28 @@ Unleash.engine = YggdrasilEngine.new metrics_reporter.last_time = Time.now - 601 - report = metrics_reporter.generate_report - expect(report[:bucket]).to be_empty + metrics_reporter.generate_report metrics_reporter.post - expect(WebMock).to have_requested(:post, 'http://test-url/client/metrics') - .with( - body: hash_including( - yggdrasilVersion: anything, - specVersion: anything, - platformName: anything, - platformVersion: anything, - bucket: {} - ) - ) + expect(WebMock).to(have_requested(:post, 'http://test-url/client/metrics') + .with do |req| + body = JSON.parse(req.body, symbolize_names: true) + + expect(body).to include( + platformName: anything, + platformVersion: anything, + yggdrasilVersion: anything, + specVersion: anything, + bucket: include( + start: anything, + stop: anything, + toggles: {} + ) + ) + + true # tell WebMock we're done matching + end) end it "includes metadata in the report" do