Skip to content

Commit e12ffee

Browse files
committed
add listener on 'page' in context
1 parent ff5e430 commit e12ffee

File tree

2 files changed

+91
-5
lines changed

2 files changed

+91
-5
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,6 @@ async for chunk in client.agent.run(
264264
):
265265
if chunk.chunkType == 'step':
266266
print(chunk.summary)
267-
else if chunk.chunkType == 'finalOutput':
267+
elif chunk.chunkType == 'finalOutput':
268268
print(chunk.content.result.content)
269269
```

src/lmnr/sdk/browser/playwright_otel.py

+90-4
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222
from wrapt import wrap_function_wrapper
2323

2424
try:
25-
from playwright.async_api import Browser
26-
from playwright.sync_api import Browser as SyncBrowser
25+
from playwright.async_api import Browser, BrowserContext
26+
from playwright.sync_api import (
27+
Browser as SyncBrowser,
28+
BrowserContext as SyncBrowserContext,
29+
)
2730
except ImportError as e:
2831
raise ImportError(
2932
f"Attempted to import {__file__}, but it is designed "
@@ -84,8 +87,12 @@ def _wrap_new_browser_sync(
8487
set_span_in_context(span, get_current())
8588
_context_spans[id(context)] = span
8689
span.set_attribute("lmnr.internal.has_browser_session", True)
90+
trace_id = format(span.get_span_context().trace_id, "032x")
91+
context.on(
92+
"page",
93+
lambda page: handle_navigation_sync(page, session_id, trace_id, client),
94+
)
8795
for page in context.pages:
88-
trace_id = format(span.get_span_context().trace_id, "032x")
8996
handle_navigation_sync(page, session_id, trace_id, client)
9097
return browser
9198

@@ -106,12 +113,67 @@ async def _wrap_new_browser_async(
106113
set_span_in_context(span, get_current())
107114
_context_spans[id(context)] = span
108115
span.set_attribute("lmnr.internal.has_browser_session", True)
116+
trace_id = format(span.get_span_context().trace_id, "032x")
117+
118+
async def handle_page_navigation(page):
119+
return await handle_navigation_async(page, session_id, trace_id, client)
120+
121+
context.on("page", handle_page_navigation)
109122
for page in context.pages:
110-
trace_id = format(span.get_span_context().trace_id, "032x")
111123
await handle_navigation_async(page, session_id, trace_id, client)
112124
return browser
113125

114126

127+
@with_tracer_and_client_wrapper
128+
def _wrap_new_context_sync(
129+
tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
130+
):
131+
context: SyncBrowserContext = wrapped(*args, **kwargs)
132+
session_id = str(uuid.uuid4().hex)
133+
span = get_current_span()
134+
if span == INVALID_SPAN:
135+
span = tracer.start_span(
136+
name=f"{to_wrap.get('object')}.{to_wrap.get('method')}"
137+
)
138+
set_span_in_context(span, get_current())
139+
_context_spans[id(context)] = span
140+
span.set_attribute("lmnr.internal.has_browser_session", True)
141+
trace_id = format(span.get_span_context().trace_id, "032x")
142+
143+
context.on(
144+
"page",
145+
lambda page: handle_navigation_sync(page, session_id, trace_id, client),
146+
)
147+
for page in context.pages:
148+
handle_navigation_sync(page, session_id, trace_id, client)
149+
return context
150+
151+
152+
@with_tracer_and_client_wrapper
153+
async def _wrap_new_context_async(
154+
tracer: Tracer, client: AsyncLaminarClient, to_wrap, wrapped, instance, args, kwargs
155+
):
156+
context: SyncBrowserContext = await wrapped(*args, **kwargs)
157+
session_id = str(uuid.uuid4().hex)
158+
span = get_current_span()
159+
if span == INVALID_SPAN:
160+
span = tracer.start_span(
161+
name=f"{to_wrap.get('object')}.{to_wrap.get('method')}"
162+
)
163+
set_span_in_context(span, get_current())
164+
_context_spans[id(context)] = span
165+
span.set_attribute("lmnr.internal.has_browser_session", True)
166+
trace_id = format(span.get_span_context().trace_id, "032x")
167+
168+
async def handle_page_navigation(page):
169+
return await handle_navigation_async(page, session_id, trace_id, client)
170+
171+
context.on("page", handle_page_navigation)
172+
for page in context.pages:
173+
await handle_navigation_async(page, session_id, trace_id, client)
174+
return context
175+
176+
115177
@with_tracer_and_client_wrapper
116178
def _wrap_close_browser_sync(
117179
tracer: Tracer,
@@ -191,6 +253,18 @@ async def _wrap_close_browser_async(
191253
"method": "close",
192254
"wrapper": _wrap_close_browser_sync,
193255
},
256+
{
257+
"package": "playwright.sync_api",
258+
"object": "Browser",
259+
"method": "new_context",
260+
"wrapper": _wrap_new_context_sync,
261+
},
262+
{
263+
"package": "playwright.sync_api",
264+
"object": "BrowserType",
265+
"method": "launch_persistent_context",
266+
"wrapper": _wrap_new_context_sync,
267+
},
194268
]
195269

196270
WRAPPED_METHODS_ASYNC = [
@@ -230,6 +304,18 @@ async def _wrap_close_browser_async(
230304
"method": "close",
231305
"wrapper": _wrap_close_browser_async,
232306
},
307+
{
308+
"package": "playwright.async_api",
309+
"object": "Browser",
310+
"method": "new_context",
311+
"wrapper": _wrap_new_context_async,
312+
},
313+
{
314+
"package": "playwright.sync_api",
315+
"object": "BrowserType",
316+
"method": "launch_persistent_context",
317+
"wrapper": _wrap_new_context_sync,
318+
},
233319
]
234320

235321

0 commit comments

Comments
 (0)