diff --git a/exporter/otlp-metrics/README.md b/exporter/otlp-metrics/README.md index ef91e019b..1f0c15caf 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/lib/opentelemetry/exporter/otlp/metrics/util.rb b/exporter/otlp-metrics/lib/opentelemetry/exporter/otlp/metrics/util.rb index 363fb9150..14e0e395c 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(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}}") 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 8819bd36c..c4939229a 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