Skip to content

Commit 4b323c9

Browse files
authored
feat: Add logging about export status to Metrics SDK (#1947)
* Adds some debug log output for successfully exporting metrics, and additional error logging. Implementation is borrowed from the Batch Log Record Processor. Does not include a count. Eventually that can be handled with the `otel.sdk.exporter.metric_data_point.exported` internal metric. See https://opentelemetry.io/docs/specs/semconv/otel/sdk-metrics/ Fixes: #1888 * Add a test * remove rubocop disable * use endless syntax * remove unused RaisingExporter copied from BLRP test * don't set export interval or timeout * use let statements * Use public force_flush instead of internal export method * Remove skip for Windows platform * remove puts stmt from debugging
1 parent 99311d0 commit 4b323c9

File tree

2 files changed

+90
-1
lines changed

2 files changed

+90
-1
lines changed

metrics_sdk/lib/opentelemetry/sdk/metrics/export/periodic_metric_reader.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,18 @@ def start
123123
def export(timeout: nil)
124124
@export_mutex.synchronize do
125125
collected_metrics = collect
126-
@exporter.export(collected_metrics, timeout: timeout || @export_timeout) unless collected_metrics.empty?
126+
result_code = @exporter.export(collected_metrics, timeout: timeout || @export_timeout) unless collected_metrics.empty?
127+
report_result(result_code)
128+
result_code
129+
end
130+
end
131+
132+
def report_result(result_code)
133+
if result_code == Export::SUCCESS
134+
OpenTelemetry.logger.debug 'Successfully exported metrics'
135+
else
136+
OpenTelemetry.handle_error(exception: ExportError.new('Unable to export metrics'))
137+
OpenTelemetry.logger.error("Result code: #{result_code}")
127138
end
128139
end
129140

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# frozen_string_literal: true
2+
3+
# Copyright The OpenTelemetry Authors
4+
#
5+
# SPDX-License-Identifier: Apache-2.0
6+
7+
require 'test_helper'
8+
9+
describe OpenTelemetry::SDK::Metrics::Export::PeriodicMetricReader do
10+
PeriodicMetricReader = OpenTelemetry::SDK::Metrics::Export::PeriodicMetricReader
11+
SUCCESS = OpenTelemetry::SDK::Metrics::Export::SUCCESS
12+
FAILURE = OpenTelemetry::SDK::Metrics::Export::FAILURE
13+
TIMEOUT = OpenTelemetry::SDK::Metrics::Export::TIMEOUT
14+
15+
class TestExporter
16+
def initialize(status_codes: nil)
17+
@status_codes = status_codes || []
18+
@exported_metrics = []
19+
end
20+
21+
attr_reader :exported_metrics
22+
23+
def export(metrics, timeout: nil)
24+
s = @status_codes.shift
25+
if s.nil? || s == SUCCESS
26+
@exported_metrics.concat(metrics)
27+
SUCCESS
28+
else
29+
s
30+
end
31+
end
32+
33+
def shutdown(timeout: nil) = SUCCESS
34+
35+
def force_flush(timeout: nil) = SUCCESS
36+
end
37+
38+
describe 'exporter with failure' do
39+
let(:exporter) { TestExporter.new(status_codes: [FAILURE]) }
40+
let(:reader) { PeriodicMetricReader.new(exporter: exporter) }
41+
42+
it 'logs export failure as error' do
43+
mock_logger = Minitest::Mock.new
44+
mock_logger.expect(:error, nil, [/Unable to export metrics/])
45+
mock_logger.expect(:error, nil, [/Result code: 1/])
46+
47+
# Stub collect to return a non-empty array so export is actually called
48+
reader.stub(:collect, ['mock_metric']) do
49+
OpenTelemetry.stub(:logger, mock_logger) do
50+
reader.force_flush
51+
end
52+
end
53+
54+
reader.shutdown
55+
mock_logger.verify
56+
end
57+
end
58+
59+
describe 'succesful exporter' do
60+
let(:exporter) { TestExporter.new(status_codes: [SUCCESS]) }
61+
let(:reader) { PeriodicMetricReader.new(exporter: exporter) }
62+
63+
it 'logs successful export as debug' do
64+
mock_logger = Minitest::Mock.new
65+
mock_logger.expect(:debug, nil, ['Successfully exported metrics'])
66+
67+
# Stub collect to return a non-empty array so export is actually called
68+
reader.stub(:collect, ['mock_metric']) do
69+
OpenTelemetry.stub(:logger, mock_logger) do
70+
reader.force_flush
71+
end
72+
end
73+
74+
reader.shutdown
75+
mock_logger.verify
76+
end
77+
end
78+
end

0 commit comments

Comments
 (0)