From 58e6546bdb735073b9593b3cf6b3d13477487ebc Mon Sep 17 00:00:00 2001 From: xuan-cao-swi Date: Wed, 19 Feb 2025 12:29:41 -0500 Subject: [PATCH 1/3] fix: update out-of-date google-protobuf-any --- .../lib/opentelemetry/exporter/otlp/metrics/util.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exporter/otlp-metrics/lib/opentelemetry/exporter/otlp/metrics/util.rb b/exporter/otlp-metrics/lib/opentelemetry/exporter/otlp/metrics/util.rb index 363fb91504..28ee0963db 100644 --- a/exporter/otlp-metrics/lib/opentelemetry/exporter/otlp/metrics/util.rb +++ b/exporter/otlp-metrics/lib/opentelemetry/exporter/otlp/metrics/util.rb @@ -117,7 +117,8 @@ def backoff?(retry_count:, reason:, retry_after: nil) def log_status(body) status = Google::Rpc::Status.decode(body) details = status.details.map do |detail| - klass_or_nil = ::Google::Protobuf::DescriptorPool.generated_pool.lookup(detail.type_name).msgclass + type_name = detail.type_url.to_s.split('/').last.to_s + klass_or_nil = ::Google::Protobuf::DescriptorPool.generated_pool.lookup(detail.type_name)&.msgclass detail.unpack(klass_or_nil) if klass_or_nil end.compact OpenTelemetry.handle_error(message: "OTLP metrics_exporter received rpc.Status{message=#{status.message}, details=#{details}}") From 2b0cfccfce24e109802a7bdaef370a2135acee8b Mon Sep 17 00:00:00 2001 From: xuan-cao-swi Date: Wed, 19 Feb 2025 13:53:31 -0500 Subject: [PATCH 2/3] fix typo --- .../lib/opentelemetry/exporter/otlp/metrics/util.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporter/otlp-metrics/lib/opentelemetry/exporter/otlp/metrics/util.rb b/exporter/otlp-metrics/lib/opentelemetry/exporter/otlp/metrics/util.rb index 28ee0963db..14e0e395c2 100644 --- a/exporter/otlp-metrics/lib/opentelemetry/exporter/otlp/metrics/util.rb +++ b/exporter/otlp-metrics/lib/opentelemetry/exporter/otlp/metrics/util.rb @@ -118,7 +118,7 @@ def log_status(body) status = Google::Rpc::Status.decode(body) details = status.details.map do |detail| type_name = detail.type_url.to_s.split('/').last.to_s - klass_or_nil = ::Google::Protobuf::DescriptorPool.generated_pool.lookup(detail.type_name)&.msgclass + klass_or_nil = ::Google::Protobuf::DescriptorPool.generated_pool.lookup(type_name)&.msgclass detail.unpack(klass_or_nil) if klass_or_nil end.compact OpenTelemetry.handle_error(message: "OTLP metrics_exporter received rpc.Status{message=#{status.message}, details=#{details}}") From ca3ac675d35c19007602817cf1a7570592e135d0 Mon Sep 17 00:00:00 2001 From: xuan-cao-swi Date: Wed, 9 Apr 2025 12:04:11 -0400 Subject: [PATCH 3/3] add test case --- exporter/otlp-metrics/README.md | 2 ++ .../otlp/metrics/metrics_exporter_test.rb | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/exporter/otlp-metrics/README.md b/exporter/otlp-metrics/README.md index ef91e019b7..1f0c15caf9 100644 --- a/exporter/otlp-metrics/README.md +++ b/exporter/otlp-metrics/README.md @@ -70,6 +70,8 @@ Or, if you use [bundler][bundler-home], include `opentelemetry-sdk`, `openteleme Then, configure the SDK to use the OTLP metrics exporter ```ruby +ENV['OTEL_METRICS_EXPORTER'] = 'none' + require 'opentelemetry/sdk' require 'opentelemetry-metrics-sdk' require 'opentelemetry/exporter/otlp_metrics' diff --git a/exporter/otlp-metrics/test/opentelemetry/exporter/otlp/metrics/metrics_exporter_test.rb b/exporter/otlp-metrics/test/opentelemetry/exporter/otlp/metrics/metrics_exporter_test.rb index 8819bd36c1..c4939229a4 100644 --- a/exporter/otlp-metrics/test/opentelemetry/exporter/otlp/metrics/metrics_exporter_test.rb +++ b/exporter/otlp-metrics/test/opentelemetry/exporter/otlp/metrics/metrics_exporter_test.rb @@ -501,6 +501,26 @@ OpenTelemetry.logger = logger end + it 'logs rpc.Status on bad request from byte body' do + log_stream = StringIO.new + logger = OpenTelemetry.logger + OpenTelemetry.logger = ::Logger.new(log_stream) + + body = "\b\x03\x12VHTTP 400 (gRPC: INVALID_ARGUMENT): Metric validation removed all of the passed metrics\x1A\xA0\x01\n)type.googleapis.com/google.rpc.BadRequest\x12s\n>\n\x1D.resourceMetrics.scopeMetrics\x12\x1DPath contained no usable data\n1\n\x10.resourceMetrics\x12\x1DPath contained no usable data" + stub_request(:post, 'http://localhost:4318/v1/metrics').to_return(status: 400, body: body, headers: { 'Content-Type' => 'application/x-protobuf' }) + metrics_data = create_metrics_data + + result = exporter.export([metrics_data]) + + _(log_stream.string).must_match( + /ERROR -- : OpenTelemetry error: OTLP metrics_exporter received rpc\.Status{message=HTTP 400 \(gRPC: INVALID_ARGUMENT\): Metric validation removed all of the passed metrics, details=\[\]}/ + ) + + _(result).must_equal(METRICS_FAILURE) + ensure + OpenTelemetry.logger = logger + end + it 'logs a specific message when there is a 404' do log_stream = StringIO.new logger = OpenTelemetry.logger