pmdainit(3)

NAME

   pmdaInit, pmdaRehash, pmdaSetFlags - initialize a PMDA

C SYNOPSIS

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

   void pmdaInit(pmdaInterface *dispatch, pmdaIndom *indoms, int nindoms,
           pmdaMetric *metrics, int nmetrics);
   void pmdaRehash(pmdaExt *pmda, pmdaMetric *metrics, int nmetrics);
   void pmdaSetFlags(pmdaInterface *dispatch, int flags);

   cc ... -lpcp_pmda -lpcp

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.

   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.

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} }, }
        };

   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.

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.

   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.

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.

   pmdaInit may issue any of these messages:

   PMDA interface version interface not supported
                  The interface version is not supported by pmdaInit.

   Using pmdaFetch() but fetch call back not set
                  The fetch callback, pmdaFetch(3), requires an additional
                  callback to be provided using pmdaSetFetchCallBack(3).

   Illegal instance domain inst for metric pmid
                  The  instance  domain inst that was specified for metric
                  pmid is not within the  range  of  the  instance  domain
                  table.

   No help text path specified
                  The  help  text  callback,  pmdaText(3), requires a help
                  text file for the metrics to have been  opened,  however
                  no path to the help text was specified as a command line
                  option,   or   as   an   argument   to   pmdaDSO(3)   or
                  pmdaDaemon(3).  This message is only a warning.

   Direct mapping for metrics disabled @ num
                  The  unit  numbers  of the metrics did not correspond to
                  the index in the metric description table.   The  direct
                  mapping  failed  for  metric  number  num in the metrics
                  table.  This is less efficient but is not fatal and  the
                  message is only a warning.

   Hashed mapping for metrics disabled @ num
                  A  memory allocation failure occurred while building the
                  hash table to index the metric description table.   This
                  is  a  non-fatal  warning message - a fallback to linear
                  searching will be automatically  performed  should  this
                  situation arise.

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).



Opportunity


Personal Opportunity - Free software gives you access to billions of dollars of software at no cost. Use this software for your business, personal use or to develop a profitable skill. Access to source code provides access to a level of capabilities/information that companies protect though copyrights. Open source is a core component of the Internet and it is available to you. Leverage the billions of dollars in resources and capabilities to build a career, establish a business or change the world. The potential is endless for those who understand the opportunity.

Business Opportunity - Goldman Sachs, IBM and countless large corporations are leveraging open source to reduce costs, develop products and increase their bottom lines. Learn what these companies know about open source and how open source can give you the advantage.


Free Software


Free Software provides computer programs and capabilities at no cost but more importantly, it provides the freedom to run, edit, contribute to, and share the software. The importance of free software is a matter of access, not price. Software at no cost is a benefit but ownership rights to the software and source code is far more significant.

Free Office Software - The Libre Office suite provides top desktop productivity tools for free. This includes, a word processor, spreadsheet, presentation engine, drawing and flowcharting, database and math applications. Libre Office is available for Linux or Windows.


Free Books


The Free Books Library is a collection of thousands of the most popular public domain books in an online readable format. The collection includes great classical literature and more recent works where the U.S. copyright has expired. These books are yours to read and use without restrictions.

Source Code - Want to change a program or know how it works? Open Source provides the source code for its programs so that anyone can use, modify or learn how to write those programs themselves. Visit the GNU source code repositories to download the source.


Education


Study at Harvard, Stanford or MIT - Open edX provides free online courses from Harvard, MIT, Columbia, UC Berkeley and other top Universities. Hundreds of courses for almost all major subjects and course levels. Open edx also offers some paid courses and selected certifications.

Linux Manual Pages - A man or manual page is a form of software documentation found on Linux/Unix operating systems. Topics covered include computer programs (including library and system calls), formal standards and conventions, and even abstract concepts.