def transform_df_to_metric(self, data: pd.DataFrame) -> Optional[Metric]: if data.empty or self.tsdb_column not in data.columns: return None values = data[self.tsdb_column].reset_index().to_numpy() describe = data[self.tsdb_column].describe().to_dict() return Metric( name=self.metric_name, start_timestamp=str(data.index[0]), end_timestamp=str(data.index[-1]), headers=self.headers, values=[(str(timestamp), float(value)) for timestamp, value in values], min=describe["min"], avg=describe["mean"], max=describe["max"], )
def get_endpoint_metrics( self, access_key: str, project: str, endpoint_id: str, metrics: List[str], start: str = "now-1h", end: str = "now", ) -> Dict[str, Metric]: if not metrics: raise MLRunInvalidArgumentError("Metric names must be provided") path = config.model_endpoint_monitoring.store_prefixes.default.format( project=project, kind=mlrun.api.schemas.ModelMonitoringStoreKinds.EVENTS ) _, container, path = parse_model_endpoint_store_prefix(path) client = get_frames_client( token=access_key, address=config.v3io_framesd, container=container, ) data = client.read( backend="tsdb", table=path, columns=["endpoint_id", *metrics], filter=f"endpoint_id=='{endpoint_id}'", start=start, end=end, ) data_dict = data.to_dict() metrics_mapping = {} for metric in metrics: metric_data = data_dict.get(metric) if metric_data is None: continue values = [ (str(timestamp), value) for timestamp, value in metric_data.items() ] metrics_mapping[metric] = Metric(name=metric, values=values) return metrics_mapping
async def get_endpoint_metrics( access_key: str, project: str, endpoint_id: str, metrics: List[str], start: str = "now-1h", end: str = "now", ) -> Dict[str, Metric]: if not metrics: raise MLRunInvalidArgumentError("Metric names must be provided") client = get_frames_client( token=access_key, address=config.v3io_framesd, container=config.model_endpoint_monitoring.container, ) data = await run_in_threadpool( client.read, backend="tsdb", table=f"{project}/{ENDPOINT_EVENTS_TABLE_PATH}", columns=["endpoint_id", *metrics], filter=f"endpoint_id=='{endpoint_id}'", start=start, end=end, ) data_dict = data.to_dict() metrics_mapping = {} for metric in metrics: metric_data = data_dict.get(metric) if metric_data is None: continue values = [(str(timestamp), value) for timestamp, value in metric_data.items()] metrics_mapping[metric] = Metric(name=metric, values=values) return metrics_mapping