| #!/usr/bin/env python |
| |
| # Copyright (c) 2014 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # This file defines script for getting entries from ES concerning reboot time. |
| |
| """ |
| Example usage: |
| python analyze_reboot_time.py -l 12 --server cautotest --board daisy_spring |
| |
| Usage: analyze_reboot_time.py [-h] [-l LAST] --server AUTOTEST_SERVER |
| [--board BOARD] [--pool POOL] [--start START] |
| [--end END] [--gte GTE] [--lte LTE] [-n SIZE] |
| [--hosts HOSTS [HOSTS ...]] |
| |
| optional arguments: |
| -h, --help show this help message and exit |
| -l LAST last hours to search results across |
| --server AUTOTEST_SERVER |
| Enter Autotest instance name, e.g. "cautotest". |
| --board BOARD restrict query by board, not implemented yet |
| --pool POOL restrict query by pool, not implemented yet |
| --start START Enter start time as: yyyy-mm-dd hh-mm-ss,defualts to |
| 24h ago. |
| --end END Enter end time as: yyyy-mm-dd hh-mm-ss,defualts to |
| current time. |
| --gte GTE Enter lower bound on reboot time for entries to |
| return. |
| --lte LTE Enter upper bound on reboot time for entries to |
| return. |
| -n SIZE Maximum number of entries to return. |
| --hosts HOSTS [HOSTS ...] |
| Enter space deliminated hostnames |
| """ |
| |
| import argparse |
| import time |
| |
| import common |
| import host_history |
| from autotest_lib.client.common_lib import time_utils |
| from autotest_lib.client.common_lib.cros.graphite import es_utils |
| |
| |
| def get_entries(time_start, time_end, gte, lte, size, index, hostname): |
| """Gets all entries from es db with the given constraints. |
| |
| @param time_start: Earliest time entry was recorded |
| @param time_end: Latest time entry was recorded |
| @param gte: Lowest reboot_time to return |
| @param lte: Highest reboot_time to return |
| @param size: Max number of entries to return |
| @param index: es db index to get entries for, i.e. 'cautotest' |
| @param hostname: string representing hostname to query for |
| @returns: Entries from esdb. |
| """ |
| query = es_utils.create_range_eq_query_multiple( |
| fields_returned=['hostname', 'time_recorded', 'value'], |
| equality_constraints=[('_type', 'reboot_total'), |
| ('hostname', hostname)], |
| range_constraints=[('time_recorded', time_start, time_end), |
| ('value', gte, lte)], |
| size=size, |
| sort_specs=[{'hostname': 'asc'}, {'value': 'desc'}]) |
| results = es_utils.execute_query(query, index=index, |
| host=es_utils.METADATA_ES_SERVER, |
| port=es_utils.ES_PORT) |
| return results |
| |
| |
| def get_results_string(hostname, time_start, time_end, results): |
| """Prints entries from esdb in a readable fashion. |
| |
| @param hostname: Hostname of DUT we are printing result for. |
| @param time_start: Earliest time entry was recorded |
| @param time_end: Latest time entry was recorded |
| @param gte: Lowest reboot_time to return |
| @param lte: Highest reboot_time to return |
| @param size: Max number of entries to return |
| @returns: String reporting reboot times for this host. |
| """ |
| num_entries = results['hits']['total'] |
| return_string = ' Host: %s \n Number of entries: %s \n' % ( |
| hostname, results['hits']['total']) |
| return_string += ' %s - %s \n' % ( |
| time_utils.epoch_time_to_date_string(time_start), |
| time_utils.epoch_time_to_date_string(time_end)) |
| if num_entries <= 0: |
| return return_string |
| for result in results['hits']['hits']: |
| fields = result['fields'] |
| time_recorded = fields['time_recorded'][0] |
| time_string = time_utils.epoch_time_to_date_string( |
| time_recorded) |
| reboot_total = fields['value'][0] |
| spaces = (15 - len(str(time_string))) * ' ' |
| return_string += ' %s Reboot_time: %.3fs\n' % ( |
| time_string, reboot_total) |
| return return_string |
| |
| |
| if __name__ == '__main__': |
| """main script""" |
| t_now = time.time() |
| t_now_minus_one_day = t_now - 3600 * 24 |
| parser = argparse.ArgumentParser() |
| parser.add_argument('-l', type=float, dest='last', |
| help='last hours to search results across', |
| default=24) |
| parser.add_argument('--server', type=str, dest='autotest_server', |
| required=True, |
| help='Enter Autotest instance name, e.g. "cautotest".') |
| parser.add_argument('--board', type=str, dest='board', |
| help='restrict query by board, not implemented yet', |
| default=None) |
| parser.add_argument('--pool', type=str, dest='pool', |
| help='restrict query by pool, not implemented yet', |
| default=None) |
| parser.add_argument('--start', type=str, dest='start', |
| help=('Enter start time as: yyyy-mm-dd hh-mm-ss,' |
| 'defualts to 24h ago.'), |
| default=t_now_minus_one_day) |
| parser.add_argument('--end', type=str, dest='end', |
| help=('Enter end time as: yyyy-mm-dd hh-mm-ss,' |
| 'defualts to current time.'), |
| default=t_now) |
| parser.add_argument('--gte', type=float, dest='gte', |
| help=('Enter lower bound on reboot time ' |
| 'for entries to return.'), |
| default=0) |
| parser.add_argument('--lte', type=float, dest='lte', |
| help=('Enter upper bound on reboot time ' |
| 'for entries to return.'), |
| default=None) |
| parser.add_argument('-n', type=int, dest='size', |
| help='Maximum number of entries to return.', |
| default=10000) |
| parser.add_argument('--hosts', nargs='+', dest='hosts', |
| help='Enter space deliminated hostnames', |
| default=[]) |
| options = parser.parse_args() |
| |
| if options.last: |
| t_start = t_now - 3600 * options.last |
| t_end = t_now |
| else: |
| t_start = time_utils.to_epoch_time(options.start) |
| t_end = time_utils.to_epoch_time(options.end) |
| if options.hosts: |
| hosts = options.hosts |
| else: |
| hosts = host_history.get_matched_hosts(options.autotest_server, |
| options.board, options.pool) |
| |
| for hostname in hosts: |
| results = get_entries( |
| t_start, t_end, options.gte, options.lte, options.size, |
| options.autotest_server, hostname) |
| print get_results_string(hostname, t_start, t_end, results) |