# ffx Analytics Events

The `ffx` tool emits various analytics events for diagnostic and quality tracking purposes. This document lists the core events emitted by `ffx` and documents their meaning. Analytics collection respects the user's opt-in status.

## Core Events

* **`invoke`**: Emitted when an `ffx` command is executed. It captures information about the command invocation, including execution time, exit code, any error message, and the underlying subcommand. Depending on the user's opt-in level for enhanced analytics, command arguments may be fully redacted or partially included.
* **`ffx_daemon`**: Emitted by the `ffx` background daemon process to track its lifecycle and activity (e.g., when the daemon is started).

## Target and Connection Events

* **`ffx_target_list_devices`**: Emitted when the `ffx target list` command executes. Records the number of devices discovered (as the `devices` dimension) along with the type of query used (e.g., no filter, or by nodename).
* **`ffx_target_connection`**: Emitted when establishing a connection to a Fuchsia target. The action parameter indicates the type of connection being attempted.
* **`ffx_connection_mode`**: Emitted concurrently with connection establishment to track the specific connectivity mode or strategy used for interacting with the target.
* **`ffx_daemon_host_pipe`**: Emitted when the daemon initiates a host pipe connection (such as SSH) to communicate with a target device. The action specifies the connection type or state being tracked.
* **`ffx_rcs_proxy`**: Emitted when `ffx` constructs an Overnet connection to a target's Remote Control Service (RCS). The action specifies the proxy connection strategy employed (e.g., mdns vs target).

## Flashing and Hardware Events

* **`ffx_flash`**: Emitted when writing a partition block to a device (typically during `ffx target flash`). Custom dimensions track the `partition_name`, `product_name`, `board_name`, `file_size`, and the `flash_time` taken to write the partition.

## Host Checks

* **`preflight`**: Emitted by platform preflight checks used to verify that the host machine satisfies requirements for certain commands (such as starting an emulator). The action field captures the result (`completed_success`, `completed_warning`, `completed_failure_recoverable`, `completed_failure`), and the event may capture environmental properties such as the host's graphics driver context.

## Diagnostic and Error Telemetry

* **`ffx_diagnostics_failure`**: Sent when the tool detects specific diagnostic, workflow, or architectural errors during operation. The `category_name` dimension captures the precise failure point, such as:
    * `target_hdl_in_bad_state`: The internal target handle structure was queried in an invalid state.
    * `target_no_netwrk`: Action was attempted on a target that doesn't appropriately expose networking.
    * `target_addr_bad_scope`: An IPv6 target address could not be used because its network scope is invalid.
    * `build_fdomain_cmd`: Failed to construct the parameters necessary for a tool fdomain command.
    * `open_hwinfo_comp`: Failed to connect to the hardware info component on the remote device.
    * `hwinfo_getinfo`: FIDL error encountered when trying to retrieve hardware information data safely.
    * `non_fastboot_target_hdl`: Attempted a fastboot operation on a device handle that isn't in the fastboot state.
    * `query_serialno`: Failed to reliably query the device for its hardware serial number.

## Developer Tools

* **`ffx_playground_cmd`**: Emitted when executing commands inside the experimental `ffx playground` shell. Records the underlying command in the `type` dimension and logs whether its execution succeeded or failed.
