From 210a5dd0883c8ef0db988294fc04db26be494150 Mon Sep 17 00:00:00 2001 From: Ivan Nikalaichanka Date: Tue, 25 Aug 2026 15:13:18 +0200 Subject: [PATCH 1/3] fix --- datareservoirio/_logging.py | 16 ++++++++ datareservoirio/client.py | 81 ++++++++++++++----------------------- 2 files changed, 47 insertions(+), 50 deletions(-) diff --git a/datareservoirio/_logging.py b/datareservoirio/_logging.py index cc90fe2a..b0f9da5d 100644 --- a/datareservoirio/_logging.py +++ b/datareservoirio/_logging.py @@ -26,6 +26,22 @@ def _ensure_azure_monitor_configured(connection_string, logger_name): ) _configured_loggers[cache_key] = True +@lru_cache(maxsize=1) +def get_metric_logger() -> logging.Logger: + logger = logging.getLogger(__name__ + "_metric_appinsight") + if os.getenv(ENV_VAR_ENABLE_APP_INSIGHTS) is not None: + enable_app_insights = os.environ[ENV_VAR_ENABLE_APP_INSIGHTS].lower() + if enable_app_insights == "true" or enable_app_insights == "1": + # Prevent messages from being passed directly to ancestor logger handlers, + # since ancestor logger levels and filters are not considered during propagation. + # https://docs.python.org/3.12/library/logging.html#logging.Logger.propagate + logger.propagate = False + logger.setLevel(logging.DEBUG) + _ensure_azure_monitor_configured( + connection_string=environment._application_insight_connectionstring, + logger_name=__name__ + "_metric_appinsight", + ) + return logger @lru_cache(maxsize=1) def get_exceptions_logger() -> logging.Logger: diff --git a/datareservoirio/client.py b/datareservoirio/client.py index 22c7ca4c..50c7f1a2 100644 --- a/datareservoirio/client.py +++ b/datareservoirio/client.py @@ -1,19 +1,17 @@ import logging -import os import time import warnings from collections import defaultdict from concurrent.futures import ThreadPoolExecutor -from datetime import datetime -from functools import lru_cache, wraps +from functools import wraps from operator import itemgetter from urllib.parse import urlencode from uuid import uuid4 +from opentelemetry import trace import numpy as np import pandas as pd import requests -from azure.monitor.opentelemetry import configure_azure_monitor from tenacity import ( retry, retry_if_exception_type, @@ -23,34 +21,13 @@ ) from tqdm.auto import tqdm -from datareservoirio._constants import ENV_VAR_ENABLE_APP_INSIGHTS - -from ._logging import _ensure_azure_monitor_configured, log_decorator +from ._logging import log_decorator, get_metric_logger from ._utils import function_translation, period_translation from .globalsettings import environment from .storage import Storage log = logging.getLogger(__name__) - -@lru_cache(maxsize=1) -def metric() -> logging.Logger: - logger = logging.getLogger(__name__ + "_metric_appinsight") - if os.getenv(ENV_VAR_ENABLE_APP_INSIGHTS) is not None: - enable_app_insights = os.environ[ENV_VAR_ENABLE_APP_INSIGHTS].lower() - if enable_app_insights == "true" or enable_app_insights == "1": - # Prevent messages from being passed directly to ancestor logger handlers, - # since ancestor logger levels and filters are not considered during propagation. - # https://docs.python.org/3.12/library/logging.html#logging.Logger.propagate - logger.propagate = False - logger.setLevel(logging.DEBUG) - _ensure_azure_monitor_configured( - connection_string=environment._application_insight_connectionstring, - logger_name=__name__ + "_metric_appinsight", - ) - return logger - - # Default values to push as start/end dates. (Limited by numpy.datetime64) _END_DEFAULT = 9214646400000000000 # 2262-01-01 _START_DEFAULT = 0 # 1970-01-01 @@ -328,30 +305,34 @@ def _timer(metric_name="Timer"): def decorator(func): @wraps(func) def wrapper(self, series_id, start=None, end=None, **kwargs): - start_time = time.perf_counter() - result = func(self, series_id, start=start, end=end, **kwargs) - end_time = time.perf_counter() - elapsed_time = end_time - start_time - start_date_as_str = None - end_date_as_str = None - if start: - start_date_as_str = pd.to_datetime( - start, dayfirst=True, unit="ns", utc=True - ).isoformat() - if end: - end_date_as_str = pd.to_datetime( - end, dayfirst=True, unit="ns", utc=True - ).isoformat() - number_of_samples = len(result) - properties = { - "series_id": series_id, - "start": start_date_as_str, - "end": end_date_as_str, - "elapsed": elapsed_time, - "number-of-samples": number_of_samples, - } - metric().info(metric_name, extra=properties) - return result + metric_logger = get_metric_logger() + tracer = trace.get_tracer(metric_logger.name) + with tracer.start_as_current_span(metric_name): + + start_time = time.perf_counter() + result = func(self, series_id, start=start, end=end, **kwargs) + end_time = time.perf_counter() + elapsed_time = end_time - start_time + start_date_as_str = None + end_date_as_str = None + if start: + start_date_as_str = pd.to_datetime( + start, dayfirst=True, unit="ns", utc=True + ).isoformat() + if end: + end_date_as_str = pd.to_datetime( + end, dayfirst=True, unit="ns", utc=True + ).isoformat() + number_of_samples = len(result) + properties = { + "series_id": series_id, + "start": start_date_as_str, + "end": end_date_as_str, + "elapsed": elapsed_time, + "number-of-samples": number_of_samples, + } + metric_logger.info(metric_name, extra=properties) + return result return wrapper From 3af654e6b4c5ea9e1cbbf71e0c0f0e26a388b1a1 Mon Sep 17 00:00:00 2001 From: Ivan Nikalaichanka Date: Tue, 25 Aug 2026 15:51:36 +0200 Subject: [PATCH 2/3] fix sort --- datareservoirio/client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datareservoirio/client.py b/datareservoirio/client.py index 50c7f1a2..742be274 100644 --- a/datareservoirio/client.py +++ b/datareservoirio/client.py @@ -7,11 +7,11 @@ from operator import itemgetter from urllib.parse import urlencode from uuid import uuid4 -from opentelemetry import trace import numpy as np import pandas as pd import requests +from opentelemetry import trace from tenacity import ( retry, retry_if_exception_type, @@ -21,7 +21,7 @@ ) from tqdm.auto import tqdm -from ._logging import log_decorator, get_metric_logger +from ._logging import get_metric_logger, log_decorator from ._utils import function_translation, period_translation from .globalsettings import environment from .storage import Storage From 47f0193180e6f9097d0d3667d1d08b10c5f24447 Mon Sep 17 00:00:00 2001 From: Ivan Nikalaichanka Date: Tue, 25 Aug 2026 15:59:40 +0200 Subject: [PATCH 3/3] more style fixes --- datareservoirio/_logging.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/datareservoirio/_logging.py b/datareservoirio/_logging.py index b0f9da5d..b9deb117 100644 --- a/datareservoirio/_logging.py +++ b/datareservoirio/_logging.py @@ -26,6 +26,7 @@ def _ensure_azure_monitor_configured(connection_string, logger_name): ) _configured_loggers[cache_key] = True + @lru_cache(maxsize=1) def get_metric_logger() -> logging.Logger: logger = logging.getLogger(__name__ + "_metric_appinsight") @@ -43,6 +44,7 @@ def get_metric_logger() -> logging.Logger: ) return logger + @lru_cache(maxsize=1) def get_exceptions_logger() -> logging.Logger: exceptions_logger = logging.getLogger(__name__ + "_exception_logger")