Skip to content

Commit 1e57f56

Browse files
authored
Merge branch 'main' into drop-docker-dependency-from-docker-tests
2 parents e901893 + ec9a98c commit 1e57f56

41 files changed

Lines changed: 702 additions & 156 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.

CHANGELOG.md

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

1414
### Added
15+
1516
- Add `BaggageLogProcessor` to `opentelemetry-processor-baggage`
1617
([#4371](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4371))
17-
1818
- `opentelemetry-instrumentation-system-metrics`: Add support for `process.disk.io` metric in system-metrics instrumentation
19-
([#4397](https://github.com/open-telemetry/opentelemetry-python-contrib/issues/4397))
19+
([#4397](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4397))
2020
- Switch to SPDX license headers and add CI enforcement
2121
([#4533](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4533))
2222
- Bump `pylint` to `4.0.5`
@@ -31,6 +31,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3131
([#3839](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3839))
3232
- `opentelemetry-exporter-richconsole`: Add support for suppressing resource information
3333
([#3898](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3898))
34+
- `opentelemetry-instrumentation`: Add experimental metrics attributes Labeler utility
35+
([#4288](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4288))
3436

3537
### Fixed
3638

@@ -48,11 +50,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4850
([#3896](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3896))
4951
- `docker-tests`: Don't require sudo, debian based distro and MS SQL ODBC driver to run locally. Instead require docker and unixodbc
5052
([#4478](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4478))
53+
- Refactor unit tests to allow for population of the random trace id flag in the `traceparent` header
54+
([#4030](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4030))
55+
- `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
56+
([#4368](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4368))
57+
- `opentelemetry-instrumentation-celery`: Coerce timelimit values to strings in `set_attributes_from_context()` to prevent mixed-type span attribute warning
58+
([#4361](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4361))
5159

5260
### Breaking changes
5361

5462
- Drop Python 3.9 support
5563
([#4412](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4412))
64+
- `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.
65+
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.
66+
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.
67+
([#4372](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4372))
5668

5769
## Version 1.41.0/0.62b0 (2026-04-09)
5870

@@ -72,13 +84,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7284
([#4049](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4049))
7385
- `opentelemetry-instrumentation-sqlalchemy`: implement new semantic convention opt-in migration
7486
([#4110](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4110))
75-
- `opentelemetry-instrumentation`: Add experimental metrics attributes Labeler utility
76-
([#4288](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4288))
7787

7888
### Fixed
7989

80-
- `opentelemetry-instrumentation-celery`: Coerce timelimit values to strings in `set_attributes_from_context()` to prevent mixed-type span attribute warning
81-
([#4361](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4361))
8290
- `opentelemetry-docker-tests`: Replace deprecated `SpanAttributes` from `opentelemetry.semconv.trace` with `opentelemetry.semconv._incubating.attributes`
8391
([#4339](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4339))
8492
- `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:

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ pytest-vcr==1.0.2
2929
pytest-asyncio==0.21.0
3030
wrapt==1.16.0
3131
opentelemetry-exporter-otlp-proto-http~=1.30
32-
opentelemetry-api==1.39 # when updating, also update in pyproject.toml
33-
opentelemetry-sdk==1.39 # when updating, also update in pyproject.toml
34-
opentelemetry-semantic-conventions==0.60b0 # when updating, also update in pyproject.toml
32+
opentelemetry-api==1.40 # when updating, also update in pyproject.toml
33+
opentelemetry-sdk==1.40 # when updating, also update in pyproject.toml
34+
opentelemetry-semantic-conventions==0.61b0 # when updating, also update in pyproject.toml
3535

3636
-e instrumentation-genai/opentelemetry-instrumentation-openai-v2
3737
-e util/opentelemetry-util-genai

instrumentation-genai/opentelemetry-instrumentation-openai-v2/tests/test_async_chat_completions.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
from .test_utils import (
2424
DEFAULT_MODEL,
25+
EXPECTED_TOOL_DEFINITIONS,
2526
USER_ONLY_EXPECTED_INPUT_MESSAGES,
2627
USER_ONLY_PROMPT,
2728
WEATHER_TOOL_EXPECTED_INPUT_MESSAGES,
@@ -616,6 +617,12 @@ async def chat_completion_tool_call(
616617
spans[0].attributes["gen_ai.output.messages"], first_output
617618
)
618619

620+
assert_messages_attribute(
621+
spans[0].attributes["gen_ai.tool.definitions"],
622+
EXPECTED_TOOL_DEFINITIONS,
623+
)
624+
assert "gen_ai.tool.definitions" not in spans[1].attributes
625+
619626
# second call
620627
del first_output[0]["finish_reason"]
621628
second_input = []
@@ -1172,7 +1179,7 @@ async def test_async_chat_completion_streaming_unsampled(
11721179

11731180
assert logs[0].log_record.trace_id is not None
11741181
assert logs[0].log_record.span_id is not None
1175-
assert logs[0].log_record.trace_flags == 0
1182+
assert not logs[0].log_record.trace_flags.sampled
11761183

11771184
assert logs[0].log_record.trace_id == logs[1].log_record.trace_id
11781185
assert logs[0].log_record.span_id == logs[1].log_record.span_id
@@ -1271,6 +1278,10 @@ async def async_chat_completion_multiple_tools_streaming(
12711278
assert_messages_attribute(
12721279
spans[0].attributes["gen_ai.output.messages"], first_output
12731280
)
1281+
assert_messages_attribute(
1282+
spans[0].attributes["gen_ai.tool.definitions"],
1283+
EXPECTED_TOOL_DEFINITIONS,
1284+
)
12741285
else:
12751286
assert len(logs) == 3
12761287

0 commit comments

Comments
 (0)