Packages

StatsAgg is a library that allows the developer to instrument functions so that execution times are logged. Stats can then be retrieved and used to populate dashboards and other Information Radiators.

Current section

Files

Jump to
ex_stats_agg README.md
Raw

README.md

# StatsAgg
StatsAgg is a library that allows instrumentation of Elixir functions to track durations.
## Overview
StatsAgg defines a macro, `with_stats_agg`, that makes it simple to add this instrumentation to your projects.
StatsAgg instrumentation includes a customizable `group` to allow related stats, or stats you wish to
display on an Information Radiator to be easily accessible.
StatsAgg is implemented as a GenServer so calls to record durations are asynchronous. Only the durations are stored
for each method to help reduce memory requirements. The durations are stored as a nested map with the keys:
- `group`: an arbitrary name provided by you, defaults to _main_
- `module`: the name of the module as returned by `__MODULE__`
- `function`: the name of the function, in the form: _name/arity_
## Basic Usage
StatsAgg calculates and returns the accumulated stats via a call to the `StatsAgg.retrieve_stats/1` method. Stats
can be retrieved at each level of the hierarchy. Thus you can query as in the following examples:
```elixir
all_stats_query = []
group_only_query = ["main"]
group_and_module_query = ["main", "MyModule"]
group_module_and_function_query = ["main", "MyModule", "function/0"]
StatsAgg.retrieve_stats(all_stats_query)
StatsAgg.retrieve_stats(group_only_query)
StatsAgg.retrieve_stats(group_and_module_query)
StatsAgg.retrieve_stats(group_module_and_function_query)
```
The results are a list of Maps with the following shape:
```elixir
%{
avg_duration: 17,
durations: [14, 17, 21],
function: "function/0",
group: "main",
max_duration: 21,
min_duration: 14,
module: "MyModule",
most_recent_duration: 14
}
```
## Considerations
Being a GenServer module, StatsAgg will lose history if the app is shutdown or restarted.
## Installation
If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `stats_agg` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:stats_agg, "~> 0.1.0"}
]
end
```
Add `StatsAgg` to your Application start:
```elixir
defmodule MyApp.Application do
use Application
def start(_type, _args) do
import Supervisor.Spec
children = [
worker(Ciroque.Monitoring.StatsAgg, [])
]
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)
end
end
```
You can then use the macros to instrument your functions, or call the `StatsAgg` functions directly.
## Miscellany
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/stats_agg](https://hexdocs.pm/stats_agg).