mlrun 1.7.2__py3-none-any.whl → 1.8.0rc1__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 (222) hide show
  1. mlrun/__init__.py +14 -12
  2. mlrun/__main__.py +3 -3
  3. mlrun/alerts/alert.py +19 -12
  4. mlrun/artifacts/__init__.py +0 -2
  5. mlrun/artifacts/base.py +34 -11
  6. mlrun/artifacts/dataset.py +16 -16
  7. mlrun/artifacts/manager.py +13 -13
  8. mlrun/artifacts/model.py +66 -53
  9. mlrun/common/constants.py +6 -0
  10. mlrun/common/formatters/__init__.py +1 -0
  11. mlrun/common/formatters/feature_set.py +1 -0
  12. mlrun/common/formatters/function.py +1 -0
  13. mlrun/common/formatters/model_endpoint.py +30 -0
  14. mlrun/common/formatters/pipeline.py +1 -2
  15. mlrun/common/model_monitoring/__init__.py +0 -3
  16. mlrun/common/model_monitoring/helpers.py +1 -1
  17. mlrun/common/runtimes/constants.py +1 -2
  18. mlrun/common/schemas/__init__.py +4 -2
  19. mlrun/common/schemas/artifact.py +0 -6
  20. mlrun/common/schemas/common.py +50 -0
  21. mlrun/common/schemas/model_monitoring/__init__.py +8 -1
  22. mlrun/common/schemas/model_monitoring/constants.py +62 -12
  23. mlrun/common/schemas/model_monitoring/model_endpoint_v2.py +149 -0
  24. mlrun/common/schemas/model_monitoring/model_endpoints.py +21 -5
  25. mlrun/common/schemas/partition.py +122 -0
  26. mlrun/config.py +43 -15
  27. mlrun/data_types/__init__.py +0 -2
  28. mlrun/data_types/data_types.py +0 -1
  29. mlrun/data_types/infer.py +3 -1
  30. mlrun/data_types/spark.py +4 -4
  31. mlrun/data_types/to_pandas.py +2 -11
  32. mlrun/datastore/__init__.py +0 -2
  33. mlrun/datastore/alibaba_oss.py +4 -1
  34. mlrun/datastore/azure_blob.py +4 -1
  35. mlrun/datastore/base.py +12 -4
  36. mlrun/datastore/datastore.py +9 -3
  37. mlrun/datastore/datastore_profile.py +1 -1
  38. mlrun/datastore/dbfs_store.py +4 -1
  39. mlrun/datastore/filestore.py +4 -1
  40. mlrun/datastore/google_cloud_storage.py +4 -1
  41. mlrun/datastore/hdfs.py +4 -1
  42. mlrun/datastore/inmem.py +4 -1
  43. mlrun/datastore/redis.py +4 -1
  44. mlrun/datastore/s3.py +4 -1
  45. mlrun/datastore/sources.py +51 -49
  46. mlrun/datastore/store_resources.py +0 -2
  47. mlrun/datastore/targets.py +22 -23
  48. mlrun/datastore/utils.py +2 -2
  49. mlrun/datastore/v3io.py +4 -1
  50. mlrun/datastore/wasbfs/fs.py +13 -12
  51. mlrun/db/base.py +126 -62
  52. mlrun/db/factory.py +3 -0
  53. mlrun/db/httpdb.py +767 -231
  54. mlrun/db/nopdb.py +126 -57
  55. mlrun/errors.py +2 -2
  56. mlrun/execution.py +55 -29
  57. mlrun/feature_store/__init__.py +0 -2
  58. mlrun/feature_store/api.py +40 -40
  59. mlrun/feature_store/common.py +9 -9
  60. mlrun/feature_store/feature_set.py +20 -18
  61. mlrun/feature_store/feature_vector.py +27 -24
  62. mlrun/feature_store/retrieval/base.py +14 -9
  63. mlrun/feature_store/retrieval/job.py +2 -1
  64. mlrun/feature_store/steps.py +2 -2
  65. mlrun/features.py +30 -13
  66. mlrun/frameworks/__init__.py +1 -2
  67. mlrun/frameworks/_common/__init__.py +1 -2
  68. mlrun/frameworks/_common/artifacts_library.py +2 -2
  69. mlrun/frameworks/_common/mlrun_interface.py +10 -6
  70. mlrun/frameworks/_common/model_handler.py +29 -27
  71. mlrun/frameworks/_common/producer.py +3 -1
  72. mlrun/frameworks/_dl_common/__init__.py +1 -2
  73. mlrun/frameworks/_dl_common/loggers/__init__.py +1 -2
  74. mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +4 -4
  75. mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +3 -3
  76. mlrun/frameworks/_ml_common/__init__.py +1 -2
  77. mlrun/frameworks/_ml_common/loggers/__init__.py +1 -2
  78. mlrun/frameworks/_ml_common/model_handler.py +21 -21
  79. mlrun/frameworks/_ml_common/plans/__init__.py +1 -2
  80. mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +3 -1
  81. mlrun/frameworks/_ml_common/plans/dataset_plan.py +3 -3
  82. mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +4 -4
  83. mlrun/frameworks/auto_mlrun/__init__.py +1 -2
  84. mlrun/frameworks/auto_mlrun/auto_mlrun.py +22 -15
  85. mlrun/frameworks/huggingface/__init__.py +1 -2
  86. mlrun/frameworks/huggingface/model_server.py +9 -9
  87. mlrun/frameworks/lgbm/__init__.py +47 -44
  88. mlrun/frameworks/lgbm/callbacks/__init__.py +1 -2
  89. mlrun/frameworks/lgbm/callbacks/logging_callback.py +4 -2
  90. mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +4 -2
  91. mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +1 -2
  92. mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +5 -5
  93. mlrun/frameworks/lgbm/model_handler.py +15 -11
  94. mlrun/frameworks/lgbm/model_server.py +11 -7
  95. mlrun/frameworks/lgbm/utils.py +2 -2
  96. mlrun/frameworks/onnx/__init__.py +1 -2
  97. mlrun/frameworks/onnx/dataset.py +3 -3
  98. mlrun/frameworks/onnx/mlrun_interface.py +2 -2
  99. mlrun/frameworks/onnx/model_handler.py +7 -5
  100. mlrun/frameworks/onnx/model_server.py +8 -6
  101. mlrun/frameworks/parallel_coordinates.py +11 -11
  102. mlrun/frameworks/pytorch/__init__.py +22 -23
  103. mlrun/frameworks/pytorch/callbacks/__init__.py +1 -2
  104. mlrun/frameworks/pytorch/callbacks/callback.py +2 -1
  105. mlrun/frameworks/pytorch/callbacks/logging_callback.py +15 -8
  106. mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +19 -12
  107. mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +22 -15
  108. mlrun/frameworks/pytorch/callbacks_handler.py +36 -30
  109. mlrun/frameworks/pytorch/mlrun_interface.py +17 -17
  110. mlrun/frameworks/pytorch/model_handler.py +21 -17
  111. mlrun/frameworks/pytorch/model_server.py +13 -9
  112. mlrun/frameworks/sklearn/__init__.py +19 -18
  113. mlrun/frameworks/sklearn/estimator.py +2 -2
  114. mlrun/frameworks/sklearn/metric.py +3 -3
  115. mlrun/frameworks/sklearn/metrics_library.py +8 -6
  116. mlrun/frameworks/sklearn/mlrun_interface.py +3 -2
  117. mlrun/frameworks/sklearn/model_handler.py +4 -3
  118. mlrun/frameworks/tf_keras/__init__.py +11 -12
  119. mlrun/frameworks/tf_keras/callbacks/__init__.py +1 -2
  120. mlrun/frameworks/tf_keras/callbacks/logging_callback.py +17 -14
  121. mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +15 -12
  122. mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +21 -18
  123. mlrun/frameworks/tf_keras/model_handler.py +17 -13
  124. mlrun/frameworks/tf_keras/model_server.py +12 -8
  125. mlrun/frameworks/xgboost/__init__.py +19 -18
  126. mlrun/frameworks/xgboost/model_handler.py +13 -9
  127. mlrun/launcher/base.py +3 -4
  128. mlrun/launcher/local.py +1 -1
  129. mlrun/launcher/remote.py +1 -1
  130. mlrun/lists.py +4 -3
  131. mlrun/model.py +108 -44
  132. mlrun/model_monitoring/__init__.py +1 -2
  133. mlrun/model_monitoring/api.py +6 -6
  134. mlrun/model_monitoring/applications/_application_steps.py +13 -15
  135. mlrun/model_monitoring/applications/histogram_data_drift.py +41 -15
  136. mlrun/model_monitoring/applications/results.py +55 -3
  137. mlrun/model_monitoring/controller.py +185 -223
  138. mlrun/model_monitoring/db/_schedules.py +156 -0
  139. mlrun/model_monitoring/db/_stats.py +189 -0
  140. mlrun/model_monitoring/db/stores/__init__.py +1 -1
  141. mlrun/model_monitoring/db/stores/base/store.py +6 -65
  142. mlrun/model_monitoring/db/stores/sqldb/models/__init__.py +0 -25
  143. mlrun/model_monitoring/db/stores/sqldb/models/base.py +0 -97
  144. mlrun/model_monitoring/db/stores/sqldb/models/mysql.py +2 -58
  145. mlrun/model_monitoring/db/stores/sqldb/models/sqlite.py +0 -15
  146. mlrun/model_monitoring/db/stores/sqldb/sql_store.py +6 -257
  147. mlrun/model_monitoring/db/stores/v3io_kv/kv_store.py +9 -271
  148. mlrun/model_monitoring/db/tsdb/base.py +74 -22
  149. mlrun/model_monitoring/db/tsdb/tdengine/schemas.py +66 -35
  150. mlrun/model_monitoring/db/tsdb/tdengine/stream_graph_steps.py +33 -0
  151. mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +284 -51
  152. mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +1 -0
  153. mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +35 -17
  154. mlrun/model_monitoring/helpers.py +97 -1
  155. mlrun/model_monitoring/model_endpoint.py +4 -2
  156. mlrun/model_monitoring/stream_processing.py +2 -2
  157. mlrun/model_monitoring/tracking_policy.py +10 -3
  158. mlrun/model_monitoring/writer.py +47 -26
  159. mlrun/package/__init__.py +3 -6
  160. mlrun/package/context_handler.py +1 -1
  161. mlrun/package/packager.py +12 -9
  162. mlrun/package/packagers/__init__.py +0 -2
  163. mlrun/package/packagers/default_packager.py +14 -11
  164. mlrun/package/packagers/numpy_packagers.py +16 -7
  165. mlrun/package/packagers/pandas_packagers.py +18 -18
  166. mlrun/package/packagers/python_standard_library_packagers.py +25 -11
  167. mlrun/package/packagers_manager.py +31 -14
  168. mlrun/package/utils/__init__.py +0 -3
  169. mlrun/package/utils/_pickler.py +6 -6
  170. mlrun/platforms/__init__.py +3 -3
  171. mlrun/platforms/iguazio.py +4 -1
  172. mlrun/projects/__init__.py +1 -6
  173. mlrun/projects/operations.py +27 -27
  174. mlrun/projects/pipelines.py +85 -215
  175. mlrun/projects/project.py +444 -158
  176. mlrun/run.py +9 -9
  177. mlrun/runtimes/__init__.py +1 -3
  178. mlrun/runtimes/base.py +13 -10
  179. mlrun/runtimes/daskjob.py +9 -9
  180. mlrun/runtimes/generators.py +2 -1
  181. mlrun/runtimes/kubejob.py +4 -5
  182. mlrun/runtimes/mpijob/__init__.py +0 -2
  183. mlrun/runtimes/mpijob/abstract.py +7 -6
  184. mlrun/runtimes/nuclio/api_gateway.py +7 -7
  185. mlrun/runtimes/nuclio/application/application.py +11 -11
  186. mlrun/runtimes/nuclio/function.py +14 -14
  187. mlrun/runtimes/nuclio/serving.py +9 -9
  188. mlrun/runtimes/pod.py +74 -29
  189. mlrun/runtimes/remotesparkjob.py +3 -2
  190. mlrun/runtimes/sparkjob/__init__.py +0 -2
  191. mlrun/runtimes/sparkjob/spark3job.py +21 -11
  192. mlrun/runtimes/utils.py +6 -5
  193. mlrun/serving/merger.py +6 -4
  194. mlrun/serving/remote.py +18 -17
  195. mlrun/serving/routers.py +27 -27
  196. mlrun/serving/server.py +1 -1
  197. mlrun/serving/states.py +76 -71
  198. mlrun/serving/utils.py +13 -2
  199. mlrun/serving/v1_serving.py +3 -2
  200. mlrun/serving/v2_serving.py +4 -4
  201. mlrun/track/__init__.py +1 -1
  202. mlrun/track/tracker.py +2 -2
  203. mlrun/track/trackers/mlflow_tracker.py +6 -5
  204. mlrun/utils/async_http.py +1 -1
  205. mlrun/utils/helpers.py +72 -28
  206. mlrun/utils/logger.py +104 -2
  207. mlrun/utils/notifications/notification/base.py +23 -4
  208. mlrun/utils/notifications/notification/console.py +1 -1
  209. mlrun/utils/notifications/notification/git.py +6 -6
  210. mlrun/utils/notifications/notification/ipython.py +5 -4
  211. mlrun/utils/notifications/notification/slack.py +1 -1
  212. mlrun/utils/notifications/notification/webhook.py +13 -17
  213. mlrun/utils/notifications/notification_pusher.py +23 -19
  214. mlrun/utils/regex.py +1 -1
  215. mlrun/utils/version/version.json +2 -2
  216. {mlrun-1.7.2.dist-info → mlrun-1.8.0rc1.dist-info}/METADATA +187 -199
  217. mlrun-1.8.0rc1.dist-info/RECORD +356 -0
  218. {mlrun-1.7.2.dist-info → mlrun-1.8.0rc1.dist-info}/WHEEL +1 -1
  219. mlrun-1.7.2.dist-info/RECORD +0 -351
  220. {mlrun-1.7.2.dist-info → mlrun-1.8.0rc1.dist-info}/LICENSE +0 -0
  221. {mlrun-1.7.2.dist-info → mlrun-1.8.0rc1.dist-info}/entry_points.txt +0 -0
  222. {mlrun-1.7.2.dist-info → mlrun-1.8.0rc1.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,
@@ -120,6 +119,7 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
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
+ :return: 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,
@@ -317,6 +337,7 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
317
337
  Union[
318
338
  mm_results.ModelMonitoringApplicationResult,
319
339
  mm_results.ModelMonitoringApplicationMetric,
340
+ mm_results._ModelMonitoringApplicationStats,
320
341
  ]
321
342
  ]:
322
343
  """
@@ -347,8 +368,13 @@ class HistogramDataDriftApplication(ModelMonitoringApplicationBase):
347
368
  monitoring_context=monitoring_context,
348
369
  metrics_per_feature=metrics_per_feature,
349
370
  )
350
- metrics_and_result = metrics + [result]
371
+ stats = self._get_stats(
372
+ metrics=metrics,
373
+ monitoring_context=monitoring_context,
374
+ metrics_per_feature=metrics_per_feature,
375
+ )
376
+ metrics_result_and_stats = metrics + [result] + stats
351
377
  monitoring_context.logger.debug(
352
- "Finished running the application", results=metrics_and_result
378
+ "Finished running the application", results=metrics_result_and_stats
353
379
  )
354
- return metrics_and_result
380
+ 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 import validator
21
+ from pydantic.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
+ }