mlrun 1.6.4rc2__py3-none-any.whl → 1.7.0rc20__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 (291) hide show
  1. mlrun/__init__.py +11 -1
  2. mlrun/__main__.py +26 -112
  3. mlrun/alerts/__init__.py +15 -0
  4. mlrun/alerts/alert.py +144 -0
  5. mlrun/api/schemas/__init__.py +5 -4
  6. mlrun/artifacts/__init__.py +8 -3
  7. mlrun/artifacts/base.py +46 -257
  8. mlrun/artifacts/dataset.py +11 -192
  9. mlrun/artifacts/manager.py +47 -48
  10. mlrun/artifacts/model.py +31 -159
  11. mlrun/artifacts/plots.py +23 -380
  12. mlrun/common/constants.py +69 -0
  13. mlrun/common/db/sql_session.py +2 -3
  14. mlrun/common/formatters/__init__.py +19 -0
  15. mlrun/common/formatters/artifact.py +21 -0
  16. mlrun/common/formatters/base.py +78 -0
  17. mlrun/common/formatters/function.py +41 -0
  18. mlrun/common/formatters/pipeline.py +53 -0
  19. mlrun/common/formatters/project.py +51 -0
  20. mlrun/common/helpers.py +1 -2
  21. mlrun/common/model_monitoring/helpers.py +9 -5
  22. mlrun/{runtimes → common/runtimes}/constants.py +37 -9
  23. mlrun/common/schemas/__init__.py +24 -4
  24. mlrun/common/schemas/alert.py +203 -0
  25. mlrun/common/schemas/api_gateway.py +148 -0
  26. mlrun/common/schemas/artifact.py +18 -8
  27. mlrun/common/schemas/auth.py +11 -5
  28. mlrun/common/schemas/background_task.py +1 -1
  29. mlrun/common/schemas/client_spec.py +4 -1
  30. mlrun/common/schemas/feature_store.py +16 -16
  31. mlrun/common/schemas/frontend_spec.py +8 -7
  32. mlrun/common/schemas/function.py +5 -1
  33. mlrun/common/schemas/hub.py +11 -18
  34. mlrun/common/schemas/memory_reports.py +2 -2
  35. mlrun/common/schemas/model_monitoring/__init__.py +18 -3
  36. mlrun/common/schemas/model_monitoring/constants.py +83 -26
  37. mlrun/common/schemas/model_monitoring/grafana.py +13 -9
  38. mlrun/common/schemas/model_monitoring/model_endpoints.py +99 -16
  39. mlrun/common/schemas/notification.py +4 -4
  40. mlrun/common/schemas/object.py +2 -2
  41. mlrun/{runtimes/mpijob/v1alpha1.py → common/schemas/pagination.py} +10 -13
  42. mlrun/common/schemas/pipeline.py +1 -10
  43. mlrun/common/schemas/project.py +24 -23
  44. mlrun/common/schemas/runtime_resource.py +8 -12
  45. mlrun/common/schemas/schedule.py +3 -3
  46. mlrun/common/schemas/tag.py +1 -2
  47. mlrun/common/schemas/workflow.py +2 -2
  48. mlrun/common/types.py +7 -1
  49. mlrun/config.py +54 -17
  50. mlrun/data_types/to_pandas.py +10 -12
  51. mlrun/datastore/__init__.py +5 -8
  52. mlrun/datastore/alibaba_oss.py +130 -0
  53. mlrun/datastore/azure_blob.py +17 -5
  54. mlrun/datastore/base.py +62 -39
  55. mlrun/datastore/datastore.py +28 -9
  56. mlrun/datastore/datastore_profile.py +146 -20
  57. mlrun/datastore/filestore.py +0 -1
  58. mlrun/datastore/google_cloud_storage.py +6 -2
  59. mlrun/datastore/hdfs.py +56 -0
  60. mlrun/datastore/inmem.py +2 -2
  61. mlrun/datastore/redis.py +6 -2
  62. mlrun/datastore/s3.py +9 -0
  63. mlrun/datastore/snowflake_utils.py +43 -0
  64. mlrun/datastore/sources.py +201 -96
  65. mlrun/datastore/spark_utils.py +1 -2
  66. mlrun/datastore/store_resources.py +7 -7
  67. mlrun/datastore/targets.py +358 -104
  68. mlrun/datastore/utils.py +72 -58
  69. mlrun/datastore/v3io.py +5 -1
  70. mlrun/db/base.py +185 -35
  71. mlrun/db/factory.py +1 -1
  72. mlrun/db/httpdb.py +614 -179
  73. mlrun/db/nopdb.py +210 -26
  74. mlrun/errors.py +12 -1
  75. mlrun/execution.py +41 -24
  76. mlrun/feature_store/__init__.py +0 -2
  77. mlrun/feature_store/api.py +40 -72
  78. mlrun/feature_store/common.py +1 -1
  79. mlrun/feature_store/feature_set.py +76 -55
  80. mlrun/feature_store/feature_vector.py +28 -30
  81. mlrun/feature_store/ingestion.py +7 -6
  82. mlrun/feature_store/retrieval/base.py +16 -11
  83. mlrun/feature_store/retrieval/conversion.py +11 -13
  84. mlrun/feature_store/retrieval/dask_merger.py +2 -0
  85. mlrun/feature_store/retrieval/job.py +9 -3
  86. mlrun/feature_store/retrieval/local_merger.py +2 -0
  87. mlrun/feature_store/retrieval/spark_merger.py +34 -24
  88. mlrun/feature_store/steps.py +37 -34
  89. mlrun/features.py +9 -20
  90. mlrun/frameworks/_common/artifacts_library.py +9 -9
  91. mlrun/frameworks/_common/mlrun_interface.py +5 -5
  92. mlrun/frameworks/_common/model_handler.py +48 -48
  93. mlrun/frameworks/_common/plan.py +2 -3
  94. mlrun/frameworks/_common/producer.py +3 -4
  95. mlrun/frameworks/_common/utils.py +5 -5
  96. mlrun/frameworks/_dl_common/loggers/logger.py +6 -7
  97. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +9 -9
  98. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +23 -47
  99. mlrun/frameworks/_ml_common/artifacts_library.py +1 -2
  100. mlrun/frameworks/_ml_common/loggers/logger.py +3 -4
  101. mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +4 -5
  102. mlrun/frameworks/_ml_common/model_handler.py +24 -24
  103. mlrun/frameworks/_ml_common/pkl_model_server.py +2 -2
  104. mlrun/frameworks/_ml_common/plan.py +1 -1
  105. mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +2 -3
  106. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +2 -3
  107. mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
  108. mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +3 -3
  109. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
  110. mlrun/frameworks/_ml_common/utils.py +4 -4
  111. mlrun/frameworks/auto_mlrun/auto_mlrun.py +9 -9
  112. mlrun/frameworks/huggingface/model_server.py +4 -4
  113. mlrun/frameworks/lgbm/__init__.py +33 -33
  114. mlrun/frameworks/lgbm/callbacks/callback.py +2 -4
  115. mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -5
  116. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -5
  117. mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -3
  118. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +6 -6
  119. mlrun/frameworks/lgbm/model_handler.py +10 -10
  120. mlrun/frameworks/lgbm/model_server.py +6 -6
  121. mlrun/frameworks/lgbm/utils.py +5 -5
  122. mlrun/frameworks/onnx/dataset.py +8 -8
  123. mlrun/frameworks/onnx/mlrun_interface.py +3 -3
  124. mlrun/frameworks/onnx/model_handler.py +6 -6
  125. mlrun/frameworks/onnx/model_server.py +7 -7
  126. mlrun/frameworks/parallel_coordinates.py +4 -3
  127. mlrun/frameworks/pytorch/__init__.py +18 -18
  128. mlrun/frameworks/pytorch/callbacks/callback.py +4 -5
  129. mlrun/frameworks/pytorch/callbacks/logging_callback.py +17 -17
  130. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +11 -11
  131. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +23 -29
  132. mlrun/frameworks/pytorch/callbacks_handler.py +38 -38
  133. mlrun/frameworks/pytorch/mlrun_interface.py +20 -20
  134. mlrun/frameworks/pytorch/model_handler.py +17 -17
  135. mlrun/frameworks/pytorch/model_server.py +7 -7
  136. mlrun/frameworks/sklearn/__init__.py +13 -13
  137. mlrun/frameworks/sklearn/estimator.py +4 -4
  138. mlrun/frameworks/sklearn/metrics_library.py +14 -14
  139. mlrun/frameworks/sklearn/mlrun_interface.py +3 -6
  140. mlrun/frameworks/sklearn/model_handler.py +2 -2
  141. mlrun/frameworks/tf_keras/__init__.py +10 -7
  142. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +15 -15
  143. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +11 -11
  144. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +19 -23
  145. mlrun/frameworks/tf_keras/mlrun_interface.py +9 -11
  146. mlrun/frameworks/tf_keras/model_handler.py +14 -14
  147. mlrun/frameworks/tf_keras/model_server.py +6 -6
  148. mlrun/frameworks/xgboost/__init__.py +13 -13
  149. mlrun/frameworks/xgboost/model_handler.py +6 -6
  150. mlrun/k8s_utils.py +14 -16
  151. mlrun/launcher/__init__.py +1 -1
  152. mlrun/launcher/base.py +16 -15
  153. mlrun/launcher/client.py +8 -6
  154. mlrun/launcher/factory.py +1 -1
  155. mlrun/launcher/local.py +17 -11
  156. mlrun/launcher/remote.py +16 -10
  157. mlrun/lists.py +7 -6
  158. mlrun/model.py +238 -73
  159. mlrun/model_monitoring/__init__.py +1 -1
  160. mlrun/model_monitoring/api.py +138 -315
  161. mlrun/model_monitoring/application.py +5 -296
  162. mlrun/model_monitoring/applications/__init__.py +24 -0
  163. mlrun/model_monitoring/applications/_application_steps.py +157 -0
  164. mlrun/model_monitoring/applications/base.py +282 -0
  165. mlrun/model_monitoring/applications/context.py +214 -0
  166. mlrun/model_monitoring/applications/evidently_base.py +211 -0
  167. mlrun/model_monitoring/applications/histogram_data_drift.py +349 -0
  168. mlrun/model_monitoring/applications/results.py +99 -0
  169. mlrun/model_monitoring/controller.py +104 -84
  170. mlrun/model_monitoring/controller_handler.py +13 -5
  171. mlrun/model_monitoring/db/__init__.py +18 -0
  172. mlrun/model_monitoring/{stores → db/stores}/__init__.py +43 -36
  173. mlrun/model_monitoring/db/stores/base/__init__.py +15 -0
  174. mlrun/model_monitoring/{stores/model_endpoint_store.py → db/stores/base/store.py} +64 -40
  175. mlrun/model_monitoring/db/stores/sqldb/__init__.py +13 -0
  176. mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +71 -0
  177. mlrun/model_monitoring/{stores → db/stores/sqldb}/models/base.py +109 -5
  178. mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +88 -0
  179. mlrun/model_monitoring/{stores/models/mysql.py → db/stores/sqldb/models/sqlite.py} +19 -13
  180. mlrun/model_monitoring/db/stores/sqldb/sql_store.py +684 -0
  181. mlrun/model_monitoring/db/stores/v3io_kv/__init__.py +13 -0
  182. mlrun/model_monitoring/{stores/kv_model_endpoint_store.py → db/stores/v3io_kv/kv_store.py} +310 -165
  183. mlrun/model_monitoring/db/tsdb/__init__.py +100 -0
  184. mlrun/model_monitoring/db/tsdb/base.py +329 -0
  185. mlrun/model_monitoring/db/tsdb/helpers.py +30 -0
  186. mlrun/model_monitoring/db/tsdb/tdengine/__init__.py +15 -0
  187. mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +240 -0
  188. mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +45 -0
  189. mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +397 -0
  190. mlrun/model_monitoring/db/tsdb/v3io/__init__.py +15 -0
  191. mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +117 -0
  192. mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +630 -0
  193. mlrun/model_monitoring/evidently_application.py +6 -118
  194. mlrun/model_monitoring/features_drift_table.py +134 -106
  195. mlrun/model_monitoring/helpers.py +127 -28
  196. mlrun/model_monitoring/metrics/__init__.py +13 -0
  197. mlrun/model_monitoring/metrics/histogram_distance.py +127 -0
  198. mlrun/model_monitoring/model_endpoint.py +3 -2
  199. mlrun/model_monitoring/prometheus.py +1 -4
  200. mlrun/model_monitoring/stream_processing.py +62 -231
  201. mlrun/model_monitoring/tracking_policy.py +9 -2
  202. mlrun/model_monitoring/writer.py +152 -124
  203. mlrun/package/__init__.py +6 -6
  204. mlrun/package/context_handler.py +5 -5
  205. mlrun/package/packager.py +7 -7
  206. mlrun/package/packagers/default_packager.py +6 -6
  207. mlrun/package/packagers/numpy_packagers.py +15 -15
  208. mlrun/package/packagers/pandas_packagers.py +5 -5
  209. mlrun/package/packagers/python_standard_library_packagers.py +10 -10
  210. mlrun/package/packagers_manager.py +19 -23
  211. mlrun/package/utils/_formatter.py +6 -6
  212. mlrun/package/utils/_pickler.py +2 -2
  213. mlrun/package/utils/_supported_format.py +4 -4
  214. mlrun/package/utils/log_hint_utils.py +2 -2
  215. mlrun/package/utils/type_hint_utils.py +4 -9
  216. mlrun/platforms/__init__.py +11 -10
  217. mlrun/platforms/iguazio.py +24 -203
  218. mlrun/projects/operations.py +35 -21
  219. mlrun/projects/pipelines.py +68 -99
  220. mlrun/projects/project.py +830 -266
  221. mlrun/render.py +3 -11
  222. mlrun/run.py +162 -166
  223. mlrun/runtimes/__init__.py +62 -7
  224. mlrun/runtimes/base.py +39 -32
  225. mlrun/runtimes/daskjob.py +8 -8
  226. mlrun/runtimes/databricks_job/databricks_cancel_task.py +1 -1
  227. mlrun/runtimes/databricks_job/databricks_runtime.py +7 -7
  228. mlrun/runtimes/databricks_job/databricks_wrapper.py +1 -1
  229. mlrun/runtimes/funcdoc.py +0 -28
  230. mlrun/runtimes/function_reference.py +1 -1
  231. mlrun/runtimes/kubejob.py +28 -122
  232. mlrun/runtimes/local.py +6 -3
  233. mlrun/runtimes/mpijob/__init__.py +0 -20
  234. mlrun/runtimes/mpijob/abstract.py +9 -10
  235. mlrun/runtimes/mpijob/v1.py +1 -1
  236. mlrun/{model_monitoring/stores/models/sqlite.py → runtimes/nuclio/__init__.py} +7 -9
  237. mlrun/runtimes/nuclio/api_gateway.py +709 -0
  238. mlrun/runtimes/nuclio/application/__init__.py +15 -0
  239. mlrun/runtimes/nuclio/application/application.py +523 -0
  240. mlrun/runtimes/nuclio/application/reverse_proxy.go +95 -0
  241. mlrun/runtimes/{function.py → nuclio/function.py} +112 -73
  242. mlrun/runtimes/{nuclio.py → nuclio/nuclio.py} +6 -6
  243. mlrun/runtimes/{serving.py → nuclio/serving.py} +45 -51
  244. mlrun/runtimes/pod.py +286 -88
  245. mlrun/runtimes/remotesparkjob.py +2 -2
  246. mlrun/runtimes/sparkjob/spark3job.py +51 -34
  247. mlrun/runtimes/utils.py +7 -75
  248. mlrun/secrets.py +9 -5
  249. mlrun/serving/remote.py +2 -7
  250. mlrun/serving/routers.py +13 -10
  251. mlrun/serving/server.py +22 -26
  252. mlrun/serving/states.py +99 -25
  253. mlrun/serving/utils.py +3 -3
  254. mlrun/serving/v1_serving.py +6 -7
  255. mlrun/serving/v2_serving.py +59 -20
  256. mlrun/track/tracker.py +2 -1
  257. mlrun/track/tracker_manager.py +3 -3
  258. mlrun/track/trackers/mlflow_tracker.py +1 -2
  259. mlrun/utils/async_http.py +5 -7
  260. mlrun/utils/azure_vault.py +1 -1
  261. mlrun/utils/clones.py +1 -2
  262. mlrun/utils/condition_evaluator.py +3 -3
  263. mlrun/utils/db.py +3 -3
  264. mlrun/utils/helpers.py +183 -197
  265. mlrun/utils/http.py +2 -5
  266. mlrun/utils/logger.py +76 -14
  267. mlrun/utils/notifications/notification/__init__.py +17 -12
  268. mlrun/utils/notifications/notification/base.py +14 -2
  269. mlrun/utils/notifications/notification/console.py +2 -0
  270. mlrun/utils/notifications/notification/git.py +3 -1
  271. mlrun/utils/notifications/notification/ipython.py +3 -1
  272. mlrun/utils/notifications/notification/slack.py +101 -21
  273. mlrun/utils/notifications/notification/webhook.py +11 -1
  274. mlrun/utils/notifications/notification_pusher.py +155 -30
  275. mlrun/utils/retryer.py +208 -0
  276. mlrun/utils/singleton.py +1 -1
  277. mlrun/utils/v3io_clients.py +2 -4
  278. mlrun/utils/version/version.json +2 -2
  279. mlrun/utils/version/version.py +2 -6
  280. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/METADATA +31 -19
  281. mlrun-1.7.0rc20.dist-info/RECORD +353 -0
  282. mlrun/kfpops.py +0 -868
  283. mlrun/model_monitoring/batch.py +0 -1095
  284. mlrun/model_monitoring/stores/models/__init__.py +0 -27
  285. mlrun/model_monitoring/stores/sql_model_endpoint_store.py +0 -384
  286. mlrun/platforms/other.py +0 -306
  287. mlrun-1.6.4rc2.dist-info/RECORD +0 -314
  288. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/LICENSE +0 -0
  289. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/WHEEL +0 -0
  290. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/entry_points.txt +0 -0
  291. {mlrun-1.6.4rc2.dist-info → mlrun-1.7.0rc20.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
- # Copyright 2023 Iguazio
1
+ # Copyright 2024 Iguazio
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -11,27 +11,28 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
- #
15
14
 
16
15
  import typing
17
16
  from abc import ABC, abstractmethod
18
17
 
18
+ import mlrun.common.schemas.model_monitoring as mm_schemas
19
+
19
20
 
20
- class ModelEndpointStore(ABC):
21
+ class StoreBase(ABC):
21
22
  """
22
- An abstract class to handle the model endpoint in the DB target.
23
+ An abstract class to handle the store object in the DB target.
23
24
  """
24
25
 
25
26
  def __init__(self, project: str):
26
27
  """
27
- Initialize a new model endpoint target.
28
+ Initialize a new store target.
28
29
 
29
- :param project: The name of the project.
30
+ :param project: The name of the project.
30
31
  """
31
32
  self.project = project
32
33
 
33
34
  @abstractmethod
34
- def write_model_endpoint(self, endpoint: typing.Dict[str, typing.Any]):
35
+ def write_model_endpoint(self, endpoint: dict[str, typing.Any]):
35
36
  """
36
37
  Create a new endpoint record in the DB table.
37
38
 
@@ -41,7 +42,7 @@ class ModelEndpointStore(ABC):
41
42
 
42
43
  @abstractmethod
43
44
  def update_model_endpoint(
44
- self, endpoint_id: str, attributes: typing.Dict[str, typing.Any]
45
+ self, endpoint_id: str, attributes: dict[str, typing.Any]
45
46
  ):
46
47
  """
47
48
  Update a model endpoint record with a given attributes.
@@ -63,14 +64,10 @@ class ModelEndpointStore(ABC):
63
64
  pass
64
65
 
65
66
  @abstractmethod
66
- def delete_model_endpoints_resources(
67
- self, endpoints: typing.List[typing.Dict[str, typing.Any]]
68
- ):
67
+ def delete_model_endpoints_resources(self):
69
68
  """
70
69
  Delete all model endpoints resources.
71
70
 
72
- :param endpoints: A list of model endpoints flattened dictionaries.
73
-
74
71
  """
75
72
  pass
76
73
 
@@ -78,7 +75,7 @@ class ModelEndpointStore(ABC):
78
75
  def get_model_endpoint(
79
76
  self,
80
77
  endpoint_id: str,
81
- ) -> typing.Dict[str, typing.Any]:
78
+ ) -> dict[str, typing.Any]:
82
79
  """
83
80
  Get a single model endpoint record.
84
81
 
@@ -93,10 +90,10 @@ class ModelEndpointStore(ABC):
93
90
  self,
94
91
  model: str = None,
95
92
  function: str = None,
96
- labels: typing.List[str] = None,
93
+ labels: list[str] = None,
97
94
  top_level: bool = None,
98
- uids: typing.List = None,
99
- ) -> typing.List[typing.Dict[str, typing.Any]]:
95
+ uids: list = None,
96
+ ) -> list[dict[str, typing.Any]]:
100
97
  """
101
98
  Returns a list of model endpoint dictionaries, supports filtering by model, function, labels or top level.
102
99
  By default, when no filters are applied, all available model endpoints for the given project will
@@ -115,33 +112,60 @@ class ModelEndpointStore(ABC):
115
112
  pass
116
113
 
117
114
  @abstractmethod
118
- def get_endpoint_real_time_metrics(
115
+ def write_application_event(
119
116
  self,
120
- endpoint_id: str,
121
- metrics: typing.List[str],
122
- start: str = "now-1h",
123
- end: str = "now",
124
- access_key: str = None,
125
- ) -> typing.Dict[str, typing.List[typing.Tuple[str, float]]]:
117
+ event: dict[str, typing.Any],
118
+ kind: mm_schemas.WriterEventKind = mm_schemas.WriterEventKind.RESULT,
119
+ ) -> None:
120
+ """
121
+ Write a new event in the target table.
122
+
123
+ :param event: An event dictionary that represents the application result, should be corresponded to the
124
+ schema defined in the :py:class:`~mlrun.common.schemas.model_monitoring.constants.WriterEvent`
125
+ object.
126
+ :param kind: The type of the event, can be either "result" or "metric".
126
127
  """
127
- Getting metrics from the time series DB. There are pre-defined metrics for model endpoints such as
128
- `predictions_per_second` and `latency_avg_5m` but also custom metrics defined by the user.
128
+
129
+ @abstractmethod
130
+ def get_last_analyzed(self, endpoint_id: str, application_name: str) -> int:
131
+ """
132
+ Get the last analyzed time for the provided model endpoint and application.
129
133
 
130
134
  :param endpoint_id: The unique id of the model endpoint.
131
- :param metrics: A list of real-time metrics to return for the model endpoint.
132
- :param start: The start time of the metrics. Can be represented by a string containing an RFC 3339
133
- time, a Unix timestamp in milliseconds, a relative time (`'now'` or
134
- `'now-[0-9]+[mhd]'`, where `m` = minutes, `h` = hours, and `'d'` = days), or 0 for the
135
- earliest time.
136
- :param end: The end time of the metrics. Can be represented by a string containing an RFC 3339
137
- time, a Unix timestamp in milliseconds, a relative time (`'now'` or
138
- `'now-[0-9]+[mhd]'`, where `m` = minutes, `h` = hours, and `'d'` = days), or 0 for the
139
- earliest time.
140
- :param access_key: V3IO access key that will be used for generating Frames client object. If not
141
- provided, the access key will be retrieved from the environment variables.
142
-
143
- :return: A dictionary of metrics in which the key is a metric name and the value is a list of tuples that
144
- includes timestamps and the values.
135
+ :param application_name: Registered application name.
136
+
137
+ :return: Timestamp as a Unix time.
138
+ :raise: MLRunNotFoundError if last analyzed value is not found.
145
139
  """
140
+ pass
146
141
 
142
+ @abstractmethod
143
+ def update_last_analyzed(
144
+ self,
145
+ endpoint_id: str,
146
+ application_name: str,
147
+ last_analyzed: int,
148
+ ):
149
+ """
150
+ Update the last analyzed time for the provided model endpoint and application.
151
+
152
+ :param endpoint_id: The unique id of the model endpoint.
153
+ :param application_name: Registered application name.
154
+ :param last_analyzed: Timestamp as a Unix time that represents the last analyzed time of a certain
155
+ application and model endpoint.
156
+
157
+ """
147
158
  pass
159
+
160
+ @abstractmethod
161
+ def get_model_endpoint_metrics(
162
+ self, endpoint_id: str, type: mm_schemas.ModelEndpointMonitoringMetricType
163
+ ) -> list[mm_schemas.ModelEndpointMonitoringMetric]:
164
+ """
165
+ Get the model monitoring results and metrics of the requested model endpoint.
166
+
167
+ :param: endpoint_id: The model endpoint identifier.
168
+ :param: type: The type of the requested metrics ("result" or "metric").
169
+
170
+ :return: A list of the available metrics.
171
+ """
@@ -0,0 +1,13 @@
1
+ # Copyright 2024 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
@@ -0,0 +1,71 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from functools import partial
16
+ from typing import Optional, TypeVar, Union
17
+
18
+ from .mysql import ApplicationMetricsTable as MySQLApplicationMetricsTable
19
+ from .mysql import ApplicationResultTable as MySQLApplicationResultTable
20
+ from .mysql import ModelEndpointsTable as MySQLModelEndpointsTable
21
+ from .mysql import MonitoringSchedulesTable as MySQLMonitoringSchedulesTable
22
+ from .sqlite import ApplicationMetricsTable as SQLiteApplicationMetricsTable
23
+ from .sqlite import ApplicationResultTable as SQLiteApplicationResultTable
24
+ from .sqlite import ModelEndpointsTable as SQLiteModelEndpointsTable
25
+ from .sqlite import MonitoringSchedulesTable as SQLiteMonitoringSchedulesTable
26
+
27
+ MySQLTableType = TypeVar("MySQLTableType")
28
+ SQLiteTableType = TypeVar("SQLiteTableType")
29
+
30
+ _MYSQL_SCHEME = "mysql:"
31
+
32
+
33
+ def _get_sql_table(
34
+ *,
35
+ mysql_table: MySQLTableType,
36
+ sqlite_table: SQLiteTableType,
37
+ connection_string: Optional[str] = None,
38
+ ) -> Union[MySQLTableType, SQLiteTableType]:
39
+ """
40
+ Return a SQLAlchemy table for MySQL or SQLite according to the connection string.
41
+ Note: this function should not be directly used in other modules.
42
+ """
43
+ if connection_string and _MYSQL_SCHEME in connection_string:
44
+ return mysql_table
45
+ return sqlite_table
46
+
47
+
48
+ _get_model_endpoints_table = partial(
49
+ _get_sql_table,
50
+ mysql_table=MySQLModelEndpointsTable,
51
+ sqlite_table=SQLiteModelEndpointsTable,
52
+ )
53
+
54
+
55
+ _get_application_result_table = partial(
56
+ _get_sql_table,
57
+ mysql_table=MySQLApplicationResultTable,
58
+ sqlite_table=SQLiteApplicationResultTable,
59
+ )
60
+
61
+ _get_application_metrics_table = partial(
62
+ _get_sql_table,
63
+ mysql_table=MySQLApplicationMetricsTable,
64
+ sqlite_table=SQLiteApplicationMetricsTable,
65
+ )
66
+
67
+ _get_monitoring_schedules_table = partial(
68
+ _get_sql_table,
69
+ mysql_table=MySQLMonitoringSchedulesTable,
70
+ sqlite_table=SQLiteMonitoringSchedulesTable,
71
+ )
@@ -11,10 +11,24 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+ from sqlalchemy import (
15
+ TIMESTAMP,
16
+ Boolean,
17
+ Column,
18
+ Float,
19
+ Integer,
20
+ String,
21
+ Text,
22
+ )
14
23
 
15
- from sqlalchemy import TIMESTAMP, Boolean, Column, Integer, String, Text
16
-
17
- from mlrun.common.schemas.model_monitoring import EventFieldType
24
+ from mlrun.common.schemas.model_monitoring import (
25
+ EventFieldType,
26
+ FileTargetKind,
27
+ MetricData,
28
+ ResultData,
29
+ SchedulingKeys,
30
+ WriterEvent,
31
+ )
18
32
  from mlrun.utils.db import BaseModel
19
33
 
20
34
 
@@ -76,9 +90,99 @@ class ModelEndpointsBaseTable(BaseModel):
76
90
  metrics = Column(EventFieldType.METRICS, Text)
77
91
  first_request = Column(
78
92
  EventFieldType.FIRST_REQUEST,
79
- TIMESTAMP,
93
+ TIMESTAMP(timezone=True),
80
94
  )
81
95
  last_request = Column(
82
96
  EventFieldType.LAST_REQUEST,
83
- TIMESTAMP,
97
+ TIMESTAMP(timezone=True),
98
+ )
99
+
100
+
101
+ class ApplicationResultBaseTable(BaseModel):
102
+ __tablename__ = FileTargetKind.APP_RESULTS
103
+
104
+ uid = Column(EventFieldType.UID, String(120), primary_key=True)
105
+
106
+ application_name = Column(
107
+ WriterEvent.APPLICATION_NAME,
108
+ String(40),
109
+ nullable=True,
110
+ )
111
+
112
+ endpoint_id = Column(
113
+ WriterEvent.ENDPOINT_ID,
114
+ String(40),
115
+ nullable=True,
116
+ )
117
+
118
+ result_name = Column(
119
+ ResultData.RESULT_NAME,
120
+ String(40),
121
+ )
122
+
123
+ start_infer_time = Column(
124
+ WriterEvent.START_INFER_TIME,
125
+ TIMESTAMP(timezone=True),
126
+ )
127
+ end_infer_time = Column(
128
+ WriterEvent.END_INFER_TIME,
129
+ TIMESTAMP(timezone=True),
130
+ )
131
+
132
+ result_status = Column(ResultData.RESULT_STATUS, String(10))
133
+ result_kind = Column(ResultData.RESULT_KIND, String(40))
134
+ result_value = Column(ResultData.RESULT_VALUE, Float)
135
+ result_extra_data = Column(ResultData.RESULT_EXTRA_DATA, Text)
136
+ current_stats = Column(ResultData.CURRENT_STATS, Text)
137
+
138
+
139
+ class ApplicationMetricsBaseTable(BaseModel):
140
+ __tablename__ = FileTargetKind.APP_METRICS
141
+
142
+ uid = Column(EventFieldType.UID, String(120), primary_key=True)
143
+ application_name = Column(
144
+ WriterEvent.APPLICATION_NAME,
145
+ String(40),
146
+ nullable=True,
147
+ )
148
+ endpoint_id = Column(
149
+ WriterEvent.ENDPOINT_ID,
150
+ String(40),
151
+ nullable=True,
152
+ )
153
+ start_infer_time = Column(
154
+ WriterEvent.START_INFER_TIME,
155
+ TIMESTAMP(timezone=True),
156
+ )
157
+ end_infer_time = Column(
158
+ WriterEvent.END_INFER_TIME,
159
+ TIMESTAMP(timezone=True),
160
+ )
161
+ metric_name = Column(
162
+ MetricData.METRIC_NAME,
163
+ String(40),
164
+ )
165
+ metric_value = Column(MetricData.METRIC_VALUE, Float)
166
+
167
+
168
+ class MonitoringSchedulesBaseTable(BaseModel):
169
+ __tablename__ = FileTargetKind.MONITORING_SCHEDULES
170
+
171
+ uid = Column(SchedulingKeys.UID, String(32), primary_key=True)
172
+
173
+ application_name = Column(
174
+ SchedulingKeys.APPLICATION_NAME,
175
+ String(40),
176
+ nullable=False,
177
+ )
178
+
179
+ endpoint_id = Column(
180
+ SchedulingKeys.ENDPOINT_ID,
181
+ String(40),
182
+ nullable=False,
183
+ )
184
+
185
+ last_analyzed = Column(
186
+ SchedulingKeys.LAST_ANALYZED,
187
+ Integer,
84
188
  )
@@ -0,0 +1,88 @@
1
+ # Copyright 2023 Iguazio
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import sqlalchemy.dialects.mysql
16
+ from sqlalchemy import Column, ForeignKey, String
17
+ from sqlalchemy.ext.declarative import declarative_base, declared_attr
18
+
19
+ from mlrun.common.schemas.model_monitoring import (
20
+ EventFieldType,
21
+ WriterEvent,
22
+ )
23
+
24
+ from .base import (
25
+ ApplicationMetricsBaseTable,
26
+ ApplicationResultBaseTable,
27
+ ModelEndpointsBaseTable,
28
+ MonitoringSchedulesBaseTable,
29
+ )
30
+
31
+ Base = declarative_base()
32
+
33
+
34
+ class ModelEndpointsTable(Base, ModelEndpointsBaseTable):
35
+ first_request = Column(
36
+ EventFieldType.FIRST_REQUEST,
37
+ sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3, timezone=True),
38
+ )
39
+ last_request = Column(
40
+ EventFieldType.LAST_REQUEST,
41
+ sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3, timezone=True),
42
+ )
43
+
44
+
45
+ class _ApplicationResultOrMetric:
46
+ """
47
+ This class sets common columns of `ApplicationResultTable` and `ApplicationMetricsTable`
48
+ to the correct values in MySQL.
49
+ Note: This class must come before the base tables in the inheritance order to override
50
+ the relevant columns.
51
+ """
52
+
53
+ start_infer_time = Column(
54
+ WriterEvent.START_INFER_TIME,
55
+ sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3, timezone=True),
56
+ )
57
+ end_infer_time = Column(
58
+ WriterEvent.END_INFER_TIME,
59
+ sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3, timezone=True),
60
+ )
61
+
62
+ @declared_attr
63
+ def endpoint_id(self):
64
+ return Column(
65
+ String(40),
66
+ ForeignKey(f"{EventFieldType.MODEL_ENDPOINTS}.{EventFieldType.UID}"),
67
+ )
68
+
69
+
70
+ class ApplicationResultTable(
71
+ Base, _ApplicationResultOrMetric, ApplicationResultBaseTable
72
+ ):
73
+ pass
74
+
75
+
76
+ class ApplicationMetricsTable(
77
+ Base, _ApplicationResultOrMetric, ApplicationMetricsBaseTable
78
+ ):
79
+ pass
80
+
81
+
82
+ class MonitoringSchedulesTable(Base, MonitoringSchedulesBaseTable):
83
+ @declared_attr
84
+ def endpoint_id(self):
85
+ return Column(
86
+ String(40),
87
+ ForeignKey(f"{EventFieldType.MODEL_ENDPOINTS}.{EventFieldType.UID}"),
88
+ )
@@ -12,23 +12,29 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- import sqlalchemy.dialects.mysql
16
- from sqlalchemy import Column
17
15
  from sqlalchemy.ext.declarative import declarative_base
18
16
 
19
- from mlrun.common.schemas.model_monitoring import EventFieldType
20
-
21
- from .base import ModelEndpointsBaseTable
17
+ from .base import (
18
+ ApplicationMetricsBaseTable,
19
+ ApplicationResultBaseTable,
20
+ ModelEndpointsBaseTable,
21
+ MonitoringSchedulesBaseTable,
22
+ )
22
23
 
23
24
  Base = declarative_base()
24
25
 
25
26
 
26
27
  class ModelEndpointsTable(Base, ModelEndpointsBaseTable):
27
- first_request = Column(
28
- EventFieldType.FIRST_REQUEST,
29
- sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3),
30
- )
31
- last_request = Column(
32
- EventFieldType.LAST_REQUEST,
33
- sqlalchemy.dialects.mysql.TIMESTAMP(fsp=3),
34
- )
28
+ pass
29
+
30
+
31
+ class ApplicationResultTable(Base, ApplicationResultBaseTable):
32
+ pass
33
+
34
+
35
+ class ApplicationMetricsTable(Base, ApplicationMetricsBaseTable):
36
+ pass
37
+
38
+
39
+ class MonitoringSchedulesTable(Base, MonitoringSchedulesBaseTable):
40
+ pass