<!-- Module User's Guide -->

<chapter>
	
	<title>&adminguide;</title>
	
	<section>
	<title>Overview</title>
	<para>
		This module helps developers to benchmark their module functions. By adding
		this module's functions via the configuration file or through its API, OpenSER
		can log profiling information for every function.
	</para>
	<para>
		The duration between calls to start_timer and log_timer is stored and logged
		via &openser;'s logging facility. Please note that all durations are given as
		microseconds (don't confuse with milliseconds!).
	</para>
	</section>
	<section>
	<title>Dependencies</title>
	<section>
		<title>&openser; Modules</title>
		<para>
		The following modules must be loaded before this module:
			<itemizedlist>
			<listitem>
			<para>
				<emphasis>No dependencies on other &openser; modules</emphasis>.
			</para>
			</listitem>
			</itemizedlist>
		</para>
	</section>
	<section>
		<title>External Libraries or Applications</title>
		<para>
		The following libraries or applications must be installed before running
		&openser; with this module loaded:
			<itemizedlist>
			<listitem>
			<para>
				<emphasis>None</emphasis>.
			</para>
			</listitem>
			</itemizedlist>
		</para>
	</section>
	</section>
	<section>
	<title>Exported Parameters</title>

	<section>
		<title><varname>enable</varname> (int)</title>
		<para>
			Even when the module is loaded, benchmarking is not enabled
			per default. This variable may have three different values:
			<itemizedlist>
			<listitem>
			<para>
				-1 - Globally disable benchmarking
			</para>
			</listitem>
			<listitem>
			<para>
				0 - Enable per-timer enabling. Single timers are inactive by default
				and can be activated through the MI interface as soon as that feature is
				implemented.
			</para>
			</listitem>
			<listitem>
			<para>
				1 - Globally enable benchmarking
			</para>
			</listitem>
			</itemizedlist>
		</para>
		<para>
		<emphasis>
			Default value is <quote>0</quote>.
		</emphasis>
		</para>
		<example>
		<title>Set <varname>enable</varname> parameter</title>
		<programlisting format="linespecific">
...
modparam("benchmark", "enable", 1)
...
</programlisting>
		</example>
	</section>

	<section>
		<title><varname>granularity</varname> (int)</title>
		<para>
			Logging normally is not done for every reference to the log_timer()
			function, but only every n'th call. n is defined through this variable.
			A sensible granularity seems to be 100.
		</para>
		<para>
		<emphasis>
			Default value is <quote>100</quote>.
		</emphasis>
		</para>
		<example>
		<title>Set <varname>granularity</varname> parameter</title>
		<programlisting format="linespecific">
...
modparam("benchmark", "granularity", 500)
...
</programlisting>
		</example>
	</section>

	<section>
		<title><varname>loglevel</varname> (int)</title>
		<para>
			Set the log level for the benchmark logs. These levels should be used:
			<itemizedlist>
			<listitem><para>-3 - L_ALERT</para></listitem>
			<listitem><para>-2 - L_CRIT</para></listitem>
			<listitem><para>-1 - L_ERR</para></listitem>
			<listitem><para>1 - L_WARN</para></listitem>
			<listitem><para>2 - L_NOTICE</para></listitem>
			<listitem><para>3 - L_INFO</para></listitem>
			<listitem><para>4 - L_DBG</para></listitem>
			</itemizedlist>
		</para>
		<para>
		<emphasis>
			Default value is <quote>3</quote> (L_INFO).
		</emphasis>
		</para>
		<example>
		<title>Set <varname>loglevel</varname> parameter</title>
		<programlisting format="linespecific">
...
modparam("benchmark", "loglevel", 4)
...
</programlisting>
		</example>
		<para>
		This will set the logging level to L_DBG.
		</para>
	</section>

	</section>
	<section>
	<title>Exported Functions</title>
	<section>
		<title>
		<function moreinfo="none">bm_start_timer(name)</function>
		</title>
		<para>
		Start timer <quote>name</quote>. A later call to
		<quote>bm_log_timer()</quote> logs this timer..
		</para>
		<example>
		<title><function>bm_start_timer</function> usage</title>
		<programlisting format="linespecific">
...
bm_start_timer("test");
...
</programlisting>
		</example>
	</section>

	<section>
		<title>
		<function moreinfo="none">bm_log_timer(name)</function>
		</title>
		<para>
			This function logs the timer with the given ID. The following data are
			logged:
			<itemizedlist>
				<listitem>
					<para><emphasis>Last msgs</emphasis> is the number of calls in the last logging interval. This equals the granularity variable.
					</para>
				</listitem>
			</itemizedlist>
			<itemizedlist>
				<listitem>
					<para><emphasis>Last sum</emphasis> is the accumulated duration in the current logging interval (i.e. for the last <quote>granularity</quote> calls).
					</para>
				</listitem>
			</itemizedlist>
			<itemizedlist>
				<listitem>
					<para><emphasis>Last min</emphasis> is the minimum duration between start/log_timer calls during the last interval.
					</para>
				</listitem>
			</itemizedlist>
			<itemizedlist>
				<listitem>
					<para><emphasis>Last max</emphasis> - maximum duration.
					</para>
				</listitem>
			</itemizedlist>
			<itemizedlist>
				<listitem>
					<para><emphasis>Last average</emphasis> is the average duration between
					bm_start_timer() and bm_log_timer() since the last logging.
					</para>
				</listitem>
			</itemizedlist>
			<itemizedlist>
				<listitem>
					<para><emphasis>Global msgs</emphasis> number of calls to log_timer.
					</para>
				</listitem>
			</itemizedlist>
			<itemizedlist>
				<listitem>
					<para><emphasis>Global sum</emphasis> total duration in microseconds.
					</para>
				</listitem>
			</itemizedlist>
			<itemizedlist>
				<listitem>
					<para><emphasis>Global min</emphasis>... You get the point. :)
					</para>
				</listitem>
			</itemizedlist>
			<itemizedlist>
				<listitem>
					<para><emphasis>Global max</emphasis> also obvious.
					</para>
				</listitem>
			</itemizedlist>
			<itemizedlist>
				<listitem>
					<para><emphasis>Global avg</emphasis> possibly the most interesting value.
					</para>
				</listitem>
			</itemizedlist>
		</para>
		<example>
		<title><function>bm_log_timer</function> usage</title>
		<programlisting format="linespecific">
...
bm_log_timer("test");
...
</programlisting>
		</example>
	</section>
	</section>

	<section>
		<title>Exported pseudo-variables</title>
		<para>
		Exported pseudo-variables are listed in the next sections.
		</para>
		<section>
		<title>$BM_time_diff</title>
			<para>
			<emphasis>$BM_time_diff</emphasis> - the time difference
			elapsed between calls of bm_start_timer(name) and
			bm_log_timer(name). The value is 0 if no bm_log_timer()
			was called.
			</para>
		</section>
	</section>

	<section>
		<title>Exported MI Functions</title>
		<section>
			<title><function moreinfo="none">bm_enable_global</function></title>
			<para>
				Enables/disables the module. Parameter may be -1, 0 or 1. See
				discription of "enable" parameter.
			</para>
		</section>
		<section>
			<title><function moreinfo="none">bm_enable_timer</function></title>
			<para>
				Enable or disable a single timer. The following example enables
				timer "test" (the second parameter must be 0 to disable):
			</para>
			<example>
				<title>Enabling a timer</title>
				<programlisting format="linespecific">
...
kamctl fifo bm_enable_timer test 1
...
</programlisting>
			</example>
		</section>
		<section>
			<title><function moreinfo="none">bm_granularity</function></title>
			<para>
				Modifies the benchmarking granularity. See "granularity" variable.
			</para>
		</section>
		<section>
			<title><function moreinfo="none">bm_loglevel</function></title>
			<para>
				Modifies the module log level. See "loglevel" variable.
			</para>
		</section>
	</section>

	<section>
		<title>Example of usage</title>
		<para>
		Measure the duration of user location lookup.
		</para>
		<example>
			<title>benchmark usage</title>
			<programlisting format="linespecific">
...
bm_start_timer("usrloc-lookup");
lookup("location");
bm_log_timer("usrloc-lookup");
...
</programlisting>
		</example>
	</section>
</chapter>