Skip to content

Commit c1882d9

Browse files
authored
Merge branch 'main' into export-nonmonotonic-sums-as-gauges-in-prometheus
2 parents ec69ad1 + e076e7c commit c1882d9

File tree

20 files changed

+320
-120
lines changed

20 files changed

+320
-120
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ env:
1010
# Otherwise, set variable to the commit of your branch on
1111
# opentelemetry-python-contrib which is compatible with these Core repo
1212
# changes.
13-
CONTRIB_REPO_SHA: a5ed4da478c4360fd6e24893f7574b150431b7ee
13+
CONTRIB_REPO_SHA: dadcd01524449ddee07a8d8405890a60caeb8c8e
1414
# This is needed because we do not clone the core repo in contrib builds anymore.
1515
# When running contrib builds as part of core builds, we use actions/checkout@v2 which
1616
# does not set an environment variable (simply just runs tox), which is different when

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1919
([#3341](https://github.com/open-telemetry/opentelemetry-python/pull/3341))
2020
- Upgrade opentelemetry-proto to 0.20 and regen
2121
[#3355](https://github.com/open-telemetry/opentelemetry-python/pull/3355))
22+
- Include endpoint in Grpc transient error warning
23+
[#3362](https://github.com/open-telemetry/opentelemetry-python/pull/3362))
2224

2325
## Version 1.18.0/0.39b0 (2023-05-04)
2426

CONTRIBUTING.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,28 @@ behind this is that every PR that adds/removes public symbols fails in CI, forci
7171
If after checking them, it is considered that they are indeed necessary, the PR will be labeled with `Skip Public API check` so that this check is not
7272
run.
7373

74+
Also, we try to keep our console output as clean as possible. Most of the time this means catching expected log messages in the test cases:
75+
76+
``` python
77+
from logging import WARNING
78+
79+
...
80+
81+
def test_case(self):
82+
with self.assertLogs(level=WARNING):
83+
some_function_that_will_log_a_warning_message()
84+
```
85+
86+
Other options can be to disable logging propagation or disabling a logger altogether.
87+
88+
A similar approach can be followed to catch warnings:
89+
90+
``` python
91+
def test_case(self):
92+
with self.assertWarns(DeprecationWarning):
93+
some_function_that_will_raise_a_deprecation_warning()
94+
```
95+
7496
See
7597
[`tox.ini`](https://github.com/open-telemetry/opentelemetry-python/blob/main/tox.ini)
7698
for more detail on available tox commands.

docs/getting_started/tests/test_flask.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,6 @@ def test_flask(self):
4444
server.terminate()
4545

4646
output = str(server.stdout.read())
47-
self.assertIn('"name": "HTTP GET"', output)
47+
self.assertIn('"name": "GET"', output)
4848
self.assertIn('"name": "example-request"', output)
4949
self.assertIn('"name": "/"', output)

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,11 @@ def __init__(
178178
):
179179
super().__init__()
180180

181-
endpoint = endpoint or environ.get(
181+
self._endpoint = endpoint or environ.get(
182182
OTEL_EXPORTER_OTLP_ENDPOINT, "http://localhost:4317"
183183
)
184184

185-
parsed_url = urlparse(endpoint)
185+
parsed_url = urlparse(self._endpoint)
186186

187187
if parsed_url.scheme == "https":
188188
insecure = False
@@ -197,7 +197,7 @@ def __init__(
197197
insecure = False
198198

199199
if parsed_url.netloc:
200-
endpoint = parsed_url.netloc
200+
self._endpoint = parsed_url.netloc
201201

202202
self._headers = headers or environ.get(OTEL_EXPORTER_OTLP_HEADERS)
203203
if isinstance(self._headers, str):
@@ -223,14 +223,16 @@ def __init__(
223223

224224
if insecure:
225225
self._client = self._stub(
226-
insecure_channel(endpoint, compression=compression)
226+
insecure_channel(self._endpoint, compression=compression)
227227
)
228228
else:
229229
credentials = _get_credentials(
230230
credentials, OTEL_EXPORTER_OTLP_CERTIFICATE
231231
)
232232
self._client = self._stub(
233-
secure_channel(endpoint, credentials, compression=compression)
233+
secure_channel(
234+
self._endpoint, credentials, compression=compression
235+
)
234236
)
235237

236238
self._export_lock = threading.Lock()
@@ -304,18 +306,20 @@ def _export(
304306
logger.warning(
305307
(
306308
"Transient error %s encountered while exporting "
307-
"%s, retrying in %ss."
309+
"%s to %s, retrying in %ss."
308310
),
309311
error.code(),
310312
self._exporting,
313+
self._endpoint,
311314
delay,
312315
)
313316
sleep(delay)
314317
continue
315318
else:
316319
logger.error(
317-
"Failed to export %s, error code: %s",
320+
"Failed to export %s to %s, error code: %s",
318321
self._exporting,
322+
self._endpoint,
319323
error.code(),
320324
)
321325

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def _exporting(self) -> str:
9393
otlp_mock_exporter._export(Mock())
9494
self.assertEqual(
9595
warning.records[0].message,
96-
"Failed to export mock, error code: None",
96+
"Failed to export mock to localhost:4317, error code: None",
9797
)
9898

9999
def code(self): # pylint: disable=function-redefined
@@ -112,7 +112,7 @@ def trailing_metadata(self):
112112
warning.records[0].message,
113113
(
114114
"Transient error StatusCode.CANCELLED encountered "
115-
"while exporting mock, retrying in 0s."
115+
"while exporting mock to localhost:4317, retrying in 0s."
116116
),
117117
)
118118

opentelemetry-api/src/opentelemetry/context/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,13 @@ def detach(token: object) -> None:
172172
_SUPPRESS_HTTP_INSTRUMENTATION_KEY = create_key(
173173
"suppress_http_instrumentation"
174174
)
175+
176+
__all__ = [
177+
"Context",
178+
"attach",
179+
"create_key",
180+
"detach",
181+
"get_current",
182+
"get_value",
183+
"set_value",
184+
]

opentelemetry-api/src/opentelemetry/trace/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,11 @@ def use_span(
588588
description=f"{type(exc).__name__}: {exc}",
589589
)
590590
)
591+
592+
# This causes parent spans to set their status to ERROR and to record
593+
# an exception as an event if a child span raises an exception even if
594+
# such child span was started with both record_exception and
595+
# set_status_on_exception attributes set to False.
591596
raise
592597

593598
finally:

opentelemetry-sdk/tests/logs/test_export.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
LoggingHandler,
3030
LogRecord,
3131
)
32+
from opentelemetry.sdk._logs._internal.export import _logger
3233
from opentelemetry.sdk._logs.export import (
3334
BatchLogRecordProcessor,
3435
ConsoleLogExporter,
@@ -167,7 +168,8 @@ def test_simple_log_record_processor_shutdown(self):
167168
)
168169
exporter.clear()
169170
logger_provider.shutdown()
170-
logger.warning("Log after shutdown")
171+
with self.assertLogs(level=logging.WARNING):
172+
logger.warning("Log after shutdown")
171173
finished_logs = exporter.get_finished_logs()
172174
self.assertEqual(len(finished_logs), 0)
173175

@@ -239,7 +241,9 @@ def test_args_defaults(self):
239241
)
240242
def test_args_env_var_value_error(self):
241243
exporter = InMemoryLogExporter()
244+
_logger.disabled = True
242245
log_record_processor = BatchLogRecordProcessor(exporter)
246+
_logger.disabled = False
243247
self.assertEqual(log_record_processor._exporter, exporter)
244248
self.assertEqual(log_record_processor._max_queue_size, 2048)
245249
self.assertEqual(log_record_processor._schedule_delay_millis, 5000)
@@ -315,12 +319,14 @@ def test_shutdown(self):
315319
provider.add_log_record_processor(log_record_processor)
316320

317321
logger = logging.getLogger("shutdown")
318-
logger.propagate = False
319322
logger.addHandler(LoggingHandler(logger_provider=provider))
320323

321-
logger.warning("warning message: %s", "possible upcoming heatwave")
322-
logger.error("Very high rise in temperatures across the globe")
323-
logger.critical("Temperature hits high 420 C in Hyderabad")
324+
with self.assertLogs(level=logging.WARNING):
325+
logger.warning("warning message: %s", "possible upcoming heatwave")
326+
with self.assertLogs(level=logging.WARNING):
327+
logger.error("Very high rise in temperatures across the globe")
328+
with self.assertLogs(level=logging.WARNING):
329+
logger.critical("Temperature hits high 420 C in Hyderabad")
324330

325331
log_record_processor.shutdown()
326332
self.assertTrue(exporter._stopped)

opentelemetry-sdk/tests/logs/test_handler.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ def test_handler_default_log_level(self):
4242
logger.debug("Debug message")
4343
self.assertEqual(emitter_mock.emit.call_count, 0)
4444
# Assert emit gets called for warning message
45-
logger.warning("Warning message")
45+
with self.assertLogs(level=logging.WARNING):
46+
logger.warning("Warning message")
4647
self.assertEqual(emitter_mock.emit.call_count, 1)
4748

4849
def test_handler_custom_log_level(self):
@@ -53,11 +54,14 @@ def test_handler_custom_log_level(self):
5354
logger = get_logger(
5455
level=logging.ERROR, logger_provider=emitter_provider_mock
5556
)
56-
logger.warning("Warning message test custom log level")
57+
with self.assertLogs(level=logging.WARNING):
58+
logger.warning("Warning message test custom log level")
5759
# Make sure any log with level < ERROR is ignored
5860
self.assertEqual(emitter_mock.emit.call_count, 0)
59-
logger.error("Mumbai, we have a major problem")
60-
logger.critical("No Time For Caution")
61+
with self.assertLogs(level=logging.ERROR):
62+
logger.error("Mumbai, we have a major problem")
63+
with self.assertLogs(level=logging.CRITICAL):
64+
logger.critical("No Time For Caution")
6165
self.assertEqual(emitter_mock.emit.call_count, 2)
6266

6367
def test_log_record_no_span_context(self):
@@ -67,7 +71,8 @@ def test_log_record_no_span_context(self):
6771
)
6872
logger = get_logger(logger_provider=emitter_provider_mock)
6973
# Assert emit gets called for warning message
70-
logger.warning("Warning message")
74+
with self.assertLogs(level=logging.WARNING):
75+
logger.warning("Warning message")
7176
args, _ = emitter_mock.emit.call_args_list[0]
7277
log_record = args[0]
7378

@@ -86,7 +91,8 @@ def test_log_record_user_attributes(self):
8691
)
8792
logger = get_logger(logger_provider=emitter_provider_mock)
8893
# Assert emit gets called for warning message
89-
logger.warning("Warning message", extra={"http.status_code": 200})
94+
with self.assertLogs(level=logging.WARNING):
95+
logger.warning("Warning message", extra={"http.status_code": 200})
9096
args, _ = emitter_mock.emit.call_args_list[0]
9197
log_record = args[0]
9298

@@ -104,7 +110,8 @@ def test_log_record_exception(self):
104110
try:
105111
raise ZeroDivisionError("division by zero")
106112
except ZeroDivisionError:
107-
logger.exception("Zero Division Error")
113+
with self.assertLogs(level=logging.ERROR):
114+
logger.exception("Zero Division Error")
108115
args, _ = emitter_mock.emit.call_args_list[0]
109116
log_record = args[0]
110117

@@ -137,7 +144,8 @@ def test_log_exc_info_false(self):
137144
try:
138145
raise ZeroDivisionError("division by zero")
139146
except ZeroDivisionError:
140-
logger.error("Zero Division Error", exc_info=False)
147+
with self.assertLogs(level=logging.ERROR):
148+
logger.error("Zero Division Error", exc_info=False)
141149
args, _ = emitter_mock.emit.call_args_list[0]
142150
log_record = args[0]
143151

@@ -160,7 +168,8 @@ def test_log_record_trace_correlation(self):
160168

161169
tracer = trace.TracerProvider().get_tracer(__name__)
162170
with tracer.start_as_current_span("test") as span:
163-
logger.critical("Critical message within span")
171+
with self.assertLogs(level=logging.CRITICAL):
172+
logger.critical("Critical message within span")
164173

165174
args, _ = emitter_mock.emit.call_args_list[0]
166175
log_record = args[0]

opentelemetry-sdk/tests/logs/test_multi_log_processor.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,18 @@ def test_log_record_processor(self):
6868
logger.addHandler(handler)
6969

7070
# Test no proessor added
71-
logger.critical("Odisha, we have another major cyclone")
71+
with self.assertLogs(level=logging.CRITICAL):
72+
logger.critical("Odisha, we have another major cyclone")
7273

7374
self.assertEqual(len(logs_list_1), 0)
7475
self.assertEqual(len(logs_list_2), 0)
7576

7677
# Add one processor
7778
provider.add_log_record_processor(processor1)
78-
logger.warning("Brace yourself")
79-
logger.error("Some error message")
79+
with self.assertLogs(level=logging.WARNING):
80+
logger.warning("Brace yourself")
81+
with self.assertLogs(level=logging.ERROR):
82+
logger.error("Some error message")
8083

8184
expected_list_1 = [
8285
("Brace yourself", "WARNING"),
@@ -86,7 +89,8 @@ def test_log_record_processor(self):
8689

8790
# Add another processor
8891
provider.add_log_record_processor(processor2)
89-
logger.critical("Something disastrous")
92+
with self.assertLogs(level=logging.CRITICAL):
93+
logger.critical("Something disastrous")
9094
expected_list_1.append(("Something disastrous", "CRITICAL"))
9195

9296
expected_list_2 = [("Something disastrous", "CRITICAL")]

opentelemetry-sdk/tests/metrics/test_instrument.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
from logging import WARNING
1516
from unittest import TestCase
1617
from unittest.mock import Mock
1718

@@ -50,7 +51,8 @@ def test_add(self):
5051
def test_add_non_monotonic(self):
5152
mc = Mock()
5253
counter = _Counter("name", Mock(), mc)
53-
counter.add(-1.0)
54+
with self.assertLogs(level=WARNING):
55+
counter.add(-1.0)
5456
mc.consume_measurement.assert_not_called()
5557

5658
def test_disallow_direct_counter_creation(self):
@@ -360,7 +362,8 @@ def test_record(self):
360362
def test_record_non_monotonic(self):
361363
mc = Mock()
362364
hist = _Histogram("name", Mock(), mc)
363-
hist.record(-1.0)
365+
with self.assertLogs(level=WARNING):
366+
hist.record(-1.0)
364367
mc.consume_measurement.assert_not_called()
365368

366369
def test_disallow_direct_histogram_creation(self):

opentelemetry-sdk/tests/metrics/test_metric_reader_storage.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ def test_creates_view_instrument_matches(
9999
# instrument2 matches view2, so should create a single
100100
# ViewInstrumentMatch
101101
MockViewInstrumentMatch.call_args_list.clear()
102-
storage.consume_measurement(Measurement(1, instrument2))
102+
with self.assertLogs(level=WARNING):
103+
storage.consume_measurement(Measurement(1, instrument2))
103104
self.assertEqual(len(MockViewInstrumentMatch.call_args_list), 1)
104105

105106
@patch(
@@ -150,7 +151,8 @@ def test_forwards_calls_to_view_instrument_match(
150151
view_instrument_match3.consume_measurement.assert_not_called()
151152

152153
measurement = Measurement(1, instrument2)
153-
storage.consume_measurement(measurement)
154+
with self.assertLogs(level=WARNING):
155+
storage.consume_measurement(measurement)
154156
view_instrument_match3.consume_measurement.assert_called_once_with(
155157
measurement
156158
)

0 commit comments

Comments
 (0)