def metrics( self, metric_type: MetricType = MetricType.TIMESTAMP, statistic: MetricStatistic = MetricStatistic.MAX, ) -> Dict[str, List[Any]]: """Gets all the metrics data, where the keys are the column names, and the values are a list containing the values in each row. For example, the table: timestamp energy 0 0.1 1 0.2 would be represented as: { "timestamp" : [0, 1], "energy" : [0.1, 0.2] } values may be integers, floats, strings or None. Args: metric_type (MetricType): The type of metrics to get. Default: MetricType.TIMESTAMP. statistic (MetricStatistic): The statistic to determine which metric value to use when there is a conflict. Default: MetricStatistic.MAX. Returns: Dict[str, List[Union[str, float, int]]] : The metrics data. """ parser = LogMetricsParser() current_time = str(time.time()) for line in self.run_log.splitlines(): if line.startswith("Metrics -"): parser.parse_log_message(current_time, line) return parser.get_parsed_metrics(metric_type, statistic)
def _parse_log_line(self, result_entry: List[Dict[str, Any]], parser: LogMetricsParser) -> None: """ Parses the single entry from CloudWatch Insights results and adds any metrics it finds to 'all_metrics' along with the timestamp for the entry. Args: result_entry (List[Dict[str, Any]]): A structured result from calling CloudWatch Insights to get logs that contain metrics. A single entry contains the message (the actual line logged to output), the timestamp (generated by CloudWatch Logs), and other metadata that we (currently) do not use. parser (LogMetricsParser) : The CWL metrics parser. """ message = self._get_element_from_log_line("@message", result_entry) if message: timestamp = self._get_element_from_log_line("@timestamp", result_entry) parser.parse_log_message(timestamp, message)
def _parse_log_query_results( self, results: List[Any], metric_type: MetricType, statistic: MetricStatistic ) -> Dict[str, List[Union[str, float, int]]]: """ Parses CloudWatch Insights results and returns all found metrics. Args: results (List[Any]): A structured result from calling CloudWatch Insights to get logs that contain metrics. metric_type (MetricType): The type of metrics to get. statistic (MetricStatistic): The statistic to determine which metric value to use when there is a conflict. Returns: Dict[str, List[Union[str, float, int]]] : The metrics data. """ parser = LogMetricsParser() for result in results: self._parse_log_line(result, parser) return parser.get_parsed_metrics(metric_type, statistic)
def _parse_metrics_from_log_stream( self, stream_name: str, timeout_time: float, parser: LogMetricsParser, ) -> None: """ Synchronously retrieves the algorithm metrics logged in a given job log stream. Args: stream_name (str): The name of the log stream. timeout_time (float) : We stop getting metrics if the current time is beyond the timeout time. parser (LogMetricsParser) : The CWL metrics parser. Returns: None """ kwargs = { "logGroupName": self.LOG_GROUP_NAME, "logStreamName": stream_name, "startFromHead": True, "limit": 10000, } previous_token = None while time.time() < timeout_time: response = self._logs_client.get_log_events(**kwargs) for event in response.get("events"): message = event.get("message") if self._is_metrics_message(message): parser.parse_log_message(event.get("timestamp"), message) next_token = response.get("nextForwardToken") if not next_token or next_token == previous_token: return previous_token = next_token kwargs["nextToken"] = next_token self._logger.warning( "Timed out waiting for all metrics. Data may be incomplete.")
def get_metrics_for_job( self, job_name: str, metric_type: MetricType = MetricType.TIMESTAMP, statistic: MetricStatistic = MetricStatistic.MAX, ) -> Dict[str, List[Union[str, float, int]]]: """ Synchronously retrieves all the algorithm metrics logged by a given Job. Args: job_name (str): The name of the Job. The name must be exact to ensure only the relevant metrics are retrieved. metric_type (MetricType): The type of metrics to get. Default is MetricType.TIMESTAMP. statistic (MetricStatistic): The statistic to determine which metric value to use when there is a conflict. Default is MetricStatistic.MAX. Returns: Dict[str, List[Union[str, float, int]]] : The metrics data, where the keys are the column names and the values are a list containing the values in each row. Example: timestamp energy 0 0.1 1 0.2 would be represented as: { "timestamp" : [0, 1], "energy" : [0.1, 0.2] } values may be integers, floats, strings or None. """ timeout_time = time.time() + self._poll_timeout_seconds parser = LogMetricsParser() log_streams = self._get_log_streams_for_job(job_name, timeout_time) for log_stream in log_streams: self._parse_metrics_from_log_stream(log_stream, timeout_time, parser) return parser.get_parsed_metrics(metric_type, statistic)