Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/license-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,11 @@ jobs:
with:
requirements: "backend/requirements-all.txt"
fail: "Copyleft,Other,Error"
exclude: '(envier.*0\.5\.0|psycopg2.*2\.9\.3|fqdn.*1\.5\.1|pyzmq.*25\.1\.2|debugpy.*1\.6\.7|certifi.*2024\.8\.30|tqdm.*4\.67\..*|webencodings.*0\.5\.1|torch.*1\.10\.2.*|torch.*1\.11\.0.*|pytorch-ignite.*0\.4\.10.*|torchaudio.*0\.11\.0.*|torchvision.*0\.12\.0.*|terminado.*0\.15\.0|qudida.*0\.0\.4|expiringdict.*1\.2\.2|botocore.*1\.29\.80|orderedmultidict.*1\.0\.1|deepchecks.*)'
exclude: '(category_encoders.*2\.7\..*|attrs.*25\.1\..*|referencing.*0\.36\..*|envier.*0\.5\.0|psycopg2.*2\.9\.3|fqdn.*1\.5\.1|pyzmq.*25\.1\.2|debugpy.*1\.6\.7|certifi.*2025\.1\.31|tqdm.*4\.67\..*|webencodings.*0\.5\.1|torch.*1\.10\.2.*|torch.*1\.11\.0.*|pytorch-ignite.*0\.4\.10.*|torchaudio.*0\.11\.0.*|torchvision.*0\.12\.0.*|terminado.*0\.15\.0|qudida.*0\.0\.4|expiringdict.*1\.2\.2|botocore.*1\.29\.80|orderedmultidict.*1\.0\.1|deepchecks.*)'
# psycopg2 is LGPL 2
# category_encoders is BSD https://github.com/scikit-learn-contrib/category_encoders/tree/master?tab=BSD-3-Clause-1-ov-file
# attrs is MIT https://github.com/python-attrs/attrs/blob/main/LICENSE
# referencing is MIT https://github.com/python-jsonschema/referencing?tab=MIT-1-ov-file
# pyzmq is Revised BSD https://github.com/zeromq/pyzmq/blob/main/examples/LICENSE
# debugpy is MIT https://github.com/microsoft/debugpy/blob/main/LICENSE
# certifi is MPL-2.0 https://github.com/certifi/python-certifi/blob/master/LICENSE
Expand Down
2 changes: 1 addition & 1 deletion backend/deepchecks_monitoring/bgtasks/alert_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ async def execute_monitor(
logger: t.Optional[logging.Logger] = None,
) -> t.List[Alert]:
"""Execute monitor alert rules."""
logger = logger or logging.getLogger('monitor-executor')
logger = logger or configure_logger('monitor-executor')
logger.info('Execution of Monitor(id:%s) for timestamp %s', monitor_id, timestamp)

monitor = t.cast(Monitor, await session.scalar(
Expand Down
2 changes: 1 addition & 1 deletion backend/deepchecks_monitoring/bgtasks/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def __init__(
self.engine = engine
self.async_session_factory = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
self.sleep_seconds = sleep_seconds
self.logger = logger or logging.getLogger('alerts-scheduler')
self.logger = logger or configure_logger('alerts-scheduler')

async def run(self):
"""Start alert scheduler."""
Expand Down
3 changes: 2 additions & 1 deletion backend/deepchecks_monitoring/ee/integrations/slack.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from deepchecks_monitoring.ee.config import SlackSettings
from deepchecks_monitoring.monitoring_utils import CheckParameterTypeEnum as CheckParameterKind
from deepchecks_monitoring.monitoring_utils import MonitorCheckConfSchema as MonitorConfig
from deepchecks_monitoring.monitoring_utils import configure_logger
from deepchecks_monitoring.schema_models import Alert, AlertRule, AlertSeverity, Check, Model, Monitor
from deepchecks_monitoring.utils.alerts import prepare_alert_link
from deepchecks_monitoring.utils.text import format_float
Expand Down Expand Up @@ -84,7 +85,7 @@ def __init__(
):
self.settings = settings
self.client = SlackClient()
self.logger = logger or logging.getLogger("slack.installation")
self.logger = logger or configure_logger("slack.installation")
self.state_utils = OAuthStateUtils()

def generate_authorization_url(self, state, redirect_path) -> str:
Expand Down
3 changes: 2 additions & 1 deletion backend/deepchecks_monitoring/ee/middlewares.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from starlette.types import ASGIApp, Message, Receive, Scope, Send

from deepchecks_monitoring.exceptions import LicenseError
from deepchecks_monitoring.monitoring_utils import configure_logger
from deepchecks_monitoring.public_models import User
from deepchecks_monitoring.utils.auth import CurrentUser

Expand Down Expand Up @@ -82,7 +83,7 @@ def __init__(
log_stream_name=log_stream_name,
)
h.setLevel(logging.INFO)
self.logger = logging.getLogger("access-audit")
self.logger = configure_logger("access-audit")
self.logger.addHandler(h)
self.app = app

Expand Down
5 changes: 4 additions & 1 deletion backend/deepchecks_monitoring/ee/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from deepchecks_monitoring.ee.notifications import AlertNotificator as EEAlertNotificator
from deepchecks_monitoring.features_control import FeaturesControl
from deepchecks_monitoring.integrations.email import EmailSender
from deepchecks_monitoring.monitoring_utils import configure_logger
from deepchecks_monitoring.public_models import User
from deepchecks_monitoring.resources import ResourcesProvider as OpenSourceResourcesProvider

Expand All @@ -27,6 +28,8 @@

__all__ = ["ResourcesProvider"]

logger: logging.Logger = configure_logger("server")


class ResourcesProvider(OpenSourceResourcesProvider):
"""Provider of resources."""
Expand Down Expand Up @@ -64,7 +67,7 @@ def get_features_control(self, user: User) -> FeaturesControl:
def parallel_check_executors_pool(self) -> "ActorPool | None":
parallel_check_executor_flag = self.settings.parallel_check_executor_flag

logging.getLogger("server").info({
logger.info({
"mesage": f"'parallelCheckExecutorEnabled' is set to {parallel_check_executor_flag}"
})
if parallel_check_executor_flag:
Expand Down
3 changes: 2 additions & 1 deletion backend/deepchecks_monitoring/integrations/email.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@
from typing_extensions import Self

from deepchecks_monitoring.config import EmailSettings
from deepchecks_monitoring.monitoring_utils import configure_logger

# TODO: change this
TEMPLATES_DIR = pathlib.Path(__file__).absolute().parent.parent / "templates"
templates = Jinja2Templates(directory=str(TEMPLATES_DIR))

logger: logging.Logger = logging.getLogger(__name__)
logger: logging.Logger = configure_logger(__name__)


class Recepient(BaseModel):
Expand Down
9 changes: 6 additions & 3 deletions backend/deepchecks_monitoring/logic/model_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload

from deepchecks_monitoring.monitoring_utils import CheckParameterTypeEnum, MonitorCheckConfSchema, fetch_or_404
from deepchecks_monitoring.monitoring_utils import (CheckParameterTypeEnum, MonitorCheckConfSchema, configure_logger,
fetch_or_404)
from deepchecks_monitoring.schema_models import Check, Model, ModelVersion
from deepchecks_monitoring.schema_models.column_type import (SAMPLE_LABEL_COL, SAMPLE_PRED_COL, SAMPLE_PRED_PROBA_COL,
SAMPLE_TS_COL, ColumnType)
Expand All @@ -33,6 +34,8 @@

DEFAULT_N_SAMPLES = 5000

logger: logging.Logger = configure_logger('monitor_run_logger')


async def get_model_versions_for_time_range(session: AsyncSession,
model_id: int,
Expand Down Expand Up @@ -317,7 +320,7 @@ def run_deepchecks(
if not (msg := getattr(e, 'message', None))
else msg
)
logging.getLogger('monitor_run_logger').exception(
logger.exception(
'For model(id=%s) version(id=%s) check(%s) '
'got exception: %s',
model.id,
Expand Down Expand Up @@ -372,7 +375,7 @@ async def get_results_for_model_versions_for_reference(
except errors.DeepchecksBaseError as e:
message = f'For model(id={model.id}) version(id={model_version.id}) check({dp_check.name()}) ' \
f'got exception: {e.message}'
logging.getLogger('monitor_run_logger').error(message)
logger.error(message)
curr_result = None

reduced_outs.append({'result': curr_result})
Expand Down
3 changes: 2 additions & 1 deletion backend/deepchecks_monitoring/notifications.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from typing_extensions import Self

from deepchecks_monitoring import __version__
from deepchecks_monitoring.monitoring_utils import configure_logger
from deepchecks_monitoring.public_models import Organization, User
from deepchecks_monitoring.schema_models import Check, Model
from deepchecks_monitoring.schema_models.alert import Alert
Expand Down Expand Up @@ -85,7 +86,7 @@ def __init__(
self.alert_rule = alert_rule
self.session = session
self.resources_provider = resources_provider
self.logger = logger or logging.getLogger("alert-notificator")
self.logger = logger or configure_logger("alert-notificator")

async def send_emails(self) -> bool:
"""Send notification emails."""
Expand Down
14 changes: 8 additions & 6 deletions backend/deepchecks_monitoring/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
from deepchecks_monitoring.features_control import FeaturesControl
from deepchecks_monitoring.integrations.email import EmailSender
from deepchecks_monitoring.logic.cache_functions import CacheFunctions
from deepchecks_monitoring.monitoring_utils import ExtendedAsyncSession, json_dumps
from deepchecks_monitoring.monitoring_utils import ExtendedAsyncSession, configure_logger, json_dumps
from deepchecks_monitoring.notifications import AlertNotificator
from deepchecks_monitoring.public_models import Organization
from deepchecks_monitoring.public_models.user import User
Expand All @@ -42,6 +42,8 @@

__all__ = ["ResourcesProvider"]

logger: logging.Logger = configure_logger("server")


class BaseResourcesProvider:
"""Base class for all resources provides."""
Expand Down Expand Up @@ -348,11 +350,11 @@ def parallel_check_executors_pool(self):
import ray # noqa
from ray.util.actor_pool import ActorPool # noqa
except ImportError:
logging.getLogger("server").info({"message": "Ray is not installed"})
logger.info({"message": "Ray is not installed"})
return

if not ray.is_initialized():
logging.getLogger("server").info({
logger.info({
"message": "Ray is not initialized"
})
return
Expand Down Expand Up @@ -389,7 +391,7 @@ def shutdown_parallel_check_executors_pool(self):
wait=tenacity.wait_fixed(1),
retry=tenacity.retry_if_exception_type(KafkaError),
reraise=True,
before_sleep=tenacity.before_sleep_log(logging.getLogger("server"), logging.WARNING),
before_sleep=tenacity.before_sleep_log(logger, logging.WARNING),
)
def ensure_kafka_topic(self, topic_name, num_partitions=1) -> bool:
"""Ensure that kafka topic exist. If not, creating it.
Expand Down Expand Up @@ -462,14 +464,14 @@ def _get_mixpanel_event_reporter(self) -> MixpanelEventReporter | None:
if mixpanel is not None:
return mixpanel
if self.settings.enable_analytics is False:
logging.getLogger("server").warning({"message": "Analytics gathering is disabled"})
logger.warning({"message": "Analytics gathering is disabled"})
return
if token := self.settings.mixpanel_id:
mixpanel = MixpanelEventReporter.from_token(token)
self._mixpanel_event_reporter = mixpanel
return mixpanel

logging.getLogger("server").warning({"message": "Mixpanel token is not provided"})
logger.warning({"message": "Mixpanel token is not provided"})

def get_features_control(self, user: User) -> FeaturesControl: # pylint: disable=unused-argument
"""Return features control."""
Expand Down
4 changes: 2 additions & 2 deletions backend/deepchecks_monitoring/schema_models/alert_webhook.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from pydantic import AnyUrl, BaseModel, validator
from sqlalchemy.dialects.postgresql import JSONB

from deepchecks_monitoring.monitoring_utils import MetadataMixin
from deepchecks_monitoring.monitoring_utils import MetadataMixin, configure_logger
from deepchecks_monitoring.schema_models import Base
from deepchecks_monitoring.utils.alerts import AlertSeverity

Expand Down Expand Up @@ -157,7 +157,7 @@ async def execute(
True - if webhook executes succesfully
False - if webhook execution fails or request returns not successful response status
"""
logger = logger or logging.getLogger(f"webhook-{self.name}")
logger = logger or configure_logger(f"webhook-{self.name}")

if alert.alert_rule.alert_severity not in self.notification_levels:
logger.info(
Expand Down
4 changes: 3 additions & 1 deletion backend/deepchecks_monitoring/utils/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
from sqlalchemy.orm import Session
from sqlalchemy.schema import CreateSchema, DDLElement

from deepchecks_monitoring.monitoring_utils import configure_logger

__all__ = ["SchemaBuilder", "attach_schema_switcher_listener", "attach_schema_switcher",
"sqlalchemy_exception_to_asyncpg_exception"]

Expand Down Expand Up @@ -139,7 +141,7 @@ def __init__(
self.name = name
self.metadata = metadata
self.migrations_location = migrations_location
self.logger = logger or logging.getLogger("schema-builder")
self.logger = logger or configure_logger("schema-builder")

async def create(self, engine: AsyncEngine):
"""Create schema."""
Expand Down
4 changes: 2 additions & 2 deletions backend/deepchecks_monitoring/utils/mixpanel.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

import deepchecks_monitoring
from deepchecks_monitoring.config import Settings
from deepchecks_monitoring.monitoring_utils import OperatorsEnum
from deepchecks_monitoring.monitoring_utils import OperatorsEnum, configure_logger
from deepchecks_monitoring.public_models.organization import OrgTier
from deepchecks_monitoring.public_models.user import User
from deepchecks_monitoring.schema_models import Alert, AlertRule, Check, Model, ModelVersion, Monitor
Expand Down Expand Up @@ -655,7 +655,7 @@ def __init__(
):
self.mixpanel = mixpanel
self.supress_errors = supress_errors
self.logger = logger or logging.getLogger(type(self).__name__)
self.logger = logger or configure_logger(type(self).__name__)

def report(
self,
Expand Down
5 changes: 3 additions & 2 deletions backend/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ confluent-kafka==2.3.0
kafka-python==2.0.2
uvloop==0.17.0
nbformat>=5.4.0,<6
deepchecks@git+https://github.com/deepchecks/deepchecks.git@main
deepchecks@git+https://github.com/deepchecks/deepchecks.git@8c15865aaebc7f73faeb0939d07fa982d646b2c4
redis[hiredis]~=4.6.0
pandas~=2.1.0
pyjwt[crypto]==2.4.0
Expand All @@ -38,4 +38,5 @@ python-json-logger~=2.0.7
mixpanel==4.10.0
typing_extensions~=4.12.0
tenacity~=8.5.0
pyarrow==14.0.2
pyarrow==14.0.2
plotly>=5.13.1,<6
Loading