Skip to content

Commit e9fff12

Browse files
committed
fixed errors
1 parent 1ce4cf5 commit e9fff12

File tree

4 files changed

+56
-27
lines changed

4 files changed

+56
-27
lines changed

instrumentation-genai/opentelemetry-instrumentation-langchain/examples/workflow/main.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
from typing import Annotated
1010

11-
1211
from langchain_core.messages import HumanMessage, SystemMessage
1312
from langchain_openai import ChatOpenAI
1413
from langgraph.graph import END, START, StateGraph
@@ -33,7 +32,6 @@
3332
from opentelemetry.sdk.trace import TracerProvider
3433
from opentelemetry.sdk.trace.export import BatchSpanProcessor
3534

36-
3735
# Configure tracing
3836
trace.set_tracer_provider(TracerProvider())
3937
span_processor = BatchSpanProcessor(OTLPSpanExporter())
@@ -112,4 +110,4 @@ def main():
112110

113111

114112
if __name__ == "__main__":
115-
main()
113+
main()

instrumentation-genai/opentelemetry-instrumentation-langchain/src/opentelemetry/instrumentation/langchain/callback_handler.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@
2525
_InvocationManager,
2626
)
2727
from opentelemetry.util.genai.handler import TelemetryHandler
28-
from opentelemetry.util.genai.invocation import InferenceInvocation
29-
from opentelemetry.util.genai.invocation import WorkflowInvocation
28+
from opentelemetry.util.genai.invocation import (
29+
InferenceInvocation,
30+
WorkflowInvocation,
31+
)
3032
from opentelemetry.util.genai.types import (
3133
InputMessage,
3234
MessagePart,
@@ -58,21 +60,26 @@ def on_chain_start(
5860
) -> Any:
5961
payload = serialized or {}
6062
name_source = (
61-
payload.get("name")
62-
or payload.get("id")
63-
or kwargs.get("name")
64-
or (metadata.get("langgraph_node") if metadata else None)
63+
payload.get("name")
64+
or payload.get("id")
65+
or kwargs.get("name")
66+
or (metadata.get("langgraph_node") if metadata else None)
6567
)
6668
name = str(name_source or "chain")
6769

6870
if parent_run_id is None:
69-
workflow_name_override = metadata.get("workflow_name") if metadata else None
70-
wf = self._telemetry_handler.start_workflow(name=workflow_name_override or name)
71+
workflow_name_override = (
72+
metadata.get("workflow_name") if metadata else None
73+
)
74+
wf = self._telemetry_handler.start_workflow(
75+
name=workflow_name_override or name
76+
)
7177
self._invocation_manager.add_invocation_state(run_id, None, wf)
7278
return
7379
else:
74-
self._invocation_manager.add_invocation_state(run_id, parent_run_id)
75-
80+
self._invocation_manager.add_invocation_state(
81+
run_id, parent_run_id
82+
)
7683

7784
def on_chain_end(
7885
self,
@@ -94,7 +101,6 @@ def on_chain_end(
94101
if not invocation.span.is_recording():
95102
self._invocation_manager.delete_invocation_state(run_id)
96103

97-
98104
def on_chain_error(
99105
self,
100106
error: BaseException,
@@ -336,4 +342,3 @@ def on_llm_error(
336342
llm_invocation.fail(error)
337343
if not llm_invocation.span.is_recording():
338344
self._invocation_manager.delete_invocation_state(run_id=run_id)
339-

instrumentation-genai/opentelemetry-instrumentation-langchain/tests/test_workflow_chain.py

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,10 @@
4343
from unittest import TestCase
4444
from unittest.mock import patch
4545

46-
from langchain_core.outputs import ChatGeneration, LLMResult
4746
from langchain_core.messages import AIMessage
47+
from langchain_core.outputs import ChatGeneration, LLMResult
4848

4949
from opentelemetry import baggage
50-
from opentelemetry import context as otel_context
5150
from opentelemetry.instrumentation.langchain.callback_handler import (
5251
OpenTelemetryLangChainCallbackHandler,
5352
)
@@ -63,11 +62,11 @@
6362
)
6463
from opentelemetry.util.genai.handler import TelemetryHandler
6564

66-
6765
# ---------------------------------------------------------------------------
6866
# Shared helpers
6967
# ---------------------------------------------------------------------------
7068

69+
7170
def _make_serialized(name: str) -> dict:
7271
"""Minimal serialized dict that on_chain_start / on_chat_model_start expect."""
7372
return {"name": name}
@@ -78,18 +77,26 @@ def _make_llm_result(content: str = "hello") -> LLMResult:
7877
msg = AIMessage(content=content)
7978
gen = ChatGeneration(message=msg, text=content)
8079
gen.generation_info = {"finish_reason": "stop"}
81-
return LLMResult(generations=[[gen]], llm_output={"model_name": "gpt-3.5-turbo"})
80+
return LLMResult(
81+
generations=[[gen]], llm_output={"model_name": "gpt-3.5-turbo"}
82+
)
8283

8384

8485
def _make_chat_invocation_params(model_name: str = "gpt-3.5-turbo") -> dict:
8586
"""kwargs dict that on_chat_model_start receives for a ChatOpenAI call."""
86-
return {"invocation_params": {"model_name": model_name, "params": {"model_name": model_name}}}
87+
return {
88+
"invocation_params": {
89+
"model_name": model_name,
90+
"params": {"model_name": model_name},
91+
}
92+
}
8793

8894

8995
# ---------------------------------------------------------------------------
9096
# Base test class
9197
# ---------------------------------------------------------------------------
9298

99+
93100
class _CallbackHandlerTestBase(TestCase):
94101
def setUp(self) -> None:
95102
self.span_exporter = InMemorySpanExporter()
@@ -113,6 +120,7 @@ def _spans_by_kind(self, kind: SpanKind):
113120
# Tests
114121
# ---------------------------------------------------------------------------
115122

123+
116124
class TestWorkflowSpanCreation(_CallbackHandlerTestBase):
117125
"""Verify that a workflow span is created for top-level chains."""
118126

@@ -243,7 +251,9 @@ def test_workflow_name_from_metadata_override(self) -> None:
243251

244252
internal_spans = self._spans_by_kind(SpanKind.INTERNAL)
245253
self.assertEqual(len(internal_spans), 1)
246-
self.assertEqual(internal_spans[0].name, "invoke_workflow my_custom_wf")
254+
self.assertEqual(
255+
internal_spans[0].name, "invoke_workflow my_custom_wf"
256+
)
247257

248258
client_spans = self._spans_by_kind(SpanKind.CLIENT)
249259
self.assertEqual(len(client_spans), 1)
@@ -257,7 +267,11 @@ class TestCSANotLeakedToBaggage(_CallbackHandlerTestBase):
257267
"""Verify that gen_ai.workflow.name is NOT written to W3C Baggage by default."""
258268

259269
def test_csa_not_leaked_to_baggage(self) -> None:
260-
env = {k: v for k, v in os.environ.items() if k != "OTEL_PYTHON_GENAI_CAPTURE_BAGGAGE"}
270+
env = {
271+
k: v
272+
for k, v in os.environ.items()
273+
if k != "OTEL_PYTHON_GENAI_CAPTURE_BAGGAGE"
274+
}
261275
with patch.dict(os.environ, env, clear=True):
262276
chain_run_id = uuid.uuid4()
263277

@@ -458,9 +472,13 @@ def test_llm_error_inside_workflow_records_error_on_llm_span(self) -> None:
458472
# Workflow span still finishes (not in error state)
459473
internal_spans = self._spans_by_kind(SpanKind.INTERNAL)
460474
self.assertEqual(len(internal_spans), 1)
461-
self.assertNotEqual(internal_spans[0].status.status_code, StatusCode.ERROR)
475+
self.assertNotEqual(
476+
internal_spans[0].status.status_code, StatusCode.ERROR
477+
)
462478

463-
def test_llm_error_inside_workflow_llm_span_is_child_of_workflow(self) -> None:
479+
def test_llm_error_inside_workflow_llm_span_is_child_of_workflow(
480+
self,
481+
) -> None:
464482
chain_run_id = uuid.uuid4()
465483
llm_run_id = uuid.uuid4()
466484

@@ -520,7 +538,9 @@ def test_name_falls_back_to_id_list(self) -> None:
520538
run_id=chain_run_id,
521539
parent_run_id=None,
522540
)
523-
self.handler.on_chain_end(outputs={}, run_id=chain_run_id, parent_run_id=None)
541+
self.handler.on_chain_end(
542+
outputs={}, run_id=chain_run_id, parent_run_id=None
543+
)
524544

525545
internal_spans = self._spans_by_kind(SpanKind.INTERNAL)
526546
self.assertEqual(len(internal_spans), 1)
@@ -537,7 +557,9 @@ def test_name_falls_back_to_langgraph_node(self) -> None:
537557
parent_run_id=None,
538558
metadata={"langgraph_node": "my_node"},
539559
)
540-
self.handler.on_chain_end(outputs={}, run_id=chain_run_id, parent_run_id=None)
560+
self.handler.on_chain_end(
561+
outputs={}, run_id=chain_run_id, parent_run_id=None
562+
)
541563

542564
internal_spans = self._spans_by_kind(SpanKind.INTERNAL)
543565
self.assertEqual(len(internal_spans), 1)
@@ -552,7 +574,9 @@ def test_name_defaults_to_chain_when_nothing_provided(self) -> None:
552574
run_id=chain_run_id,
553575
parent_run_id=None,
554576
)
555-
self.handler.on_chain_end(outputs={}, run_id=chain_run_id, parent_run_id=None)
577+
self.handler.on_chain_end(
578+
outputs={}, run_id=chain_run_id, parent_run_id=None
579+
)
556580

557581
internal_spans = self._spans_by_kind(SpanKind.INTERNAL)
558582
self.assertEqual(len(internal_spans), 1)

uv.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)