Skip to content

Commit 2a2d52a

Browse files
committed
in preparation for a new exporter, factor out duplicated backoff code
1 parent b9f31e9 commit 2a2d52a

File tree

5 files changed

+23
-60
lines changed
  • exporter
    • opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal
    • opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc
    • opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http

5 files changed

+23
-60
lines changed

exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/__init__.py

+15
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
from collections.abc import Sequence
1818
from typing import Any, Mapping, Optional, List, Callable, TypeVar, Dict
1919

20+
import backoff
21+
2022
from opentelemetry.sdk.util.instrumentation import InstrumentationScope
2123
from opentelemetry.proto.common.v1.common_pb2 import (
2224
InstrumentationScope as PB2InstrumentationScope,
@@ -130,3 +132,16 @@ def _get_resource_data(
130132
)
131133
)
132134
return resource_data
135+
136+
137+
# Work around API change between backoff 1.x and 2.x. Since 2.0.0 the backoff
138+
# wait generator API requires a first .send(None) before reading the backoff
139+
# values from the generator.
140+
_is_backoff_v2 = next(backoff.expo()) is None
141+
142+
143+
def _create_exp_backoff_generator(*args, **kwargs):
144+
gen = backoff.expo(*args, **kwargs)
145+
if _is_backoff_v2:
146+
gen.send(None)
147+
return gen

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

+2-15
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838

3939
from opentelemetry.exporter.otlp.proto.common._internal import (
4040
_get_resource_data,
41+
_create_exp_backoff_generator,
4142
)
42-
import backoff
4343
from google.rpc.error_details_pb2 import RetryInfo
4444
from grpc import (
4545
ChannelCredentials,
@@ -137,19 +137,6 @@ def _get_credentials(creds, environ_key):
137137
return ssl_channel_credentials()
138138

139139

140-
# Work around API change between backoff 1.x and 2.x. Since 2.0.0 the backoff
141-
# wait generator API requires a first .send(None) before reading the backoff
142-
# values from the generator.
143-
_is_backoff_v2 = next(backoff.expo()) is None
144-
145-
146-
def _expo(*args, **kwargs):
147-
gen = backoff.expo(*args, **kwargs)
148-
if _is_backoff_v2:
149-
gen.send(None)
150-
return gen
151-
152-
153140
# pylint: disable=no-member
154141
class OTLPExporterMixin(
155142
ABC, Generic[SDKDataT, ExportServiceRequestT, ExportResultT]
@@ -266,7 +253,7 @@ def _export(
266253
# expo returns a generator that yields delay values which grow
267254
# exponentially. Once delay is greater than max_value, the yielded
268255
# value will remain constant.
269-
for delay in _expo(max_value=max_value):
256+
for delay in _create_exp_backoff_generator(max_value=max_value):
270257
if delay == max_value or self._shutdown:
271258
return self._result.FAILURE
272259

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

+2-15
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
from typing import Dict, Optional, Sequence
2121
from time import sleep
2222

23-
import backoff
2423
import requests
2524

25+
from opentelemetry.exporter.otlp.proto.common._internal import _create_exp_backoff_generator
2626
from opentelemetry.exporter.otlp.proto.common._log_encoder import encode_logs
2727
from opentelemetry.sdk.environment_variables import (
2828
OTEL_EXPORTER_OTLP_CERTIFICATE,
@@ -56,19 +56,6 @@
5656
DEFAULT_LOGS_EXPORT_PATH = "v1/logs"
5757
DEFAULT_TIMEOUT = 10 # in seconds
5858

59-
# Work around API change between backoff 1.x and 2.x. Since 2.0.0 the backoff
60-
# wait generator API requires a first .send(None) before reading the backoff
61-
# values from the generator.
62-
_is_backoff_v2 = next(backoff.expo()) is None
63-
64-
65-
def _expo(*args, **kwargs):
66-
gen = backoff.expo(*args, **kwargs)
67-
if _is_backoff_v2:
68-
gen.send(None)
69-
return gen
70-
71-
7259
class OTLPLogExporter(LogExporter):
7360

7461
_MAX_RETRY_TIMEOUT = 64
@@ -147,7 +134,7 @@ def export(self, batch: Sequence[LogData]) -> LogExportResult:
147134

148135
serialized_data = encode_logs(batch).SerializeToString()
149136

150-
for delay in _expo(max_value=self._MAX_RETRY_TIMEOUT):
137+
for delay in _create_exp_backoff_generator(max_value=self._MAX_RETRY_TIMEOUT):
151138

152139
if delay == self._MAX_RETRY_TIMEOUT:
153140
return LogExportResult.FAILURE

exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py

+2-15
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
from opentelemetry.exporter.otlp.proto.common._internal import (
2626
_get_resource_data,
27+
_create_exp_backoff_generator,
2728
)
2829
from opentelemetry.exporter.otlp.proto.common._internal.metrics_encoder import (
2930
OTLPMetricExporterMixin,
@@ -73,7 +74,6 @@
7374
from opentelemetry.sdk.resources import Resource as SDKResource
7475
from opentelemetry.util.re import parse_env_headers
7576

76-
import backoff
7777
import requests
7878
from opentelemetry.proto.resource.v1.resource_pb2 import (
7979
Resource as PB2Resource,
@@ -87,19 +87,6 @@
8787
DEFAULT_METRICS_EXPORT_PATH = "v1/metrics"
8888
DEFAULT_TIMEOUT = 10 # in seconds
8989

90-
# Work around API change between backoff 1.x and 2.x. Since 2.0.0 the backoff
91-
# wait generator API requires a first .send(None) before reading the backoff
92-
# values from the generator.
93-
_is_backoff_v2 = next(backoff.expo()) is None
94-
95-
96-
def _expo(*args, **kwargs):
97-
gen = backoff.expo(*args, **kwargs)
98-
if _is_backoff_v2:
99-
gen.send(None)
100-
return gen
101-
102-
10390
class OTLPMetricExporter(MetricExporter, OTLPMetricExporterMixin):
10491

10592
_MAX_RETRY_TIMEOUT = 64
@@ -181,7 +168,7 @@ def export(
181168
**kwargs,
182169
) -> MetricExportResult:
183170
serialized_data = encode_metrics(metrics_data)
184-
for delay in _expo(max_value=self._MAX_RETRY_TIMEOUT):
171+
for delay in _create_exp_backoff_generator(max_value=self._MAX_RETRY_TIMEOUT):
185172

186173
if delay == self._MAX_RETRY_TIMEOUT:
187174
return MetricExportResult.FAILURE

exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py

+2-15
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
from typing import Dict, Optional
2121
from time import sleep
2222

23-
import backoff
2423
import requests
2524

25+
from opentelemetry.exporter.otlp.proto.common._internal import _create_exp_backoff_generator
2626
from opentelemetry.exporter.otlp.proto.common.trace_encoder import (
2727
encode_spans,
2828
)
@@ -54,19 +54,6 @@
5454
DEFAULT_TRACES_EXPORT_PATH = "v1/traces"
5555
DEFAULT_TIMEOUT = 10 # in seconds
5656

57-
# Work around API change between backoff 1.x and 2.x. Since 2.0.0 the backoff
58-
# wait generator API requires a first .send(None) before reading the backoff
59-
# values from the generator.
60-
_is_backoff_v2 = next(backoff.expo()) is None
61-
62-
63-
def _expo(*args, **kwargs):
64-
gen = backoff.expo(*args, **kwargs)
65-
if _is_backoff_v2:
66-
gen.send(None)
67-
return gen
68-
69-
7057
class OTLPSpanExporter(SpanExporter):
7158

7259
_MAX_RETRY_TIMEOUT = 64
@@ -145,7 +132,7 @@ def export(self, spans) -> SpanExportResult:
145132

146133
serialized_data = encode_spans(spans).SerializeToString()
147134

148-
for delay in _expo(max_value=self._MAX_RETRY_TIMEOUT):
135+
for delay in _create_exp_backoff_generator(max_value=self._MAX_RETRY_TIMEOUT):
149136

150137
if delay == self._MAX_RETRY_TIMEOUT:
151138
return SpanExportResult.FAILURE

0 commit comments

Comments
 (0)