summaryrefslogtreecommitdiff
path: root/startop/scripts/app_startup/parse_metrics
diff options
context:
space:
mode:
Diffstat (limited to 'startop/scripts/app_startup/parse_metrics')
-rwxr-xr-xstartop/scripts/app_startup/parse_metrics181
1 files changed, 181 insertions, 0 deletions
diff --git a/startop/scripts/app_startup/parse_metrics b/startop/scripts/app_startup/parse_metrics
new file mode 100755
index 000000000000..c6bf08ee9dfd
--- /dev/null
+++ b/startop/scripts/app_startup/parse_metrics
@@ -0,0 +1,181 @@
+#!/bin/bash
+#
+# Copyright 2019, The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+usage() {
+ cat <<EOF
+Usage: launch_application package activity | parse_metrics --package <name> --timestamp <timestamp> [OPTIONS]...
+
+ Reads from stdin the result of 'am start' metrics. May also parse logcat
+ for additional metrics.
+
+ Output form:
+
+ MetricName_unit=numeric_value
+ MetricName2_unit=numeric_value2
+
+ This may block until all desired metrics are parsed from logcat.
+ To get a list of metrics without doing real parsing, use --simulate.
+
+ To add package-specific metrics, add a script called 'metrics/\$full_package_name'
+ that exposes additional metrics in same way as above.
+
+ (required)
+ -p, --package <name> package of the app that is being used
+ -ts, --timestamp <name> logcat timestamp [only looks at logcat entries after this timestamp].
+
+ (optional)
+ -s, --simulate prints dummy values instead of real metrics
+ -a, --activity <name> activity to use (default: inferred)
+ -h, --help usage information (this)
+ -v, --verbose enable extra verbose printing
+ -t, --timeout <sec> how many seconds to timeout when trying to wait for logcat to change
+EOF
+}
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+source "$DIR/lib/common"
+
+package=""
+activity=""
+timeout=10
+simulate="n"
+parse_arguments() {
+ while [[ $# -gt 0 ]]; do
+ case "$1" in
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ -p|--package)
+ package="$2"
+ shift
+ ;;
+ -a|--activity)
+ activity="$2"
+ shift
+ ;;
+ -v|--verbose)
+ export verbose="y"
+ ;;
+ -t|--timeout)
+ timeout="$2"
+ shift
+ ;;
+ -ts|--timestamp)
+ timestamp="$2"
+ shift
+ ;;
+ -s|--simulate)
+ simulate="y"
+ ;;
+ *)
+ echo "Invalid argument: $1" >&2
+ exit 1
+ esac
+ shift
+ done
+}
+
+# Main entry point
+if [[ $# -eq 0 ]]; then
+ usage
+ exit 1
+else
+ parse_arguments "$@"
+
+ # if we do not have have package exit early with an error
+ [[ "$package" == "" ]] && echo "--package not specified" 1>&2 && exit 64
+
+ # ignore timestamp for --simulate. it's optional.
+ if [[ $simulate == y ]]; then
+ timestamp=0
+ fi
+
+ # if we do not have timestamp, exit early with an error
+ [[ "$timestamp" == "" ]] && echo "--timestamp not specified" 1>&2 && exit 64
+
+ if [[ "$activity" == "" ]] && [[ "$simulate" != "y" ]]; then
+ activity="$(get_activity_name "$package")"
+ if [[ "$activity" == "" ]]; then
+ echo "Activity name could not be found, invalid package name?" 1>&2
+ exit 64
+ else
+ verbose_print "Activity name inferred: " "$activity"
+ fi
+ fi
+fi
+
+parse_metric_from_logcat() {
+ local metric_name="$1"
+ local pattern="$2"
+ local re_pattern="$3"
+ local retcode
+
+ # parse logcat for 'Displayed...' and that other one...
+
+ # 05-06 14:34:08.854 29460 29481 I ActivityTaskManager: Displayed com.google.android.dialer/.extensions.GoogleDialtactsActivity: +361ms
+ verbose_print "parse_metric_from_logcat: $re_pattern"
+
+
+ echo -ne "$metric_name="
+
+ if [[ $simulate == y ]]; then
+ echo "-1"
+ return 0
+ fi
+
+ logcat_extract_pattern "$timeout" "$timestamp" "$pattern" "$re_pattern"
+ retcode=$?
+
+ if [[ $retcode -ne 0 ]]; then
+ # Timed out before finding the pattern. Could also mean the pattern is wrong.
+ echo "-$?"
+ fi
+
+ return $retcode
+}
+
+
+total_time="-1"
+if [[ $simulate != y ]]; then
+ verbose_print 'logcat timestamp NOW: ' $(logcat_save_timestamp)
+
+ # parse stdin for 'am start' result
+ while read -t "$timeout" -r input_line; do
+ verbose_print 'stdin:' "$input_line"
+ if [[ $input_line == *TotalTime:* ]]; then
+ total_time="$(echo "$input_line" | sed 's/TotalTime: \([[:digit:]]\+\)/\1/g')"
+ # but keep reading the rest from stdin until <EOF>
+ fi
+ done
+fi
+
+echo "TotalTime_ms=$total_time"
+
+# parse logcat for 'Displayed...' and that other one...
+
+# 05-06 14:34:08.854 29460 29481 I ActivityTaskManager: Displayed com.google.android.dialer/.extensions.GoogleDialtactsActivity: +361ms
+pattern="ActivityTaskManager: Displayed ${package}"
+re_pattern='.*Displayed[[:blank:]]\+'"${package}"'[/][^[:blank:]]\+[[:blank:]]+\([[:digit:]]\+\).*'
+
+parse_metric_from_logcat "Displayed_ms" "$pattern" "$re_pattern"
+
+# also call into package-specific scripts if there are additional metrics
+if [[ -x "$DIR/metrics/$package" ]]; then
+ source "$DIR/metrics/$package" "$timestamp"
+else
+ verbose_print parse_metrics: no per-package metrics script found at "$DIR/metrics/$package"
+fi