Skip to content

Commit d1cf86b

Browse files
authored
Merge branch 'main' into doc-fastapi-doc-holes
2 parents 3b7a2e6 + 23ac232 commit d1cf86b

49 files changed

Lines changed: 733 additions & 178 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/generate_workflows_lib/src/generate_workflows_lib/misc.yml.j2

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ jobs:
6868
- name: Install tox
6969
run: pip install tox-uv
7070

71+
{%- if job_data == "docker-tests" %}
72+
73+
- name: Install Microsoft SQL ODBC driver
74+
run: sudo apt update -y && ACCEPT_EULA=Y sudo apt install -y msodbcsql18 unixodbc-dev unixodbc
75+
{%- endif %}
76+
7177
- name: Run tests
7278
run: tox -e {{ job_data }}
7379
{%- if job_data == "generate-workflows" %}

.github/workflows/misc.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ jobs:
5959
- name: Install tox
6060
run: pip install tox-uv
6161

62+
- name: Install Microsoft SQL ODBC driver
63+
run: sudo apt update -y && ACCEPT_EULA=Y sudo apt install -y msodbcsql18 unixodbc-dev unixodbc
64+
6265
- name: Run tests
6366
run: tox -e docker-tests
6467

CHANGELOG.md

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
## Unreleased
1313

1414
### Added
15-
- Add `BaggageLogProcessor` to `opentelemetry-processor-baggage`
16-
([#4371](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4371))
1715

1816
- `opentelemetry-instrumentation-fastapi`: Clarify documentation for zero-code setup, propagation, and logs
1917
([#4555](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4555))
2018
- `opentelemetry-instrumentation`: Include the package README in the generated documentation
2119
([#4555](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4555))
20+
- Add `BaggageLogProcessor` to `opentelemetry-processor-baggage`
21+
([#4371](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4371))
2222
- `opentelemetry-instrumentation-system-metrics`: Add support for `process.disk.io` metric in system-metrics instrumentation
23-
([#4397](https://github.com/open-telemetry/opentelemetry-python-contrib/issues/4397))
23+
([#4397](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4397))
2424
- Switch to SPDX license headers and add CI enforcement
2525
([#4533](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4533))
2626
- Bump `pylint` to `4.0.5`
@@ -35,6 +35,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3535
([#3839](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3839))
3636
- `opentelemetry-exporter-richconsole`: Add support for suppressing resource information
3737
([#3898](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3898))
38+
- `opentelemetry-instrumentation`: Add experimental metrics attributes Labeler utility
39+
([#4288](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4288))
3840

3941
### Fixed
4042

@@ -50,11 +52,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5052
([#4360](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4360))
5153
- `opentelemetry-instrumentation-aiohttp-server`: Use `canonical` attribute of the `Resource` as a span name
5254
([#3896](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3896))
55+
- `docker-tests`: Don't require sudo, debian based distro and MS SQL ODBC driver to run locally. Instead require docker and unixodbc
56+
([#4478](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4478))
57+
- Refactor unit tests to allow for population of the random trace id flag in the `traceparent` header
58+
([#4030](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4030))
59+
- `opentelemetry-instrumentation-fastapi`: Fix `FastAPI` instrumentation to correctly trace `BackgroundTasks` by wrapping their execution in a dedicated span, ensuring proper parent-child relationships and accurate trace timing
60+
([#4368](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4368))
61+
- `opentelemetry-instrumentation-celery`: Coerce timelimit values to strings in `set_attributes_from_context()` to prevent mixed-type span attribute warning
62+
([#4361](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4361))
5363

5464
### Breaking changes
5565

5666
- Drop Python 3.9 support
5767
([#4412](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4412))
68+
- `opentelemetry-instrumentation-logging`: Use `LogRecord.getMessage()` to format and extract each log record's body text to more closely match the expected usage of the logging system. As a result, all OTel log record bodies are now always strings.
69+
Previously, if `LogRecord.msg` (which contains the format string) was set to a non-string object (e.g. `logger.warning(some_dict)`), the object was exported as-is to the OTLP body field. Now, `LogRecord.getMessage()` will convert it to to a string.
70+
If you are passing in non-strings as the format string argument and your backend is expecting them as-is, you will need to update accordingly.
71+
([#4372](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4372))
5872

5973
## Version 1.41.0/0.62b0 (2026-04-09)
6074

@@ -74,13 +88,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7488
([#4049](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4049))
7589
- `opentelemetry-instrumentation-sqlalchemy`: implement new semantic convention opt-in migration
7690
([#4110](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4110))
77-
- `opentelemetry-instrumentation`: Add experimental metrics attributes Labeler utility
78-
([#4288](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4288))
7991

8092
### Fixed
8193

82-
- `opentelemetry-instrumentation-celery`: Coerce timelimit values to strings in `set_attributes_from_context()` to prevent mixed-type span attribute warning
83-
([#4361](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4361))
8494
- `opentelemetry-docker-tests`: Replace deprecated `SpanAttributes` from `opentelemetry.semconv.trace` with `opentelemetry.semconv._incubating.attributes`
8595
([#4339](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4339))
8696
- `opentelemetry-instrumentation-confluent-kafka`: Skip `recv` span creation when `poll()` returns no message or `consume()` returns an empty list, avoiding empty spans on idle polls

instrumentation-genai/opentelemetry-instrumentation-anthropic/pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ classifiers = [
2525
"Programming Language :: Python :: 3.14",
2626
]
2727
dependencies = [
28-
"opentelemetry-api ~= 1.39",
29-
"opentelemetry-instrumentation ~= 0.60b0",
30-
"opentelemetry-semantic-conventions ~= 0.60b0",
28+
"opentelemetry-api ~= 1.40",
29+
"opentelemetry-instrumentation ~= 0.61b0",
30+
"opentelemetry-semantic-conventions ~= 0.61b0",
3131
"opentelemetry-util-genai >= 0.4b0.dev, <0.5b0",
3232
]
3333

instrumentation-genai/opentelemetry-instrumentation-anthropic/tests/requirements.oldest.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ pytest==7.4.4
2121
pytest-vcr==1.0.2
2222
pytest-asyncio==0.21.0
2323
wrapt==1.16.0
24-
opentelemetry-api==1.39 # when updating, also update in pyproject.toml
25-
opentelemetry-sdk==1.39 # when updating, also update in pyproject.toml
26-
opentelemetry-semantic-conventions==0.60b0 # when updating, also update in pyproject.toml
24+
opentelemetry-api==1.40 # when updating, also update in pyproject.toml
25+
opentelemetry-sdk==1.40 # when updating, also update in pyproject.toml
26+
opentelemetry-semantic-conventions==0.61b0 # when updating, also update in pyproject.toml
2727

2828
-e instrumentation-genai/opentelemetry-instrumentation-anthropic

instrumentation-genai/opentelemetry-instrumentation-openai-agents-v2/pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ classifiers = [
2525
"Programming Language :: Python :: 3.14",
2626
]
2727
dependencies = [
28-
"opentelemetry-api >= 1.39",
29-
"opentelemetry-instrumentation >= 0.58b0",
30-
"opentelemetry-semantic-conventions >= 0.60b0",
28+
"opentelemetry-api >= 1.40",
29+
"opentelemetry-instrumentation >= 0.61b0",
30+
"opentelemetry-semantic-conventions >= 0.61b0",
3131
"opentelemetry-util-genai >= 0.4b0.dev"
3232
]
3333

instrumentation-genai/opentelemetry-instrumentation-openai-agents-v2/tests/requirements.oldest.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ pytest-asyncio==0.21.0
2626
wrapt==1.16.0
2727
opentelemetry-exporter-otlp-proto-grpc~=1.30
2828
opentelemetry-exporter-otlp-proto-http~=1.30
29-
opentelemetry-api==1.39 # when updating, also update in pyproject.toml
30-
opentelemetry-sdk==1.39 # when updating, also update in pyproject.toml
31-
opentelemetry-semantic-conventions==0.60b0 # when updating, also update in pyproject.toml
29+
opentelemetry-api==1.40 # when updating, also update in pyproject.toml
30+
opentelemetry-sdk==1.40 # when updating, also update in pyproject.toml
31+
opentelemetry-semantic-conventions==0.61b0 # when updating, also update in pyproject.toml
3232
grpcio>=1.60.0; implementation_name != "pypy"
3333
grpcio<1.60.0; implementation_name == "pypy"
3434

instrumentation-genai/opentelemetry-instrumentation-openai-v2/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
- Pass tool definitions from `tools` kwarg to `InferenceInvocation.tool_definitions`
11+
so `gen_ai.tool.definitions` span attribute is populated on chat completion spans
12+
([#4554](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4554))
13+
1014
## Version 2.4b0 (2026-05-01)
1115

1216

instrumentation-genai/opentelemetry-instrumentation-openai-v2/pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ classifiers = [
2525
"Programming Language :: Python :: 3.14",
2626
]
2727
dependencies = [
28-
"opentelemetry-api ~= 1.39",
29-
"opentelemetry-instrumentation ~= 0.60b0",
30-
"opentelemetry-semantic-conventions ~= 0.60b0",
28+
"opentelemetry-api ~= 1.40",
29+
"opentelemetry-instrumentation ~= 0.61b0",
30+
"opentelemetry-semantic-conventions ~= 0.61b0",
3131
"opentelemetry-util-genai >= 0.4b0.dev",
3232
]
3333

instrumentation-genai/opentelemetry-instrumentation-openai-v2/src/opentelemetry/instrumentation/openai_v2/utils.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@
3232
from opentelemetry.util.genai.handler import TelemetryHandler
3333
from opentelemetry.util.genai.invocation import InferenceInvocation
3434
from opentelemetry.util.genai.types import (
35+
FunctionToolDefinition,
3536
InputMessage,
3637
OutputMessage,
3738
Text,
3839
ToolCallRequest,
3940
ToolCallResponse,
41+
ToolDefinition,
4042
)
4143

4244
_OpenAIOmit = getattr(openai, "Omit", None)
@@ -397,6 +399,9 @@ def create_chat_invocation(
397399
invocation.input_messages = _prepare_input_messages(
398400
kwargs.get("messages", [])
399401
)
402+
invocation.tool_definitions = _prepare_tool_definitions(
403+
kwargs.get("tools")
404+
)
400405
return invocation
401406

402407

@@ -475,6 +480,26 @@ def extract_tool_calls_new(tool_calls) -> list[ToolCallRequest]:
475480
return parts
476481

477482

483+
def _prepare_tool_definitions(tools) -> list[ToolDefinition] | None:
484+
if not tools:
485+
return None
486+
487+
definitions: list[ToolDefinition] = []
488+
for tool in tools:
489+
tool_type = get_property_value(tool, "type")
490+
if tool_type == "function":
491+
func = get_property_value(tool, "function")
492+
if func:
493+
definitions.append(
494+
FunctionToolDefinition(
495+
name=get_property_value(func, "name") or "",
496+
description=get_property_value(func, "description"),
497+
parameters=get_property_value(func, "parameters"),
498+
)
499+
)
500+
return definitions
501+
502+
478503
def _prepare_output_messages(choices) -> List[OutputMessage]:
479504
output_messages = []
480505
for choice in choices:

0 commit comments

Comments
 (0)