From a6d7ce50fa91f71d06bb8fbd36b553c374e1764d Mon Sep 17 00:00:00 2001 From: Zhichao Date: Thu, 12 Dec 2024 08:50:57 +0800 Subject: [PATCH 1/5] save --- vision_agent/utils/execute.py | 109 ++++++++++++++++++++++++++++------ 1 file changed, 92 insertions(+), 17 deletions(-) diff --git a/vision_agent/utils/execute.py b/vision_agent/utils/execute.py index c317d0cb..8a965386 100644 --- a/vision_agent/utils/execute.py +++ b/vision_agent/utils/execute.py @@ -7,6 +7,7 @@ import sys import traceback import warnings +import inspect from enum import Enum from pathlib import Path from time import sleep @@ -28,6 +29,13 @@ from nbclient.exceptions import CellTimeoutError, DeadKernelError from nbclient.util import run_sync from nbformat.v4 import new_code_cell +from opentelemetry import trace +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter +from opentelemetry.trace import Status, StatusCode +from opentelemetry.trace.span import Span +from opentelemetry.sdk.resources import SERVICE_NAME, Resource from pydantic import BaseModel, field_serializer from typing_extensions import Self @@ -36,6 +44,23 @@ RemoteSandboxExecutionError, ) +# Set up tracer provider +provider = TracerProvider(resource=Resource.create({SERVICE_NAME: "vision-agent"})) +tracer = trace.get_tracer_provider() + +# Configure OTLP HTTP exporter +otlp_exporter = OTLPSpanExporter( + endpoint=os.getenv( + "OTEL_EXPORTER_OTLP_ENDPOINT", "http://192.168.50.21:4318/v1/traces" + ) +) + +# Add BatchSpanProcessor with OTLP HTTP exporter +provider.add_span_processor(BatchSpanProcessor(otlp_exporter)) + +# Set the tracer provider +trace.set_tracer_provider(provider) + load_dotenv() _LOGGER = logging.getLogger(__name__) _SESSION_TIMEOUT = 600 # 10 minutes @@ -597,6 +622,39 @@ def __init__( sleep(1) self._new_kernel() + def _function_tracer(self, parent_span: Span): + """Creates a trace function to track function calls inside the cell.""" + tracer = trace.get_tracer(__name__) + + def trace_calls(frame, event, arg): + if event != "call": + return + + # Get function details + func_name = frame.f_code.co_name + if func_name == "": + return + + # Get calling code + lines, start = inspect.getsourcelines(frame) + + # Start span for function call + with tracer.start_span( + f"function_{func_name}", context=trace.set_span_in_context(parent_span) + ) as span: + span.set_attributes( + { + "function.name": func_name, + "function.filename": frame.f_code.co_filename, + "function.lineno": frame.f_lineno, + "function.source": "".join(lines), + } + ) + + return None + + return trace_calls + def _new_kernel(self) -> None: if self.nb_client.kc is None or not run_sync(self.nb_client.kc.is_alive)(): # type: ignore self.nb_client.create_kernel_manager() @@ -633,23 +691,40 @@ def restart_kernel(self) -> None: self._new_kernel() def exec_cell(self, code: str) -> Execution: - try: - self.nb.cells.append(new_code_cell(code)) - cell = self.nb.cells[-1] - self.nb_client.execute_cell(cell, len(self.nb.cells) - 1) - return _parse_local_code_interpreter_outputs(self.nb.cells[-1].outputs) - except CellTimeoutError as e: - run_sync(self.nb_client.km.interrupt_kernel)() # type: ignore - sleep(1) - traceback_raw = traceback.format_exc().splitlines() - return Execution.from_exception(e, traceback_raw) - except DeadKernelError as e: - self.restart_kernel() - traceback_raw = traceback.format_exc().splitlines() - return Execution.from_exception(e, traceback_raw) - except Exception as e: - traceback_raw = traceback.format_exc().splitlines() - return Execution.from_exception(e, traceback_raw) + tracer = trace.get_tracer(__name__) + with tracer.start_as_current_span("notebook_cell_execution") as span: + try: + # Add code as span attribute + span.set_attribute("code", code) + span.set_attribute("cell_index", len(self.nb.cells)) + + # Create function tracer + # sys.settrace(self._function_tracer(span)) + + self.nb.cells.append(new_code_cell(code)) + cell = self.nb.cells[-1] + self.nb_client.execute_cell(cell, len(self.nb.cells) - 1) + + # Stop tracing + # sys.settrace(None) + + result = _parse_local_code_interpreter_outputs( + self.nb.cells[-1].outputs + ) + span.set_status(Status(StatusCode.OK)) + return result + except CellTimeoutError as e: + run_sync(self.nb_client.km.interrupt_kernel)() # type: ignore + sleep(1) + traceback_raw = traceback.format_exc().splitlines() + return Execution.from_exception(e, traceback_raw) + except DeadKernelError as e: + self.restart_kernel() + traceback_raw = traceback.format_exc().splitlines() + return Execution.from_exception(e, traceback_raw) + except Exception as e: + traceback_raw = traceback.format_exc().splitlines() + return Execution.from_exception(e, traceback_raw) def upload_file(self, file_path: Union[str, Path]) -> Path: with open(file_path, "rb") as f: From 6e9e81d8becc962ceddb0d2f57b820347a18f467 Mon Sep 17 00:00:00 2001 From: Zhichao Date: Thu, 12 Dec 2024 17:32:05 +0800 Subject: [PATCH 2/5] only add OpenTelemetry API to VA --- vision_agent/utils/execute.py | 73 ++++------------------------------- 1 file changed, 8 insertions(+), 65 deletions(-) diff --git a/vision_agent/utils/execute.py b/vision_agent/utils/execute.py index 8a965386..b576c880 100644 --- a/vision_agent/utils/execute.py +++ b/vision_agent/utils/execute.py @@ -7,7 +7,6 @@ import sys import traceback import warnings -import inspect from enum import Enum from pathlib import Path from time import sleep @@ -29,38 +28,15 @@ from nbclient.exceptions import CellTimeoutError, DeadKernelError from nbclient.util import run_sync from nbformat.v4 import new_code_cell -from opentelemetry import trace -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import BatchSpanProcessor -from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter -from opentelemetry.trace import Status, StatusCode -from opentelemetry.trace.span import Span -from opentelemetry.sdk.resources import SERVICE_NAME, Resource from pydantic import BaseModel, field_serializer from typing_extensions import Self +from opentelemetry.trace import get_tracer, Status, StatusCode, Span from vision_agent.utils.exceptions import ( RemoteSandboxCreationError, RemoteSandboxExecutionError, ) -# Set up tracer provider -provider = TracerProvider(resource=Resource.create({SERVICE_NAME: "vision-agent"})) -tracer = trace.get_tracer_provider() - -# Configure OTLP HTTP exporter -otlp_exporter = OTLPSpanExporter( - endpoint=os.getenv( - "OTEL_EXPORTER_OTLP_ENDPOINT", "http://192.168.50.21:4318/v1/traces" - ) -) - -# Add BatchSpanProcessor with OTLP HTTP exporter -provider.add_span_processor(BatchSpanProcessor(otlp_exporter)) - -# Set the tracer provider -trace.set_tracer_provider(provider) - load_dotenv() _LOGGER = logging.getLogger(__name__) _SESSION_TIMEOUT = 600 # 10 minutes @@ -622,39 +598,6 @@ def __init__( sleep(1) self._new_kernel() - def _function_tracer(self, parent_span: Span): - """Creates a trace function to track function calls inside the cell.""" - tracer = trace.get_tracer(__name__) - - def trace_calls(frame, event, arg): - if event != "call": - return - - # Get function details - func_name = frame.f_code.co_name - if func_name == "": - return - - # Get calling code - lines, start = inspect.getsourcelines(frame) - - # Start span for function call - with tracer.start_span( - f"function_{func_name}", context=trace.set_span_in_context(parent_span) - ) as span: - span.set_attributes( - { - "function.name": func_name, - "function.filename": frame.f_code.co_filename, - "function.lineno": frame.f_lineno, - "function.source": "".join(lines), - } - ) - - return None - - return trace_calls - def _new_kernel(self) -> None: if self.nb_client.kc is None or not run_sync(self.nb_client.kc.is_alive)(): # type: ignore self.nb_client.create_kernel_manager() @@ -691,23 +634,17 @@ def restart_kernel(self) -> None: self._new_kernel() def exec_cell(self, code: str) -> Execution: - tracer = trace.get_tracer(__name__) + tracer = get_tracer(__name__) with tracer.start_as_current_span("notebook_cell_execution") as span: try: # Add code as span attribute span.set_attribute("code", code) span.set_attribute("cell_index", len(self.nb.cells)) - # Create function tracer - # sys.settrace(self._function_tracer(span)) - self.nb.cells.append(new_code_cell(code)) cell = self.nb.cells[-1] self.nb_client.execute_cell(cell, len(self.nb.cells) - 1) - # Stop tracing - # sys.settrace(None) - result = _parse_local_code_interpreter_outputs( self.nb.cells[-1].outputs ) @@ -716,13 +653,19 @@ def exec_cell(self, code: str) -> Execution: except CellTimeoutError as e: run_sync(self.nb_client.km.interrupt_kernel)() # type: ignore sleep(1) + span.set_status(Status(StatusCode.ERROR, str(e))) + span.record_exception(e) traceback_raw = traceback.format_exc().splitlines() return Execution.from_exception(e, traceback_raw) except DeadKernelError as e: self.restart_kernel() + span.set_status(Status(StatusCode.ERROR, str(e))) + span.record_exception(e) traceback_raw = traceback.format_exc().splitlines() return Execution.from_exception(e, traceback_raw) except Exception as e: + span.set_status(Status(StatusCode.ERROR, str(e))) + span.record_exception(e) traceback_raw = traceback.format_exc().splitlines() return Execution.from_exception(e, traceback_raw) From 610d07eb8953089ca657dbbdd83e043832ecf768 Mon Sep 17 00:00:00 2001 From: Zhichao Date: Thu, 12 Dec 2024 17:32:28 +0800 Subject: [PATCH 3/5] minor --- vision_agent/utils/execute.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vision_agent/utils/execute.py b/vision_agent/utils/execute.py index b576c880..11d68e0b 100644 --- a/vision_agent/utils/execute.py +++ b/vision_agent/utils/execute.py @@ -30,7 +30,7 @@ from nbformat.v4 import new_code_cell from pydantic import BaseModel, field_serializer from typing_extensions import Self -from opentelemetry.trace import get_tracer, Status, StatusCode, Span +from opentelemetry.trace import get_tracer, Status, StatusCode from vision_agent.utils.exceptions import ( RemoteSandboxCreationError, From d8d994f724b16a7b27018a3523303f63ab215ad2 Mon Sep 17 00:00:00 2001 From: Zhichao Date: Mon, 16 Dec 2024 16:30:00 +0800 Subject: [PATCH 4/5] save --- vision_agent/utils/execute.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/vision_agent/utils/execute.py b/vision_agent/utils/execute.py index 11d68e0b..fcc5cf0d 100644 --- a/vision_agent/utils/execute.py +++ b/vision_agent/utils/execute.py @@ -30,7 +30,8 @@ from nbformat.v4 import new_code_cell from pydantic import BaseModel, field_serializer from typing_extensions import Self -from opentelemetry.trace import get_tracer, Status, StatusCode +from opentelemetry.trace import get_tracer, Status, StatusCode, SpanKind +from opentelemetry.context import get_current from vision_agent.utils.exceptions import ( RemoteSandboxCreationError, @@ -634,8 +635,12 @@ def restart_kernel(self) -> None: self._new_kernel() def exec_cell(self, code: str) -> Execution: + # track the exec_cell with opentelemetry trace tracer = get_tracer(__name__) - with tracer.start_as_current_span("notebook_cell_execution") as span: + context = get_current() + with tracer.start_as_current_span( + "notebook_cell_execution", kind=SpanKind.INTERNAL, context=context + ) as span: try: # Add code as span attribute span.set_attribute("code", code) From 9f64c340b2ac205a290e09e8ec9b70369a542326 Mon Sep 17 00:00:00 2001 From: Zhichao Date: Mon, 16 Dec 2024 21:30:30 +0800 Subject: [PATCH 5/5] add opentelemetry to the dependency --- poetry.lock | 110 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index f7ce0804..8eca08ef 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "annotated-types" @@ -651,6 +651,23 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "deprecated" +version = "1.2.15" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, + {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools", "sphinx (<2)", "tox"] + [[package]] name = "distlib" version = "0.3.9" @@ -2249,6 +2266,21 @@ numpy = [ {version = ">=1.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"aarch64\" and python_version >= \"3.8\" and python_version < \"3.10\" or python_version > \"3.9\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_system != \"Darwin\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, ] +[[package]] +name = "opentelemetry-api" +version = "1.29.0" +description = "OpenTelemetry Python API" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_api-1.29.0-py3-none-any.whl", hash = "sha256:5fcd94c4141cc49c736271f3e1efb777bebe9cc535759c54c936cca4f1b312b8"}, + {file = "opentelemetry_api-1.29.0.tar.gz", hash = "sha256:d04a6cf78aad09614f52964ecb38021e248f5714dc32c2e0d8fd99517b4d69cf"}, +] + +[package.dependencies] +deprecated = ">=1.2.6" +importlib-metadata = ">=6.0,<=8.5.0" + [[package]] name = "orjson" version = "3.10.11" @@ -4196,6 +4228,80 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] +[[package]] +name = "wrapt" +version = "1.17.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +files = [ + {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, + {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, + {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, + {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, + {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, + {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, + {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, + {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, + {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, + {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, + {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, + {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, + {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, + {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, + {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, + {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, + {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, + {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, + {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, + {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, + {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, + {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, + {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, +] + [[package]] name = "zipp" version = "3.21.0" @@ -4218,4 +4324,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "2cd6c4ef4af5804e7647398e62bb97b90183bf3ffef3cf464c4cbb14f401bec9" +content-hash = "b60ae95253463af9b9c65562370bd421ce7aa589433f1a61859d9266b1e67eed" diff --git a/pyproject.toml b/pyproject.toml index 0f9c8351..d80226af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,7 @@ av = "^11.0.0" libcst = "^1.5.0" matplotlib = "^3.9.2" scikit-learn = "^1.5.2" +opentelemetry-api = "^1.29.0" [tool.poetry.group.dev.dependencies] autoflake = "1.*"