| #!/bin/bash |
| # Copyright 2019 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. |
| |
| # A helper to query build_log data contained in internal analysis_service |
| # events. |
| |
| # Make sure we have prod access so we don't fail without getting any work done. |
| prodcertstatus 1>/dev/null 2>/dev/null || prodaccess |
| |
| when="last3days" |
| string_data="" |
| count_data="" |
| limit=30 |
| field_limit=80 |
| verbose=0 |
| only_stdout=0 |
| |
| print_usage() { |
| cat <<HELP_USAGE |
| |
| Usage: $0 -c|--count <search_string> OR -s|--string <search_string> |
| [-w|-when] <when_string> |
| [-l|--limit] <limit_string> [--field_limit <field_limit>] |
| [-v|--verbose] [--usage|-u|--help|-h] |
| |
| If -c is specified, count the occurrences of the search string. |
| If -s is specified, display the matching occurences based on the other |
| arguments (-l, --field_limit, etc). |
| |
| search_string : What to search for in build_cmd logs. |
| when_string : Which dremel table, such as last7days, last1days, etc. |
| (default=last3days) |
| limit_string : Limits numbers of rows to this value (default=30). |
| field_limit : Show <field_limit> characters of stdout starting with |
| <search_string> (default=80). |
| only_stdout : Show only stdout and date, not buildId, stepName, etc. |
| verbose : Show dremel query before executing it. |
| HELP_USAGE |
| exit 0 |
| } |
| |
| while (( "$#" )); do |
| case "$1" in |
| -s|--string) |
| string_data=$2 |
| shift 2 |
| ;; |
| -c|--count) |
| count_data=$2 |
| shift 2 |
| ;; |
| -w|--when) |
| when=$2 |
| shift 2 |
| ;; |
| -l|--limit) |
| limit=$2 |
| shift 2 |
| ;; |
| --field_limit) |
| field_limit=$2 |
| shift 2 |
| ;; |
| --only_stdout) |
| only_stdout=1 |
| shift 1 |
| ;; |
| -v|--verbose) |
| verbose=1 |
| shift |
| ;; |
| --usage|-u|--help|-h) |
| print_usage |
| shift |
| ;; |
| *) |
| echo "Unknown arg: $1" |
| print_usage |
| shift |
| esac |
| done |
| |
| if [[ ! -z ${string_data} ]] && [[ ! -z ${count_data} ]]; then |
| echo "Specifying both -s and -c is not allowed." |
| print_usage |
| fi |
| |
| # If a count was requested, build and execute the query. This code path is |
| # separate because it is much simpler than search queries. |
| if [[ ! -z ${count_data} ]]; then |
| query="SELECT count(stdout) AS Count FROM |
| chromeos_ci_eng.analysis_event_log.${when} |
| WHERE stdout LIKE \"%${count_data}%\";" |
| if [ "${verbose}" -eq 1 ]; then |
| echo "QUERY: ${query}" |
| echo "Executing..." |
| fi |
| echo "${query}" | dremel --min_completion_ratio 1 |
| exit 0 |
| fi |
| |
| if [[ -z "${string_data}" ]] |
| then |
| echo "No search string specified. -s|--string <search_string> is required." |
| print_usage |
| fi |
| |
| if [ -z "${field_limit}" ] |
| then |
| select_field="stdout" |
| else |
| select_field="SUBSTR(stdout, STRPOS(stdout, \"${string_data}\")," |
| select_field="${select_field} ${field_limit})" |
| fi |
| |
| if [ "${only_stdout}" -eq 1 ]; then |
| query="SELECT ${select_field} AS Stdout, |
| DATETIME(TIMESTAMP_SECONDS(request_time.seconds)) AS DateTime" |
| else |
| query="SELECT ${select_field} AS Stdout, |
| CONCAT('https://ci.chromium.org/b/', CAST(build_id AS STRING)) as BuildId,step_name, |
| DATETIME(TIMESTAMP_SECONDS(request_time.seconds)) AS DateTime" |
| fi |
| |
| query="$query FROM chromeos_ci_eng.analysis_event_log.${when} |
| WHERE stdout LIKE \"%${string_data}%\" ORDER BY DateTime DESC LIMIT ${limit};" |
| |
| if [ "${verbose}" -eq 1 ]; then |
| echo "QUERY: ${query}" |
| echo "Executing..." |
| fi |
| echo "${query}" | dremel --min_completion_ratio 1 |