A `Group` provides a way of grouping multiple probes (or timers). Once grouped, one can measure stats between members of a group -- i.e. the time it takes to get from one probe to the other in the group, or the change in a metric between two probes in a group.

`Core_profiler` supports a path query syntax where one can ask for stats about *paths* in the time series of data. The idea of a group is best explained by an example, which you can find in the tutorial.

`type t`````
`val create : name:string ‑> t create_args`
`val add_probe : t ‑> ?⁠sources:probe array ‑> name:string ‑> unit ‑> probe`

`sources` should be a list of probes, specifying the edges that we care about. (i.e., we care about (s, this) for all s in `sources`). When using online profiling, if no sources are specified no, stats will be collected.

For offline profiling sources are less relevant. All the probe information is collected in the output and sources provides a default configuration to the profiler_tool. If no sources are specified, the offline tool will fall back to the default of "all two-probe direct paths" of a group.

`val reset : t ‑> unit`

Resetting a group avoids path/delta calculation across the reset. This shouldn't be necessary in simple cases if you specify the edges you care about, via `sources` or otherwise. In more complex cases with cycles, you will need to call this at the start or end of the function you are instrumenting.