Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 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
3 changes: 2 additions & 1 deletion backend/deepchecks_monitoring/utils/database.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""The database module."""

Check failure on line 1 in backend/deepchecks_monitoring/utils/database.py

View workflow job for this annotation

GitHub Actions / pylint

Imports are incorrectly sorted and/or formatted.
import contextlib
import logging
import typing as t
Expand All @@ -12,6 +12,7 @@
from sqlalchemy.ext.compiler import compiles
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 +140,7 @@
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