| #!/bin/bash | |
| # Copyright 2019 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| #### CATEGORY=Other | |
| ### manage collection of metrics in fx tools | |
| ## usage: | |
| ## fx metrics | |
| ## Show what metrics are collected when enabled | |
| ## | |
| ## fx metrics status | |
| ## Show if metrics collection is enabled or disabled | |
| ## | |
| ## fx metrics [--log=LOG_FILE] enable | |
| ## Enable metrics collection in fx tools | |
| ## --log=<LOG_FILE> Log all metrics collected to LOG_FILE for | |
| ## debugging purposes. The LOG_FILE setting is persisted | |
| ## in a config file in the /tmp filesystem and will be | |
| ## reset when the user logs out. | |
| ## | |
| ## fx metrics disable | |
| ## Disable metrics collection in fx tools | |
| ## | |
| set -e | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $? | |
| source "${FUCHSIA_DIR}/tools/devshell/lib/style.sh" || exit $? | |
| source "${FUCHSIA_DIR}/tools/devshell/lib/metrics.sh" || exit $? | |
| function usage { | |
| show-what-is-collected | |
| fx-command-help | |
| } | |
| function show-what-is-collected { | |
| cat <<EOF | |
| When enabled, this tool creates a random unique user ID (UUID) for the Fuchsia | |
| repository and uses that to collect the following anonymized metrics of | |
| the session and user workflow in order to improve the user experience: | |
| 1. For every "fx" invocation: | |
| - The output of "uname -rs" (Kernel name and release) | |
| - The version of the shell (bash or zsh) | |
| - The name of the "fx" subcommand invoked | |
| - (in the future) Imports in BUILDDIR/args.gn for product and board | |
| - (in the future) Value FUCHSIA_ARCH from BUILDDIR/fx.config | |
| 2. For the following subcomand(s) [${TRACK_ALL_ARGS}]: | |
| - All arguments passed to the subcommand | |
| 3. (in the future) For the following subcomand(s) [${TRACK_RESULTS}]: | |
| - Time taken to complete | |
| - Exit status | |
| 4. Custom events for the following subcommand(s): [${ALLOWS_CUSTOM_REPORTING}] | |
| When metrics collection is disabled, any existing UUID is deleted, and a | |
| new UUID will be created if metrics is later re-enabled. | |
| When enabled, the UUID and the status are stored in ${METRICS_CONFIG} | |
| EOF | |
| } | |
| function maybe-print-metrics-logfile-status { | |
| logfile=$(metrics-get-debug-logfile) | |
| if [[ $logfile ]]; then | |
| echo "Logging metrics collection for debugging purposes to $logfile" | |
| fi | |
| } | |
| function styled-status { | |
| enabled=$1 | |
| if [[ $METRICS_ENABLED -eq 1 ]]; then | |
| metrics_status="enabled" | |
| color="green" | |
| else | |
| metrics_status="disabled" | |
| color="red" | |
| fi | |
| style::echo --bold --${color} ${metrics_status} | |
| } | |
| fx-standard-switches "$@" | |
| set -- "${FX_ARGV[@]}" | |
| if [[ $# -lt 1 ]]; then | |
| usage | |
| exit 1 | |
| fi | |
| debug_logfile= | |
| has_debug_logfile=0 | |
| while [[ $# -ne 0 ]]; do | |
| case "$1" in | |
| -h|--help) | |
| usage | |
| exit 0 | |
| ;; | |
| --log) | |
| if [[ $# -lt 2 ]]; then | |
| fx-error Invalid syntax | |
| fx-command-help | |
| return 1 | |
| fi | |
| has_debug_logfile=1 | |
| debug_logfile=$2 | |
| shift | |
| ;; | |
| enable|disable|status) | |
| action=$1 | |
| ;; | |
| *) | |
| fx-error Invalid syntax | |
| fx-command-help | |
| exit 1 | |
| esac | |
| shift | |
| done | |
| if [[ "$has_debug_logfile" -eq 1 ]]; then | |
| if [[ $action != "enable" ]]; then | |
| fx-error "Invalid syntax, you can only specify --log when enabling metrics" | |
| fx-command-help | |
| exit 1 | |
| fi | |
| metrics-set-debug-logfile "$debug_logfile" | |
| fi | |
| # Read config in a way that exit code is preserved but doesn't exit because | |
| # of "set -e" if config file doesn't exist | |
| __successfully_read_config=0 | |
| metrics-read-config || __successfully_read_config=$? | |
| if [[ $action == "status" ]]; then | |
| echo "Collection of metrics is currently $(styled-status "$METRICS_ENABLED") for ${FUCHSIA_DIR}" | |
| maybe-print-metrics-logfile-status | |
| echo "To change it, run fx metrics <enable|disable>" | |
| if [[ $METRICS_ENABLED -eq 1 ]]; then | |
| echo | |
| show-what-is-collected | |
| fi | |
| exit 0 | |
| fi | |
| if [[ $action == "enable" ]]; then | |
| maybe-print-metrics-logfile-status | |
| if [[ $METRICS_ENABLED -eq 1 ]]; then | |
| echo "Metrics collection is already enabled." | |
| exit 0 | |
| fi | |
| if [[ -z "${METRICS_UUID}" ]]; then | |
| uuidgen_cmd=uuidgen | |
| if ! command -v $uuidgen_cmd >/dev/null 2>&1 ; then | |
| fx-error "Command '$uuidgen_cmd' cannot be found, please add it to your PATH." | |
| exit 1 | |
| fi | |
| METRICS_UUID=$($uuidgen_cmd) | |
| fi | |
| METRICS_ENABLED=1 | |
| metrics-maybe-log "Metrics collection enabled at user's request" | |
| elif [[ $action == "disable" ]]; then | |
| if [[ $METRICS_ENABLED -eq 0 ]]; then | |
| if [[ "${__successfully_read_config}" -ne 0 ]]; then | |
| # if metrics is already disabled but the config file does not exist or | |
| # is inconsistent, we rewrite the file before exiting | |
| metrics-write-config "${METRICS_ENABLED}" "${METRICS_UUID}" | |
| fi | |
| echo "Metrics collection is already disabled." | |
| exit 0 | |
| fi | |
| METRICS_UUID="" | |
| METRICS_ENABLED=0 | |
| metrics-maybe-log "Metrics collection disabled at user's request" | |
| fi | |
| metrics-write-config "${METRICS_ENABLED}" "${METRICS_UUID}" | |
| echo "Collection of metrics is now $(styled-status $METRICS_ENABLED) for ${FUCHSIA_DIR}" | |