diff --git a/doc/source/contributor/metrics.rst b/doc/source/contributor/metrics.rst new file mode 100644 index 0000000000..cf3e83eac8 --- /dev/null +++ b/doc/source/contributor/metrics.rst @@ -0,0 +1,58 @@ +Metrics +======= + +Ironic provides a pluggable metrics library as of the 2.0.0 release. +The metrics backend to be used is configured via ``CONF.metrics.backend``. +Not all backends support all metrics types or metric sources. + +The typical usage of metrics is to initialize and cache a metrics logger, +using the ``get_metrics_logger()`` method in ``metrics_utils``, then +use that object to decorate functions or create context managers to gather +metrics. The general convention is to provide the name of the module as the +first argument to set it as the prefix, then set the actual metric name to the +method name. For example: + +.. code-block:: python + + from ironic import metrics_utils + + METRICS = metrics_utils.get_metrics_logger(__name__) + + @METRICS.timer('my_simple_method') + def my_simple_method(arg, matey): + pass + + def my_complex_method(arg, matey): + with METRICS.timer('complex_method_pt_1'): + do_some_work() + + with METRICS.timer('complex_method_pt_2'): + do_more_work() + +There are three different kinds of metrics: + - **Timers** measure how long the code in the decorated method or context + manager takes to execute, and emits the value as a timer metric. These + are useful for measuring performance of a given block of code. + - **Counters** increment a counter each time a decorated method or context + manager is executed. These are useful for counting the number of times a + method is called, or the number of times an event occurs. + - **Gauges** return the value of a decorated method as a metric. This is + useful when you want to monitor the value returned by a method over time. + +Additionally, metrics can be sent directly, rather than using a context +manager or decorator, when appropriate. When used in this way, we will +simply emit the value provided as the requested metric type. For example: + +.. code-block:: python + + from ironic import metrics_utils + + METRICS = metrics_utils.get_metrics_logger(__name__) + + def my_node_failure_method(node): + if node.failed: + METRICS.send_counter(node.uuid, 1) + +The provided statsd backend natively supports all three metric types. For more +information about how statsd changes behavior based on the metric type, see +`statsd metric types <https://github.com/etsy/statsd/blob/master/docs/metric_types.md>`_