package metrics2

/*
Metrics2 Package
================

Concepts
--------

The major difference between the old metrics format and the new is that, from
the app’s point of view, the old metrics were specified using a single metric
name.  In the new format, metrics are specified using a measurement name and a
map[string]string of tags.  Expect all instances of metrics types to require
both a measurement name and tags map instead of just the metric name.  When
using common.InitWithMetrics2, runtime stats including uptime are automatically
recorded, and the “host” and “app” tags are automatically set for all
measurements.  In many cases, it may be unnecessary to provide more tags, so
you can just pass nil.

Metrics Helpers
---------------
The metrics2 package provides a number of helper structs and functions which
should be your primary mode of interacting with metrics.

### Typed Metrics

Metrics2 provides a few typed metrics helpers which behave similarly to
go_metrics.GetOrRegisterGauge: once registered, the metric contains a single
value which are reported at regular intervals.  The value can be changed by
calling Update() on the Metric. The metrics are stored in a sort of registry
so that you don’t need to keep the object around and can just do:
metrics2.GetInt64Metric(metric, tags).Update(value).

### Counter

Counter in the metrics2 package behaves similarly to those from go-metrics
except that there is no GetOrRegisterCounter equivalent.  Instead, you should
call metrics2.GetCounter(name, tags), hold on to the returned struct instance
and call Inc(), Dec(), etc, on it as desired. Note that Counter requires a
name and not a measurement, because the measurement is always “counter”, and
the provided name is inserted as a tag.

### Liveness

Liveness in metrics2 behaves similarly to the old metrics liveness, except that
you provide a name and tags.  Call metrics2.NewLiveness() to start the liveness
timer, and call Reset() on the instance to reset it to zero.  Note that
Liveness requires a name and not a measurement, because the measurement is
always “liveness”, and the provided name is inserted as a tag.

### Timer

Timer in metrics2 behaves similarly to the old metrics timer, except that you
provide a name and tags instead of a metric.  Call metrics2.NewTimer(name,
tags) to start the timer and call Stop() on the instance to measure the
duration and report the duration. Timer does not behave like a Gauge, in that
it does not push values at regular intervals.  Instead, it only pushes a value
when Stop() is called.  Be aware of this when creating alerts based on timers,
since data points will not be evenly spaced and may not exist for a time
period.  Timer requires a name and not a measurement, because the measurement
is always “timer” and the provided name is inserted as a tag.

### FuncTimer

FuncTimer is a special Timer designed specifically for timing the duration of
functions.  It does not accept any parameters because it automatically fills in
the function name and package name in the tags.  Just do defer
metrics2.FuncTimer().Stop() at the beginning of the function.

*/
