Skip to content

Commit

Permalink
Merge branch 'main' into redis_additional_attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
lzchen committed Aug 14, 2024
2 parents c53b08e + af9e841 commit fd52a83
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 24 deletions.
9 changes: 8 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

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

## Breaking changes

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

## Fixed

- `opentelemetry-instrumentation-fastapi` fix `fastapi` auto-instrumentation by removing `fastapi-slim` support, `fastapi-slim` itself is discontinued from maintainers
Expand All @@ -23,12 +26,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#2750](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2750))
- `opentelemetry-instrumentation-django` Fix regression - `http.target` re-added back to old semconv duration metrics
([#2746](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2746))
- `opentelemetry-instrumentation-asgi` do not set `url.full` attribute for server spans
([#2735](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2735))
- `opentelemetry-instrumentation-grpc` Fixes the issue with the gRPC instrumentation not working with the 1.63.0 and higher version of gRPC
([#2483](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2484))
- `opentelemetry-instrumentation-aws-lambda` Fixing w3c baggage support
([#2589](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2589))
- `opentelemetry-instrumentation-celery` propagates baggage
([#2385](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2385))
- `opentelemetry-instrumentation-asyncio` Fixes async generator coroutines not being awaited
([#2792](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2792))

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

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
aiohttp==3.9.4
aiohttp==3.10.2
aiosignal==1.3.1
asgiref==3.7.2
async-timeout==4.0.3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ async def request_handler(request):
[
(
"GET",
(StatusCode.ERROR, "ServerTimeoutError"),
(StatusCode.ERROR, "SocketTimeoutError"),
{
SpanAttributes.HTTP_METHOD: "GET",
SpanAttributes.HTTP_URL: f"http://{host}:{port}/test_timeout",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
aiohttp==3.9.4
aiohttp==3.10.2
aiosignal==1.3.1
asgiref==3.7.2
async-timeout==4.0.3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,10 +354,12 @@ def collect_request_attributes(
result, path, path, query_string, sem_conv_opt_in_mode
)
if http_url:
_set_http_url(
result, remove_url_credentials(http_url), sem_conv_opt_in_mode
)

if _report_old(sem_conv_opt_in_mode):
_set_http_url(
result,
remove_url_credentials(http_url),
_HTTPStabilityMode.DEFAULT,
)
http_method = scope.get("method", "")
if http_method:
_set_http_method(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@
SERVER_PORT,
)
from opentelemetry.semconv.attributes.url_attributes import (
URL_FULL,
URL_PATH,
URL_QUERY,
URL_SCHEME,
Expand Down Expand Up @@ -410,7 +409,6 @@ def validate_outputs(
SERVER_ADDRESS: "127.0.0.1",
NETWORK_PROTOCOL_VERSION: "1.0",
URL_PATH: "/",
URL_FULL: "http://127.0.0.1/",
CLIENT_ADDRESS: "127.0.0.1",
CLIENT_PORT: 32767,
HTTP_RESPONSE_STATUS_CODE: 200,
Expand Down Expand Up @@ -447,7 +445,6 @@ def validate_outputs(
SERVER_ADDRESS: "127.0.0.1",
NETWORK_PROTOCOL_VERSION: "1.0",
URL_PATH: "/",
URL_FULL: "http://127.0.0.1/",
CLIENT_ADDRESS: "127.0.0.1",
CLIENT_PORT: 32767,
HTTP_RESPONSE_STATUS_CODE: 200,
Expand Down Expand Up @@ -693,7 +690,6 @@ def update_expected_server(expected):
{
SERVER_ADDRESS: "0.0.0.0",
SERVER_PORT: 80,
URL_FULL: "http://0.0.0.0/",
}
)
return expected
Expand Down Expand Up @@ -721,7 +717,6 @@ def update_expected_server(expected):
SpanAttributes.HTTP_URL: "http://0.0.0.0/",
SERVER_ADDRESS: "0.0.0.0",
SERVER_PORT: 80,
URL_FULL: "http://0.0.0.0/",
}
)
return expected
Expand Down Expand Up @@ -1009,7 +1004,6 @@ def test_websocket_new_semconv(self):
SERVER_ADDRESS: self.scope["server"][0],
NETWORK_PROTOCOL_VERSION: self.scope["http_version"],
URL_PATH: self.scope["path"],
URL_FULL: f'{self.scope["scheme"]}://{self.scope["server"][0]}{self.scope["path"]}',
CLIENT_ADDRESS: self.scope["client"][0],
CLIENT_PORT: self.scope["client"][1],
HTTP_RESPONSE_STATUS_CODE: 200,
Expand Down Expand Up @@ -1095,7 +1089,6 @@ def test_websocket_both_semconv(self):
SERVER_ADDRESS: self.scope["server"][0],
NETWORK_PROTOCOL_VERSION: self.scope["http_version"],
URL_PATH: self.scope["path"],
URL_FULL: f'{self.scope["scheme"]}://{self.scope["server"][0]}{self.scope["path"]}',
CLIENT_ADDRESS: self.scope["client"][0],
CLIENT_PORT: self.scope["client"][1],
HTTP_RESPONSE_STATUS_CODE: 200,
Expand Down Expand Up @@ -1639,7 +1632,6 @@ def test_request_attributes_new_semconv(self):
SERVER_ADDRESS: "127.0.0.1",
URL_PATH: "/",
URL_QUERY: "foo=bar",
URL_FULL: "http://127.0.0.1/?foo=bar",
SERVER_PORT: 80,
URL_SCHEME: "http",
NETWORK_PROTOCOL_VERSION: "1.0",
Expand Down Expand Up @@ -1676,7 +1668,6 @@ def test_request_attributes_both_semconv(self):
SERVER_ADDRESS: "127.0.0.1",
URL_PATH: "/",
URL_QUERY: "foo=bar",
URL_FULL: "http://127.0.0.1/?foo=bar",
SERVER_PORT: 80,
URL_SCHEME: "http",
NETWORK_PROTOCOL_VERSION: "1.0",
Expand All @@ -1698,18 +1689,24 @@ def test_query_string_new_semconv(self):
self.scope,
_HTTPStabilityMode.HTTP,
)
self.assertEqual(attrs[URL_FULL], "http://127.0.0.1/?foo=bar")
self.assertEqual(attrs[URL_SCHEME], "http")
self.assertEqual(attrs[SERVER_ADDRESS], "127.0.0.1")
self.assertEqual(attrs[URL_PATH], "/")
self.assertEqual(attrs[URL_QUERY], "foo=bar")

def test_query_string_both_semconv(self):
self.scope["query_string"] = b"foo=bar"
attrs = otel_asgi.collect_request_attributes(
self.scope,
_HTTPStabilityMode.HTTP_DUP,
)
self.assertEqual(attrs[URL_FULL], "http://127.0.0.1/?foo=bar")
self.assertEqual(
attrs[SpanAttributes.HTTP_URL], "http://127.0.0.1/?foo=bar"
)
self.assertEqual(attrs[URL_SCHEME], "http")
self.assertEqual(attrs[SERVER_ADDRESS], "127.0.0.1")
self.assertEqual(attrs[URL_PATH], "/")
self.assertEqual(attrs[URL_QUERY], "foo=bar")

def test_query_string_percent_bytes(self):
self.scope["query_string"] = b"foo%3Dbar"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ def trace_item(self, coro_or_future):

async def trace_coroutine(self, coro):
if not hasattr(coro, "__name__"):
return coro
return await coro
start = default_timer()
attr = {
"type": "coroutine",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,23 @@ def tearDown(self):

# Asyncio anext() does not have __name__ attribute, which is used to determine if the coroutine should be traced.
# This test is to ensure that the instrumentation does not break when the coroutine does not have __name__ attribute.
# Additionally, ensure the coroutine is actually awaited.
@skipIf(
sys.version_info < (3, 10), "anext is only available in Python 3.10+"
)
def test_asyncio_anext(self):
async def main():
async def async_gen():
for it in range(2):
# nothing special about this range other than to avoid returning a zero
# from a function named 'main' (which might cause confusion about intent)
for it in range(2, 4):
yield it

async_gen_instance = async_gen()
agen = anext(async_gen_instance)
await asyncio.create_task(agen)
return await asyncio.create_task(agen)

asyncio.run(main())
ret = asyncio.run(main())
self.assertEqual(ret, 2) # first iteration from range()
spans = self.memory_exporter.get_finished_spans()
self.assertEqual(len(spans), 0)
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,6 @@
]
default_instrumentations = [
"opentelemetry-instrumentation-asyncio==0.48b0.dev",
"opentelemetry-instrumentation-aws-lambda==0.48b0.dev",
"opentelemetry-instrumentation-dbapi==0.48b0.dev",
"opentelemetry-instrumentation-logging==0.48b0.dev",
"opentelemetry-instrumentation-sqlite3==0.48b0.dev",
Expand Down
9 changes: 9 additions & 0 deletions scripts/generate_instrumentation_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,21 @@
"bootstrap_gen.py",
)

# AWS Lambda instrumentation is excluded from the default list because it often
# requires specific configurations and dependencies that may not be set up
# in all environments. Instead, users who need AWS Lambda support can opt-in
# by manually adding it to their environment.
# See https://github.com/open-telemetry/opentelemetry-python-contrib/issues/2787
packages_to_exclude = ["opentelemetry-instrumentation-aws-lambda"]


def main():
# pylint: disable=no-member
default_instrumentations = ast.List(elts=[])
libraries = ast.List(elts=[])
for pkg in get_instrumentation_packages():
if pkg.get("name") in packages_to_exclude:
continue
if not pkg["instruments"]:
default_instrumentations.elts.append(ast.Str(pkg["requirement"]))
for target_pkg in pkg["instruments"]:
Expand Down

0 comments on commit fd52a83

Please sign in to comment.