Skip to content

Commit b09fe25

Browse files
committed
Fix warning message for OTLP gRPC exporter mixin
Fixes #2780
1 parent 25771ec commit b09fe25

File tree

2 files changed

+67
-3
lines changed

2 files changed

+67
-3
lines changed

exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,15 +321,17 @@ def _export(self, data: TypingSequence[SDKDataT]) -> ExportResultT:
321321
)
322322

323323
logger.warning(
324-
"Transient error %s encountered while exporting span batch, retrying in %ss.",
324+
"Transient error %s encountered while exporting %s, retrying in %ss.",
325325
error.code(),
326+
data.__class__.__name__,
326327
delay,
327328
)
328329
sleep(delay)
329330
continue
330331
else:
331332
logger.error(
332-
"Failed to export span batch, error code: %s",
333+
"Failed to export %s, error code: %s",
334+
data.__class__.__name__,
333335
error.code(),
334336
)
335337

exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,21 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
from logging import WARNING
16+
from types import MethodType
17+
from typing import Sequence
1518
from unittest import TestCase
16-
from unittest.mock import patch
19+
from unittest.mock import Mock, patch
1720

1821
from grpc import Compression
1922

2023
from opentelemetry.exporter.otlp.proto.grpc.exporter import (
24+
ExportServiceRequestT,
2125
InvalidCompressionValueException,
26+
OTLPExporterMixin,
27+
RpcError,
28+
SDKDataT,
29+
StatusCode,
2230
environ_to_compression,
2331
)
2432

@@ -47,3 +55,57 @@ def test_environ_to_compression(self):
4755
)
4856
with self.assertRaises(InvalidCompressionValueException):
4957
environ_to_compression("test_invalid")
58+
59+
@patch("opentelemetry.exporter.otlp.proto.grpc.exporter.expo")
60+
def test_export_warning(self, mock_expo):
61+
62+
mock_expo.configure_mock(**{"return_value": [0]})
63+
64+
rpc_error = RpcError()
65+
66+
def code(self):
67+
return None
68+
69+
rpc_error.code = MethodType(code, rpc_error)
70+
71+
class OTLPMockExporter(OTLPExporterMixin):
72+
73+
_result = Mock()
74+
_stub = Mock(
75+
**{"return_value": Mock(**{"Export.side_effect": rpc_error})}
76+
)
77+
78+
def _translate_data(
79+
self, data: Sequence[SDKDataT]
80+
) -> ExportServiceRequestT:
81+
pass
82+
83+
otlp_mock_exporter = OTLPMockExporter()
84+
85+
with self.assertLogs(level=WARNING) as warning:
86+
# pylint: disable=protected-access
87+
otlp_mock_exporter._export(Mock())
88+
self.assertEqual(
89+
warning.records[0].message,
90+
"Failed to export Mock, error code: None",
91+
)
92+
93+
def code(self): # pylint: disable=function-redefined
94+
return StatusCode.CANCELLED
95+
96+
def trailing_metadata(self):
97+
return {}
98+
99+
rpc_error.code = MethodType(code, rpc_error)
100+
rpc_error.trailing_metadata = MethodType(trailing_metadata, rpc_error)
101+
102+
with self.assertLogs(level=WARNING) as warning:
103+
# pylint: disable=protected-access
104+
otlp_mock_exporter._export(Mock())
105+
self.assertEqual(
106+
warning.records[0].message,
107+
(
108+
"Transient error StatusCode.CANCELLED encountered "
109+
"while exporting Mock, retrying in 0s."
110+
),
111+
)

0 commit comments

Comments
 (0)