Statistics Module
     __________________________________________________________

   Table of Contents

   1. Admin Guide

        1.1. Overview
        1.2. Statistic Groups
        1.3. Statistic Series
        1.4. Dependencies

              1.4.1. OpenSIPS Modules
              1.4.2. External Libraries or Applications

        1.5. Exported Parameters

              1.5.1. variable (string)
              1.5.2. stat_groups (string)
              1.5.3. stat_series_profile (string)

        1.6. Exported Functions

              1.6.1. update_stat(variable, value)
              1.6.2. reset_stat(variable)
              1.6.3. stat_iter_init(group, iter)
              1.6.4. stat_iter_next(name, val, iter)
              1.6.5. update_stat_series(profile, variable, value)

        1.7. Exported Pseudo-Variables

              1.7.1. $stat

   2. Contributors

        2.1. By Commit Statistics
        2.2. By Commit Activity

   3. Documentation

        3.1. Contributors

   List of Tables

   2.1. Top contributors by DevScore^(1), authored commits^(2) and
          lines added/removed^(3)

   2.2. Most recently active contributors^(1) to this module

   List of Examples

   1.1. variable example
   1.2. setting the stat_groups parameter
   1.3. setting the stat_series_profile parameter
   1.4. update_stat usage
   1.5. reset_stat usage
   1.6. stat_iter_init usage
   1.7. stat_iter_next usage
   1.8. update_stat_series usage
   1.9. $stat usage

Chapter 1. Admin Guide

1.1. Overview

   The Statistics module is a wrapper over the internal statistics
   manager, allowing the script writer to dynamically define and
   use of statistic variables.

   By bringing the statistics support into the script, it takes
   advantage of the script flexibility in defining logics, making
   possible implementation of any kind of statistic scenario.

1.2. Statistic Groups

   Starting with OpenSIPS 2.3, statistics may be grouped by
   prefixing their names with the name of the desired group, along
   with a colon separator (e.g. $stat(method:invite) or
   update_stat("packets:$var(ptype)", "+1")). In order for this to
   work, the groups must be defined prior to OpenSIPS startup
   using the stat_groups module parameter.

   The module allows easy iteration over the statistics of a group
   using the stat_iter_init() and stat_iter_next() functions.

   By default, all statistics belong to the "dynamic" group.

1.3. Statistic Series

   Statistic series provide the ability to accumulate statistical
   data over a pre-defined time window. Data is stored in a
   circular buffer, pushing new data on top, and removing stale
   values (values outside the timeframe) from the bottom. These
   statistics can be used to provide per-time stats, such as ACD,
   ASR, AST, etc, that can be read using the classic statistics
   interface, through the $stat() variable.

   Statistic series profile describe the timeframe used to store
   the data, as well as how the data is be accumulated and
   interpreted. There are several types a statistic series can be
   used, depending on the provisioned algorithm:
     * accumulate - accumulates the specified values in a counter;
       works similar to clasical statistics, except that they
       reset after the specified timeframe
     * average - returns an average of all the data fed within the
       timeframe; can be useful when computing PDD, AST, ACD
       stats.
     * percentage - indicates the percentage of a set of values
       out of the total amount of values fed; can be useful when
       computing ASR, NER, CCR stats.

1.4. Dependencies

1.4.1. OpenSIPS Modules

   The following modules must be loaded before this module:
     * No dependencies on other OpenSIPS modules.

1.4.2. External Libraries or Applications

   The following libraries or applications must be installed
   before running OpenSIPS with this module loaded:
     * None.

1.5. Exported Parameters

1.5.1. variable (string)

   Name of a new statistic variable. The name may be followed by
   additional flag which describe the variable behavior:
     * no_reset : variable cannot be reset.

   Example 1.1. variable example
modparam("statistics", "variable", "register_counter")
modparam("statistics", "variable", "active_calls/no_reset")

1.5.2. stat_groups (string)

   A comma-separated values string, specifying the statistic
   groups that may be used throughout the OpenSIPS script. Groups
   cannot contain leading or trailing whitespace characters.

   Example 1.2. setting the stat_groups parameter
modparam("statistics", "stat_groups", "method, packet, response")

1.5.3. stat_series_profile (string)

   Used to define a statistic series profile. Has the following
   format: name: [attr=value]*, where name represents the name of
   the profile, and attr=value contains multiple settings of the
   defined profile. Possible attributes and their values are:
     * algorithm - indicates the way data should be stored and
       accumulated over the specified timeframe. Possible values
       are: accumulate, average and percentage, as described in
       the Section 1.3, “Statistic Series” paragraph (default is
       accumulate)
     * hash_size - each statistic defined/used is stored in a hash
       map attached to the profile; this setting tunes the size of
       the hash (default is: 8)
     * group - indicates the group where the statistics beloging
       to this profile are grouped (as described in stat_groups
       (default is to use the same group as the profile)
     * window - the number of seconds a timeframe has; all older
       values (out of the specified window) are discarded (default
       is 60 seconds)
     * slots - the number of slots per window; used to tune the
       granularity of the circular buffer; the higher the number
       of slots is, the more accurate the resulted statistic;
       (default is the same value of the window parameter)
     * percentage_factor - used for percentage algorithm profiles
       to specify the percentage factor to be used (defaults to
       100)

   This parameter can be set multiple times, for each profile
   needed.

   Example 1.3. setting the stat_series_profile parameter
...
# define a statistic that accumulates average values in the last minute
modparam("statistics", "stat_series_profile", "avg: algorithm=average")
...
# define a statistic that accumulates average values in the 10 minutes
# with 1 minute granularity (10 slots out of the 600s window)
modparam("statistics", "stat_series_profile", "avg_10m: algorithm=averag
e window=600 slots=10")
...
# define a statistic that computes the percentage of values in the last
hour
# with 10 minutes granularity (6 slots out of the 3600s window)
modparam("statistics", "stat_series_profile", "perc_1h: algorithm=percen
tage window=3600 slots=6")
...

1.6. Exported Functions

1.6.1.  update_stat(variable, value)

   Updates the value of the statistic variable with the new value.

   Meaning of the parameters is as follows:
     * variable (string) - variable to be updated;
     * value (int) - value to update with; it may be also
       negative.

   This function can be used from REQUEST_ROUTE, BRANCH_ROUTE,
   FAILURE_ROUTE and ONREPLY_ROUTE.

   Example 1.4. update_stat usage
...
update_stat("register_counter", 1);
...
$var(a_calls) = "active_calls";
update_stat($var(a_calls), -1);
...

1.6.2.  reset_stat(variable)

   Resets to zero the value of the statistic variable.

   Meaning of the parameters is as follows:
     * variable (string) - variable to be reset-ed

   This function can be used from REQUEST_ROUTE, BRANCH_ROUTE,
   FAILURE_ROUTE and ONREPLY_ROUTE.

   Example 1.5. reset_stat usage
...
reset_stat("register_counter");
...
$var(reg_counter) = "register_counter";
update_stat($var(reg_counter));
...

1.6.3.  stat_iter_init(group, iter)

   Re-initializes "iter" in order to begin iterating through all
   statistics belonging to the given "group".

   Meaning of the parameters is as follows:
     * group (string)
     * iter (string) - internally matched to a corresponding
       iterator

   This function can be used from REQUEST_ROUTE, BRANCH_ROUTE,
   FAILURE_ROUTE and ONREPLY_ROUTE.

   Example 1.6. stat_iter_init usage
...
stat_iter_init("packet", "iter");
...

1.6.4.  stat_iter_next(name, val, iter)

   Attempts to fetch the current statistic to which "iter" points.
   If successful, the relevant data will be written to "name" and
   "val", while also advancing "iter". Returns negative when
   reaching the end of iteration.

   Meaning of the parameters is as follows:
     * name (var)
     * val (var)
     * iter (string) - internally matched to a corresponding
       iterator

   This function can be used from REQUEST_ROUTE, BRANCH_ROUTE,
   FAILURE_ROUTE and ONREPLY_ROUTE.

   Example 1.7. stat_iter_next usage
...
# periodically clear packet-related data
timer_route [clear_packet_stats, 7200] {
        stat_iter_init("packet", "iter");
        while (stat_iter_next($var(stat), $var(val), "iter"))
                reset_stat("packet:$var(stat)");
}
...

1.6.5.  update_stat_series(profile, variable, value)

   Updates the value of a series statistic.

   Meaning of the parameters is as follows:
     * profile (string) - the profile as defined in
       stat_series_profile
     * variable (string) - variable to be updated;
     * value (int) - value to update with; it may be also
       negative; when using percentage algorithm, the resulted
       value represents the percentage of positive values out of
       the total number of values (positive + negative)

   This function can be used from any route.

   Example 1.8. update_stat_series usage
...
# account failed calls
update_stat_series("perc_1h", "ASR_1h", -1);

# account successful calls
update_stat_series("perc_1h", "ASR_1h", 1);

# compute average PDD
update_stat_series("avg", "PDD", $var(pdd_ms));
...

1.7. Exported Pseudo-Variables

1.7.1. $stat

   Allows "get" or "reset" operations on the given statistics.

   The name of a statistic may be optionally prefixed with a
   searching group, along with a colon separator.

   If a searching group is not provided, the statistic is first
   searched for in the core groups. If not found, search continues
   with the "dynamic" group which, by default, holds all
   non-explicitly grouped statistics which are not exported by the
   OpenSIPS core.

   Example 1.9. $stat usage
...
xlog("SHM used size = $stat(used_size), no_invites = $stat(method:invite
)\n");
...
$stat(err_requests) = 0;
...

Chapter 2. Contributors

2.1. By Commit Statistics

   Table 2.1. Top contributors by DevScore^(1), authored
   commits^(2) and lines added/removed^(3)
     Name DevScore Commits Lines ++ Lines --
   1. Bogdan-Andrei Iancu (@bogdan-iancu) 33 20 1037 227
   2. Liviu Chircu (@liviuchircu) 27 19 518 161
   3. Razvan Crainea (@razvancrainea) 19 12 680 18
   4. Daniel-Constantin Mierla (@miconda) 11 9 22 18
   5. Vlad Patrascu (@rvlad-patrascu) 9 4 97 201
   6. Maksym Sobolyev (@sobomax) 5 3 5 6
   7. Vlad Paiu (@vladpaiu) 5 2 144 1
   8. Anca Vamanu 4 2 14 16
   9. Henning Westerholt (@henningw) 4 2 4 4
   10. Ionut Ionita (@ionutrazvanionita) 3 1 17 1

   All remaining contributors: Ovidiu Sas (@ovidiusas), Konstantin
   Bokarius, Julián Moreno Patiño, Peter Lemenkov (@lemenkov),
   Edson Gellert Schubert.

   (1) DevScore = author_commits + author_lines_added /
   (project_lines_added / project_commits) + author_lines_deleted
   / (project_lines_deleted / project_commits)

   (2) including any documentation-related commits, excluding
   merge commits. Regarding imported patches/code, we do our best
   to count the work on behalf of the proper owner, as per the
   "fix_authors" and "mod_renames" arrays in
   opensips/doc/build-contrib.sh. If you identify any
   patches/commits which do not get properly attributed to you,
   please submit a pull request which extends "fix_authors" and/or
   "mod_renames".

   (3) ignoring whitespace edits, renamed files and auto-generated
   files

2.2. By Commit Activity

   Table 2.2. Most recently active contributors^(1) to this module
                      Name                   Commit Activity
   1.  Maksym Sobolyev (@sobomax)          Jan 2021 - Feb 2023
   2.  Liviu Chircu (@liviuchircu)         Mar 2014 - Feb 2023
   3.  Razvan Crainea (@razvancrainea)     Feb 2012 - Feb 2021
   4.  Vlad Patrascu (@rvlad-patrascu)     May 2017 - May 2019
   5.  Bogdan-Andrei Iancu (@bogdan-iancu) Mar 2006 - Apr 2019
   6.  Peter Lemenkov (@lemenkov)          Jun 2018 - Jun 2018
   7.  Ionut Ionita (@ionutrazvanionita)   Apr 2017 - Apr 2017
   8.  Julián Moreno Patiño                Feb 2016 - Feb 2016
   9.  Vlad Paiu (@vladpaiu)               Jul 2010 - Feb 2011
   10. Anca Vamanu                         Oct 2007 - Sep 2009

   All remaining contributors: Ovidiu Sas (@ovidiusas),
   Daniel-Constantin Mierla (@miconda), Konstantin Bokarius, Edson
   Gellert Schubert, Henning Westerholt (@henningw).

   (1) including any documentation-related commits, excluding
   merge commits

Chapter 3. Documentation

3.1. Contributors

   Last edited by: Liviu Chircu (@liviuchircu), Razvan Crainea
   (@razvancrainea), Vlad Patrascu (@rvlad-patrascu), Peter
   Lemenkov (@lemenkov), Bogdan-Andrei Iancu (@bogdan-iancu), Vlad
   Paiu (@vladpaiu), Ovidiu Sas (@ovidiusas), Daniel-Constantin
   Mierla (@miconda), Konstantin Bokarius, Edson Gellert Schubert.

   Documentation Copyrights:

   Copyright © 2007-2017 OpenSIPS Project

   Copyright © 2006 Voice Sistem SRL
