mlrun 1.7.1rc10__py3-none-any.whl → 1.8.0rc8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mlrun might be problematic. Click here for more details.

Files changed (257) hide show
  1. mlrun/__init__.py +23 -21
  2. mlrun/__main__.py +3 -3
  3. mlrun/alerts/alert.py +148 -14
  4. mlrun/artifacts/__init__.py +1 -2
  5. mlrun/artifacts/base.py +46 -12
  6. mlrun/artifacts/dataset.py +16 -16
  7. mlrun/artifacts/document.py +334 -0
  8. mlrun/artifacts/manager.py +15 -13
  9. mlrun/artifacts/model.py +66 -53
  10. mlrun/common/constants.py +7 -0
  11. mlrun/common/formatters/__init__.py +1 -0
  12. mlrun/common/formatters/feature_set.py +1 -0
  13. mlrun/common/formatters/function.py +1 -0
  14. mlrun/{model_monitoring/db/stores/base/__init__.py → common/formatters/model_endpoint.py} +16 -1
  15. mlrun/common/formatters/pipeline.py +1 -2
  16. mlrun/common/formatters/project.py +9 -0
  17. mlrun/common/model_monitoring/__init__.py +0 -5
  18. mlrun/common/model_monitoring/helpers.py +1 -29
  19. mlrun/common/runtimes/constants.py +1 -2
  20. mlrun/common/schemas/__init__.py +6 -2
  21. mlrun/common/schemas/alert.py +111 -19
  22. mlrun/common/schemas/api_gateway.py +3 -3
  23. mlrun/common/schemas/artifact.py +11 -7
  24. mlrun/common/schemas/auth.py +6 -4
  25. mlrun/common/schemas/background_task.py +7 -7
  26. mlrun/common/schemas/client_spec.py +2 -3
  27. mlrun/common/schemas/clusterization_spec.py +2 -2
  28. mlrun/common/schemas/common.py +53 -3
  29. mlrun/common/schemas/constants.py +15 -0
  30. mlrun/common/schemas/datastore_profile.py +1 -1
  31. mlrun/common/schemas/feature_store.py +9 -9
  32. mlrun/common/schemas/frontend_spec.py +4 -4
  33. mlrun/common/schemas/function.py +10 -10
  34. mlrun/common/schemas/hub.py +1 -1
  35. mlrun/common/schemas/k8s.py +3 -3
  36. mlrun/common/schemas/memory_reports.py +3 -3
  37. mlrun/common/schemas/model_monitoring/__init__.py +2 -1
  38. mlrun/common/schemas/model_monitoring/constants.py +66 -14
  39. mlrun/common/schemas/model_monitoring/grafana.py +1 -1
  40. mlrun/common/schemas/model_monitoring/model_endpoints.py +91 -147
  41. mlrun/common/schemas/notification.py +24 -3
  42. mlrun/common/schemas/object.py +1 -1
  43. mlrun/common/schemas/pagination.py +4 -4
  44. mlrun/common/schemas/partition.py +137 -0
  45. mlrun/common/schemas/pipeline.py +2 -2
  46. mlrun/common/schemas/project.py +25 -17
  47. mlrun/common/schemas/runs.py +2 -2
  48. mlrun/common/schemas/runtime_resource.py +5 -5
  49. mlrun/common/schemas/schedule.py +1 -1
  50. mlrun/common/schemas/secret.py +1 -1
  51. mlrun/common/schemas/tag.py +3 -3
  52. mlrun/common/schemas/workflow.py +5 -5
  53. mlrun/config.py +67 -10
  54. mlrun/data_types/__init__.py +0 -2
  55. mlrun/data_types/infer.py +3 -1
  56. mlrun/data_types/spark.py +2 -1
  57. mlrun/datastore/__init__.py +0 -2
  58. mlrun/datastore/alibaba_oss.py +4 -1
  59. mlrun/datastore/azure_blob.py +4 -1
  60. mlrun/datastore/base.py +12 -4
  61. mlrun/datastore/datastore.py +9 -3
  62. mlrun/datastore/datastore_profile.py +79 -20
  63. mlrun/datastore/dbfs_store.py +4 -1
  64. mlrun/datastore/filestore.py +4 -1
  65. mlrun/datastore/google_cloud_storage.py +4 -1
  66. mlrun/datastore/hdfs.py +4 -1
  67. mlrun/datastore/inmem.py +4 -1
  68. mlrun/datastore/redis.py +4 -1
  69. mlrun/datastore/s3.py +4 -1
  70. mlrun/datastore/sources.py +52 -51
  71. mlrun/datastore/store_resources.py +0 -2
  72. mlrun/datastore/targets.py +21 -21
  73. mlrun/datastore/utils.py +2 -2
  74. mlrun/datastore/v3io.py +4 -1
  75. mlrun/datastore/vectorstore.py +194 -0
  76. mlrun/datastore/wasbfs/fs.py +13 -12
  77. mlrun/db/base.py +208 -82
  78. mlrun/db/factory.py +0 -3
  79. mlrun/db/httpdb.py +1237 -386
  80. mlrun/db/nopdb.py +201 -74
  81. mlrun/errors.py +2 -2
  82. mlrun/execution.py +136 -50
  83. mlrun/feature_store/__init__.py +0 -2
  84. mlrun/feature_store/api.py +41 -40
  85. mlrun/feature_store/common.py +9 -9
  86. mlrun/feature_store/feature_set.py +20 -18
  87. mlrun/feature_store/feature_vector.py +27 -24
  88. mlrun/feature_store/retrieval/base.py +14 -9
  89. mlrun/feature_store/retrieval/job.py +2 -1
  90. mlrun/feature_store/steps.py +2 -2
  91. mlrun/features.py +30 -13
  92. mlrun/frameworks/__init__.py +1 -2
  93. mlrun/frameworks/_common/__init__.py +1 -2
  94. mlrun/frameworks/_common/artifacts_library.py +2 -2
  95. mlrun/frameworks/_common/mlrun_interface.py +10 -6
  96. mlrun/frameworks/_common/model_handler.py +29 -27
  97. mlrun/frameworks/_common/producer.py +3 -1
  98. mlrun/frameworks/_dl_common/__init__.py +1 -2
  99. mlrun/frameworks/_dl_common/loggers/__init__.py +1 -2
  100. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +4 -4
  101. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +3 -3
  102. mlrun/frameworks/_ml_common/__init__.py +1 -2
  103. mlrun/frameworks/_ml_common/loggers/__init__.py +1 -2
  104. mlrun/frameworks/_ml_common/model_handler.py +21 -21
  105. mlrun/frameworks/_ml_common/plans/__init__.py +1 -2
  106. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +3 -1
  107. mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
  108. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
  109. mlrun/frameworks/auto_mlrun/__init__.py +1 -2
  110. mlrun/frameworks/auto_mlrun/auto_mlrun.py +22 -15
  111. mlrun/frameworks/huggingface/__init__.py +1 -2
  112. mlrun/frameworks/huggingface/model_server.py +9 -9
  113. mlrun/frameworks/lgbm/__init__.py +47 -44
  114. mlrun/frameworks/lgbm/callbacks/__init__.py +1 -2
  115. mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -2
  116. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -2
  117. mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +1 -2
  118. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +5 -5
  119. mlrun/frameworks/lgbm/model_handler.py +15 -11
  120. mlrun/frameworks/lgbm/model_server.py +11 -7
  121. mlrun/frameworks/lgbm/utils.py +2 -2
  122. mlrun/frameworks/onnx/__init__.py +1 -2
  123. mlrun/frameworks/onnx/dataset.py +3 -3
  124. mlrun/frameworks/onnx/mlrun_interface.py +2 -2
  125. mlrun/frameworks/onnx/model_handler.py +7 -5
  126. mlrun/frameworks/onnx/model_server.py +8 -6
  127. mlrun/frameworks/parallel_coordinates.py +11 -11
  128. mlrun/frameworks/pytorch/__init__.py +22 -23
  129. mlrun/frameworks/pytorch/callbacks/__init__.py +1 -2
  130. mlrun/frameworks/pytorch/callbacks/callback.py +2 -1
  131. mlrun/frameworks/pytorch/callbacks/logging_callback.py +15 -8
  132. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +19 -12
  133. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +22 -15
  134. mlrun/frameworks/pytorch/callbacks_handler.py +36 -30
  135. mlrun/frameworks/pytorch/mlrun_interface.py +17 -17
  136. mlrun/frameworks/pytorch/model_handler.py +21 -17
  137. mlrun/frameworks/pytorch/model_server.py +13 -9
  138. mlrun/frameworks/sklearn/__init__.py +19 -18
  139. mlrun/frameworks/sklearn/estimator.py +2 -2
  140. mlrun/frameworks/sklearn/metric.py +3 -3
  141. mlrun/frameworks/sklearn/metrics_library.py +8 -6
  142. mlrun/frameworks/sklearn/mlrun_interface.py +3 -2
  143. mlrun/frameworks/sklearn/model_handler.py +4 -3
  144. mlrun/frameworks/tf_keras/__init__.py +11 -12
  145. mlrun/frameworks/tf_keras/callbacks/__init__.py +1 -2
  146. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +17 -14
  147. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +15 -12
  148. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +21 -18
  149. mlrun/frameworks/tf_keras/model_handler.py +17 -13
  150. mlrun/frameworks/tf_keras/model_server.py +12 -8
  151. mlrun/frameworks/xgboost/__init__.py +19 -18
  152. mlrun/frameworks/xgboost/model_handler.py +13 -9
  153. mlrun/launcher/base.py +3 -4
  154. mlrun/launcher/local.py +1 -1
  155. mlrun/launcher/remote.py +1 -1
  156. mlrun/lists.py +4 -3
  157. mlrun/model.py +117 -46
  158. mlrun/model_monitoring/__init__.py +4 -4
  159. mlrun/model_monitoring/api.py +61 -59
  160. mlrun/model_monitoring/applications/_application_steps.py +17 -17
  161. mlrun/model_monitoring/applications/base.py +165 -6
  162. mlrun/model_monitoring/applications/context.py +88 -37
  163. mlrun/model_monitoring/applications/evidently_base.py +0 -1
  164. mlrun/model_monitoring/applications/histogram_data_drift.py +43 -21
  165. mlrun/model_monitoring/applications/results.py +55 -3
  166. mlrun/model_monitoring/controller.py +207 -239
  167. mlrun/model_monitoring/db/__init__.py +0 -2
  168. mlrun/model_monitoring/db/_schedules.py +156 -0
  169. mlrun/model_monitoring/db/_stats.py +189 -0
  170. mlrun/model_monitoring/db/tsdb/base.py +78 -25
  171. mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +61 -6
  172. mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +33 -0
  173. mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +255 -29
  174. mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +1 -0
  175. mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +78 -17
  176. mlrun/model_monitoring/helpers.py +152 -49
  177. mlrun/model_monitoring/stream_processing.py +99 -283
  178. mlrun/model_monitoring/tracking_policy.py +10 -3
  179. mlrun/model_monitoring/writer.py +48 -36
  180. mlrun/package/__init__.py +3 -6
  181. mlrun/package/context_handler.py +1 -1
  182. mlrun/package/packager.py +12 -9
  183. mlrun/package/packagers/__init__.py +0 -2
  184. mlrun/package/packagers/default_packager.py +14 -11
  185. mlrun/package/packagers/numpy_packagers.py +16 -7
  186. mlrun/package/packagers/pandas_packagers.py +18 -18
  187. mlrun/package/packagers/python_standard_library_packagers.py +25 -11
  188. mlrun/package/packagers_manager.py +31 -14
  189. mlrun/package/utils/__init__.py +0 -3
  190. mlrun/package/utils/_pickler.py +6 -6
  191. mlrun/platforms/__init__.py +47 -16
  192. mlrun/platforms/iguazio.py +4 -1
  193. mlrun/projects/operations.py +27 -27
  194. mlrun/projects/pipelines.py +71 -36
  195. mlrun/projects/project.py +865 -206
  196. mlrun/run.py +53 -10
  197. mlrun/runtimes/__init__.py +1 -3
  198. mlrun/runtimes/base.py +15 -11
  199. mlrun/runtimes/daskjob.py +9 -9
  200. mlrun/runtimes/generators.py +2 -1
  201. mlrun/runtimes/kubejob.py +4 -5
  202. mlrun/runtimes/mounts.py +572 -0
  203. mlrun/runtimes/mpijob/__init__.py +0 -2
  204. mlrun/runtimes/mpijob/abstract.py +7 -6
  205. mlrun/runtimes/nuclio/api_gateway.py +7 -7
  206. mlrun/runtimes/nuclio/application/application.py +11 -11
  207. mlrun/runtimes/nuclio/function.py +19 -17
  208. mlrun/runtimes/nuclio/serving.py +18 -11
  209. mlrun/runtimes/pod.py +154 -45
  210. mlrun/runtimes/remotesparkjob.py +3 -2
  211. mlrun/runtimes/sparkjob/__init__.py +0 -2
  212. mlrun/runtimes/sparkjob/spark3job.py +21 -11
  213. mlrun/runtimes/utils.py +6 -5
  214. mlrun/serving/merger.py +6 -4
  215. mlrun/serving/remote.py +18 -17
  216. mlrun/serving/routers.py +185 -172
  217. mlrun/serving/server.py +7 -1
  218. mlrun/serving/states.py +97 -78
  219. mlrun/serving/utils.py +13 -2
  220. mlrun/serving/v1_serving.py +3 -2
  221. mlrun/serving/v2_serving.py +74 -65
  222. mlrun/track/__init__.py +1 -1
  223. mlrun/track/tracker.py +2 -2
  224. mlrun/track/trackers/mlflow_tracker.py +6 -5
  225. mlrun/utils/async_http.py +1 -1
  226. mlrun/utils/clones.py +1 -1
  227. mlrun/utils/helpers.py +54 -16
  228. mlrun/utils/logger.py +106 -4
  229. mlrun/utils/notifications/notification/__init__.py +22 -19
  230. mlrun/utils/notifications/notification/base.py +33 -14
  231. mlrun/utils/notifications/notification/console.py +6 -6
  232. mlrun/utils/notifications/notification/git.py +11 -11
  233. mlrun/utils/notifications/notification/ipython.py +10 -9
  234. mlrun/utils/notifications/notification/mail.py +176 -0
  235. mlrun/utils/notifications/notification/slack.py +6 -6
  236. mlrun/utils/notifications/notification/webhook.py +6 -6
  237. mlrun/utils/notifications/notification_pusher.py +86 -44
  238. mlrun/utils/regex.py +3 -1
  239. mlrun/utils/version/version.json +2 -2
  240. {mlrun-1.7.1rc10.dist-info → mlrun-1.8.0rc8.dist-info}/METADATA +21 -16
  241. mlrun-1.8.0rc8.dist-info/RECORD +347 -0
  242. mlrun/model_monitoring/db/stores/__init__.py +0 -136
  243. mlrun/model_monitoring/db/stores/base/store.py +0 -213
  244. mlrun/model_monitoring/db/stores/sqldb/__init__.py +0 -13
  245. mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +0 -71
  246. mlrun/model_monitoring/db/stores/sqldb/models/base.py +0 -190
  247. mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +0 -103
  248. mlrun/model_monitoring/db/stores/sqldb/models/sqlite.py +0 -40
  249. mlrun/model_monitoring/db/stores/sqldb/sql_store.py +0 -659
  250. mlrun/model_monitoring/db/stores/v3io_kv/__init__.py +0 -13
  251. mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py +0 -726
  252. mlrun/model_monitoring/model_endpoint.py +0 -118
  253. mlrun-1.7.1rc10.dist-info/RECORD +0 -351
  254. {mlrun-1.7.1rc10.dist-info → mlrun-1.8.0rc8.dist-info}/LICENSE +0 -0
  255. {mlrun-1.7.1rc10.dist-info → mlrun-1.8.0rc8.dist-info}/WHEEL +0 -0
  256. {mlrun-1.7.1rc10.dist-info → mlrun-1.8.0rc8.dist-info}/entry_points.txt +0 -0
  257. {mlrun-1.7.1rc10.dist-info → mlrun-1.8.0rc8.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,6 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- import json
16
15
  from dataclasses import dataclass
17
16
  from typing import Final, Optional, Protocol, Union, cast
18
17
 
@@ -25,10 +24,10 @@ import mlrun.model_monitoring.applications.context as mm_context
25
24
  import mlrun.model_monitoring.applications.results as mm_results
26
25
  import mlrun.model_monitoring.features_drift_table as mm_drift_table
27
26
  from mlrun.common.schemas.model_monitoring.constants import (
28
- EventFieldType,
29
27
  HistogramDataDriftApplicationConstants,
30
28
  ResultKindApp,
31
29
  ResultStatusApp,
30
+ StatsKind,
32
31
  )
33
32
  from mlrun.model_monitoring.applications import (
34
33
  ModelMonitoringApplicationBase,
@@ -114,12 +113,13 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
114
113
 
115
114
  project.enable_model_monitoring()
116
115
 
117
- To avoid it, pass `deploy_histogram_data_drift_app=False`.
116
+ To avoid it, pass :code:`deploy_histogram_data_drift_app=False`.
118
117
  """
119
118
 
120
119
  NAME: Final[str] = HistogramDataDriftApplicationConstants.NAME
121
120
 
122
121
  _REQUIRED_METRICS = {HellingerDistance, TotalVarianceDistance}
122
+ _STATS_TYPES: tuple[StatsKind] = (StatsKind.CURRENT_STATS, StatsKind.DRIFT_MEASURES)
123
123
 
124
124
  metrics: list[type[HistogramDistanceMetric]] = [
125
125
  HellingerDistance,
@@ -189,21 +189,12 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
189
189
  )
190
190
 
191
191
  status = self._value_classifier.value_to_status(value)
192
+
192
193
  return mm_results.ModelMonitoringApplicationResult(
193
194
  name=HistogramDataDriftApplicationConstants.GENERAL_RESULT_NAME,
194
195
  value=value,
195
196
  kind=ResultKindApp.data_drift,
196
197
  status=status,
197
- extra_data={
198
- EventFieldType.CURRENT_STATS: json.dumps(
199
- monitoring_context.sample_df_stats
200
- ),
201
- EventFieldType.DRIFT_MEASURES: json.dumps(
202
- metrics_per_feature.T.to_dict()
203
- | {metric.name: metric.value for metric in metrics}
204
- ),
205
- EventFieldType.DRIFT_STATUS: status.value,
206
- },
207
198
  )
208
199
 
209
200
  @staticmethod
@@ -225,6 +216,35 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
225
216
 
226
217
  return metrics
227
218
 
219
+ @staticmethod
220
+ def _get_stats(
221
+ metrics: list[mm_results.ModelMonitoringApplicationMetric],
222
+ metrics_per_feature: DataFrame,
223
+ monitoring_context: mm_context.MonitoringApplicationContext,
224
+ ) -> list[mm_results._ModelMonitoringApplicationStats]:
225
+ """
226
+ list the application calculated stats
227
+ :param metrics: the calculated metrics
228
+ :param metrics_per_feature: metric calculated per feature
229
+ :param monitoring_context: context object for current monitoring application
230
+ :returns: list of mm_results._ModelMonitoringApplicationStats for histogram data drift application
231
+ """
232
+ stats = []
233
+ for stats_type in HistogramDataDriftApplication._STATS_TYPES:
234
+ stats.append(
235
+ mm_results._ModelMonitoringApplicationStats(
236
+ name=stats_type,
237
+ stats=metrics_per_feature.T.to_dict()
238
+ | {metric.name: metric.value for metric in metrics}
239
+ if stats_type == StatsKind.DRIFT_MEASURES
240
+ else monitoring_context.sample_df_stats,
241
+ timestamp=monitoring_context.end_infer_time.isoformat(
242
+ sep=" ", timespec="microseconds"
243
+ ),
244
+ )
245
+ )
246
+ return stats
247
+
228
248
  @staticmethod
229
249
  def _get_shared_features_sample_stats(
230
250
  monitoring_context: mm_context.MonitoringApplicationContext,
@@ -311,19 +331,16 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
311
331
  )
312
332
 
313
333
  def do_tracking(
314
- self,
315
- monitoring_context: mm_context.MonitoringApplicationContext,
334
+ self, monitoring_context: mm_context.MonitoringApplicationContext
316
335
  ) -> list[
317
336
  Union[
318
337
  mm_results.ModelMonitoringApplicationResult,
319
338
  mm_results.ModelMonitoringApplicationMetric,
339
+ mm_results._ModelMonitoringApplicationStats,
320
340
  ]
321
341
  ]:
322
342
  """
323
343
  Calculate and return the data drift metrics, averaged over the features.
324
-
325
- Refer to `ModelMonitoringApplicationBaseV2` for the meaning of the
326
- function arguments.
327
344
  """
328
345
  monitoring_context.logger.debug("Starting to run the application")
329
346
  if not monitoring_context.feature_stats:
@@ -347,8 +364,13 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
347
364
  monitoring_context=monitoring_context,
348
365
  metrics_per_feature=metrics_per_feature,
349
366
  )
350
- metrics_and_result = metrics + [result]
367
+ stats = self._get_stats(
368
+ metrics=metrics,
369
+ monitoring_context=monitoring_context,
370
+ metrics_per_feature=metrics_per_feature,
371
+ )
372
+ metrics_result_and_stats = metrics + [result] + stats
351
373
  monitoring_context.logger.debug(
352
- "Finished running the application", results=metrics_and_result
374
+ "Finished running the application", results=metrics_result_and_stats
353
375
  )
354
- return metrics_and_result
376
+ return metrics_result_and_stats
@@ -17,10 +17,16 @@ import json
17
17
  import re
18
18
  from abc import ABC, abstractmethod
19
19
 
20
+ from pydantic.v1 import validator
21
+ from pydantic.v1.dataclasses import dataclass
22
+
20
23
  import mlrun.common.helpers
21
24
  import mlrun.common.model_monitoring.helpers
22
25
  import mlrun.common.schemas.model_monitoring.constants as mm_constant
23
26
  import mlrun.utils.v3io_clients
27
+ from mlrun.utils import logger
28
+
29
+ _RESULT_EXTRA_DATA_MAX_SIZE = 998
24
30
 
25
31
 
26
32
  class _ModelMonitoringApplicationDataRes(ABC):
@@ -38,7 +44,7 @@ class _ModelMonitoringApplicationDataRes(ABC):
38
44
  raise NotImplementedError
39
45
 
40
46
 
41
- @dataclasses.dataclass
47
+ @dataclass
42
48
  class ModelMonitoringApplicationResult(_ModelMonitoringApplicationDataRes):
43
49
  """
44
50
  Class representing the result of a custom model monitoring application.
@@ -49,7 +55,10 @@ class ModelMonitoringApplicationResult(_ModelMonitoringApplicationDataRes):
49
55
  :param value: (float) Value of the application result.
50
56
  :param kind: (ResultKindApp) Kind of application result.
51
57
  :param status: (ResultStatusApp) Status of the application result.
52
- :param extra_data: (dict) Extra data associated with the application result.
58
+ :param extra_data: (dict) Extra data associated with the application result. Note that if the extra data is
59
+ exceeding the maximum size of 998 characters, it will be ignored and a message will
60
+ be logged. In this case, we recommend logging the extra data as a separate artifact or
61
+ shortening it.
53
62
  """
54
63
 
55
64
  name: str
@@ -72,8 +81,23 @@ class ModelMonitoringApplicationResult(_ModelMonitoringApplicationDataRes):
72
81
  mm_constant.ResultData.RESULT_EXTRA_DATA: json.dumps(self.extra_data),
73
82
  }
74
83
 
84
+ @validator("extra_data")
85
+ @classmethod
86
+ def validate_extra_data_len(cls, result_extra_data: dict):
87
+ """Ensure that the extra data is not exceeding the maximum size which is important to avoid
88
+ possible storage issues."""
89
+ extra_data_len = len(json.dumps(result_extra_data))
90
+ if extra_data_len > _RESULT_EXTRA_DATA_MAX_SIZE:
91
+ logger.warning(
92
+ f"Extra data is too long and won't be stored: {extra_data_len} characters while the maximum "
93
+ f"is {_RESULT_EXTRA_DATA_MAX_SIZE} characters."
94
+ f"Please shorten the extra data or log it as a separate artifact."
95
+ )
96
+ return {}
97
+ return result_extra_data
75
98
 
76
- @dataclasses.dataclass
99
+
100
+ @dataclass
77
101
  class ModelMonitoringApplicationMetric(_ModelMonitoringApplicationDataRes):
78
102
  """
79
103
  Class representing a single metric of a custom model monitoring application.
@@ -97,3 +121,31 @@ class ModelMonitoringApplicationMetric(_ModelMonitoringApplicationDataRes):
97
121
  mm_constant.MetricData.METRIC_NAME: self.name,
98
122
  mm_constant.MetricData.METRIC_VALUE: self.value,
99
123
  }
124
+
125
+
126
+ @dataclasses.dataclass
127
+ class _ModelMonitoringApplicationStats(_ModelMonitoringApplicationDataRes):
128
+ """
129
+ Class representing the stats of histogram data drift application.
130
+
131
+ :param name (mm_constant.StatsKind) Enum mm_constant.StatsData of the stats data kind of the event
132
+ :param (str) iso format representation of the timestamp the event took place
133
+ :param stats (dict) Dictionary representation of the stats calculated for the event
134
+
135
+ """
136
+
137
+ name: mm_constant.StatsKind
138
+ timestamp: str
139
+ stats: dict = dataclasses.field(default_factory=dict)
140
+
141
+ def to_dict(self):
142
+ """
143
+ Convert the object to a dictionary format suitable for writing.
144
+
145
+ :returns: (dict) Dictionary representation of the result.
146
+ """
147
+ return {
148
+ mm_constant.StatsData.STATS_NAME: self.name,
149
+ mm_constant.StatsData.STATS: self.stats,
150
+ mm_constant.StatsData.TIMESTAMP: self.timestamp,
151
+ }