Skip to content

Commit 5a1a1d5

Browse files
authored
Merge branch 'main' into redis_additional_attributes
2 parents da7ae34 + 830397e commit 5a1a1d5

File tree

18 files changed

+421
-247
lines changed

18 files changed

+421
-247
lines changed

Diff for: .github/workflows/generate_workflows_lib/src/generate_workflows_lib/misc.yml.j2

+5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ jobs:
2525
!contains(github.event.pull_request.labels.*.name, 'Skip generate-workflows')
2626
&& github.actor != 'opentelemetrybot'
2727
{%- endif %}
28+
{%- if job_data == "public-symbols-check" %}
29+
if: |
30+
!contains(github.event.pull_request.labels.*.name, 'Approve Public API check')
31+
&& github.actor != 'opentelemetrybot'
32+
{%- endif %}
2833
steps:
2934
- name: Checkout repo @ SHA - ${% raw %}{{ github.sha }}{% endraw %}
3035
uses: actions/checkout@v4

Diff for: CHANGELOG.md

+12-4
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10-
## Added
10+
### Added
1111

1212
- `opentelemetry-instrumentation-kafka-python` Instrument temporary fork, kafka-python-ng
1313
inside kafka-python's instrumentation
1414
([#2537](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2537))
1515

16-
## Breaking changes
16+
### Breaking changes
1717

1818
- `opentelemetry-bootstrap` Remove `opentelemetry-instrumentation-aws-lambda` from the defaults instrumentations
1919
([#2786](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2786))
2020

21-
## Fixed
21+
### Fixed
2222

23+
- `opentelemetry-instrumentation-httpx` fix handling of async hooks
24+
([#2823](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2823))
25+
- `opentelemetry-instrumentation-system-metrics` fix `process.runtime.cpu.utilization` values to be shown in range of 0 to 1
26+
([#2812](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2812))
2327
- `opentelemetry-instrumentation-fastapi` fix `fastapi` auto-instrumentation by removing `fastapi-slim` support, `fastapi-slim` itself is discontinued from maintainers
24-
([2783](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2783))
28+
([#2783](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2783))
2529
- `opentelemetry-instrumentation-aws-lambda` Avoid exception when a handler is not present.
2630
([#2750](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2750))
2731
- `opentelemetry-instrumentation-django` Fix regression - `http.target` re-added back to old semconv duration metrics
@@ -36,6 +40,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3640
([#2385](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2385))
3741
- `opentelemetry-instrumentation-asyncio` Fixes async generator coroutines not being awaited
3842
([#2792](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2792))
43+
- `opentelemetry-instrumentation-tornado` Handle http client exception and record exception info into span
44+
([#2563](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2563))
45+
- `opentelemetry-instrumentation` fix `http.host` new http semantic convention mapping to depend on `kind` of span
46+
([#2814](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2814))
3947

4048
## Version 1.26.0/0.47b0 (2024-07-23)
4149

Diff for: CONTRIBUTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ and [**Maintainer**](https://github.com/open-telemetry/community/blob/main/commu
1515

1616
Before you can contribute, you will need to sign the [Contributor License Agreement](https://docs.linuxfoundation.org/lfx/easycla/contributors).
1717

18-
Please also read the [OpenTelemetry Contributor Guide](https://github.com/open-telemetry/community/blob/main/CONTRIBUTING.md).
18+
Please also read the [OpenTelemetry Contributor Guide](https://github.com/open-telemetry/community/blob/main/guides/contributor/README.md).
1919

2020
## Index
2121

Diff for: instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,10 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A
215215
_server_duration_attrs_new,
216216
_server_duration_attrs_old,
217217
_set_http_flavor_version,
218-
_set_http_host,
218+
_set_http_host_server,
219219
_set_http_method,
220220
_set_http_net_host_port,
221-
_set_http_peer_ip,
221+
_set_http_peer_ip_server,
222222
_set_http_peer_port_server,
223223
_set_http_scheme,
224224
_set_http_target,
@@ -342,7 +342,7 @@ def collect_request_attributes(
342342
if scheme:
343343
_set_http_scheme(result, scheme, sem_conv_opt_in_mode)
344344
if server_host:
345-
_set_http_host(result, server_host, sem_conv_opt_in_mode)
345+
_set_http_host_server(result, server_host, sem_conv_opt_in_mode)
346346
if port:
347347
_set_http_net_host_port(result, port, sem_conv_opt_in_mode)
348348
flavor = scope.get("http_version")
@@ -380,7 +380,9 @@ def collect_request_attributes(
380380
_set_http_user_agent(result, http_user_agent[0], sem_conv_opt_in_mode)
381381

382382
if "client" in scope and scope["client"] is not None:
383-
_set_http_peer_ip(result, scope.get("client")[0], sem_conv_opt_in_mode)
383+
_set_http_peer_ip_server(
384+
result, scope.get("client")[0], sem_conv_opt_in_mode
385+
)
384386
_set_http_peer_port_server(
385387
result, scope.get("client")[1], sem_conv_opt_in_mode
386388
)

Diff for: instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_custom_headers.py

+58-40
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
1+
# Copyright The OpenTelemetry Authors
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
115
import os
216

317
import opentelemetry.instrumentation.asgi as otel_asgi
4-
from opentelemetry.test.asgitestutil import AsgiTestBase
18+
from opentelemetry.test.asgitestutil import AsyncAsgiTestBase
519
from opentelemetry.test.test_base import TestBase
620
from opentelemetry.trace import SpanKind
721
from opentelemetry.util.http import (
@@ -90,7 +104,7 @@ async def websocket_app_with_custom_headers(scope, receive, send):
90104
break
91105

92106

93-
class TestCustomHeaders(AsgiTestBase, TestBase):
107+
class TestCustomHeaders(AsyncAsgiTestBase):
94108
constructor_params = {}
95109
__test__ = False
96110

@@ -108,7 +122,7 @@ def setUp(self):
108122
**self.constructor_params,
109123
)
110124

111-
def test_http_custom_request_headers_in_span_attributes(self):
125+
async def test_http_custom_request_headers_in_span_attributes(self):
112126
self.scope["headers"].extend(
113127
[
114128
(b"custom-test-header-1", b"test-header-value-1"),
@@ -119,8 +133,8 @@ def test_http_custom_request_headers_in_span_attributes(self):
119133
]
120134
)
121135
self.seed_app(self.app)
122-
self.send_default_request()
123-
self.get_all_output()
136+
await self.send_default_request()
137+
await self.get_all_output()
124138
span_list = self.exporter.get_finished_spans()
125139
expected = {
126140
"http.request.header.custom_test_header_1": (
@@ -139,16 +153,16 @@ def test_http_custom_request_headers_in_span_attributes(self):
139153
if span.kind == SpanKind.SERVER:
140154
self.assertSpanHasAttributes(span, expected)
141155

142-
def test_http_repeat_request_headers_in_span_attributes(self):
156+
async def test_http_repeat_request_headers_in_span_attributes(self):
143157
self.scope["headers"].extend(
144158
[
145159
(b"custom-test-header-1", b"test-header-value-1"),
146160
(b"custom-test-header-1", b"test-header-value-2"),
147161
]
148162
)
149163
self.seed_app(self.app)
150-
self.send_default_request()
151-
self.get_all_output()
164+
await self.send_default_request()
165+
await self.get_all_output()
152166
span_list = self.exporter.get_finished_spans()
153167
expected = {
154168
"http.request.header.custom_test_header_1": (
@@ -159,15 +173,15 @@ def test_http_repeat_request_headers_in_span_attributes(self):
159173
span = next(span for span in span_list if span.kind == SpanKind.SERVER)
160174
self.assertSpanHasAttributes(span, expected)
161175

162-
def test_http_custom_request_headers_not_in_span_attributes(self):
176+
async def test_http_custom_request_headers_not_in_span_attributes(self):
163177
self.scope["headers"].extend(
164178
[
165179
(b"custom-test-header-1", b"test-header-value-1"),
166180
]
167181
)
168182
self.seed_app(self.app)
169-
self.send_default_request()
170-
self.get_all_output()
183+
await self.send_default_request()
184+
await self.get_all_output()
171185
span_list = self.exporter.get_finished_spans()
172186
expected = {
173187
"http.request.header.custom_test_header_1": (
@@ -185,15 +199,15 @@ def test_http_custom_request_headers_not_in_span_attributes(self):
185199
for key, _ in not_expected.items():
186200
self.assertNotIn(key, span.attributes)
187201

188-
def test_http_custom_response_headers_in_span_attributes(self):
202+
async def test_http_custom_response_headers_in_span_attributes(self):
189203
self.app = otel_asgi.OpenTelemetryMiddleware(
190204
http_app_with_custom_headers,
191205
tracer_provider=self.tracer_provider,
192206
**self.constructor_params,
193207
)
194208
self.seed_app(self.app)
195-
self.send_default_request()
196-
self.get_all_output()
209+
await self.send_default_request()
210+
await self.get_all_output()
197211
span_list = self.exporter.get_finished_spans()
198212
expected = {
199213
"http.response.header.custom_test_header_1": (
@@ -214,15 +228,15 @@ def test_http_custom_response_headers_in_span_attributes(self):
214228
if span.kind == SpanKind.SERVER:
215229
self.assertSpanHasAttributes(span, expected)
216230

217-
def test_http_repeat_response_headers_in_span_attributes(self):
231+
async def test_http_repeat_response_headers_in_span_attributes(self):
218232
self.app = otel_asgi.OpenTelemetryMiddleware(
219233
http_app_with_repeat_headers,
220234
tracer_provider=self.tracer_provider,
221235
**self.constructor_params,
222236
)
223237
self.seed_app(self.app)
224-
self.send_default_request()
225-
self.get_all_output()
238+
await self.send_default_request()
239+
await self.get_all_output()
226240
span_list = self.exporter.get_finished_spans()
227241
expected = {
228242
"http.response.header.custom_test_header_1": (
@@ -233,15 +247,15 @@ def test_http_repeat_response_headers_in_span_attributes(self):
233247
span = next(span for span in span_list if span.kind == SpanKind.SERVER)
234248
self.assertSpanHasAttributes(span, expected)
235249

236-
def test_http_custom_response_headers_not_in_span_attributes(self):
250+
async def test_http_custom_response_headers_not_in_span_attributes(self):
237251
self.app = otel_asgi.OpenTelemetryMiddleware(
238252
http_app_with_custom_headers,
239253
tracer_provider=self.tracer_provider,
240254
**self.constructor_params,
241255
)
242256
self.seed_app(self.app)
243-
self.send_default_request()
244-
self.get_all_output()
257+
await self.send_default_request()
258+
await self.get_all_output()
245259
span_list = self.exporter.get_finished_spans()
246260
not_expected = {
247261
"http.response.header.custom_test_header_3": (
@@ -253,7 +267,7 @@ def test_http_custom_response_headers_not_in_span_attributes(self):
253267
for key, _ in not_expected.items():
254268
self.assertNotIn(key, span.attributes)
255269

256-
def test_websocket_custom_request_headers_in_span_attributes(self):
270+
async def test_websocket_custom_request_headers_in_span_attributes(self):
257271
self.scope = {
258272
"type": "websocket",
259273
"http_version": "1.1",
@@ -271,11 +285,11 @@ def test_websocket_custom_request_headers_in_span_attributes(self):
271285
"server": ("127.0.0.1", 80),
272286
}
273287
self.seed_app(self.app)
274-
self.send_input({"type": "websocket.connect"})
275-
self.send_input({"type": "websocket.receive", "text": "ping"})
276-
self.send_input({"type": "websocket.disconnect"})
288+
await self.send_input({"type": "websocket.connect"})
289+
await self.send_input({"type": "websocket.receive", "text": "ping"})
290+
await self.send_input({"type": "websocket.disconnect"})
277291

278-
self.get_all_output()
292+
await self.get_all_output()
279293
span_list = self.exporter.get_finished_spans()
280294
expected = {
281295
"http.request.header.custom_test_header_1": (
@@ -294,7 +308,9 @@ def test_websocket_custom_request_headers_in_span_attributes(self):
294308
if span.kind == SpanKind.SERVER:
295309
self.assertSpanHasAttributes(span, expected)
296310

297-
def test_websocket_custom_request_headers_not_in_span_attributes(self):
311+
async def test_websocket_custom_request_headers_not_in_span_attributes(
312+
self,
313+
):
298314
self.scope = {
299315
"type": "websocket",
300316
"http_version": "1.1",
@@ -309,11 +325,11 @@ def test_websocket_custom_request_headers_not_in_span_attributes(self):
309325
"server": ("127.0.0.1", 80),
310326
}
311327
self.seed_app(self.app)
312-
self.send_input({"type": "websocket.connect"})
313-
self.send_input({"type": "websocket.receive", "text": "ping"})
314-
self.send_input({"type": "websocket.disconnect"})
328+
await self.send_input({"type": "websocket.connect"})
329+
await self.send_input({"type": "websocket.receive", "text": "ping"})
330+
await self.send_input({"type": "websocket.disconnect"})
315331

316-
self.get_all_output()
332+
await self.get_all_output()
317333
span_list = self.exporter.get_finished_spans()
318334
not_expected = {
319335
"http.request.header.custom_test_header_3": (
@@ -325,7 +341,7 @@ def test_websocket_custom_request_headers_not_in_span_attributes(self):
325341
for key, _ in not_expected.items():
326342
self.assertNotIn(key, span.attributes)
327343

328-
def test_websocket_custom_response_headers_in_span_attributes(self):
344+
async def test_websocket_custom_response_headers_in_span_attributes(self):
329345
self.scope = {
330346
"type": "websocket",
331347
"http_version": "1.1",
@@ -342,10 +358,10 @@ def test_websocket_custom_response_headers_in_span_attributes(self):
342358
**self.constructor_params,
343359
)
344360
self.seed_app(self.app)
345-
self.send_input({"type": "websocket.connect"})
346-
self.send_input({"type": "websocket.receive", "text": "ping"})
347-
self.send_input({"type": "websocket.disconnect"})
348-
self.get_all_output()
361+
await self.send_input({"type": "websocket.connect"})
362+
await self.send_input({"type": "websocket.receive", "text": "ping"})
363+
await self.send_input({"type": "websocket.disconnect"})
364+
await self.get_all_output()
349365
span_list = self.exporter.get_finished_spans()
350366
expected = {
351367
"http.response.header.custom_test_header_1": (
@@ -366,7 +382,9 @@ def test_websocket_custom_response_headers_in_span_attributes(self):
366382
if span.kind == SpanKind.SERVER:
367383
self.assertSpanHasAttributes(span, expected)
368384

369-
def test_websocket_custom_response_headers_not_in_span_attributes(self):
385+
async def test_websocket_custom_response_headers_not_in_span_attributes(
386+
self,
387+
):
370388
self.scope = {
371389
"type": "websocket",
372390
"http_version": "1.1",
@@ -383,10 +401,10 @@ def test_websocket_custom_response_headers_not_in_span_attributes(self):
383401
**self.constructor_params,
384402
)
385403
self.seed_app(self.app)
386-
self.send_input({"type": "websocket.connect"})
387-
self.send_input({"type": "websocket.receive", "text": "ping"})
388-
self.send_input({"type": "websocket.disconnect"})
389-
self.get_all_output()
404+
await self.send_input({"type": "websocket.connect"})
405+
await self.send_input({"type": "websocket.receive", "text": "ping"})
406+
await self.send_input({"type": "websocket.disconnect"})
407+
await self.get_all_output()
390408
span_list = self.exporter.get_finished_spans()
391409
not_expected = {
392410
"http.response.header.custom_test_header_3": (

0 commit comments

Comments
 (0)