diff --git a/libs/lbox-clients/src/lbox/request_client.py b/libs/lbox-clients/src/lbox/request_client.py index 5e32f90dd..2806573b7 100644 --- a/libs/lbox-clients/src/lbox/request_client.py +++ b/libs/lbox-clients/src/lbox/request_client.py @@ -1,10 +1,12 @@ +import inspect import json import logging import os +import re 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 @@ -22,6 +24,51 @@ 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/") +TEST_FILE_PATTERN = re.compile(r".*test.*\.py$") + + +class _RequestInfo(TypedDict): + prefix: str + class_name: str + method_name: str + + +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_FILE_PATTERN.search(call_info.filename): + prefix = "test:" + else: + if class_name == "NoneType": + class_name = "" + break + + except Exception: + pass + 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: """A Labelbox request client. @@ -186,6 +233,8 @@ def convert_value(value): if files: del headers["Content-Type"] del headers["Accept"] + headers["X-SDK-Method"] = call_info_as_str() + request = requests.Request( "POST", endpoint,