pmdaInit (3) - Linux Manuals
pmdaInit: initialize a PMDA
NAME
pmdaInit, pmdaRehash, pmdaSetFlags - initialize a PMDAC SYNOPSIS
#include <pcp/pmapi.h>#include <pcp/impl.h>
#include <pcp/pmda.h>
Much of the
pmdaInterface
structure can be automatically initialized with
pmdaDaemon(3),
pmdaGetOpt(3)
and
pmdaDSO(3).
pmdaInit
completes the PMDA initialization phase with three operations.
The first operation adds the domain and instance numbers to the instance and
metric tables. Singular metrics (metrics without an instance domain) should
have the instance domain
PM_INDOM_NULL
set in the
indom
field of the
pmDesc
structure (see
pmLookupDesc(3)).
Metrics with an instance domain should set this field to be the serial number
of the instance domain in the
indoms
table.
The instance domain table may be made empty by setting
indoms
to NULL and
nindoms
to 0.
This allows the caller to provide custom Fetch and Instance callback functions.
The metric table may be made empty by setting
metrics
to NULL and
nmetrics
to 0.
This allows the caller to provide custom Fetch and Descriptor callback functions.
The metric description table defines metric A with no instance domain,
metric B with instance domain X and metric C with instance domain Y. Metric
C has units of seconds, while the other metrics have no units (simple counters).
pmdaInit
will take these structures and assign the
PMDA(3)
domain number to the
it_indom
field of each instance domain. This identifier also replaces the
indom
field of all metrics which have that instance domain, so that they are
correctly associated.
The second stage opens the
help text file, if one was specified with the
-h
command line option (see
pmdaGetOpt(3))
or as a
helptext
argument to
pmdaDSO(3)
or
pmdaDaemon(3).
The final stage involves preparing the metric table lookup strategy.
If all of the metric PMID item numbers correspond to the position
in the
metrics
table, then direct mapping is used.
This is the most efficient of the lookup functions as it involves
a direct array index (no additional memory is required nor any
additional processing overhead).
If the PMID numbering requirement is met by the PMDA, it is ideal.
This strategy can be explicitly requested by calling
pmdaSetFlags(pmda, PMDA_FLAG_EXT_DIRECT)
before calling
pmdaInit.
In this case, if the direct mapping is not possible (e.g. due to
an oversight on the part of the PMDA developer), a warning is
logged and the linear strategy is used instead.
The second strategy (linear search) is the default, when a direct
mapping cannot be established.
This provides greater flexibility in the PMID numbering scheme,
as the PMDA item numbers do not have to be unique (hence, the PMID
cluster numbers can be used more freely, which is often extremely
convenient for the PMDA developer).
However, lookup involves a linear walk from the start of the metric
table until a matching PMID is found, for each requested PMID in a
request.
The third strategy (hash lookup) can be requested by calling
pmdaSetFlags(pmda, PMDA_FLAG_EXT_HASHED)
before calling
pmdaInit.
This strategy is most useful for PMDAs with large numbers of metrics
(many hundreds, or thousands).
Such PMDAs will almost always use the cluster numbering scheme, so
the direct lookup scheme becomes inappropriate.
They may also be prepared to sacrifice a small amount of additional
memory for a hash table, mapping PMID to metric table offsets, to
speed up lookups in their vast metric tables.
This final strategy can also be used by PMDAs serving up dynamically
numbered metrics.
For this case, the
pmdaRehash
function should be used to replace the metric table when new metrics
become available, or existing metrics are removed.
The PMID hash mapping will be recomputed at the same time that the
new metric table is installed.
pmdaInit
may issue any of these messages:
void pmdaInit(pmdaInterface *dispatch, pmdaIndom *indoms, int
void pmdaRehash(pmdaExt *pmda, pmdaMetric
void pmdaSetFlags(pmdaInterface *dispatch, int flags);
DESCRIPTION
pmdaInit
initializes a PMDA so that it is ready to receive PDUs from
pmcd(1).
The function expects as arguments the instance domain table
(indoms)
and the metric description table
(metrics)
that are initialized by the PMDA. The arguments
nindoms
and
nmetrics
should be set to the number of instances and metrics in the tables,
respectively.
EXAMPLE
For example, a PMDA has three metrics: A, B and C, and two instance
domains X and Y, with two instances in each instance domain. The instance
domain and metrics description tables could be defined as:
static pmdaInstid _X[] = {
{ 0, "X1" }, { 1, "X2" }
};
static pmdaInstid _Y[] = {
{ 0, "Y1" }, { 1, "Y2" }
};
static pmdaIndom indomtab[] = {
#define X_INDOM 0
{ X_INDOM, 2, _X },
#define Y_INDOM 3
{ Y_INDOM, 2, _Y }
};
static pmdaMetric metrictab[] = {
/* A */
{ (void *)0,
{ PMDA_PMID(0,0), PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_INSTANT,
{ 0,0,0,0,0,0} }, },
/* B */
{ (void *)0,
{ PMDA_PMID(0,1), PM_TYPE_U32, X_INDOM, PM_SEM_INSTANT,
{ 0,0,0,0,0,0} }, },
/* C */
{ (void *)0,
{ PMDA_PMID(0,2), PM_TYPE_DOUBLE, Y_INDOM, PM_SEM_INSTANT,
{ 0,1,0,0,PM_TIME_SEC,0} }, }
};
METRIC LOOKUP
When fetch and descriptor requests are made of the PMDA, each
requested PMID must be mapped to a metric table entry.
There are currently three strategies for performing this mapping -
direct, linear and hashed.
Each has its own set of tradeoffs and an appropriate strategy
should be selected for each PMDA.
DIAGNOSTICS
pmdaInit
will set
dispatch->status
to a value less than zero if there is an error that would prevent the
PMDA(3)
from successfully running.
pmcd(1)
will terminate the connection to the
PMDA(3)
if this occurs.
CAVEAT
The PMDA must be using
PMDA_INTERFACE_2
or later, as specified in the call to
pmdaDSO(3)
or
pmdaDaemon(3).
SEE ALSO
newhelp(1),
pmcd(1),
PMAPI(3),
PMDA(3),
pmdaDaemon(3),
pmdaDSO(3),
pmdaFetch(3),
pmdaGetOpt(3),
pmdaText(3)
and
pmLookupDesc(3).