def _get_endpoint_features( project: str, endpoint_id: str, features: Optional[str] ) -> List[Features]: if not features: url = f"projects/{project}/model-endpoints/{endpoint_id}/features" raise MLRunNotFoundError(f"Endpoint features not found' - {url}") parsed_features: List[dict] = json.loads(features) if features is not None else [] feature_objects = [Features(**feature) for feature in parsed_features] return feature_objects
def get_endpoint( access_key: str, project: str, endpoint_id: str, metrics: Optional[List[str]] = None, start: str = "now-1h", end: str = "now", feature_analysis: bool = False, ) -> ModelEndpoint: """ Returns a ModelEndpoint object with additional metrics and feature related data. :param access_key: V3IO access key for managing user permissions :param project: The name of the project :param endpoint_id: The id of the model endpoint :param metrics: A list of metrics to return for each endpoint, read more in 'TimeMetric' :param start: The start time of the metrics :param end: The end time of the metrics :param feature_analysis: When True, the base feature statistics and current feature statistics will be added to the output of the resulting object """ logger.info( "Getting model endpoint record from kv", endpoint_id=endpoint_id, ) client = get_v3io_client(endpoint=config.v3io_api) path = config.model_endpoint_monitoring.store_prefixes.default.format( project=project, kind=ENDPOINTS) _, container, path = parse_model_endpoint_store_prefix(path) endpoint = client.kv.get( container=container, table_path=path, key=endpoint_id, access_key=access_key, raise_for_status=RaiseForStatus.never, ) endpoint = endpoint.output.item if not endpoint: raise MLRunNotFoundError(f"Endpoint {endpoint_id} not found") labels = endpoint.get("labels") feature_names = endpoint.get("feature_names") feature_names = _json_loads_if_not_none(feature_names) label_names = endpoint.get("label_names") label_names = _json_loads_if_not_none(label_names) feature_stats = endpoint.get("feature_stats") feature_stats = _json_loads_if_not_none(feature_stats) current_stats = endpoint.get("current_stats") current_stats = _json_loads_if_not_none(current_stats) drift_measures = endpoint.get("drift_measures") drift_measures = _json_loads_if_not_none(drift_measures) monitor_configuration = endpoint.get("monitor_configuration") monitor_configuration = _json_loads_if_not_none(monitor_configuration) endpoint = ModelEndpoint( metadata=ModelEndpointMetadata( project=endpoint.get("project"), labels=_json_loads_if_not_none(labels), uid=endpoint_id, ), spec=ModelEndpointSpec( function_uri=endpoint.get("function_uri"), model=endpoint.get("model"), model_class=endpoint.get("model_class") or None, model_uri=endpoint.get("model_uri") or None, feature_names=feature_names or None, label_names=label_names or None, stream_path=endpoint.get("stream_path") or None, algorithm=endpoint.get("algorithm") or None, monitor_configuration=monitor_configuration or None, active=endpoint.get("active") or None, ), status=ModelEndpointStatus( state=endpoint.get("state") or None, feature_stats=feature_stats or None, current_stats=current_stats or None, first_request=endpoint.get("first_request") or None, last_request=endpoint.get("last_request") or None, accuracy=endpoint.get("accuracy") or None, error_count=endpoint.get("error_count") or None, drift_status=endpoint.get("drift_status") or None, ), ) if feature_analysis and feature_names: endpoint_features = get_endpoint_features( feature_names=feature_names, feature_stats=feature_stats, current_stats=current_stats, ) if endpoint_features: endpoint.status.features = endpoint_features endpoint.status.drift_measures = drift_measures if metrics: endpoint_metrics = get_endpoint_metrics( access_key=access_key, project=project, endpoint_id=endpoint_id, start=start, end=end, metrics=metrics, ) if endpoint_metrics: endpoint.status.metrics = endpoint_metrics return endpoint
def get_endpoint( access_key: str, project: str, endpoint_id: str, metrics: Optional[List[str]] = None, start: str = "now-1h", end: str = "now", features: bool = False, ) -> ModelEndpointState: """ Returns the current state of an endpoint. :param access_key: V3IO access key for managing user permissions :param project: The name of the project :param endpoint_id: The id of the model endpoint :param metrics: A list of metrics to return for each endpoint, read more in 'TimeMetric' :param start: The start time of the metrics :param end: The end time of the metrics """ verify_endpoint(project, endpoint_id) endpoint = get_endpoint_kv_record_by_id( access_key, project, endpoint_id, ENDPOINT_TABLE_ATTRIBUTES, ) if not endpoint: url = f"/projects/{project}/model-endpoints/{endpoint_id}" raise MLRunNotFoundError(f"Endpoint {endpoint_id} not found - {url}") endpoint_metrics = None if metrics: endpoint_metrics = _get_endpoint_metrics( access_key=access_key, project=project, endpoint_id=endpoint_id, start=start, end=end, name=metrics, ) return ModelEndpointState( endpoint=ModelEndpoint( metadata=ModelEndpointMetadata( project=endpoint.get("project"), tag=endpoint.get("tag"), labels=json.loads(endpoint.get("labels", "")), ), spec=ModelEndpointSpec( model=endpoint.get("model"), function=endpoint.get("function"), model_class=endpoint.get("model_class"), ), status=ObjectStatus(state="active"), ), first_request=endpoint.get("first_request"), last_request=endpoint.get("last_request"), error_count=endpoint.get("error_count"), drift_status=endpoint.get("drift_status"), metrics=endpoint_metrics, )
def get_endpoint( project: str, endpoint_id: str, start: str = Query(default="now-1h"), end: str = Query(default="now"), metrics: bool = Query(default=False), features: bool = Query(default=False), ): """ Return the current state of an endpoint, meaning all additional data the is relevant to a specified endpoint. This function also takes into account the start and end times and uses the same time-querying as v3io-frames. """ _verify_endpoint(project, endpoint_id) endpoint = _get_endpoint_kv_record_by_id( endpoint_id, ENDPOINT_TABLE_ATTRIBUTES_WITH_FEATURES, ) if not endpoint: url = f"/projects/{project}/model-endpoints/{endpoint_id}" raise MLRunNotFoundError(f"Endpoint {endpoint_id} not found - {url}") endpoint_metrics = None if metrics: endpoint_metrics = _get_endpoint_metrics( endpoint_id=endpoint_id, start=start, end=end, name=["predictions", "latency"], ) endpoint_features = None if features: endpoint_features = _get_endpoint_features( project=project, endpoint_id=endpoint_id, features=endpoint.get("features")) return ModelEndpointState( endpoint=ModelEndpoint( metadata=ModelEndpointMetadata( project=endpoint.get("project"), tag=endpoint.get("tag"), labels=json.loads(endpoint.get("labels", "")), ), spec=ModelEndpointSpec( model=endpoint.get("model"), function=endpoint.get("function"), model_class=endpoint.get("model_class"), ), status=ObjectStatus(state="active"), ), first_request=endpoint.get("first_request"), last_request=endpoint.get("last_request"), error_count=endpoint.get("error_count"), alert_count=endpoint.get("alert_count"), drift_status=endpoint.get("drift_status"), metrics=endpoint_metrics, features=endpoint_features, )