summaryrefslogtreecommitdiff
path: root/static/freebsd/man3/stats.3 3.html
diff options
context:
space:
mode:
Diffstat (limited to 'static/freebsd/man3/stats.3 3.html')
-rw-r--r--static/freebsd/man3/stats.3 3.html725
1 files changed, 725 insertions, 0 deletions
diff --git a/static/freebsd/man3/stats.3 3.html b/static/freebsd/man3/stats.3 3.html
new file mode 100644
index 00000000..fb277eab
--- /dev/null
+++ b/static/freebsd/man3/stats.3 3.html
@@ -0,0 +1,725 @@
+<table class="head">
+ <tr>
+ <td class="head-ltitle">STATS(3)</td>
+ <td class="head-vol">Library Functions Manual</td>
+ <td class="head-rtitle">STATS(3)</td>
+ </tr>
+</table>
+<div class="manual-text">
+<section class="Sh">
+<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1>
+<p class="Pp"><code class="Nm">stats</code> &#x2014; <span class="Nd">statistics
+ gathering</span></p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="LIBRARY"><a class="permalink" href="#LIBRARY">LIBRARY</a></h1>
+<p class="Pp"><span class="Lb">library &#x201C;libstats&#x201D;</span></p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1>
+<p class="Pp"><code class="In">#include
+ &lt;<a class="In">sys/arb.h</a>&gt;</code>
+ <br/>
+ <code class="In">#include &lt;<a class="In">sys/qmath.h</a>&gt;</code>
+ <br/>
+ <code class="In">#include &lt;<a class="In">sys/stats.h</a>&gt;</code></p>
+<section class="Ss">
+<h2 class="Ss" id="Stats_Blob_Template_Management_Functions"><a class="permalink" href="#Stats_Blob_Template_Management_Functions">Stats
+ Blob Template Management Functions</a></h2>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_tpl_alloc</code>(<var class="Fa">const char
+ *name</var>, <var class="Fa">uint32_t flags</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_tpl_fetch_allocid</code>(<var class="Fa">const char
+ *name</var>, <var class="Fa">uint32_t hash</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_tpl_fetch</code>(<var class="Fa">int tpl_id</var>,
+ <var class="Fa">struct statsblob_tpl **tpl</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_tpl_id2name</code>(<var class="Fa">uint32_t
+ tpl_id</var>, <var class="Fa">char *buf</var>, <var class="Fa">size_t
+ len</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_tpl_sample_rates</code>(<var class="Fa">SYSCTL_HANDLER_ARGS</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_tpl_sample_rollthedice</code>(<var class="Fa">struct
+ stats_tpl_sample_rate *rates</var>, <var class="Fa">int nrates</var>,
+ <var class="Fa">void *seed_bytes</var>, <var class="Fa">size_t
+ seed_len</var>);</p>
+<p class="Pp"><var class="Ft">struct voistatspec</var>
+ <br/>
+ <code class="Fn">STATS_VSS_SUM</code>();</p>
+<p class="Pp"><var class="Ft">struct voistatspec</var>
+ <br/>
+ <code class="Fn">STATS_VSS_MAX</code>();</p>
+<p class="Pp"><var class="Ft">struct voistatspec</var>
+ <br/>
+ <code class="Fn">STATS_VSS_MIN</code>();</p>
+<p class="Pp"><var class="Ft">struct voistatspec</var>
+ <br/>
+ <code class="Fn">STATS_VSS_CRHIST&lt;32|64&gt;_LIN</code>(<var class="Fa">lb</var>,
+ <var class="Fa">ub</var>, <var class="Fa">stepinc</var>,
+ <var class="Fa">vsdflags</var>);</p>
+<p class="Pp"><var class="Ft">struct voistatspec</var>
+ <br/>
+ <code class="Fn">STATS_VSS_CRHIST&lt;32|64&gt;_EXP</code>(<var class="Fa">lb</var>,
+ <var class="Fa">ub</var>, <var class="Fa">stepbase</var>,
+ <var class="Fa">stepexp</var>, <var class="Fa">vsdflags</var>);</p>
+<p class="Pp"><var class="Ft">struct voistatspec</var>
+ <br/>
+ <code class="Fn">STATS_VSS_CRHIST&lt;32|64&gt;_LINEXP</code>(<var class="Fa">lb</var>,
+ <var class="Fa">ub</var>, <var class="Fa">nlinsteps</var>,
+ <var class="Fa">stepbase</var>, <var class="Fa">vsdflags</var>);</p>
+<p class="Pp"><var class="Ft">struct voistatspec</var>
+ <br/>
+ <code class="Fn">STATS_VSS_CRHIST&lt;32|64&gt;_USR</code>(<b class="Sy">HBKTS</b>(<a class="permalink" href="#CRBKT"><b class="Sy" id="CRBKT">CRBKT</b></a>(<i class="Em">lb</i>),
+ <i class="Em">...</i>), <var class="Fa">vsdflags</var>);</p>
+<p class="Pp"><var class="Ft">struct voistatspec</var>
+ <br/>
+ <code class="Fn">STATS_VSS_DRHIST&lt;32|64&gt;_USR</code>(<b class="Sy">HBKTS</b>(<a class="permalink" href="#DRBKT"><b class="Sy" id="DRBKT">DRBKT</b></a>(<i class="Em">lb</i>,
+ <a class="permalink" href="#ub"><i class="Em" id="ub">ub</i></a>),
+ <i class="Em">...</i>), <var class="Fa">vsdflags</var>);</p>
+<p class="Pp"><var class="Ft">struct voistatspec</var>
+ <br/>
+ <code class="Fn">STATS_VSS_DVHIST&lt;32|64&gt;_USR</code>(<b class="Sy">HBKTS</b>(<a class="permalink" href="#DVBKT"><b class="Sy" id="DVBKT">DVBKT</b></a>(<a class="permalink" href="#val"><i class="Em" id="val">val</i></a>),
+ <i class="Em">...</i>), <var class="Fa">vsdflags</var>);</p>
+<p class="Pp"><var class="Ft">struct voistatspec</var>
+ <br/>
+ <code class="Fn">STATS_VSS_TDGSTCLUST&lt;32|64&gt;</code>(<var class="Fa">nctroids</var>,
+ <var class="Fa">prec</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_tpl_add_voistats</code>(<var class="Fa">uint32_t
+ tpl_id</var>, <var class="Fa">int32_t voi_id</var>, <var class="Fa">const
+ char *voi_name</var>, <var class="Fa">enum vsd_dtype voi_dtype</var>,
+ <var class="Fa">uint32_t nvss</var>, <var class="Fa">struct voistatspec
+ *vss</var>, <var class="Fa">uint32_t flags</var>);</p>
+</section>
+<section class="Ss">
+<h2 class="Ss" id="Stats_Blob_Data_Gathering_Functions"><a class="permalink" href="#Stats_Blob_Data_Gathering_Functions">Stats
+ Blob Data Gathering Functions</a></h2>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_voi_update_&lt;abs|rel&gt;_&lt;dtype&gt;</code>(<var class="Fa">struct
+ statsblob *sb</var>, <var class="Fa">int32_t voi_id</var>,
+ <var class="Fa">&lt;dtype&gt; voival</var>);</p>
+</section>
+<section class="Ss">
+<h2 class="Ss" id="Stats_Blob_Utility_Functions"><a class="permalink" href="#Stats_Blob_Utility_Functions">Stats
+ Blob Utility Functions</a></h2>
+<p class="Pp"><var class="Ft">struct statsblob *</var>
+ <br/>
+ <code class="Fn">stats_blob_alloc</code>(<var class="Fa">uint32_t
+ tpl_id</var>, <var class="Fa">uint32_t flags</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_blob_init</code>(<var class="Fa">struct statsblob
+ *sb</var>, <var class="Fa">uint32_t tpl_id</var>, <var class="Fa">uint32_t
+ flags</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_blob_clone</code>(<var class="Fa">struct statsblob
+ **dst</var>, <var class="Fa">size_t dstmaxsz</var>, <var class="Fa">struct
+ statsblob *src</var>, <var class="Fa">uint32_t flags</var>);</p>
+<p class="Pp"><var class="Ft">void</var>
+ <br/>
+ <code class="Fn">stats_blob_destroy</code>(<var class="Fa">struct statsblob
+ *sb</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_voistat_fetch_dptr</code>(<var class="Fa">struct
+ statsblob *sb</var>, <var class="Fa">int32_t voi_id</var>,
+ <var class="Fa">enum voi_stype stype</var>, <var class="Fa">enum vsd_dtype
+ *retdtype</var>, <var class="Fa">struct voistatdata **retvsd</var>,
+ <var class="Fa">size_t *retvsdsz</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_voistat_fetch_&lt;dtype&gt;</code>(<var class="Fa">struct
+ statsblob *sb</var>, <var class="Fa">int32_t voi_id</var>,
+ <var class="Fa">enum voi_stype stype</var>, <var class="Fa">&lt;dtype&gt;
+ *ret</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_blob_snapshot</code>(<var class="Fa">struct statsblob
+ **dst</var>, <var class="Fa">size_t dstmaxsz</var>, <var class="Fa">struct
+ statsblob *src</var>, <var class="Fa">uint32_t flags</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_blob_tostr</code>(<var class="Fa">struct statsblob
+ *sb</var>, <var class="Fa">struct sbuf *buf</var>, <var class="Fa">enum
+ sb_str_fmt fmt</var>, <var class="Fa">uint32_t flags</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_voistatdata_tostr</code>(<var class="Fa">const struct
+ voistatdata *vsd</var>, <var class="Fa">enum vsd_dtype dtype</var>,
+ <var class="Fa">enum sb_str_fmt fmt</var>, <var class="Fa">struct sbuf
+ *buf</var>, <var class="Fa">int objdump</var>);</p>
+<p class="Pp"><var class="Ft">typedef int</var>
+ <br/>
+ <code class="Fn">(*stats_blob_visitcb_t)</code>(<var class="Fa" style="white-space: nowrap;">struct
+ sb_visit *sbv</var>, <var class="Fa" style="white-space: nowrap;">void
+ *usrctx</var>);</p>
+<p class="Pp"><var class="Ft">int</var>
+ <br/>
+ <code class="Fn">stats_blob_visit</code>(<var class="Fa">struct statsblob
+ *sb</var>, <var class="Fa">stats_blob_visitcb_t func</var>,
+ <var class="Fa">void *usrctx</var>);</p>
+</section>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1>
+<p class="Pp">The <code class="Nm">stats</code> framework facilitates real-time
+ kernel and user space statistics gathering. The framework is built around
+ the &#x201C;statsblob&#x201D;, an object embedded within a contiguous memory
+ allocation that is mostly opaque to consumers and stores all required state.
+ A &#x201C;statsblob&#x201D; object can itself be embedded within other
+ objects either directly or indirectly using a pointer.</p>
+<p class="Pp">Objects or subsystems for which statistics are to be gathered are
+ initialized from a template &#x201C;statsblob&#x201D;, which acts as the
+ blueprint for an arbitrary set of Variables Of Interest (VOIs) and their
+ associated statistics. Each template defines a schema plus associated
+ metadata, which are kept separate to minimize the memory footprint of
+ blobs.</p>
+<p class="Pp">Data gathering hook functions added at appropriate locations
+ within the code base of interest feed VOI data into the framework for
+ processing.</p>
+<p class="Pp">Each &#x201C;statsblob&#x201D;, consists of a
+ <var class="Vt">struct statsblob</var> header and opaque internal blob
+ structure per the following diagram:</p>
+<div class="Bd Pp Bd-indent Li">
+<pre>---------------------------------------------------------
+| struct | uint8_t |
+| statsblob | opaque[] |
+---------------------------------------------------------</pre>
+</div>
+<p class="Pp">The publicly visible 8-byte header is defined as:</p>
+<div class="Bd Pp Bd-indent Li">
+<pre>struct statsblob {
+ uint8_t abi;
+ uint8_t endian;
+ uint16_t flags;
+ uint16_t maxsz;
+ uint16_t cursz;
+ uint8_t opaque[];
+};</pre>
+</div>
+<p class="Pp"><var class="Va">abi</var> specifies which API version the blob's
+ <var class="Va">opaque</var> internals conform to
+ (<code class="Dv">STATS_ABI_V1 is the only version currently
+ defined</code>). <var class="Va">endian</var> specifies the endianness of
+ the blob's fields (<code class="Dv">SB_LE</code> for little endian,
+ <code class="Dv">SB_BE</code> for big endian, or
+ <code class="Dv">SB_UE</code> for unknown endianness).
+ <var class="Va">cursz</var> specifies the size of the blob, while
+ <var class="Va">maxsz</var> specifies the size of the underlying memory
+ allocation in which the blob is embedded. Both <var class="Va">cursz</var>
+ and <var class="Va">maxsz</var> default to units of bytes, unless a flag is
+ set in <var class="Va">flags</var> that dictates otherwise.</p>
+<p class="Pp">Templates are constructed by associating arbitrary VOI IDs with a
+ set of statistics, where each statistic is specified using a
+ <var class="Vt">struct voistatspec</var> per the definition below:</p>
+<div class="Bd Pp Bd-indent Li">
+<pre>struct voistatspec {
+ vss_hlpr_fn hlpr;
+ struct vss_hlpr_info *hlprinfo;
+ struct voistatdata *iv;
+ size_t vsdsz;
+ uint32_t flags;
+ enum vsd_dtype vs_dtype : 8;
+ enum voi_stype stype : 8;
+};</pre>
+</div>
+<p class="Pp" id="STATS_VSS_*">It is generally expected that consumers will not
+ work with <var class="Vt">struct voistatspec</var> directly, and instead use
+ the
+ <a class="permalink" href="#STATS_VSS_*"><code class="Fn">STATS_VSS_*</code></a>()
+ helper macros.</p>
+<p class="Pp">The <code class="Nm">stats</code> framework offers the following
+ statistics for association with VOIs:</p>
+<dl class="Bl-tag">
+ <dt id="VS_STYPE_SUM"><a class="permalink" href="#VS_STYPE_SUM"><code class="Dv">VS_STYPE_SUM</code></a></dt>
+ <dd>The sum of VOI values.</dd>
+ <dt id="VS_STYPE_MAX"><a class="permalink" href="#VS_STYPE_MAX"><code class="Dv">VS_STYPE_MAX</code></a></dt>
+ <dd>The maximum VOI value.</dd>
+ <dt id="VS_STYPE_MIN"><a class="permalink" href="#VS_STYPE_MIN"><code class="Dv">VS_STYPE_MIN</code></a></dt>
+ <dd>The minimum VOI value.</dd>
+ <dt id="VS_STYPE_HIST"><a class="permalink" href="#VS_STYPE_HIST"><code class="Dv">VS_STYPE_HIST</code></a></dt>
+ <dd>A static bucket histogram of VOI values, including a count of
+ &#x201C;out-of-band/bucket&#x201D; values which did not match any bucket.
+ Histograms can be specified as
+ &#x201C;<a class="permalink" href="#C"><i class="Em" id="C">C</i></a>ontinuous
+ <i class="Em">R</i>ange&#x201D; (CRHIST),
+ &#x201C;<i class="Em">D</i>iscrete <i class="Em">R</i>ange&#x201D;
+ (DRHIST) or &#x201C;<i class="Em">D</i>iscrete
+ <a class="permalink" href="#V"><i class="Em" id="V">V</i></a>alue&#x201D;
+ (DVHIST), with 32 or 64 bit bucket counters, depending on the VOI
+ semantics.</dd>
+ <dt id="VS_STYPE_TDGST"><a class="permalink" href="#VS_STYPE_TDGST"><code class="Dv">VS_STYPE_TDGST</code></a></dt>
+ <dd>A dynamic bucket histogram of VOI values based on the t-digest method
+ (refer to the t-digest paper in the <a class="Sx" href="#SEE_ALSO">SEE
+ ALSO</a> section below).</dd>
+</dl>
+<p class="Pp">A &#x201C;visitor software design pattern&#x201D;-like scheme is
+ employed to facilitate iterating over a blob's data without concern for the
+ blob's structure. The data provided to visitor callback functions is
+ encapsulated in <var class="Vt">struct sb_visit</var> per the definition
+ below:</p>
+<div class="Bd Pp Bd-indent Li">
+<pre>struct sb_visit {
+ struct voistatdata *vs_data;
+ uint32_t tplhash;
+ uint32_t flags;
+ int16_t voi_id;
+ int16_t vs_dsz;
+ enum vsd_dtype voi_dtype : 8;
+ enum vsd_dtype vs_dtype : 8;
+ int8_t vs_stype;
+ uint16_t vs_errs;
+};</pre>
+</div>
+<p class="Pp" id="stats_tpl_sample_rates">The
+ <a class="permalink" href="#stats_tpl_sample_rates"><code class="Fn">stats_tpl_sample_rates</code></a>()
+ and <code class="Fn">stats_tpl_sample_rollthedice</code>() functions utilize
+ <var class="Vt">struct stats_tpl_sample_rate</var> to encapsulate
+ per-template sample rate information per the definition below:</p>
+<div class="Bd Pp Bd-indent Li">
+<pre>struct stats_tpl_sample_rate {
+ int32_t tpl_slot_id;
+ uint32_t tpl_sample_pct;
+};</pre>
+</div>
+<p class="Pp" id="stats_tpl_alloc">The <var class="Va">tpl_slot_id</var> member
+ holds the template's slot ID obtained from
+ <a class="permalink" href="#stats_tpl_alloc"><code class="Fn">stats_tpl_alloc</code></a>()
+ or <code class="Fn">stats_tpl_fetch_allocid</code>(). The
+ <var class="Va">tpl_sample_pct</var> member holds the template's sample rate
+ as an integer percentage in the range [0,100].</p>
+<p class="Pp" id="stats_tpl_sample_rates~2">The
+ <var class="Vt">stats_tpl_sr_cb_t</var> conformant function pointer that is
+ required as the <var class="Fa">arg1</var> of
+ <a class="permalink" href="#stats_tpl_sample_rates~2"><code class="Fn">stats_tpl_sample_rates</code></a>()
+ is defined as:</p>
+<div class="Bd Pp Bd-indent Li">
+<pre>enum stats_tpl_sr_cb_action {
+ TPL_SR_UNLOCKED_GET,
+ TPL_SR_RLOCKED_GET,
+ TPL_SR_RUNLOCK,
+ TPL_SR_PUT
+};
+typedef int (*stats_tpl_sr_cb_t)(enum stats_tpl_sr_cb_action action,
+ struct stats_tpl_sample_rate **rates, int *nrates, void *ctx);</pre>
+</div>
+<p class="Pp">It is required that a conformant function:</p>
+<ul class="Bl-dash">
+ <li>Return an appropriate <a class="Xr">errno(2)</a> on error, otherwise
+ 0.</li>
+ <li>When called with &quot;action == TPL_SR_*_GET&quot;, return the
+ subsystem's rates list ptr and count, locked or unlocked as
+ requested.</li>
+ <li>When called with &quot;action == TPL_SR_RUNLOCK&quot;, unlock the
+ subsystem's rates list ptr and count. Pair with a prior &quot;action ==
+ TPL_SR_RLOCKED_GET&quot; call.</li>
+ <li id="stats_tpl_sample_rates~3">When called with &quot;action ==
+ TPL_SR_PUT&quot;, update the subsystem's rates list ptr and count to the
+ sysctl processed values and return the inactive list details in
+ <var class="Fa">rates</var> and <var class="Fa">nrates</var> for garbage
+ collection by
+ <a class="permalink" href="#stats_tpl_sample_rates~3"><code class="Fn">stats_tpl_sample_rates</code></a>().</li>
+</ul>
+<p class="Pp">Where templates need to be referenced via textual means, for
+ example via a MIB variable, the following string based template spec formats
+ can be used:</p>
+<ol class="Bl-enum">
+ <li>&quot;&lt;tplname&gt;&quot;:&lt;tplhash&gt;, for example
+ &quot;TCP_DEFAULT&quot;:1731235399</li>
+ <li>&quot;&lt;tplname&gt;&quot;, for example &quot;TCP_DEFAULT&quot;</li>
+ <li>:&lt;tplhash&gt;, for example :1731235399</li>
+</ol>
+<p class="Pp">The first form is the normative spec format generated by the
+ framework, while the second and third forms are convenience formats
+ primarily for user input. The use of inverted commas around the template
+ name is optional.</p>
+<section class="Ss">
+<h2 class="Ss" id="MIB_Variables"><a class="permalink" href="#MIB_Variables">MIB
+ Variables</a></h2>
+<p class="Pp">The in-kernel <code class="Nm">stats</code> framework exposes the
+ following framework-specific variables in the
+ <var class="Va">kern.stats</var> branch of the <a class="Xr">sysctl(3)</a>
+ MIB.</p>
+<dl class="Bl-tag">
+ <dt>templates</dt>
+ <dd>Read-only CSV list of registered templates in normative template spec
+ form.</dd>
+</dl>
+</section>
+<section class="Ss">
+<h2 class="Ss" id="Template_Management_Functions"><a class="permalink" href="#Template_Management_Functions">Template
+ Management Functions</a></h2>
+<p class="Pp">The
+ <a class="permalink" href="#stats_tpl_alloc~2"><code class="Fn" id="stats_tpl_alloc~2">stats_tpl_alloc</code></a>()
+ function allocates a new template with the specified unique name and returns
+ its runtime-stable template slot ID for use with other API functions. The
+ <var class="Fa">flags</var> argument is currently unused.</p>
+<p class="Pp" id="stats_tpl_fetch_allocid">The
+ <a class="permalink" href="#stats_tpl_fetch_allocid"><code class="Fn">stats_tpl_fetch_allocid</code></a>()
+ function returns the runtime-stable template slot ID of any registered
+ template matching the specified name and hash.</p>
+<p class="Pp" id="stats_tpl_fetch">The
+ <a class="permalink" href="#stats_tpl_fetch"><code class="Fn">stats_tpl_fetch</code></a>()
+ function returns the pointer to the registered template object at the
+ specified template slot ID.</p>
+<p class="Pp" id="stats_tpl_id2name">The
+ <a class="permalink" href="#stats_tpl_id2name"><code class="Fn">stats_tpl_id2name</code></a>()
+ function returns the name of the registered template object at the specified
+ template slot ID.</p>
+<p class="Pp" id="stats_tpl_sample_rates~4">The
+ <a class="permalink" href="#stats_tpl_sample_rates~4"><code class="Fn">stats_tpl_sample_rates</code></a>()
+ function provides a generic handler for template sample rates management and
+ reporting via <a class="Xr">sysctl(3)</a> MIB variables. Subsystems can use
+ this function to create a subsystem-specific
+ <a class="Xr">SYSCTL_PROC(9)</a> MIB variable that manages and reports
+ subsystem-specific template sampling rates. Subsystems must supply a
+ <var class="Vt">stats_tpl_sr_cb_t</var> conformant function pointer as the
+ sysctl's <var class="Fa">arg1</var>, which is a callback used to interact
+ with the subsystem's stats template sample rates list. Subsystems can
+ optionally specify the sysctl's <var class="Fa">arg2</var> as non-zero,
+ which causes a zero-initialized allocation of arg2-sized contextual memory
+ to be heap-allocated and passed in to all subsystem callbacks made during
+ the operation of <code class="Fn">stats_tpl_sample_rates</code>().</p>
+<p class="Pp" id="stats_tpl_sample_rollthedice">The
+ <a class="permalink" href="#stats_tpl_sample_rollthedice"><code class="Fn">stats_tpl_sample_rollthedice</code></a>()
+ function makes a weighted random template selection from the supplied array
+ of template sampling rates. The cumulative percentage of all sampling rates
+ should not exceed 100. If no seed is supplied, a PRNG is used to generate a
+ true random number so that every selection is independent. If a seed is
+ supplied, selection will be made randomly across different seeds, but
+ deterministically given the same seed.</p>
+<p class="Pp" id="stats_tpl_add_voistats">The
+ <a class="permalink" href="#stats_tpl_add_voistats"><code class="Fn">stats_tpl_add_voistats</code></a>()
+ function is used to add a VOI and associated set of statistics to the
+ registered template object at the specified template slot ID. The set of
+ statistics is passed as an array of <var class="Vt">struct voistatspec</var>
+ which can be initialized using the <code class="Fn">STATS_VSS_*</code>()
+ helper macros or manually for non-standard use cases. For static
+ <var class="Fa">vss</var> arrays, the <var class="Fa">nvss</var> count of
+ array elements can be determined by passing <var class="Fa">vss</var> to the
+ <a class="permalink" href="#NVSS"><code class="Fn" id="NVSS">NVSS</code></a>()
+ macro. The <code class="Dv">SB_VOI_RELUPDATE</code> flag can be passed to
+ configure the VOI for use with
+ <a class="permalink" href="#stats_voi_update_rel__dtype_"><code class="Fn" id="stats_voi_update_rel__dtype_">stats_voi_update_rel_&lt;dtype&gt;</code></a>(),
+ which entails maintaining an extra 8 bytes of state in the blob at each
+ update.</p>
+</section>
+<section class="Ss">
+<h2 class="Ss" id="Data_Gathering_Functions"><a class="permalink" href="#Data_Gathering_Functions">Data
+ Gathering Functions</a></h2>
+<p class="Pp">The
+ <a class="permalink" href="#stats_voi_update_abs__dtype_"><code class="Fn" id="stats_voi_update_abs__dtype_">stats_voi_update_abs_&lt;dtype&gt;</code></a>()
+ and <code class="Fn">stats_voi_update_rel_&lt;dtype&gt;</code>() functions
+ both update all the statistics associated with the VOI identified by
+ <var class="Fa">voi_id</var>. The &#x201C;abs&#x201D; call uses
+ <var class="Fa">voival</var> as an absolute value, whereas the
+ &#x201C;rel&#x201D; call uses <var class="Fa">voival</var> as a value
+ relative to that of the previous update function call, by adding it to the
+ previous value and using the result for the update. Relative updates are
+ only possible for VOIs that were added to the template with the
+ <code class="Dv">SB_VOI_RELUPDATE</code> flag specified to
+ <code class="Fn">stats_tpl_add_voistats</code>().</p>
+</section>
+<section class="Ss">
+<h2 class="Ss" id="Utility_Functions"><a class="permalink" href="#Utility_Functions">Utility
+ Functions</a></h2>
+<p class="Pp">The <code class="Fn">stats_blob_alloc</code>() function allocates
+ and initializes a new blob based on the registered template object at the
+ specified template slot ID.</p>
+<p class="Pp" id="stats_blob_init">The
+ <a class="permalink" href="#stats_blob_init"><code class="Fn">stats_blob_init</code></a>()
+ function initializes a new blob in an existing memory allocation based on
+ the registered template object at the specified template slot ID.</p>
+<p class="Pp" id="stats_blob_clone">The
+ <a class="permalink" href="#stats_blob_clone"><code class="Fn">stats_blob_clone</code></a>()
+ function duplicates the <var class="Fa">src</var> blob into
+ <var class="Fa">dst</var>, leaving only the <var class="Va">maxsz</var>
+ field of <var class="Fa">dst</var> untouched. The
+ <code class="Dv">SB_CLONE_ALLOCDST</code> flag can be passed to instruct the
+ function to allocate a new blob of appropriate size into which to clone
+ <var class="Fa">src</var>, storing the new pointer in
+ <var class="Fa">*dst</var>. The
+ <code class="Dv">SB_CLONE_USRDSTNOFAULT</code> or
+ <code class="Dv">SB_CLONE_USRDST</code> flags can be set to respectively
+ signal that <a class="Xr">copyout_nofault(9)</a> or
+ <a class="Xr">copyout(9)</a> should be used because
+ <var class="Fa">*dst</var> is a user space address.</p>
+<p class="Pp" id="stats_blob_snapshot">The
+ <a class="permalink" href="#stats_blob_snapshot"><code class="Fn">stats_blob_snapshot</code></a>()
+ function calls <code class="Fn">stats_blob_clone</code>() to obtain a copy
+ of <var class="Fa">src</var> and then performs any additional functions
+ required to produce a coherent blob snapshot. The flags interpreted by
+ <code class="Fn">stats_blob_clone</code>() also apply to
+ <code class="Fn">stats_blob_snapshot</code>(). Additionally, the
+ <code class="Dv">SB_CLONE_RSTSRC</code> flag can be used to effect a reset
+ of the <var class="Fa">src</var> blob's statistics after a snapshot is
+ successfully taken.</p>
+<p class="Pp" id="stats_blob_destroy">The
+ <a class="permalink" href="#stats_blob_destroy"><code class="Fn">stats_blob_destroy</code></a>()
+ function destroys a blob previously created with
+ <a class="permalink" href="#stats_blob_alloc"><code class="Fn" id="stats_blob_alloc">stats_blob_alloc</code></a>(),
+ <code class="Fn">stats_blob_clone</code>() or
+ <code class="Fn">stats_blob_snapshot</code>().</p>
+<p class="Pp" id="stats_blob_visit">The
+ <a class="permalink" href="#stats_blob_visit"><code class="Fn">stats_blob_visit</code></a>()
+ function allows the caller to iterate over the contents of a blob. The
+ callback function <var class="Fa">func</var> is called for every VOI and
+ statistic in the blob, passing a <var class="Vt">struct sb_visit</var> and
+ the user context argument <var class="Fa">usrctx</var> to the callback
+ function. The <var class="Fa">sbv</var> passed to the callback function may
+ have one or more of the following flags set in the
+ <var class="Va">flags</var> struct member to provide useful metadata about
+ the iteration: <code class="Dv">SB_IT_FIRST_CB</code>,
+ <code class="Dv">SB_IT_LAST_CB</code>,
+ <code class="Dv">SB_IT_FIRST_VOI</code>,
+ <code class="Dv">SB_IT_LAST_VOI</code>,
+ <code class="Dv">SB_IT_FIRST_VOISTAT</code>,
+ <code class="Dv">SB_IT_LAST_VOISTAT</code>,
+ <code class="Dv">SB_IT_NULLVOI</code> and
+ <code class="Dv">SB_IT_NULLVOISTAT</code>. Returning a non-zero value from
+ the callback function terminates the iteration.</p>
+<p class="Pp" id="stats_blob_tostr">The
+ <a class="permalink" href="#stats_blob_tostr"><code class="Fn">stats_blob_tostr</code></a>()
+ renders a string representation of a blob into the <a class="Xr">sbuf(9)</a>
+ <var class="Fa">buf</var>. Currently supported render formats are
+ <code class="Dv">SB_STRFMT_FREEFORM</code> and
+ <code class="Dv">SB_STRFMT_JSON</code>. The
+ <code class="Dv">SB_TOSTR_OBJDUMP</code> flag can be passed to render
+ version specific opaque implementation detail for debugging or
+ string-to-binary blob reconstruction purposes. The
+ <code class="Dv">SB_TOSTR_META</code> flag can be passed to render template
+ metadata into the string representation, using the blob's template hash to
+ lookup the corresponding template.</p>
+<p class="Pp" id="stats_voistatdata_tostr">The
+ <a class="permalink" href="#stats_voistatdata_tostr"><code class="Fn">stats_voistatdata_tostr</code></a>()
+ renders a string representation of an individual statistic's data into the
+ <a class="Xr">sbuf(9)</a> <var class="Fa">buf</var>. The same render formats
+ supported by the <code class="Fn">stats_blob_tostr</code>() function can be
+ specified, and the <var class="Fa">objdump</var> boolean has the same
+ meaning as the <code class="Dv">SB_TOSTR_OBJDUMP</code> flag.</p>
+<p class="Pp" id="stats_voistat_fetch_dptr">The
+ <a class="permalink" href="#stats_voistat_fetch_dptr"><code class="Fn">stats_voistat_fetch_dptr</code></a>()
+ function returns an internal blob pointer to the specified
+ <var class="Fa">stype</var> statistic data for the VOI
+ <var class="Fa">voi_id</var>. The
+ <a class="permalink" href="#stats_voistat_fetch__dtype_"><code class="Fn" id="stats_voistat_fetch__dtype_">stats_voistat_fetch_&lt;dtype&gt;</code></a>()
+ functions are convenience wrappers around
+ <code class="Fn">stats_voistat_fetch_dptr</code>() to perform the extraction
+ for simple data types.</p>
+</section>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="IMPLEMENTATION_NOTES"><a class="permalink" href="#IMPLEMENTATION_NOTES">IMPLEMENTATION
+ NOTES</a></h1>
+<p class="Pp">The following notes apply to STATS_ABI_V1 format statsblobs.</p>
+<section class="Ss">
+<h2 class="Ss" id="Space-Time_Complexity"><a class="permalink" href="#Space-Time_Complexity">Space-Time
+ Complexity</a></h2>
+<p class="Pp">Blobs are laid out as three distinct memory regions following the
+ header:</p>
+<div class="Bd Pp Bd-indent Li">
+<pre>------------------------------------------------------
+| struct | struct | struct | struct |
+| statsblobv1 | voi [] | voistat [] | voistatdata [] |
+------------------------------------------------------</pre>
+</div>
+<p class="Pp">Blobs store VOI and statistic blob state (8 bytes for
+ <var class="Vt">struct voi</var> and 8 bytes for <var class="Vt">struct
+ voistat</var> respectively) in sparse arrays, using the
+ <var class="Fa">voi_id</var> and <var class="Vt">enum voi_stype</var> as
+ array indices. This allows O(1) access to any voi/voistat pair in the blob,
+ at the expense of 8 bytes of wasted memory per vacant slot for templates
+ which do not specify contiguously numbered VOIs and/or statistic types. Data
+ storage for statistics is only allocated for non-vacant slot pairs.</p>
+<p class="Pp">To provide a concrete example, a blob with the following
+ specification:</p>
+<ul class="Bl-dash">
+ <li>Two VOIs; ID 0 and 2; added to the template in that order</li>
+ <li>VOI 0 is of data type <var class="Vt">int64_t</var>, is configured with
+ <code class="Dv">SB_VOI_RELUPDATE</code> to enable support for relative
+ updates using
+ <code class="Fn">stats_voi_update_rel_&lt;dtype&gt;</code>(), and has a
+ <code class="Dv">VS_STYPE_MIN</code> statistic associated with it.</li>
+ <li>VOI 2 is of data type <var class="Vt">uint32_t</var> with
+ <code class="Dv">VS_STYPE_SUM</code> and
+ <code class="Dv">VS_STYPE_MAX</code> statistics associated with it.</li>
+</ul>
+<p class="Pp">would have the following memory layout:</p>
+<div class="Bd Pp Li">
+<pre>--------------------------------------
+| header | struct statsblobv1, 32 bytes
+|------------------------------------|
+| voi[0] | struct voi, 8 bytes
+| voi[1] (vacant) | struct voi, 8 bytes
+| voi[2] | struct voi, 8 bytes
+|------------------------------------|
+| voi[2]voistat[VOISTATE] (vacant) | struct voistat, 8 bytes
+| voi[2]voistat[SUM] | struct voistat, 8 bytes
+| voi[2]voistat[MAX] | struct voistat, 8 bytes
+| voi[0]voistat[VOISTATE] | struct voistat, 8 bytes
+| voi[0]voistat[SUM] (vacant) | struct voistat, 8 bytes
+| voi[0]voistat[MAX] (vacant) | struct voistat, 8 bytes
+| voi[0]voistat[MIN] | struct voistat, 8 bytes
+|------------------------------------|
+| voi[2]voistat[SUM]voistatdata | struct voistatdata_int32, 4 bytes
+| voi[2]voistat[MAX]voistatdata | struct voistatdata_int32, 4 bytes
+| voi[0]voistat[VOISTATE]voistatdata | struct voistatdata_numeric, 8 bytes
+| voi[0]voistat[MIN]voistatdata | struct voistatdata_int64, 8 bytes
+--------------------------------------
+ TOTAL 136 bytes</pre>
+</div>
+<p class="Pp">When rendered to string format using
+ <code class="Fn">stats_blob_tostr</code>(), the
+ <code class="Dv">SB_STRFMT_FREEFORM</code> <var class="Fa">fmt</var> and the
+ <code class="Dv">SB_TOSTR_OBJDUMP</code> flag, the rendered output is:</p>
+<div class="Bd Pp Li">
+<pre>struct statsblobv1@0x8016250a0, abi=1, endian=1, maxsz=136, cursz=136, \
+ created=6294158585626144, lastrst=6294158585626144, flags=0x0000, \
+ stats_off=56, statsdata_off=112, tplhash=2994056564
+ vois[0]: id=0, name=&quot;&quot;, flags=0x0001, dtype=INT_S64, voistatmaxid=3, \
+ stats_off=80
+ vois[0]stat[0]: stype=VOISTATE, flags=0x0000, dtype=VOISTATE, \
+ dsz=8, data_off=120
+ voistatdata: prev=0
+ vois[0]stat[1]: stype=-1
+ vois[0]stat[2]: stype=-1
+ vois[0]stat[3]: stype=MIN, flags=0x0000, dtype=INT_S64, \
+ dsz=8, data_off=128
+ voistatdata: 9223372036854775807
+ vois[1]: id=-1
+ vois[2]: id=2, name=&quot;&quot;, flags=0x0000, dtype=INT_U32, voistatmaxid=2, \
+ stats_off=56
+ vois[2]stat[0]: stype=-1
+ vois[2]stat[1]: stype=SUM, flags=0x0000, dtype=INT_U32, dsz=4, \
+ data_off=112
+ voistatdata: 0
+ vois[2]stat[2]: stype=MAX, flags=0x0000, dtype=INT_U32, dsz=4, \
+ data_off=116
+ voistatdata: 0</pre>
+</div>
+<p class="Pp">Note: The &quot;\&quot; present in the rendered output above
+ indicates a manual line break inserted to keep the man page within 80
+ columns and is not part of the actual output.</p>
+</section>
+<section class="Ss">
+<h2 class="Ss" id="Locking"><a class="permalink" href="#Locking">Locking</a></h2>
+<p class="Pp">The <code class="Nm">stats</code> framework does not provide any
+ concurrency protection at the individual blob level, instead requiring that
+ consumers guarantee mutual exclusion when calling API functions that
+ reference a non-template blob.</p>
+<p class="Pp">The list of templates is protected with a
+ <a class="Xr">rwlock(9)</a> in-kernel, and <a class="Xr">pthread(3)</a> rw
+ lock in user space to support concurrency between template management and
+ blob initialization operations.</p>
+</section>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN
+ VALUES</a></h1>
+<p class="Pp"><code class="Fn">stats_tpl_alloc</code>() returns a runtime-stable
+ template slot ID on success, or a negative errno on failure. -EINVAL is
+ returned if any problems are detected with the arguments. -EEXIST is
+ returned if an existing template is registered with the same name. -ENOMEM
+ is returned if a required memory allocation fails.</p>
+<p class="Pp"><code class="Fn">stats_tpl_fetch_allocid</code>() returns a
+ runtime-stable template slot ID, or negative errno on failure. -ESRCH is
+ returned if no registered template matches the specified name and/or
+ hash.</p>
+<p class="Pp"><code class="Fn">stats_tpl_fetch</code>() returns 0 on success, or
+ ENOENT if an invalid <var class="Fa">tpl_id</var> is specified.</p>
+<p class="Pp"><code class="Fn">stats_tpl_id2name</code>() returns 0 on success,
+ or an errno on failure. EOVERFLOW is returned if the length of
+ <var class="Fa">buf</var> specified by <var class="Fa">len</var> is too
+ short to hold the template's name. ENOENT is returned if an invalid
+ <var class="Fa">tpl_id</var> is specified.</p>
+<p class="Pp"><code class="Fn">stats_tpl_sample_rollthedice</code>() returns a
+ valid template slot id selected from <var class="Fa">rates</var> or -1 if a
+ NULL selection was made, that is no stats collection this roll.</p>
+<p class="Pp"><code class="Fn">stats_tpl_add_voistats</code>() return 0 on
+ success, or an errno on failure. EINVAL is returned if any problems are
+ detected with the arguments. EFBIG is returned if the resulting blob would
+ have exceeded the maximum size. EOPNOTSUPP is returned if an attempt is made
+ to add more VOI stats to a previously configured VOI. ENOMEM is returned if
+ a required memory allocation fails.</p>
+<p class="Pp"><code class="Fn">stats_voi_update_abs_&lt;dtype&gt;</code>() and
+ <code class="Fn">stats_voi_update_rel_&lt;dtype&gt;</code>() return 0 on
+ success, or EINVAL if any problems are detected with the arguments.</p>
+<p class="Pp"><code class="Fn">stats_blob_init</code>() returns 0 on success, or
+ an errno on failure. EINVAL is returned if any problems are detected with
+ the arguments. EOVERFLOW is returned if the template blob's
+ <var class="Fa">cursz</var> is larger than the <var class="Fa">maxsz</var>
+ of the blob being initialized.</p>
+<p class="Pp"><code class="Fn">stats_blob_alloc</code>() returns a pointer to a
+ newly allocated and initialized blob based on the specified template with
+ slot ID <var class="Fa">tpl_id</var>, or NULL if the memory allocation
+ failed.</p>
+<p class="Pp"><code class="Fn">stats_blob_clone</code>() and
+ <code class="Fn">stats_blob_snapshot</code>() return 0 on success, or an
+ errno on failure. EINVAL is returned if any problems are detected with the
+ arguments. ENOMEM is returned if the SB_CLONE_ALLOCDST flag was specified
+ and the memory allocation for <var class="Fa">dst</var> fails. EOVERFLOW is
+ returned if the src blob's <var class="Fa">cursz</var> is larger than the
+ <var class="Fa">maxsz</var> of the <var class="Fa">dst</var> blob.</p>
+<p class="Pp"><code class="Fn">stats_blob_visit</code>() returns 0 on success,
+ or EINVAL if any problems are detected with the arguments.</p>
+<p class="Pp"><code class="Fn">stats_blob_tostr</code>() and
+ <code class="Fn">stats_voistatdata_tostr</code>() return 0 on success, or an
+ errno on failure. EINVAL is returned if any problems are detected with the
+ arguments, otherwise any error returned by
+ <code class="Fn">sbuf_error</code>() for <var class="Fa">buf</var> is
+ returned.</p>
+<p class="Pp"><code class="Fn">stats_voistat_fetch_dptr</code>() returns 0 on
+ success, or EINVAL if any problems are detected with the arguments.</p>
+<p class="Pp"><code class="Fn">stats_voistat_fetch_&lt;dtype&gt;</code>()
+ returns 0 on success, or an errno on failure. EINVAL is returned if any
+ problems are detected with the arguments. EFTYPE is returned if the
+ requested data type does not match the blob's data type for the specified
+ <var class="Fa">voi_id</var> and <var class="Fa">stype</var>.</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE
+ ALSO</a></h1>
+<p class="Pp"><a class="Xr">errno(2)</a>, <a class="Xr">arb(3)</a>,
+ <a class="Xr">qmath(3)</a>, <a class="Xr">tcp(4)</a>,
+ <a class="Xr">sbuf(9)</a></p>
+<p class="Pp"><cite class="Rs"><span class="RsA">Ted Dunning</span> and
+ <span class="RsA">Otmar Ertl</span>, <span class="RsT">Computing Extremely
+ Accurate Quantiles Using t-digests</span>,
+ <a class="RsU" href="https://github.com/tdunning/t-digest/raw/master/docs/t-digest-paper/histo.pdf">https://github.com/tdunning/t-digest/raw/master/docs/t-digest-paper/histo.pdf</a>.</cite></p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1>
+<p class="Pp">The <code class="Nm">stats</code> framework first appeared in
+ <span class="Ux">FreeBSD 13.0</span>.</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1>
+<p class="Pp">The <code class="Nm">stats</code> framework and this manual page
+ were written by <span class="An">Lawrence Stewart</span>
+ &#x27E8;lstewart@FreeBSD.org&#x27E9; and sponsored by Netflix, Inc.</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="CAVEATS"><a class="permalink" href="#CAVEATS">CAVEATS</a></h1>
+<p class="Pp">Granularity of timing-dependent network statistics, in particular
+ TCP_RTT, depends on the <code class="Dv">HZ</code> timer. To minimize the
+ measurement error avoid using HZ lower than 1000.</p>
+</section>
+</div>
+<table class="foot">
+ <tr>
+ <td class="foot-date">December 2, 2019</td>
+ <td class="foot-os">FreeBSD 15.0</td>
+ </tr>
+</table>