From 0546abf0f7d9f0f2b594baf0b4cbdd259db25846 Mon Sep 17 00:00:00 2001 From: Utkarshkhandka Date: Thu, 2 Apr 2026 23:37:48 +0530 Subject: [PATCH 1/3] Fix: Handle ToolNode in tools iteration for LangGraph compatibility --- .../opentelemetry/instrumentation/langchain/patch.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py b/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py index 6f6ce72ea8..1977421265 100644 --- a/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py +++ b/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py @@ -486,7 +486,15 @@ def wrapper(wrapped, _instance, args, kwargs): tools = args[1] if tools: tool_definitions = [] - for tool in tools: + if hasattr(tools, "tools_by_name"): + iterable_tools = tools.tools_by_name.values() + elif isinstance(tools, (list, tuple, set)): + iterable_tools = tools + else: + iterable_tools = [tools] + + for tool in iterable_tools: + tool_def = _extract_tool_definition(tool) tool_def = _extract_tool_definition(tool) if tool_def: tool_definitions.append(tool_def) From 9228d8c4e71dfe59d14829e88d329bca030f5660 Mon Sep 17 00:00:00 2001 From: Utkarsh Khandka <94026798+Utkarshkhandka@users.noreply.github.com> Date: Fri, 3 Apr 2026 12:01:41 +0530 Subject: [PATCH 2/3] Fix comment punctuation and refactor tool extraction Corrected comment punctuation and adjusted indentation for better readability. Streamlined tool extraction logic. --- .../instrumentation/langchain/patch.py | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py b/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py index 1977421265..04857977d1 100644 --- a/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py +++ b/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py @@ -468,7 +468,7 @@ def wrapper(wrapped, _instance, args, kwargs): span.set_attribute(GenAIAttributes.GEN_AI_AGENT_NAME, agent_name) # Extract system instructions from prompt/system_prompt parameter - # LangGraph uses "prompt", LangChain uses "system_prompt" + # LangGraph uses "prompt", LangChain uses "system_prompt." system_instructions = kwargs.get("prompt") or kwargs.get("system_prompt") if system_instructions: if isinstance(system_instructions, str): @@ -486,19 +486,18 @@ def wrapper(wrapped, _instance, args, kwargs): tools = args[1] if tools: tool_definitions = [] - if hasattr(tools, "tools_by_name"): - iterable_tools = tools.tools_by_name.values() - elif isinstance(tools, (list, tuple, set)): - iterable_tools = tools - else: - iterable_tools = [tools] + if hasattr(tools, "tools_by_name"): + iterable_tools = tools.tools_by_name.values() + elif isinstance(tools, (list, tuple, set)): + iterable_tools = tools + else: + iterable_tools = [tools] for tool in iterable_tools: tool_def = _extract_tool_definition(tool) - tool_def = _extract_tool_definition(tool) - if tool_def: - tool_definitions.append(tool_def) - if tool_definitions: + if tool_def: + tool_definitions.append(tool_def) + if tool_definitions: span.set_attribute( GenAIAttributes.GEN_AI_TOOL_DEFINITIONS, json.dumps(tool_definitions) From eefffb241bd5e61aa69f971eb3ae7a6c7588108a Mon Sep 17 00:00:00 2001 From: Utkarsh Khandka <94026798+Utkarshkhandka@users.noreply.github.com> Date: Fri, 3 Apr 2026 12:08:19 +0530 Subject: [PATCH 3/3] Refactor tool extraction logic in patch.py --- .../instrumentation/langchain/patch.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py b/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py index 04857977d1..f836105546 100644 --- a/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py +++ b/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/patch.py @@ -486,18 +486,18 @@ def wrapper(wrapped, _instance, args, kwargs): tools = args[1] if tools: tool_definitions = [] - if hasattr(tools, "tools_by_name"): - iterable_tools = tools.tools_by_name.values() - elif isinstance(tools, (list, tuple, set)): - iterable_tools = tools - else: - iterable_tools = [tools] + if hasattr(tools, "tools_by_name"): + iterable_tools = tools.tools_by_name.values() + elif isinstance(tools, (list, tuple, set)): + iterable_tools = tools + else: + iterable_tools = [tools] for tool in iterable_tools: tool_def = _extract_tool_definition(tool) - if tool_def: - tool_definitions.append(tool_def) - if tool_definitions: + if tool_def: + tool_definitions.append(tool_def) + if tool_definitions: span.set_attribute( GenAIAttributes.GEN_AI_TOOL_DEFINITIONS, json.dumps(tool_definitions)