blob: a571ca6e7b47ff5049ad18c08a5509abd1f3c26a [file] [log] [blame]
#!/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
##
## If you opt-in to metrics collection, data will be collected and used by
## Google in accordance with the Google privacy policy
## (https://policies.google.com/privacy)
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 subcomand(s) [${_METRICS_TRACK_ALL_ARGS[@]}]:
- All arguments passed to the subcommand
3. For the subcomand(s) [${_METRICS_TRACK_RESULTS[@]}]:
- Time taken to complete
- Exit status
4. Custom events for the subcommand(s): [${_METRICS_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 describe-privacy-policy {
cat << EOF
If you opt-in to metrics collection, data will be collected and used by Google
in accordance with the Google privacy policy
(https://policies.google.com/privacy)
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
# 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 [[ "$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
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
describe-privacy-policy
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."\
"(On Ubuntu/Debian systems, try \`sudo apt install uuid-runtime\`.)"
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}" "${debug_logfile}"
echo "Collection of metrics is now $(styled-status $METRICS_ENABLED) for ${FUCHSIA_DIR}"