Skip to content

Commit 1008906

Browse files
committed
Implement partial success logging.
1 parent 6fd249b commit 1008906

File tree

2 files changed

+22
-1
lines changed
  • exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc

2 files changed

+22
-1
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# limitations under the License.
1313

1414
from os import environ
15+
import sys
1516
from typing import Dict, Literal, Optional, Sequence, Tuple, Union
1617
from typing import Sequence as TypingSequence
1718

@@ -109,6 +110,11 @@ def _translate_data(
109110
) -> ExportLogsServiceRequest:
110111
return encode_logs(data)
111112

113+
def _log_partial_success(self, partial_success):
114+
# Override that skips the "logging" module due to the possibility
115+
# of circular logic (logging -> OTLP logs export).
116+
sys.stderr.write(f"Partial success:\n{partial_success}\n")
117+
112118
def export( # type: ignore [reportIncompatibleMethodOverride]
113119
self,
114120
batch: Sequence[LogData],

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
OTEL_EXPORTER_OTLP_HEADERS,
9494
OTEL_EXPORTER_OTLP_INSECURE,
9595
OTEL_EXPORTER_OTLP_TIMEOUT,
96+
OTEL_LOG_LEVEL
9697
)
9798
from opentelemetry.sdk.metrics.export import MetricExportResult, MetricsData
9899
from opentelemetry.sdk.resources import Resource as SDKResource
@@ -257,6 +258,11 @@ def _get_credentials(
257258
return ssl_channel_credentials()
258259

259260

261+
def _should_log_partial_responses():
262+
otel_log_level = environ.get(OTEL_LOG_LEVEL, "off").lower()
263+
return otel_log_level in ["verbose", "debug", "info"]
264+
265+
260266
# pylint: disable=no-member
261267
class OTLPExporterMixin(
262268
ABC, Generic[SDKDataT, ExportServiceRequestT, ExportResultT, ExportStubT]
@@ -293,6 +299,7 @@ def __init__(
293299
self._endpoint = endpoint or environ.get(
294300
OTEL_EXPORTER_OTLP_ENDPOINT, "http://localhost:4317"
295301
)
302+
self._partial_response_logging_enabled = _should_log_partial_responses()
296303

297304
parsed_url = urlparse(self._endpoint)
298305

@@ -374,6 +381,13 @@ def _translate_data(
374381
) -> ExportServiceRequestT:
375382
pass
376383

384+
def _log_partial_success(self, partial_success):
385+
logger.info(f"Partial success:\n{partial_success}")
386+
387+
def _process_response(self, response):
388+
if self._partial_response_logging_enabled and response.HasField("partial_success"):
389+
self._log_partial_success(response.partial_success)
390+
377391
def _export(
378392
self,
379393
data: SDKDataT,
@@ -388,11 +402,12 @@ def _export(
388402
deadline_sec = time() + self._timeout
389403
for retry_num in range(_MAX_RETRYS):
390404
try:
391-
self._client.Export(
405+
response = self._client.Export(
392406
request=self._translate_data(data),
393407
metadata=self._headers,
394408
timeout=deadline_sec - time(),
395409
)
410+
self._process_response(response)
396411
return self._result.SUCCESS # type: ignore [reportReturnType]
397412
except RpcError as error:
398413
retry_info_bin = dict(error.trailing_metadata()).get( # type: ignore [reportAttributeAccessIssue]

0 commit comments

Comments
 (0)