blob: 0b6df78e5fe659037d8e9d64e757891145e28906 [file] [log] [blame] [view]
# Detect snapshot filing
Detect runs on-device, periodically gathering and evaluating Diagnostic data to decide whether to generate a crash report / snapshot.
## How it works {#how-detect-works}
Every few minutes Detect reads the Inspect state, evaluates trigger conditions,
and files crash reports to the `FuchsiaDetect` product. The frequency of
diagnostic scans is set by command line arguments in
`//src/diagnostics/detect/meta/triage-detect.cml`.
Diagnostic state other than Inspect is not currently read. SyslogHas(),
KlogHas(), and BootlogHas() will always return false.
## Enabling crash reports {#enabling-detect-reports}
By default, Detect runs in all products and builds, but only creates or files
crash reports in some builds. Otherwise it logs a warning:
`Detect would have filed {}` where `{}` is replaced by the snapshot signature.
Detect only generates crash reports if
`"//src/diagnostics/detect:enable-report-filing"` is included in
`--with-base`.
Crash reports are only sent to the server in some build configurations, or if
explicitly enabled as explained in [Crash reporting].
[Crash reporting]: /src/developer/forensics/crash_reports/README.md
## Snapshot triggers {#snapshot-triggers}
Snapshot triggers live in .triage files in the
`//src/diagnostics/config/triage/detect` directory. Files added to that
directory must also be added to `detect_unconditional_files` in
`//src/diagnostics/config/triage/BUILD.gn`.
The .triage files are standard [Triage] format. Detect adds a new `act` type:
```json5
snapshot_action: {
type: "Snapshot",
trigger: "something > something_else",
repeat: "Hours(6)",
signature: "a-string-with-restrictions",
}
```
* `trigger` is evaluated by Triage-lib just like in `Warning`-type actions.
* `repeat` gives the minimum delay before re-filing if a condition persists
or repeats. It can use `Days()`, `Hours()`, and `Minutes()`. If the
`repeat` value is less than `MINIMUM_SIGNATURE_INTERVAL_NANOS` the latter
will be used and a warning will be logged.
* `signature` will be reported in the crash report.
* `fuchsia-detect-` will be prepended to the signature.
* Signatures must contain only lowercase letters and hyphens
(no spaces or underscores). Any characters
outside this set will be lowercased or converted to hyphens and an error
will be logged.
* Several Snapshot actions may have the same signature. Crash reports filed
by each action will be identical. `repeat` throttling will be applied
per-signature not per-action, using the value from the action that
triggered.
[Triage]: /docs/development/diagnostics/triage/config.md
## Conditional file inclusion
Detect configuration files can be included in only a subset of builds or
products. This can be done in `//src/diagnostics/config/triage/BUILD.gn` by:
1. Adding the file to `detect_conditional_files` rather
than `detect_unconditional_files`
1. Creating a new `config_data()` entry; by convention its target name should
be the same as the file name
1. Adding that target to the appropriate group so the file is included along
with whatever component(s) it should be analyzing
See [here for examples](https://fuchsia-review.googlesource.com/c/fuchsia/+/542996).
## The fine print
Read this section if you're using Detect for debugging on your desktop.
`repeat` is actually a Triage eval expression like `trigger` and could be
calculated dynamically from Inspect data. The expression must evaluate to an
integer number of nanoseconds.
The frequency with which Detect checks diagnostic data is configured by the
`--check-every` command line parameter which is set in
`//src/diagnostics/detect/meta/triage-detect.cml`. (This expression must
contain only constants.)
Detect has built-in limits on its time delays; it will exit with error if
`--check-every` is less than `MINIMUM_CHECK_TIME_NANOS` and it will
delay re-filing snapshots at least `MINIMUM_SIGNATURE_INTERVAL_NANOS`.
These limits can be overridden by adding a `--test-only` command line argument.