From 6bae4e1a2b6f05b673a3e7241d91e56acad2c8e9 Mon Sep 17 00:00:00 2001 From: Sam <370182+plantfansam@users.noreply.github.com> Date: Wed, 17 Apr 2024 09:27:11 -0600 Subject: [PATCH] feat: add stats for serialization time in otlp exporter (#1628) Co-authored-by: Francis Bogsanyi --- .../otlp/lib/opentelemetry/exporter/otlp/exporter.rb | 6 ++++++ .../test/opentelemetry/exporter/otlp/exporter_test.rb | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/exporter/otlp/lib/opentelemetry/exporter/otlp/exporter.rb b/exporter/otlp/lib/opentelemetry/exporter/otlp/exporter.rb index 55d8fae054..b017e4a30c 100644 --- a/exporter/otlp/lib/opentelemetry/exporter/otlp/exporter.rb +++ b/exporter/otlp/lib/opentelemetry/exporter/otlp/exporter.rb @@ -271,6 +271,7 @@ def backoff?(retry_count:, reason:, retry_after: nil) # rubocop:disable Metrics/ end def encode(span_data) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) Opentelemetry::Proto::Collector::Trace::V1::ExportTraceServiceRequest.encode( Opentelemetry::Proto::Collector::Trace::V1::ExportTraceServiceRequest.new( resource_spans: span_data @@ -298,6 +299,11 @@ def encode(span_data) # rubocop:disable Metrics/MethodLength, Metrics/Cyclomatic rescue StandardError => e OpenTelemetry.handle_error(exception: e, message: 'unexpected error in OTLP::Exporter#encode') nil + ensure + stop = Process.clock_gettime(Process::CLOCK_MONOTONIC) + duration_ms = 1000.0 * (stop - start) + @metrics_reporter.record_value('otel.otlp_exporter.encode_duration', + value: duration_ms) end def as_otlp_span(span_data) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity diff --git a/exporter/otlp/test/opentelemetry/exporter/otlp/exporter_test.rb b/exporter/otlp/test/opentelemetry/exporter/otlp/exporter_test.rb index aa0232d5d9..0f19d9142d 100644 --- a/exporter/otlp/test/opentelemetry/exporter/otlp/exporter_test.rb +++ b/exporter/otlp/test/opentelemetry/exporter/otlp/exporter_test.rb @@ -382,6 +382,17 @@ _(result).must_equal(SUCCESS) end + it 'records metrics' do + metrics_reporter = Minitest::Mock.new + exporter = OpenTelemetry::Exporter::OTLP::Exporter.new(metrics_reporter: metrics_reporter) + stub_request(:post, 'http://localhost:4318/v1/traces').to_timeout.then.to_return(status: 200) + metrics_reporter.expect(:record_value, nil) { |m, _, _| m == 'otel.otlp_exporter.encode_duration' } + metrics_reporter.expect(:record_value, nil) { |m, _, _| m == 'otel.otlp_exporter.message.uncompressed_size' } + metrics_reporter.expect(:record_value, nil) { |m, _, _| m == 'otel.otlp_exporter.message.compressed_size' } + metrics_reporter.expect(:add_to_counter, nil) { |m, _, _| m == 'otel.otlp_exporter.failure' } + exporter.export([OpenTelemetry::TestHelpers.create_span_data]) + end + it 'retries on timeout' do stub_request(:post, 'http://localhost:4318/v1/traces').to_timeout.then.to_return(status: 200) span_data = OpenTelemetry::TestHelpers.create_span_data