Source code for mlrun.model_monitoring.applications.base

# Copyright 2023 Iguazio
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from abc import ABC, abstractmethod
from typing import Any, Union

import mlrun.model_monitoring.applications.context as mm_context
import mlrun.model_monitoring.applications.results as mm_results
from mlrun.serving.utils import MonitoringApplicationToDict


[docs]class ModelMonitoringApplicationBase(MonitoringApplicationToDict, ABC): """ A base class for a model monitoring application. Inherit from this class to create a custom model monitoring application. example for very simple custom application:: class MyApp(ApplicationBase): def do_tracking( self, monitoring_context: mm_context.MonitoringApplicationContext, ) -> ModelMonitoringApplicationResult: monitoring_context.log_artifact( TableArtifact( "sample_df_stats", df=self.dict_to_histogram(sample_df_stats) ) ) return ModelMonitoringApplicationResult( name="data_drift_test", value=0.5, kind=mm_constant.ResultKindApp.data_drift, status=mm_constant.ResultStatusApp.detected, ) """ kind = "monitoring_application" def do( self, monitoring_context: mm_context.MonitoringApplicationContext ) -> tuple[ list[ Union[ mm_results.ModelMonitoringApplicationResult, mm_results.ModelMonitoringApplicationMetric, ] ], mm_context.MonitoringApplicationContext, ]: """ Process the monitoring event and return application results & metrics. :param monitoring_context: (MonitoringApplicationContext) The monitoring application context. :returns: A tuple of: [0] = list of application results that can be either from type `ModelMonitoringApplicationResult` or from type `ModelMonitoringApplicationResult`. [1] = the original application event, wrapped in `MonitoringApplicationContext` object """ results = self.do_tracking(monitoring_context=monitoring_context) if isinstance(results, dict): results = [ mm_results.ModelMonitoringApplicationMetric(name=key, value=value) for key, value in results.items() ] results = results if isinstance(results, list) else [results] return results, monitoring_context
[docs] @abstractmethod def do_tracking( self, monitoring_context: mm_context.MonitoringApplicationContext, ) -> Union[ mm_results.ModelMonitoringApplicationResult, list[ Union[ mm_results.ModelMonitoringApplicationResult, mm_results.ModelMonitoringApplicationMetric, ] ], dict[str, Any], ]: """ Implement this method with your custom monitoring logic. :param monitoring_context: (MonitoringApplicationContext) The monitoring context to process. :returns: (ModelMonitoringApplicationResult) or (list[Union[ModelMonitoringApplicationResult, ModelMonitoringApplicationMetric]]) or dict that contains the application metrics only (in this case the name of each metric name is the key and the metric value is the corresponding value). """ raise NotImplementedError