lmnr 0.5.1__py3-none-any.whl → 0.5.1a0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lmnr/openllmetry_sdk/__init__.py +35 -3
- lmnr/openllmetry_sdk/decorators/base.py +4 -4
- lmnr/openllmetry_sdk/tracing/__init__.py +0 -1
- lmnr/openllmetry_sdk/tracing/tracing.py +251 -207
- lmnr/sdk/browser/playwright_otel.py +58 -42
- lmnr/sdk/browser/pw_utils.py +40 -8
- lmnr/sdk/client/asynchronous/async_client.py +8 -0
- lmnr/sdk/client/synchronous/sync_client.py +8 -0
- lmnr/sdk/laminar.py +3 -3
- lmnr/version.py +1 -1
- {lmnr-0.5.1.dist-info → lmnr-0.5.1a0.dist-info}/METADATA +1 -1
- {lmnr-0.5.1.dist-info → lmnr-0.5.1a0.dist-info}/RECORD +15 -16
- lmnr/openllmetry_sdk/tracing/context_manager.py +0 -13
- {lmnr-0.5.1.dist-info → lmnr-0.5.1a0.dist-info}/LICENSE +0 -0
- {lmnr-0.5.1.dist-info → lmnr-0.5.1a0.dist-info}/WHEEL +0 -0
- {lmnr-0.5.1.dist-info → lmnr-0.5.1a0.dist-info}/entry_points.txt +0 -0
@@ -2,9 +2,7 @@ import logging
|
|
2
2
|
import uuid
|
3
3
|
|
4
4
|
from lmnr.sdk.browser.pw_utils import handle_navigation_async, handle_navigation_sync
|
5
|
-
from lmnr.sdk.browser.utils import
|
6
|
-
from lmnr.sdk.client.asynchronous.async_client import AsyncLaminarClient
|
7
|
-
from lmnr.sdk.client.synchronous.sync_client import LaminarClient
|
5
|
+
from lmnr.sdk.browser.utils import with_tracer_wrapper
|
8
6
|
from lmnr.version import __version__
|
9
7
|
|
10
8
|
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
@@ -18,11 +16,11 @@ from opentelemetry.trace import (
|
|
18
16
|
set_span_in_context,
|
19
17
|
)
|
20
18
|
from opentelemetry.context import get_current
|
21
|
-
from typing import Collection
|
19
|
+
from typing import Collection, Optional
|
22
20
|
from wrapt import wrap_function_wrapper
|
23
21
|
|
24
22
|
try:
|
25
|
-
from playwright.async_api import Browser
|
23
|
+
from playwright.async_api import Browser
|
26
24
|
from playwright.sync_api import (
|
27
25
|
Browser as SyncBrowser,
|
28
26
|
BrowserContext as SyncBrowserContext,
|
@@ -39,12 +37,12 @@ _instruments = ("playwright >= 1.9.0",)
|
|
39
37
|
logger = logging.getLogger(__name__)
|
40
38
|
|
41
39
|
_context_spans: dict[str, Span] = {}
|
40
|
+
_project_api_key: Optional[str] = None
|
41
|
+
_base_http_url: Optional[str] = None
|
42
42
|
|
43
43
|
|
44
|
-
@
|
45
|
-
def _wrap_new_page(
|
46
|
-
tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
|
47
|
-
):
|
44
|
+
@with_tracer_wrapper
|
45
|
+
def _wrap_new_page(tracer: Tracer, to_wrap, wrapped, instance, args, kwargs):
|
48
46
|
with tracer.start_as_current_span(
|
49
47
|
f"{to_wrap.get('object')}.{to_wrap.get('method')}"
|
50
48
|
) as span:
|
@@ -52,13 +50,15 @@ def _wrap_new_page(
|
|
52
50
|
session_id = str(uuid.uuid4().hex)
|
53
51
|
trace_id = format(get_current_span().get_span_context().trace_id, "032x")
|
54
52
|
span.set_attribute("lmnr.internal.has_browser_session", True)
|
55
|
-
handle_navigation_sync(
|
53
|
+
handle_navigation_sync(
|
54
|
+
page, session_id, trace_id, _project_api_key, _base_http_url
|
55
|
+
)
|
56
56
|
return page
|
57
57
|
|
58
58
|
|
59
|
-
@
|
59
|
+
@with_tracer_wrapper
|
60
60
|
async def _wrap_new_page_async(
|
61
|
-
tracer: Tracer,
|
61
|
+
tracer: Tracer, to_wrap, wrapped, instance, args, kwargs
|
62
62
|
):
|
63
63
|
with tracer.start_as_current_span(
|
64
64
|
f"{to_wrap.get('object')}.{to_wrap.get('method')}"
|
@@ -67,14 +67,14 @@ async def _wrap_new_page_async(
|
|
67
67
|
session_id = str(uuid.uuid4().hex)
|
68
68
|
trace_id = format(span.get_span_context().trace_id, "032x")
|
69
69
|
span.set_attribute("lmnr.internal.has_browser_session", True)
|
70
|
-
await handle_navigation_async(
|
70
|
+
await handle_navigation_async(
|
71
|
+
page, session_id, trace_id, _project_api_key, _base_http_url
|
72
|
+
)
|
71
73
|
return page
|
72
74
|
|
73
75
|
|
74
|
-
@
|
75
|
-
def _wrap_new_browser_sync(
|
76
|
-
tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
|
77
|
-
):
|
76
|
+
@with_tracer_wrapper
|
77
|
+
def _wrap_new_browser_sync(tracer: Tracer, to_wrap, wrapped, instance, args, kwargs):
|
78
78
|
global _context_spans
|
79
79
|
browser: SyncBrowser = wrapped(*args, **kwargs)
|
80
80
|
session_id = str(uuid.uuid4().hex)
|
@@ -90,16 +90,20 @@ def _wrap_new_browser_sync(
|
|
90
90
|
trace_id = format(span.get_span_context().trace_id, "032x")
|
91
91
|
context.on(
|
92
92
|
"page",
|
93
|
-
lambda page: handle_navigation_sync(
|
93
|
+
lambda page: handle_navigation_sync(
|
94
|
+
page, session_id, trace_id, _project_api_key, _base_http_url
|
95
|
+
),
|
94
96
|
)
|
95
97
|
for page in context.pages:
|
96
|
-
handle_navigation_sync(
|
98
|
+
handle_navigation_sync(
|
99
|
+
page, session_id, trace_id, _project_api_key, _base_http_url
|
100
|
+
)
|
97
101
|
return browser
|
98
102
|
|
99
103
|
|
100
|
-
@
|
104
|
+
@with_tracer_wrapper
|
101
105
|
async def _wrap_new_browser_async(
|
102
|
-
tracer: Tracer,
|
106
|
+
tracer: Tracer, to_wrap, wrapped, instance, args, kwargs
|
103
107
|
):
|
104
108
|
global _context_spans
|
105
109
|
browser: Browser = await wrapped(*args, **kwargs)
|
@@ -116,18 +120,20 @@ async def _wrap_new_browser_async(
|
|
116
120
|
trace_id = format(span.get_span_context().trace_id, "032x")
|
117
121
|
|
118
122
|
async def handle_page_navigation(page):
|
119
|
-
return await handle_navigation_async(
|
123
|
+
return await handle_navigation_async(
|
124
|
+
page, session_id, trace_id, _project_api_key, _base_http_url
|
125
|
+
)
|
120
126
|
|
121
127
|
context.on("page", handle_page_navigation)
|
122
128
|
for page in context.pages:
|
123
|
-
await handle_navigation_async(
|
129
|
+
await handle_navigation_async(
|
130
|
+
page, session_id, trace_id, _project_api_key, _base_http_url
|
131
|
+
)
|
124
132
|
return browser
|
125
133
|
|
126
134
|
|
127
|
-
@
|
128
|
-
def _wrap_new_context_sync(
|
129
|
-
tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
|
130
|
-
):
|
135
|
+
@with_tracer_wrapper
|
136
|
+
def _wrap_new_context_sync(tracer: Tracer, to_wrap, wrapped, instance, args, kwargs):
|
131
137
|
context: SyncBrowserContext = wrapped(*args, **kwargs)
|
132
138
|
session_id = str(uuid.uuid4().hex)
|
133
139
|
span = get_current_span()
|
@@ -142,16 +148,20 @@ def _wrap_new_context_sync(
|
|
142
148
|
|
143
149
|
context.on(
|
144
150
|
"page",
|
145
|
-
lambda page: handle_navigation_sync(
|
151
|
+
lambda page: handle_navigation_sync(
|
152
|
+
page, session_id, trace_id, _project_api_key, _base_http_url
|
153
|
+
),
|
146
154
|
)
|
147
155
|
for page in context.pages:
|
148
|
-
handle_navigation_sync(
|
156
|
+
handle_navigation_sync(
|
157
|
+
page, session_id, trace_id, _project_api_key, _base_http_url
|
158
|
+
)
|
149
159
|
return context
|
150
160
|
|
151
161
|
|
152
|
-
@
|
162
|
+
@with_tracer_wrapper
|
153
163
|
async def _wrap_new_context_async(
|
154
|
-
tracer: Tracer,
|
164
|
+
tracer: Tracer, to_wrap, wrapped, instance, args, kwargs
|
155
165
|
):
|
156
166
|
context: SyncBrowserContext = await wrapped(*args, **kwargs)
|
157
167
|
session_id = str(uuid.uuid4().hex)
|
@@ -166,18 +176,21 @@ async def _wrap_new_context_async(
|
|
166
176
|
trace_id = format(span.get_span_context().trace_id, "032x")
|
167
177
|
|
168
178
|
async def handle_page_navigation(page):
|
169
|
-
return await handle_navigation_async(
|
179
|
+
return await handle_navigation_async(
|
180
|
+
page, session_id, trace_id, _project_api_key, _base_http_url
|
181
|
+
)
|
170
182
|
|
171
183
|
context.on("page", handle_page_navigation)
|
172
184
|
for page in context.pages:
|
173
|
-
await handle_navigation_async(
|
185
|
+
await handle_navigation_async(
|
186
|
+
page, session_id, trace_id, _project_api_key, _base_http_url
|
187
|
+
)
|
174
188
|
return context
|
175
189
|
|
176
190
|
|
177
|
-
@
|
191
|
+
@with_tracer_wrapper
|
178
192
|
def _wrap_close_browser_sync(
|
179
193
|
tracer: Tracer,
|
180
|
-
client: LaminarClient,
|
181
194
|
to_wrap,
|
182
195
|
wrapped,
|
183
196
|
instance: SyncBrowser,
|
@@ -195,10 +208,9 @@ def _wrap_close_browser_sync(
|
|
195
208
|
return wrapped(*args, **kwargs)
|
196
209
|
|
197
210
|
|
198
|
-
@
|
211
|
+
@with_tracer_wrapper
|
199
212
|
async def _wrap_close_browser_async(
|
200
213
|
tracer: Tracer,
|
201
|
-
client: AsyncLaminarClient,
|
202
214
|
to_wrap,
|
203
215
|
wrapped,
|
204
216
|
instance: Browser,
|
@@ -320,18 +332,24 @@ WRAPPED_METHODS_ASYNC = [
|
|
320
332
|
|
321
333
|
|
322
334
|
class PlaywrightInstrumentor(BaseInstrumentor):
|
323
|
-
def __init__(self
|
335
|
+
def __init__(self):
|
324
336
|
super().__init__()
|
325
|
-
self.client = client
|
326
|
-
self.async_client = async_client
|
327
337
|
|
328
338
|
def instrumentation_dependencies(self) -> Collection[str]:
|
329
339
|
return _instruments
|
330
340
|
|
331
341
|
def _instrument(self, **kwargs):
|
342
|
+
global _project_api_key, _base_http_url
|
343
|
+
|
332
344
|
tracer_provider = kwargs.get("tracer_provider")
|
333
345
|
tracer = get_tracer(__name__, __version__, tracer_provider)
|
334
346
|
|
347
|
+
if kwargs.get("project_api_key"):
|
348
|
+
_project_api_key = kwargs.get("project_api_key")
|
349
|
+
|
350
|
+
if kwargs.get("base_http_url"):
|
351
|
+
_base_http_url = kwargs.get("base_http_url")
|
352
|
+
|
335
353
|
for wrapped_method in WRAPPED_METHODS:
|
336
354
|
wrap_package = wrapped_method.get("package")
|
337
355
|
wrap_object = wrapped_method.get("object")
|
@@ -342,7 +360,6 @@ class PlaywrightInstrumentor(BaseInstrumentor):
|
|
342
360
|
f"{wrap_object}.{wrap_method}",
|
343
361
|
wrapped_method.get("wrapper")(
|
344
362
|
tracer,
|
345
|
-
self.client,
|
346
363
|
wrapped_method,
|
347
364
|
),
|
348
365
|
)
|
@@ -360,7 +377,6 @@ class PlaywrightInstrumentor(BaseInstrumentor):
|
|
360
377
|
f"{wrap_object}.{wrap_method}",
|
361
378
|
wrapped_method.get("wrapper")(
|
362
379
|
tracer,
|
363
|
-
self.async_client,
|
364
380
|
wrapped_method,
|
365
381
|
),
|
366
382
|
)
|
lmnr/sdk/browser/pw_utils.py
CHANGED
@@ -3,6 +3,7 @@ import logging
|
|
3
3
|
import os
|
4
4
|
import time
|
5
5
|
import threading
|
6
|
+
from typing import Optional
|
6
7
|
|
7
8
|
from opentelemetry import trace
|
8
9
|
|
@@ -26,6 +27,8 @@ logger = logging.getLogger(__name__)
|
|
26
27
|
# Track pages we've already instrumented to avoid double-instrumentation
|
27
28
|
instrumented_pages = set()
|
28
29
|
async_instrumented_pages = set()
|
30
|
+
client: Optional[LaminarClient] = None
|
31
|
+
async_client: Optional[AsyncLaminarClient] = None
|
29
32
|
|
30
33
|
|
31
34
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
@@ -220,8 +223,21 @@ async def inject_rrweb_async(page: Page):
|
|
220
223
|
|
221
224
|
@observe(name="playwright.page", ignore_input=True, ignore_output=True)
|
222
225
|
def handle_navigation_sync(
|
223
|
-
page: SyncPage,
|
226
|
+
page: SyncPage,
|
227
|
+
session_id: str,
|
228
|
+
trace_id: str,
|
229
|
+
project_api_key: Optional[str] = None,
|
230
|
+
base_http_url: Optional[str] = None,
|
224
231
|
):
|
232
|
+
global client
|
233
|
+
if client is None:
|
234
|
+
client = LaminarClient(base_url=base_http_url, project_api_key=project_api_key)
|
235
|
+
if (base_http_url is not None and base_http_url != client.base_url) or (
|
236
|
+
project_api_key is not None and project_api_key != client.project_api_key
|
237
|
+
):
|
238
|
+
if client is not None:
|
239
|
+
client.close()
|
240
|
+
client = LaminarClient(base_url=base_http_url, project_api_key=project_api_key)
|
225
241
|
trace.get_current_span().set_attribute("lmnr.internal.has_browser_session", True)
|
226
242
|
# Check if we've already instrumented this page
|
227
243
|
page_id = id(page)
|
@@ -239,11 +255,10 @@ def handle_navigation_sync(
|
|
239
255
|
inject_rrweb_sync(page)
|
240
256
|
|
241
257
|
def collection_loop():
|
242
|
-
while not page.is_closed():
|
258
|
+
while not page.is_closed():
|
243
259
|
send_events_sync(page, session_id, trace_id, client)
|
244
260
|
time.sleep(2)
|
245
261
|
|
246
|
-
# Clean up when page closes
|
247
262
|
if page_id in instrumented_pages:
|
248
263
|
instrumented_pages.remove(page_id)
|
249
264
|
|
@@ -253,8 +268,25 @@ def handle_navigation_sync(
|
|
253
268
|
|
254
269
|
@observe(name="playwright.page", ignore_input=True, ignore_output=True)
|
255
270
|
async def handle_navigation_async(
|
256
|
-
page: Page,
|
271
|
+
page: Page,
|
272
|
+
session_id: str,
|
273
|
+
trace_id: str,
|
274
|
+
project_api_key: Optional[str] = None,
|
275
|
+
base_http_url: Optional[str] = None,
|
257
276
|
):
|
277
|
+
global async_client
|
278
|
+
if async_client is None:
|
279
|
+
async_client = AsyncLaminarClient(
|
280
|
+
base_url=base_http_url, project_api_key=project_api_key
|
281
|
+
)
|
282
|
+
if (base_http_url is not None and base_http_url != async_client.base_url) or (
|
283
|
+
project_api_key is not None and project_api_key != async_client.project_api_key
|
284
|
+
):
|
285
|
+
if async_client is not None:
|
286
|
+
await async_client.close()
|
287
|
+
async_client = AsyncLaminarClient(
|
288
|
+
base_url=base_http_url, project_api_key=project_api_key
|
289
|
+
)
|
258
290
|
trace.get_current_span().set_attribute("lmnr.internal.has_browser_session", True)
|
259
291
|
# Check if we've already instrumented this page
|
260
292
|
page_id = id(page)
|
@@ -271,19 +303,19 @@ async def handle_navigation_async(
|
|
271
303
|
page.on("load", lambda: asyncio.create_task(on_load()))
|
272
304
|
await inject_rrweb_async(page)
|
273
305
|
|
274
|
-
async def collection_loop():
|
306
|
+
async def collection_loop(client: AsyncLaminarClient):
|
275
307
|
try:
|
276
|
-
while not page.is_closed():
|
308
|
+
while not page.is_closed():
|
277
309
|
await send_events_async(page, session_id, trace_id, client)
|
278
310
|
await asyncio.sleep(2)
|
279
|
-
|
311
|
+
|
280
312
|
async_instrumented_pages.remove(page_id)
|
281
313
|
logger.info("Event collection stopped")
|
282
314
|
except Exception as e:
|
283
315
|
logger.error(f"Event collection stopped: {e}")
|
284
316
|
|
285
317
|
# Create and store task
|
286
|
-
task = asyncio.create_task(collection_loop())
|
318
|
+
task = asyncio.create_task(collection_loop(async_client))
|
287
319
|
|
288
320
|
# Clean up task when page closes
|
289
321
|
page.on("close", lambda: task.cancel())
|
@@ -137,6 +137,14 @@ class AsyncLaminarClient:
|
|
137
137
|
"""
|
138
138
|
await self.__client.aclose()
|
139
139
|
|
140
|
+
@property
|
141
|
+
def base_url(self) -> str:
|
142
|
+
return self.__base_url
|
143
|
+
|
144
|
+
@property
|
145
|
+
def project_api_key(self) -> str:
|
146
|
+
return self.__project_api_key
|
147
|
+
|
140
148
|
async def __aenter__(self: _T) -> _T:
|
141
149
|
return self
|
142
150
|
|
@@ -150,6 +150,14 @@ class LaminarClient:
|
|
150
150
|
if hasattr(self, "_client"):
|
151
151
|
self.__client.close()
|
152
152
|
|
153
|
+
@property
|
154
|
+
def base_url(self) -> str:
|
155
|
+
return self.__base_url
|
156
|
+
|
157
|
+
@property
|
158
|
+
def project_api_key(self) -> str:
|
159
|
+
return self.__project_api_key
|
160
|
+
|
153
161
|
def __enter__(self: _T) -> _T:
|
154
162
|
return self
|
155
163
|
|
lmnr/sdk/laminar.py
CHANGED
@@ -2,7 +2,7 @@ from contextlib import contextmanager
|
|
2
2
|
from contextvars import Context
|
3
3
|
from lmnr.openllmetry_sdk import TracerManager
|
4
4
|
from lmnr.openllmetry_sdk.instruments import Instruments
|
5
|
-
from lmnr.openllmetry_sdk
|
5
|
+
from lmnr.openllmetry_sdk import get_tracer
|
6
6
|
from lmnr.openllmetry_sdk.tracing.attributes import (
|
7
7
|
ASSOCIATION_PROPERTIES,
|
8
8
|
Attributes,
|
@@ -652,8 +652,8 @@ class Laminar:
|
|
652
652
|
|
653
653
|
@classmethod
|
654
654
|
def shutdown(cls):
|
655
|
-
|
656
|
-
|
655
|
+
cls.__initialized = False
|
656
|
+
return TracerManager.shutdown()
|
657
657
|
|
658
658
|
@classmethod
|
659
659
|
def set_session(
|
lmnr/version.py
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
lmnr/__init__.py,sha256=q_LvkFcUKZCxrCap4Mr4cewyNg1vh-t2tX-kaOUdWos,1186
|
2
2
|
lmnr/cli.py,sha256=4J2RZQhHM3jJcjFvBC4PChQTS-ukxykVvI0X6lTkK-o,2918
|
3
3
|
lmnr/openllmetry_sdk/.flake8,sha256=bCxuDlGx3YQ55QHKPiGJkncHanh9qGjQJUujcFa3lAU,150
|
4
|
-
lmnr/openllmetry_sdk/__init__.py,sha256=
|
4
|
+
lmnr/openllmetry_sdk/__init__.py,sha256=3zDqa-NEDEwdaxYv9Lcg39IpOnl-CWhGvU3fP17GwTk,3325
|
5
5
|
lmnr/openllmetry_sdk/config/__init__.py,sha256=5aGdIdo1LffBkNwIBUbqzN6OUCMCrURU4b0rf5LBSI0,300
|
6
6
|
lmnr/openllmetry_sdk/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
|
-
lmnr/openllmetry_sdk/decorators/base.py,sha256=
|
7
|
+
lmnr/openllmetry_sdk/decorators/base.py,sha256=Wrr6r7nsPyNl8fE1w7BcTLeaE965kON8LvwOcwMfTRI,7100
|
8
8
|
lmnr/openllmetry_sdk/instruments.py,sha256=9KoJ19Qar1dBrmO1wikNEkKxRfus8znQTj-g_maRTTM,1098
|
9
|
-
lmnr/openllmetry_sdk/tracing/__init__.py,sha256=
|
9
|
+
lmnr/openllmetry_sdk/tracing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
10
|
lmnr/openllmetry_sdk/tracing/attributes.py,sha256=BEMMGrX_7kPu4PNCV7Bz1uaclY4DNhlaLT0bWwFQnRE,1366
|
11
11
|
lmnr/openllmetry_sdk/tracing/content_allow_list.py,sha256=3feztm6PBWNelc8pAZUcQyEGyeSpNiVKjOaDk65l2ps,846
|
12
|
-
lmnr/openllmetry_sdk/tracing/
|
13
|
-
lmnr/openllmetry_sdk/tracing/tracing.py,sha256=V0A6bP_SCU6r58sFtb62CcYtkLgwEFnANkLxYQ55I-k,35985
|
12
|
+
lmnr/openllmetry_sdk/tracing/tracing.py,sha256=eX2Fwmu6iiRxOSjH3KyCjmZNH3rVXhlbYef1vauJijc,38839
|
14
13
|
lmnr/openllmetry_sdk/utils/__init__.py,sha256=pNhf0G3vTd5ccoc03i1MXDbricSaiqCbi1DLWhSekK8,604
|
15
14
|
lmnr/openllmetry_sdk/utils/in_memory_span_exporter.py,sha256=H_4TRaThMO1H6vUQ0OpQvzJk_fZH0OOsRAM1iZQXsR8,2112
|
16
15
|
lmnr/openllmetry_sdk/utils/json_encoder.py,sha256=dK6b_axr70IYL7Vv-bu4wntvDDuyntoqsHaddqX7P58,463
|
@@ -19,11 +18,11 @@ lmnr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
18
|
lmnr/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
20
19
|
lmnr/sdk/browser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
20
|
lmnr/sdk/browser/browser_use_otel.py,sha256=wKFe07XTUUCuPDwFD9gqGrcaaj82BRg-kLLZQM_KshM,3915
|
22
|
-
lmnr/sdk/browser/playwright_otel.py,sha256=
|
23
|
-
lmnr/sdk/browser/pw_utils.py,sha256=
|
21
|
+
lmnr/sdk/browser/playwright_otel.py,sha256=en91IZxuHFgFHbmssbdJZejtBIlma7gJ9NCv3_RLXzk,12636
|
22
|
+
lmnr/sdk/browser/pw_utils.py,sha256=Lh0pJ3sb_NC8roZnQppBtK8VV-AHXchPUxISEm5SkF4,10490
|
24
23
|
lmnr/sdk/browser/rrweb/rrweb.min.js,sha256=X5pgaoX1j_OjKTqGQgKB-83xUSuydNLQa-Kkh1AAZYM,140485
|
25
24
|
lmnr/sdk/browser/utils.py,sha256=xPpMRP2y9aJIsdIDNg2wN4PSa_4w0LSsra-GIMx9VXc,2366
|
26
|
-
lmnr/sdk/client/asynchronous/async_client.py,sha256=
|
25
|
+
lmnr/sdk/client/asynchronous/async_client.py,sha256=9QqeYIsHPCS23kAUhwTqBmSxGKJ6j_M0AUicOI3KoM8,4953
|
27
26
|
lmnr/sdk/client/asynchronous/resources/__init__.py,sha256=ul1K_uvLmN5pw1Z_NZojdZ_CDp7om4RYV78pkgx6-2M,507
|
28
27
|
lmnr/sdk/client/asynchronous/resources/agent.py,sha256=95m72mNL1ScCkaoHg204h7evNbgtm1hkoHf9Pe6f0X4,8940
|
29
28
|
lmnr/sdk/client/asynchronous/resources/base.py,sha256=aJ43Q1rltg23IQaI4eeaZKckxVTgDUbCJrChhQCUEoE,986
|
@@ -38,18 +37,18 @@ lmnr/sdk/client/synchronous/resources/browser_events.py,sha256=9rFYWZesXQomnFgbZ
|
|
38
37
|
lmnr/sdk/client/synchronous/resources/evals.py,sha256=sMMAai7_IW842z_J0W9OpthDhGQPCkTVJZamIkKq0wk,3496
|
39
38
|
lmnr/sdk/client/synchronous/resources/pipeline.py,sha256=MJLF7HICjB7kS1-DvtJPAneIO1aMRl8fGG1QZjCsPl4,2974
|
40
39
|
lmnr/sdk/client/synchronous/resources/semantic_search.py,sha256=oFH5r3bWJEvoZrC_a4jAtZko9tdpuUzCX1M0yvj8MMw,2046
|
41
|
-
lmnr/sdk/client/synchronous/sync_client.py,sha256=
|
40
|
+
lmnr/sdk/client/synchronous/sync_client.py,sha256=jLX-hZMwm6m9urajg1HrpDuaRdNs9_M11DnJ6-HV3EY,5380
|
42
41
|
lmnr/sdk/datasets.py,sha256=jl5Wj5nEI9pww4Jwn4XKF8h0gXBU4TOIrhqNjTJsHZQ,1709
|
43
42
|
lmnr/sdk/decorators.py,sha256=g0VBqUEMCPRbgjgGHauVuKK1wHEd9rkiGzlYUYrcml4,2336
|
44
43
|
lmnr/sdk/eval_control.py,sha256=G6Fg3Xx_KWv72iBaWlNMdyRTF2bZFQnwJ68sJNSpIcY,177
|
45
44
|
lmnr/sdk/evaluations.py,sha256=kjzc257BKhq3z_vMeHD96pJ_xBoiWzW8e0lkVaNJ2jY,20555
|
46
|
-
lmnr/sdk/laminar.py,sha256=
|
45
|
+
lmnr/sdk/laminar.py,sha256=0FRgGT7SWw4mwGY525EXUHAf_Qj5swaeg3RewUYPyAA,27976
|
47
46
|
lmnr/sdk/log.py,sha256=nt_YMmPw1IRbGy0b7q4rTtP4Yo3pQfNxqJPXK3nDSNQ,2213
|
48
47
|
lmnr/sdk/types.py,sha256=wtSiq7KqdvQ5k7URdDnGoWwX3ucDNMabNfVnbKBXfhs,13940
|
49
48
|
lmnr/sdk/utils.py,sha256=o9MybEMM0Tp_xxCMFpzEYDsOAn2I7g1t7MrazOQAxAs,3692
|
50
|
-
lmnr/version.py,sha256=
|
51
|
-
lmnr-0.5.
|
52
|
-
lmnr-0.5.
|
53
|
-
lmnr-0.5.
|
54
|
-
lmnr-0.5.
|
55
|
-
lmnr-0.5.
|
49
|
+
lmnr/version.py,sha256=in8hiGDV28kmF2xSVRf1DEvu8z9A1snM4PoxsftIn-I,1323
|
50
|
+
lmnr-0.5.1a0.dist-info/LICENSE,sha256=67b_wJHVV1CBaWkrKFWU1wyqTPSdzH77Ls-59631COg,10411
|
51
|
+
lmnr-0.5.1a0.dist-info/METADATA,sha256=2BpQewtLlMeR3u2OxJqzPnGwi4yvoyKs-0GP8TuzKz4,14998
|
52
|
+
lmnr-0.5.1a0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
53
|
+
lmnr-0.5.1a0.dist-info/entry_points.txt,sha256=K1jE20ww4jzHNZLnsfWBvU3YKDGBgbOiYG5Y7ivQcq4,37
|
54
|
+
lmnr-0.5.1a0.dist-info/RECORD,,
|
@@ -1,13 +0,0 @@
|
|
1
|
-
from contextlib import contextmanager
|
2
|
-
|
3
|
-
from lmnr.openllmetry_sdk.tracing.tracing import TracerWrapper
|
4
|
-
|
5
|
-
|
6
|
-
@contextmanager
|
7
|
-
def get_tracer(flush_on_exit: bool = False):
|
8
|
-
wrapper = TracerWrapper()
|
9
|
-
try:
|
10
|
-
yield wrapper.get_tracer()
|
11
|
-
finally:
|
12
|
-
if flush_on_exit:
|
13
|
-
wrapper.flush()
|
File without changes
|
File without changes
|
File without changes
|