From 04700d77c3e9ea71e5b7554287e18c72bba223de Mon Sep 17 00:00:00 2001 From: Val Brodsky Date: Wed, 25 Sep 2024 14:24:17 -0700 Subject: [PATCH 1/2] Add method / heurisrtics to extract original sdk method name from python trace --- libs/lbox-clients/src/lbox/request_client.py | 38 ++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/libs/lbox-clients/src/lbox/request_client.py b/libs/lbox-clients/src/lbox/request_client.py index 5e32f90dd..ae92e8f20 100644 --- a/libs/lbox-clients/src/lbox/request_client.py +++ b/libs/lbox-clients/src/lbox/request_client.py @@ -1,6 +1,8 @@ +import inspect import json import logging import os +import re import sys from datetime import datetime, timezone from types import MappingProxyType @@ -22,6 +24,39 @@ def python_version_info(): return f"{version_info.major}.{version_info.minor}.{version_info.micro}-{version_info.releaselevel}" +LABELBOX_CALL_PATTERN = re.compile(r"/labelbox/") + + +def call_info(): + method_name = "Unknown" + prefix = "" + class_name = "" + skip_methods = ["wrapper", "__init__"] + skip_classes = ["PaginatedCollection", "_CursorPagination", "_OffsetPagination"] + + try: + call_info = None + for stack in reversed(inspect.stack()): + if LABELBOX_CALL_PATTERN.search(stack.filename): + call_info = stack + method_name = call_info.function + class_name = call_info.frame.f_locals.get( + "self", None + ).__class__.__name__ + + if method_name not in skip_methods and class_name not in skip_classes: + if "test" in call_info.filename: + prefix = "test:" + else: + if class_name == "NoneType": + class_name = "" + break + + except Exception: + pass + return (prefix, class_name, method_name) + + class RequestClient: """A Labelbox request client. @@ -186,6 +221,9 @@ def convert_value(value): if files: del headers["Content-Type"] del headers["Accept"] + headers["X-SDK-Method"] = ( + f"{call_info()[0]}{call_info()[1]}:{call_info()[2]}" + ) request = requests.Request( "POST", endpoint, From 8a78550413089f423c2ee948dcdc1944f78527f9 Mon Sep 17 00:00:00 2001 From: Val Brodsky Date: Thu, 26 Sep 2024 10:01:06 -0700 Subject: [PATCH 2/2] PR feedback --- libs/lbox-clients/src/lbox/request_client.py | 23 +++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/libs/lbox-clients/src/lbox/request_client.py b/libs/lbox-clients/src/lbox/request_client.py index ae92e8f20..2806573b7 100644 --- a/libs/lbox-clients/src/lbox/request_client.py +++ b/libs/lbox-clients/src/lbox/request_client.py @@ -6,7 +6,7 @@ import sys from datetime import datetime, timezone from types import MappingProxyType -from typing import Callable, Dict, Optional +from typing import Callable, Dict, Optional, TypedDict import requests import requests.exceptions @@ -25,6 +25,13 @@ def python_version_info(): LABELBOX_CALL_PATTERN = re.compile(r"/labelbox/") +TEST_FILE_PATTERN = re.compile(r".*test.*\.py$") + + +class _RequestInfo(TypedDict): + prefix: str + class_name: str + method_name: str def call_info(): @@ -45,7 +52,7 @@ def call_info(): ).__class__.__name__ if method_name not in skip_methods and class_name not in skip_classes: - if "test" in call_info.filename: + if TEST_FILE_PATTERN.search(call_info.filename): prefix = "test:" else: if class_name == "NoneType": @@ -54,7 +61,12 @@ def call_info(): except Exception: pass - return (prefix, class_name, method_name) + return _RequestInfo(prefix=prefix, class_name=class_name, method_name=method_name) + + +def call_info_as_str(): + info = call_info() + return f"{info['prefix']}{info['class_name']}:{info['method_name']}" class RequestClient: @@ -221,9 +233,8 @@ def convert_value(value): if files: del headers["Content-Type"] del headers["Accept"] - headers["X-SDK-Method"] = ( - f"{call_info()[0]}{call_info()[1]}:{call_info()[2]}" - ) + headers["X-SDK-Method"] = call_info_as_str() + request = requests.Request( "POST", endpoint,