pmfetch(3) — Linux manual page

NAME | C SYNOPSIS | DESCRIPTION | COMPATIBILITY | SEE ALSO | DIAGNOSTICS | ENVIRONMENT | COLOPHON

PMFETCH(3)               Library Functions Manual              PMFETCH(3)

NAME         top

       pmFetch - get performance metric values

C SYNOPSIS         top

       #include <pcp/pmapi.h>

       int pmFetch(int numpmid, pmID *pmidlist, pmResult **result);

       cc ... -lpcp

DESCRIPTION         top

       Given  a  list  of Performance Metric Identifiers (PMID)s, e.g. as
       constructed by pmLookupName(3), via pmidlist  and  numpmid,  fetch
       the values for these performance metrics.

       A  call  to pmFetch is executed in the context of a source of met‐
       rics, instance profile and collection time, previously established
       by calls to the appropriate context and profile functions,  namely
       some   of   pmNewContext(3),   pmDupContext(3),   pmUseContext(3),
       pmAddProfile(3), pmDelProfile(3) and pmSetMode(3).

       The principal result from pmFetch is returned in the argument  re‐
       sult as a tree, using the following component data structures;

            typedef struct {
                  unsigned int vtype : 8;        /* value type (same as pmDesc.type) */
                  unsigned int vlen : 24;        /* bytes for vtype/vlen + vbuf */
                  char         vbuf[1];          /* one or more values */
            } pmValueBlock;

            typedef struct {
                  int      inst;                 /* instance identifier */
                  union {
                        pmValueBlock *pval;      /* pointer to value-block */
                        int          lval;       /* integer value insitu */
                  } value;
            } pmValue;

            typedef struct {
                  pmID      pmid;                /* metric identifier */
                  int       numval;              /* number of values or error code */
                  int       valfmt;              /* value style, insitu or ptr */
                  pmValue   vlist[1];            /* set of instances/values */
            } pmValueSet;

            /* Result returned by pmFetch() */
            typedef struct {
                  struct timespec timestamp;     /* time stamped by collector */
                  int            numpmid;        /* number of PMIDs */
                  pmValueSet     *vset[1];       /* set of value sets */
            } pmResult;

       To  accommodate  metrics with multiple value instances, the numval
       field indicates how many values are returned  for  each  requested
       PMID.   The  field valfmt in the pmValueSet structure indicates if
       the values for this metric are stored insitu in  the  lval  field,
       i.e.  a 32-bit integer quantity (either int, unsigned int, long or
       unsigned long) or if the values are held  in  associated  pmValue‐
       Block  structures.   The pmValueBlock structure is always used for
       floating point values (float or double) and also accommodates  ar‐
       bitrary sized binary data such as `string-valued' metrics and met‐
       rics with aggregated or complex data types.  The maximum length of
       a  pmValueBlock  buffer is PM_VAL_VLEN_MAX bytes.  If the pmValue‐
       Block format is used, the vtype field indicates the data  type  of
       the  value.   This  field  has the same interpretation as the type
       field in the pmDesc structure, see pmLookupDesc(3).

       Note that the insitu value may be a signed or unsigned 32 bit  in‐
       teger, signed or unsigned 32 bit long value (on 32 bit platforms),
       In  the  special  cases  described  below, it may also be a 32 bit
       floating point value.  If the application needs to know  the  type
       of  an insitu value, which is almost always the case, it is neces‐
       sary to fetch the descriptor for the metric and interpret the type
       field, as described in detail in pmLookupDesc(3).  When the  pmRe‐
       sult  is received from a PCP1.x pmcd, insitu values may also be 32
       bit floating point values (of type PM_TYPE_FLOAT).  In all  cases,
       it is good practice to use pmLookupDesc(3) to fetch the descriptor
       for  the  metric  and interpret the type field therein.  Note also
       that the PMAPI(3) will automatically  translate  from  the  PCP2.0
       format  to  the PCP1.x format when a PCP1.x client requests 32 bit
       floating point values from a PCP2.0 pmcd, but the reverse transla‐
       tion does not occur (because the PCP2.0 pmcd cannot  automatically
       distinguish  between arbitrary 32 bit floating point values and 32
       bit integers).

       If one value (i.e. associated with a particular  instance)  for  a
       requested  metric  is  `unavailable' (at the requested time), then
       there is no associated pmValue structure in the result.  If  there
       are no available values for a metric, then numval will be zero and
       the  associated  pmValue[] instance will be empty (valfmt is unde‐
       fined in these circumstances, however pmid will be  correctly  set
       to the PMID of the metric with no values).

       As  an extension of this protocol, if the Performance Metrics Col‐
       lection System (PMCS) is able to provide a reason  why  no  values
       are  available for a particular metric, this is encoded as a stan‐
       dard error code in the  corresponding  numval.   Since  the  error
       codes  are  all  negative,  values for a requested metric are `un‐
       available' if numval is less than, or equal to, zero.   A  perfor‐
       mance metric's value may be `unavailable' for a number of reasons;
       the  following  list  is  illustrative  but not exhaustive: of the
       software for the associated Performance Metric Domain

       +      Collection is not currently activated in the software for
              the associated Performance Metric Domain

       +      The associated PMID is not known

       +      The current system configuration does not include the asso‐
              ciated hardware component and/or the associated software
              module, e.g. a disk is not installed, or off-line, or Ora‐
              cle is not installed

       +      The metric is one for which an instance profile is re‐
              quired, and none was provided (there are a small number of
              metrics in this category, typically ones with very large,
              and/or very dynamic instance domains, and/or expensive met‐
              ric instantiation methods).

       +      If the current context involves fetching metrics from an
              archive, values may be unavailable in the region around a
              <mark> record (see pmlogextract(1)) that indicate a tempo‐
              ral discontinuity in the time-series of metric values.

       In general, we may not be able to differentiate between the vari‐
       ous cases, and if differentiation is not possible, numval will
       simply be zero.

       The argument definition and the result specifications have been
       constructed to ensure that for each PMID in the requested pmidlist
       there is exactly one pmValueSet in the result, and further the
       PMIDs appear in exactly the same sequence in both pmidlist and re‐
       sult.  This makes the number and order of entries in result com‐
       pletely deterministic, and greatly simplifies the application pro‐
       gramming logic after the call to pmFetch.

       The result structure returned by pmFetch is dynamically allocated
       using a combination of malloc(3) calls and specialized allocation
       strategies, and should be released when no longer required by
       calling pmFreeResult(3) - under no circumstances should free(3) be
       called directly to release this space.

       As common error conditions are encoded in the result data struc‐
       ture, we'd expect only cataclysmic events to cause an error value
       to be returned.  One example would be if the metrics source con‐
       text was a remote host, and that host or the PMCS on that host be‐
       came unreachable.  Otherwise the value returned by the pmFetch
       function will be non-negative.

       If the current context involves fetching metrics from a Perfor‐
       mance Metrics Collector Daemon (PMCD), then the return value may
       be used to encode out-of-band changes in the state of the PMCD and
       the associated Performance Metrics Daemon Agents (PMDAs), as a
       bit-wise ``or'' of the following values:

       PMCD_RESTART_AGENT  An attempt has been made to restart at least
                           one failed PMDA.

       PMCD_ADD_AGENT      At least one PMDA has been started.

       PMCD_DROP_AGENT     PMCD has noticed the termination of at least
                           one PMDA.

       PMCD_AGENT_CHANGE   A convenience macro for any of the three PMDA
                           changes.

       PMCD_LABEL_CHANGE   PMCD has been informed of changes to global
                           (context) labels, or new metrics have appeared
                           which have associated labels.

       PMCD_NAMES_CHANGE   PMCD has been informed that the namespace has
                           been modified, such that new metrics have ap‐
                           peared or existing metrics have been removed.

       PMCD_HOSTNAME_CHANGE
                           The hostname on the host where PMCD is running
                           has changed.  This may be the result of
                           changes from temporary to permanent hostname
                           after a system reboot or some subsequent ex‐
                           plicit change to the system's hostname.

       The default is to return zero to indicate no change in state, how‐
       ever the pmResult returned by pmFetch has the same interpretation
       independent of the return value being zero or greater than zero.

COMPATIBILITY         top

       Prior to PCP 7.0 the timestamp field in the pmResult struct was a
       struct timeval.  To support PMAPI transition, the old interface
       and semantics can be used if applications are recompiled with
       -DPMAPI_VERSION=2.

       For a time in PCP 6.x there was a routine with the same semantics
       as the current pmFetch called pmFetchHighRes, and a struct with
       the same definition as the current pmResult struct called pmRe‐
       sultHighRes, although both are now deprecated and compile-time
       support for pmFetchHighRes (and the historically misnamed alias
       pmHighResFetch) and pmResultHighRes will be removed in a future
       release.

SEE ALSO         top

       pmcd(1), pmAddProfile(3), PMAPI(3), pmDelProfile(3),
       pmDupContext(3), pmExtractValue(3), pmFetchArchive(3),
       pmFreeResult(3), pmGetInDom(3), pmLookupDesc(3),
       pmLookupLabels(3), pmLookupName(3), pmNewContext(3), pmSetMode(3),
       pmUseContext(3) and pmWhichContext(3).

       Note that pmFetch is the most primitive method for fetching metric
       values from the PMCS.  See the pmFetchGroup(3) API for a higher
       level method that insulates the user from the intricacies of look‐
       ing up metric names and metadata, setting up instance profiles,
       pmResult traversal, conversions, and scaling.

DIAGNOSTICS         top

       As mentioned above, pmFetch return error codes insitu in the argu‐
       ment result.  If no result is returned, e.g. due to IPC failure
       using the current PMAPI context, or end of file on an archive,
       then these routines will return a negative error code which may be
       examined using pmErrStr(3).

       PM_ERR_EOL
              When fetching records from an archive, pmFetch returns this
              error code to indicate the end of the archive has been
              passed (or the start of the archive has been passed, if the
              direction of traversal is backwards in time).  If the
              ``mode'' for the current PMAPI context (see pmSetMode(3))
              is PM_MODE_INTERP then the time origin is advanced, even
              when this error code is returned.  In this way applications
              that position the time outside the range defined by the
              records in the archive, and then commence to pmFetch will
              eventually see valid results once the time origin moves in‐
              side the temporal span of the archive.

       -EAGAIN
              If the current context involves fetching metrics from pmcd,
              then a return value of -EAGAIN indicates the caller has
              created too many contexts.

ENVIRONMENT         top

       Many of the performance metrics exported from PCP agents have the
       semantics of counter meaning they are expected to be monotonically
       increasing.  Under some circumstances, one value of these metrics
       may be smaller than the previously fetched value.  This can happen
       when a counter of finite precision overflows, or when the PCP
       agent has been reset or restarted, or when the PCP agent is ex‐
       porting values from some underlying instrumentation that is sub‐
       ject to some asynchronous discontinuity.
       The environment variable PCP_COUNTER_WRAP may be set to indicate
       that all such cases of a decreasing ``counter'' should be treated
       as a counter overflow, and hence the values are assumed to have
       wrapped once in the interval between consecutive samples.  This
       ``wrapping'' behavior was the default in earlier PCP versions, but
       by default has been disabled in PCP version 1.3 and later.

COLOPHON         top

       This page is part of the PCP (Performance Co-Pilot) project.  In‐
       formation about the project can be found at ⟨http://www.pcp.io/⟩.
       If you have a bug report for this manual page, send it to
       pcp@groups.io.  This page was obtained from the project's upstream
       Git repository ⟨https://github.com/performancecopilot/pcp.git⟩ on
       2025-08-11.  (At that time, the date of the most recent commit
       that was found in the repository was 2025-08-11.)  If you discover
       any rendering problems in this HTML version of the page, or you
       believe there is a better or more up-to-date source for the page,
       or you have corrections or improvements to the information in this
       COLOPHON (which is not part of the original manual page), send a
       mail to man-pages@man7.org

Performance Co-Pilot               PCP                         PMFETCH(3)

Pages that refer to this page: pmdaopenmetrics(1)pmgenmap(1)pmstore(1)pcpintro(3)pmaddprofile(3)pmapi(3)__pmcontrollog(3)pmconvscale(3)pmdafetch(3)pmdelprofile(3)pmextractvalue(3)pmfetcharchive(3)pmfreeresult(3)pmgetarchiveend(3)pmgetcontexthostname(3)pmgetderivedcontrol(3)pmlookuplabels(3)pmnewcontext(3)pmnewcontextzone(3)pmprintvalue(3)pmregisterderived(3)pmsetmode(3)pmsortinstances(3)pmstore(3)pmwebapi(3)QmcIndom(3)LOGARCHIVE(5)