diff --git a/CHANGELOG.md b/CHANGELOG.md index d946d825d1..2dd8b95725 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-resource-detector-containerid`: make it more quiet on platforms without cgroups ([#3579](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3579)) +### Added + +- `opentelemetry-util-http` Added support for redacting specific url query string values and url credentials in instrumentations + ([#3508](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3508)) +- `opentelemetry-instrumentation-pymongo` `aggregate` and `getMore` capture statements support + ([#3601](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3601)) +- `opentelemetry-instrumentation-fastapi` Utilize instruments-any functionality. TODO MOVE TO NEW VERSION WHEN OUT + ([#3612](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3612)) +- `opentelemetry-instrumentation-psycopg2` Utilize instruments-any functionality. + ([#3612](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3612)) +- `opentelemetry-instrumentation-kafka-python` Utilize instruments-any functionality. + ([#3612](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3612)) + ## Version 1.34.0/0.55b0 (2025-06-04) ### Fixed diff --git a/instrumentation/README.md b/instrumentation/README.md index d58d710b4f..2e78e54a5a 100644 --- a/instrumentation/README.md +++ b/instrumentation/README.md @@ -22,7 +22,7 @@ | [opentelemetry-instrumentation-django](./opentelemetry-instrumentation-django) | django >= 1.10 | Yes | development | [opentelemetry-instrumentation-elasticsearch](./opentelemetry-instrumentation-elasticsearch) | elasticsearch >= 6.0 | No | development | [opentelemetry-instrumentation-falcon](./opentelemetry-instrumentation-falcon) | falcon >= 1.4.1, < 5.0.0 | Yes | migration -| [opentelemetry-instrumentation-fastapi](./opentelemetry-instrumentation-fastapi) | fastapi ~= 0.92 | Yes | migration +| [opentelemetry-instrumentation-fastapi](./opentelemetry-instrumentation-fastapi) | fastapi ~= 0.92,fastapi-slim ~= 0.92 | Yes | migration | [opentelemetry-instrumentation-flask](./opentelemetry-instrumentation-flask) | flask >= 1.0 | Yes | migration | [opentelemetry-instrumentation-grpc](./opentelemetry-instrumentation-grpc) | grpcio >= 1.42.0 | No | development | [opentelemetry-instrumentation-httpx](./opentelemetry-instrumentation-httpx) | httpx >= 0.18.0 | Yes | migration diff --git a/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml b/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml index 0597b38123..0afab0b5a4 100644 --- a/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml @@ -33,8 +33,10 @@ dependencies = [ ] [project.optional-dependencies] -instruments = [ +instruments = [] +instruments-any = [ "fastapi ~= 0.92", + "fastapi-slim ~= 0.92", ] [project.entry-points.opentelemetry_instrumentor] diff --git a/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/package.py b/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/package.py index 93e4534d3c..22f4b68c7d 100644 --- a/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/package.py +++ b/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/package.py @@ -13,7 +13,9 @@ # limitations under the License. -_instruments = ("fastapi ~= 0.92",) +# TODO: update this +_instruments = () +_instruments_any = ("fastapi ~= 0.92", "fastapi-slim ~= 0.92") _supports_metrics = True diff --git a/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml b/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml index a552db42d9..f9918e4d0d 100644 --- a/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml @@ -31,7 +31,8 @@ dependencies = [ ] [project.optional-dependencies] -instruments = [ +instruments = [] +instruments-any = [ "kafka-python >= 2.0, < 3.0", "kafka-python-ng >= 2.0, < 3.0" ] diff --git a/instrumentation/opentelemetry-instrumentation-kafka-python/src/opentelemetry/instrumentation/kafka/package.py b/instrumentation/opentelemetry-instrumentation-kafka-python/src/opentelemetry/instrumentation/kafka/package.py index 3a4a5e5de6..e0b8fe4bfa 100644 --- a/instrumentation/opentelemetry-instrumentation-kafka-python/src/opentelemetry/instrumentation/kafka/package.py +++ b/instrumentation/opentelemetry-instrumentation-kafka-python/src/opentelemetry/instrumentation/kafka/package.py @@ -13,7 +13,9 @@ # limitations under the License. +# TODO: where are these used? _instruments_kafka_python = "kafka-python >= 2.0, < 3.0" _instruments_kafka_python_ng = "kafka-python-ng >= 2.0, < 3.0" -_instruments = (_instruments_kafka_python, _instruments_kafka_python_ng) +_instruments = () +_instruments_any = (_instruments_kafka_python, _instruments_kafka_python_ng) diff --git a/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml b/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml index 8257865264..ebf55f04d4 100644 --- a/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml +++ b/instrumentation/opentelemetry-instrumentation-psycopg2/pyproject.toml @@ -31,7 +31,8 @@ dependencies = [ ] [project.optional-dependencies] -instruments = [ +instruments = [] +instruments-any = [ "psycopg2 >= 2.7.3.1", "psycopg2-binary >= 2.7.3.1", ] diff --git a/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/package.py b/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/package.py index b1bf92901a..d1b6e7b2a0 100644 --- a/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/package.py +++ b/instrumentation/opentelemetry-instrumentation-psycopg2/src/opentelemetry/instrumentation/psycopg2/package.py @@ -13,10 +13,13 @@ # limitations under the License. +# TODO: where are these used? _instruments_psycopg2 = "psycopg2 >= 2.7.3.1" _instruments_psycopg2_binary = "psycopg2-binary >= 2.7.3.1" -_instruments = ( +# TODO: maybe add _instruments_any +_instruments = () +_instruments_any = ( _instruments_psycopg2, _instruments_psycopg2_binary, ) diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py index cf6aedaf65..27b5d11992 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py @@ -104,6 +104,10 @@ "library": "fastapi ~= 0.92", "instrumentation": "opentelemetry-instrumentation-fastapi==0.57b0.dev", }, + { + "library": "fastapi-slim ~= 0.92", + "instrumentation": "opentelemetry-instrumentation-fastapi==0.57b0.dev", + }, { "library": "flask >= 1.0", "instrumentation": "opentelemetry-instrumentation-flask==0.57b0.dev", diff --git a/pyproject.toml b/pyproject.toml index 988fa6831b..be261f4c60 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,17 +32,20 @@ dependencies = [ "opentelemetry-instrumentation-elasticsearch[instruments]", "opentelemetry-instrumentation-falcon[instruments]", "opentelemetry-instrumentation-fastapi[instruments]", + "opentelemetry-instrumentation-fastapi[instruments-any]", "opentelemetry-instrumentation-flask[instruments]", "opentelemetry-instrumentation-grpc[instruments]", "opentelemetry-instrumentation-httpx[instruments]", "opentelemetry-instrumentation-jinja2[instruments]", "opentelemetry-instrumentation-kafka-python[instruments]", + "opentelemetry-instrumentation-kafka-python[instruments-any]", "opentelemetry-instrumentation-logging", "opentelemetry-instrumentation-mysql[instruments]", "opentelemetry-instrumentation-mysqlclient[instruments]", "opentelemetry-instrumentation-pika[instruments]", "opentelemetry-instrumentation-psycopg[instruments]", "opentelemetry-instrumentation-psycopg2[instruments]", + "opentelemetry-instrumentation-psycopg2[instruments-any]", "opentelemetry-instrumentation-pymemcache[instruments]", "opentelemetry-instrumentation-pymongo[instruments]", "opentelemetry-instrumentation-pymysql[instruments]", diff --git a/scripts/generate_instrumentation_bootstrap.py b/scripts/generate_instrumentation_bootstrap.py index c8bc0f936d..3299a05290 100755 --- a/scripts/generate_instrumentation_bootstrap.py +++ b/scripts/generate_instrumentation_bootstrap.py @@ -84,7 +84,7 @@ def main(): pkg_name = pkg.get("name") if pkg_name in packages_to_exclude: continue - if not pkg["instruments"]: + if not pkg["instruments"] and not pkg["instruments-any"]: default_instrumentations.elts.append(ast.Str(pkg["requirement"])) for target_pkg in pkg["instruments"]: libraries.elts.append( @@ -93,6 +93,14 @@ def main(): values=[ast.Str(target_pkg), ast.Str(pkg["requirement"])], ) ) + # instruments-any is an optional field that can be used instead of or in addition to _instruments. While _instruments is a list of dependencies, all of which are expected by the instrumentation, instruments-any is a list any of which but not all are expected. + for target_pkg in pkg["instruments-any"]: + libraries.elts.append( + ast.Dict( + keys=[ast.Str("library"), ast.Str("instrumentation")], + values=[ast.Str(target_pkg), ast.Str(pkg["requirement"])], + ) + ) tree = ast.parse(_source_tmpl) tree.body[0].value = libraries diff --git a/scripts/generate_instrumentation_readme.py b/scripts/generate_instrumentation_readme.py index b4a712cc83..0148480ff6 100755 --- a/scripts/generate_instrumentation_readme.py +++ b/scripts/generate_instrumentation_readme.py @@ -58,11 +58,16 @@ def main(base_instrumentation_path): with open(version_filename, encoding="utf-8") as fh: exec(fh.read(), pkg_info) - instruments = pkg_info["_instruments"] + instruments_and = pkg_info.get("_instruments", ()) + # _instruments_any is an optional field that can be used instead of or in addition to _instruments. While _instruments is a list of dependencies, all of which are expected by the instrumentation, _instruments_any is a list any of which but not all are expected. + instruments_any = pkg_info.get("_instruments_any", ()) supports_metrics = pkg_info.get("_supports_metrics") semconv_status = pkg_info.get("_semconv_status") - if not instruments: - instruments = (name,) + instruments_all = () + if not instruments_and and not instruments_any: + instruments_all = (name,) + else: + instruments_all = tuple(instruments_and + instruments_any) if not semconv_status: semconv_status = "development" @@ -70,7 +75,7 @@ def main(base_instrumentation_path): metric_column = "Yes" if supports_metrics else "No" table.append( - f"| [{instrumentation}](./{instrumentation}) | {','.join(instruments)} | {metric_column} | {semconv_status}" + f"| [{instrumentation}](./{instrumentation}) | {','.join(instruments_all)} | {metric_column} | {semconv_status}" ) with open( diff --git a/scripts/otel_packaging.py b/scripts/otel_packaging.py index 12e424cf2e..a542b9c067 100644 --- a/scripts/otel_packaging.py +++ b/scripts/otel_packaging.py @@ -60,12 +60,17 @@ def get_instrumentation_packages( with open(pyproject_toml_path, "rb") as file: pyproject_toml = tomli.load(file) + optional_dependencies = pyproject_toml["project"][ + "optional-dependencies" + ] + instruments = optional_dependencies.get("instruments", []) + # instruments-any is an optional field that can be used instead of or in addition to instruments. While instruments is a list of dependencies, all of which are expected by the instrumentation, instruments-any is a list any of which but not all are expected. + instruments_any = optional_dependencies.get("instruments-any", []) instrumentation = { "name": pyproject_toml["project"]["name"], "version": version.strip(), - "instruments": pyproject_toml["project"]["optional-dependencies"][ - "instruments" - ], + "instruments": instruments, + "instruments-any": instruments_any, } if instrumentation["name"] in independent_packages: specifier = independent_packages[instrumentation["name"]] diff --git a/uv.lock b/uv.lock index c4210acc9a..bd4a54c148 100644 --- a/uv.lock +++ b/uv.lock @@ -997,6 +997,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164 }, ] +[[package]] +name = "fastapi-slim" +version = "0.116.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/16/5cd5aed36d165a990a646b488b34ecebeb1970eebaca1902836299efbfbe/fastapi_slim-0.116.0.tar.gz", hash = "sha256:3ad5b8051b0e13fb4591afb992f473a040c9d6bf4c2b0925e4f38b0416329e4d", size = 296542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/53/fa173886253074caabdfedea8c4491dabd34028e65a36e0caf2a13a41e5f/fastapi_slim-0.116.0-py3-none-any.whl", hash = "sha256:2d7e5fed5671152fce6ffce6403b7715875269744593b4bcf29a77ef3d2b3fca", size = 95678 }, +] + [[package]] name = "flask" version = "3.1.1" @@ -2720,20 +2734,22 @@ dependencies = [ ] [package.optional-dependencies] -instruments = [ +instruments-any = [ { name = "fastapi" }, + { name = "fastapi-slim" }, ] [package.metadata] requires-dist = [ - { name = "fastapi", marker = "extra == 'instruments'", specifier = "~=0.92" }, + { name = "fastapi", marker = "extra == 'instruments-any'", specifier = "~=0.92" }, + { name = "fastapi-slim", marker = "extra == 'instruments-any'", specifier = "~=0.92" }, { name = "opentelemetry-api", git = "https://github.com/open-telemetry/opentelemetry-python?subdirectory=opentelemetry-api&branch=main" }, { name = "opentelemetry-instrumentation", editable = "opentelemetry-instrumentation" }, { name = "opentelemetry-instrumentation-asgi", editable = "instrumentation/opentelemetry-instrumentation-asgi" }, { name = "opentelemetry-semantic-conventions", git = "https://github.com/open-telemetry/opentelemetry-python?subdirectory=opentelemetry-semantic-conventions&branch=main" }, { name = "opentelemetry-util-http", editable = "util/opentelemetry-util-http" }, ] -provides-extras = ["instruments"] +provides-extras = ["instruments", "instruments-any"] [[package]] name = "opentelemetry-instrumentation-flask" @@ -2872,20 +2888,20 @@ dependencies = [ ] [package.optional-dependencies] -instruments = [ +instruments-any = [ { name = "kafka-python" }, { name = "kafka-python-ng" }, ] [package.metadata] requires-dist = [ - { name = "kafka-python", marker = "extra == 'instruments'", specifier = ">=2.0,<3.0" }, - { name = "kafka-python-ng", marker = "extra == 'instruments'", specifier = ">=2.0,<3.0" }, + { name = "kafka-python", marker = "extra == 'instruments-any'", specifier = ">=2.0,<3.0" }, + { name = "kafka-python-ng", marker = "extra == 'instruments-any'", specifier = ">=2.0,<3.0" }, { name = "opentelemetry-api", git = "https://github.com/open-telemetry/opentelemetry-python?subdirectory=opentelemetry-api&branch=main" }, { name = "opentelemetry-instrumentation", editable = "opentelemetry-instrumentation" }, { name = "opentelemetry-semantic-conventions", git = "https://github.com/open-telemetry/opentelemetry-python?subdirectory=opentelemetry-semantic-conventions&branch=main" }, ] -provides-extras = ["instruments"] +provides-extras = ["instruments", "instruments-any"] [[package]] name = "opentelemetry-instrumentation-logging" @@ -3029,7 +3045,7 @@ dependencies = [ ] [package.optional-dependencies] -instruments = [ +instruments-any = [ { name = "psycopg2" }, { name = "psycopg2-binary" }, ] @@ -3039,10 +3055,10 @@ requires-dist = [ { name = "opentelemetry-api", git = "https://github.com/open-telemetry/opentelemetry-python?subdirectory=opentelemetry-api&branch=main" }, { name = "opentelemetry-instrumentation", editable = "opentelemetry-instrumentation" }, { name = "opentelemetry-instrumentation-dbapi", editable = "instrumentation/opentelemetry-instrumentation-dbapi" }, - { name = "psycopg2", marker = "extra == 'instruments'", specifier = ">=2.7.3.1" }, - { name = "psycopg2-binary", marker = "extra == 'instruments'", specifier = ">=2.7.3.1" }, + { name = "psycopg2", marker = "extra == 'instruments-any'", specifier = ">=2.7.3.1" }, + { name = "psycopg2-binary", marker = "extra == 'instruments-any'", specifier = ">=2.7.3.1" }, ] -provides-extras = ["instruments"] +provides-extras = ["instruments", "instruments-any"] [[package]] name = "opentelemetry-instrumentation-pymemcache" @@ -3543,19 +3559,19 @@ dependencies = [ { name = "opentelemetry-instrumentation-django", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-elasticsearch", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-falcon", extra = ["instruments"] }, - { name = "opentelemetry-instrumentation-fastapi", extra = ["instruments"] }, + { name = "opentelemetry-instrumentation-fastapi", extra = ["instruments-any"] }, { name = "opentelemetry-instrumentation-flask", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-grpc", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-httpx", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-jinja2", extra = ["instruments"] }, - { name = "opentelemetry-instrumentation-kafka-python", extra = ["instruments"] }, + { name = "opentelemetry-instrumentation-kafka-python", extra = ["instruments-any"] }, { name = "opentelemetry-instrumentation-logging" }, { name = "opentelemetry-instrumentation-mysql", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-mysqlclient", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-openai-v2", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-pika", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-psycopg", extra = ["instruments"] }, - { name = "opentelemetry-instrumentation-psycopg2", extra = ["instruments"] }, + { name = "opentelemetry-instrumentation-psycopg2", extra = ["instruments-any"] }, { name = "opentelemetry-instrumentation-pymemcache", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-pymongo", extra = ["instruments"] }, { name = "opentelemetry-instrumentation-pymysql", extra = ["instruments"] }, @@ -3608,11 +3624,13 @@ requires-dist = [ { name = "opentelemetry-instrumentation-elasticsearch", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-elasticsearch" }, { name = "opentelemetry-instrumentation-falcon", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-falcon" }, { name = "opentelemetry-instrumentation-fastapi", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-fastapi" }, + { name = "opentelemetry-instrumentation-fastapi", extras = ["instruments-any"], editable = "instrumentation/opentelemetry-instrumentation-fastapi" }, { name = "opentelemetry-instrumentation-flask", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-flask" }, { name = "opentelemetry-instrumentation-grpc", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-grpc" }, { name = "opentelemetry-instrumentation-httpx", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-httpx" }, { name = "opentelemetry-instrumentation-jinja2", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-jinja2" }, { name = "opentelemetry-instrumentation-kafka-python", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-kafka-python" }, + { name = "opentelemetry-instrumentation-kafka-python", extras = ["instruments-any"], editable = "instrumentation/opentelemetry-instrumentation-kafka-python" }, { name = "opentelemetry-instrumentation-logging", editable = "instrumentation/opentelemetry-instrumentation-logging" }, { name = "opentelemetry-instrumentation-mysql", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-mysql" }, { name = "opentelemetry-instrumentation-mysqlclient", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-mysqlclient" }, @@ -3620,6 +3638,7 @@ requires-dist = [ { name = "opentelemetry-instrumentation-pika", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-pika" }, { name = "opentelemetry-instrumentation-psycopg", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-psycopg" }, { name = "opentelemetry-instrumentation-psycopg2", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-psycopg2" }, + { name = "opentelemetry-instrumentation-psycopg2", extras = ["instruments-any"], editable = "instrumentation/opentelemetry-instrumentation-psycopg2" }, { name = "opentelemetry-instrumentation-pymemcache", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-pymemcache" }, { name = "opentelemetry-instrumentation-pymongo", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-pymongo" }, { name = "opentelemetry-instrumentation-pymysql", extras = ["instruments"], editable = "instrumentation/opentelemetry-instrumentation-pymysql" },