61 lines
2.5 KiB
Markdown
61 lines
2.5 KiB
Markdown
# V metrics
|
|
|
|
This library defines an interface for implementing a metrics collector & an
|
|
accompanying exporter interface for serializing the data in some way. A
|
|
thread-safe implementation of the collector interface is provided, which
|
|
utilizes a combination of atomic operations & `lock`/`rlock` to ensure the data
|
|
structure can be safely used concurrently. An implementation of a
|
|
Prometheus-compatible exporter is planned.
|
|
|
|
This library takes a lot of inspiration from the Rust
|
|
[metrics crate](https://docs.rs/metrics/latest/metrics/index.html).
|
|
|
|
Note that this library is still in development, and stuff might still change.
|
|
|
|
## Metric types
|
|
|
|
Just like the Rust crate, this library defines three types of metrics.
|
|
|
|
### Counter
|
|
|
|
A counter is a `u64` value that can only be monotonically incremented. One
|
|
example of such value is the amount of requests a web server has processed.
|
|
|
|
### Gauge
|
|
|
|
A gauge is an `f64` value describing a metric that can arbitrarily increase or
|
|
decrease over time. It can be freely added to, subtracted from or plainly set
|
|
to an absolute value. This could for example be used to track memory usage.
|
|
|
|
### Histogram
|
|
|
|
A histogram is an arbitrarily growing list of `f64` values. These values can
|
|
then be used to provide statistical analysis over time. The processing of these
|
|
values is left to the exporter to decide. The metrics collector solely stores
|
|
these values.
|
|
|
|
## Interfaces
|
|
|
|
As mentioned above, this library defines two interfaces. These can either be
|
|
used by using one of the provided implementations, or a user can freely
|
|
implement their own versions.
|
|
|
|
### `MetricsCollector`
|
|
|
|
A metrics collector is responsible for receiving and storing the types of
|
|
metrics. Two implementations are provided, namely `DefaultCollector` and
|
|
`NullCollector`. The former is the above-mentioned thread-safe implementation,
|
|
while the latter is an implementation that does absolutely nothing. The usecase
|
|
I have in mind for this seemingly useless version is when it's configurable
|
|
whether a piece of software should collect metrics or not. If the answer is no,
|
|
the developer could simply use a `NullCollector`, without having to change any
|
|
of the other code. All calls to the metrics collector will just get silently
|
|
ignored.
|
|
|
|
### `MetricsExporter`
|
|
|
|
A metrics exporter is responsible for converting the data stored in a metrics
|
|
collector into some format that can then be processed by some other means. The
|
|
classic example would be exporting to a Prometheus-compatible text format,
|
|
which could then be ingressed by Prometheus and processed further.
|