Provided by: libpcp-pmda3-dev_5.3.6-1build1_amd64 bug

NAME

       pmdaInstance - return instance descriptions for a PMDA

C SYNOPSIS

       #include <pcp/pmapi.h>
       #include <pcp/pmda.h>

       int pmdaInstance(pmInDom indom, int inst, char *name, pmInResult **result, pmdaExt *pmda);

       cc ... -lpcp_pmda -lpcp

DESCRIPTION

       pmdaInstance  uses  the  standard  PMDA(3)  data structures to return information concerning the instance
       domain indom.

       The result structure is constructed by pmdaInstance and will contain one or more  instance  names  and/or
       identifiers as specified by the inst and name arguments.

       If  inst  has the value PM_IN_NULL and name is a null string, result will contain all the instances names
       and identifiers in the instance domain.

       If inst is PM_IN_NULL but name is the name of an instance in the instance domain indom, then result  will
       contain  the  instance  identifier  for  instance  name.   Note  that if name contains no spaces, partial
       matching up to the first space in the instance name is performed, i.e.  ``1'' will  match  instance  name
       ``1  minute''.  If name contains an embedded space, then no partial matching is performed and name should
       match one of the instance names exactly.

       If name is a null string but inst is an instance identifier in the instance  domain  indom,  then  result
       will  contain the name for instance inst.  The result structure is allocated with malloc(3) and should be
       released by the caller with free(3).

MULTI-DIMENSIONAL INSTANCE NAMING

       Further to the above description of name, the set of rules describing external instance names is provided
       in the pmdaCacheStore(3) manual page.

       Instance  domains  adds  another  dimension (set of values) to metrics.  However, this may not suffice to
       describe complex multi-dimensional instance domain situations.  For this case  the  approach  used  by  a
       number  of  PMDAs is to structure the external instance names using a delimiter (``/'' or ``::'' are most
       commonly used) to allow separation of the other dimensions.  In this situation,  instance  domain  labels
       should  be  used  to define names for each instance name component.  This allows PMAPI(3) client tools to
       identify and refine value fetches to specific dimensions of interest.

       For example, some of the  Linux  kernel  cgroup  (control  group)  metric  instance  domains  are  multi-
       dimensional.   The  instance  domain  represents  individual  values across both control groups and CPUs,
       making this a two-dimensional instance domain.  The instance names associated with  this  cgroup  metrics
       indom  have  been  structured  using  the  ``::'' delimiter to separate the two dimensions.  The instance
       domain itself has been labeled accordingly, as follows.

       $ pminfo --desc --fetch --labels cgroup.cpuacct.usage_percpu
       cgroup.cpuacct.usage_percpu
            Data Type: 64-bit unsigned int  InDom: 3.22 0xc00016
            Semantics: counter  Units: nanosec
            inst [0 or "/::cpu0"] value 713787
            inst [1 or "/::cpu1"] value 353969
            inst [2 or "/app::cpu0"] value 407816
            inst [3 or "/app::cpu1"] value 202747
            inst [0 or "/::cpu0"] labels {"device_type":"cpu","cgroup":"/","cpu":0}
            inst [1 or "/::cpu1"] labels {"device_type":"cpu","cgroup":"/","cpu":1}
            inst [2 or "/app::cpu0"] labels {"device_type":"cpu","cgroup":"/app","cpu":0}
            inst [3 or "/app::cpu1"] labels {"device_type":"cpu","cgroup":"/app","cpu":1}

       $ pminfo --labels 3.22
       InDom: 3.22 0xc00016
            labels {"device_type":"cpu"}

       As shown above the individual instances inherit the labels from the instance domain, and  the  PMDA  also
       applies  additional  per-instance labels describing individual cgroup and CPU names.  When this model has
       been used by the PMDA, PMAPI clients are able to restrict their queries to the cgroup metric instances  -
       in  the  example,  restricting  to processor "cpu0" using the "cpu" label, perhaps, or to just the "/app"
       cgroup metrics using the "cgroup" label.

       Furthermore, using this labeling  scheme  client  tools  can  also  correlate  related  instances  across
       different instance domains.

       $ pminfo --desc --fetch --labels kernel.percpu.cpu.irq.soft
       kernel.percpu.cpu.irq.soft
            Data Type: 64-bit unsigned int  InDom: 60.0 0xf000000
            Semantics: counter  Units: millisec
            inst [0 or "cpu0"] value 6770
            inst [1 or "cpu1"] value 100
            inst [0 or "cpu0"] labels {"device_type":"cpu"}
            inst [1 or "cpu1"] labels {"device_type":"cpu"}

       $ pminfo --labels 60.0
       InDom: 60.0 0xf000000
            labels {"device_type":"cpu"}

       Although  these  two metrics have different instance domains (60.0 and 3.22 respectively) and are sourced
       from different PMDAs, the "device_type" label identifies the common device to which these values relate.

CAVEAT

       The PMDA  must  be  using  PMDA_INTERFACE_2  or  later,  as  specified  in  the  call  to  pmdaDSO(3)  or
       pmdaDaemon(3).   If  labeling  of  multi-dimensional  instance  names  is  performed,  the  PMDA must use
       PMDA_INTERFACE_7 or later.

       Because of optional partial matching up to the first space in  the  instance  name,  the  PMDA  developer
       should  ensure  that  if  instance names are allowed to have spaces, the names are unique up to the first
       space.

DIAGNOSTICS

       If any errors occur during the execution of pmdaInstance, the result structure is  deallocated.   If  the
       instance domain indom is not supported by the PMDA, pmdaInstance will return PM_ERR_INDOM.

       If  the  inst  or name does not correspond to any instances in the indom domain, pmdaInstance will return
       PM_ERR_INST.

SEE ALSO

       malloc(3), PMAPI(3), PMDA(3), pmdaCacheStore(3), pmdaLabel(3) and pmGetInDom(3).