PMWEBAPI man page

PMWEBAPI — introduction to the Performance Metrics Web Application Programming Interface

Overview

The PMWEBAPI interface is a binding of a subset of the PMAPI to the web.  It uses HTTP as transport, REST as organizational style for request/parameter encoding (the GET and POST methods are interchangeable), and JSON as response encoding.  A context identifier is used as a persistent way to refer to PMAPI contexts across related web requests.  These context identifiers expire after a configurable period of disuse.  

Errors generally result in HTTP-level error responses. An Access-Control-Allow-Origin: * header is added to all JSON responses.

CONTEXT CREATION: pmNewContext

To create a new web context identifier, a web client invokes:

/pmapi/context?hostname=STRING
/pmapi/context?hostspec=STRING

Creates a PM_CONTEXT_HOST PMAPI context with the given host name and/or extended specification.  If the host specification contains a userid/password combination, then the corresponding PMAPI context operations will require HTTP Basic authentication credentials with matching userid/password.

/pmapi/context?archivefile=ARCHIVE

Creates a PM_CONTEXT_ARCHIVE PMAPI context with the given file name.  Only metrics from the given archive are available.

In addition, the web client may add the parameter &polltimeout=MMMM for a maximum interval (in seconds) between expected accesses to the given context.  This value is limited by pmwebd configuration, and is a courtesy to allow pmwebd to free up memory earlier in case of sudden web application shutdown.

If successful, the response from these requests is a JSON document of the form:

{ "context" : NNNNN }

The number (a 32-bit unsigned decimal) is then used in all later operations.

CONTEXT CREATION: configurable permanent contexts

In addition, permanent contexts may be created by pmwebd at initialization using its -h, -a, -L command line options, so that a set of fixed NNNNN numbers may be made available to web clients.

Pmapi Operations

The general form of the requests is as follows: /pmapi/NNNNN/OPERATION where

/pmapi

is the fixed prefix for all PMWEBAPI operations,

NNNNN

is a PMWEBAPI context number returned from a context-creation call, or assigned permanently at pmwebd startup, and

OPERATION?PARAM1=VALUE2&PARAM2=VALUE2

identifies the operation and its URL-encoded parameters.  Some parameters may be optional.

METRIC METADATA: pmLookupName, pmLookupDesc, pmLookupText, pmTraversePMNS_r

The general form of the requests is as follows:

/pmapi/NNNNN/_metric

Traverse the entire Performance Metrics Name Space (PMNS).

/pmapi/NNNNN/_metric?prefix=NAME

Traverse the subtree of PMNS with the prefix NAME.

The response is a JSON document that provides the metric metadata as an array.  For example:

{ "metrics": [ 
    { "name":"foo.bar", "pmID":PPPP, "indom":DDDD,
      "type":"32", "sem":"instant", "units":"MHz",
      "text-oneline":"foo bar", "text-help":"blah blah blah" },
    { "name":"foo.bar2", ... }
    ...
  ] }

Most of the fields are self-explanatory.

name

A name for the metric as defined in the PMNS. If the PMNS contains multiple names associated with the metric's Performance Metric Identifier (PMID), one of these will be returned via name, but there is no way to determine which of the duplicate names this will be.

PPPP

the PMID

DDDD

the instance domain

type

from pmTypeStr

units

from pmUnitsStr

sem

an abbreviation of the metric semantic:

PM_SEM_COUNTER  "counter"
PM_SEM_INSTANT  "instant"
PM_SEM_DISCRETE "discrete"

METRIC VALUE: pmFetch

The general form of the requests is as follows:

/pmapi/NNNNN/_fetch?names=NAME1,NAME2

Fetch current values for given named metrics.

/pmapi/NNNNN/_fetch?pmids=PPPP1,PPPP2

Fetch current values for given PMIDs.

If any of the names/pmids are valid, the response is a JSON document that provides the values for all requested metrics, for all their instances.

{ "timestamp": { "s":SEC, "us":USEC },
  "values": [
        { "pmid":PPPP1, "name":"NAME1",
          "instances:" [
               { "instance":IIII1, "value":VALUE1 }
               { "instance":IIII2, "value":VALUE2 }
               ...
          ] },
        { "pmid":PPPP2, "name":"NAME2", ... }
        ...
  ] }

Most of the fields are self-explanatory.  Numeric metric types are represented as JSON integer or floating-point values.  Strings are passed verbatim, except that non-ASCII values are replaced with a Unicode 0xFFFD REPLACEMENT CHARACTER code.  Event type metrics are not currently supported.

INSTANCE DOMAINS METADATA: pmGetInDom, pmNameInDom, pmLookupInDom

The general form of the requests is as follows:

/pmapi/NNNN/_indom?indom=DDDD

List instances of the given instance domain.

/pmapi/NNNN/_indom?name=NAME

List instances of the instance domain belonging to the named metric.

In addition, either query may be suffixed with:

&instance=IIII,JJJJ

Restrict listings to given instance code numbers.

&iname=INAME1,INAME2

Restrict listings to given instance names.

The response is a JSON document that provides the metric metadata as an array.  For example:

{ "indom":DDDD,
   "instances": [
      { "instance":IIII, "name":"INAME" }
      ...
   ] }

INSTANCE PROFILE: pmAddProfile, pmDelProfile

The general form of these requests is as follows:

/pmapi/NNNN/_profile_reset?indom=DDDD

These are not currently supported.

/pmapi/NNNN/_profile_add?indom=DDDD&instance=IIII,JJJJ

These are not currently supported.

/pmapi/NNNN/_profile_add?indom=DDDD&iname=IIII,JJJJ

These are not currently supported.

/pmapi/NNNN/_profile_del?indom=DDDD&instance=JJJJ

These are not currently supported.

/pmapi/NNNN/_profile_del?indom=DDDD&iname=INAME1,INAME2

These are not currently supported.

METRIC STORE: pmStore

The general form of these requests is as follows:

/pmapi/NNNN/_store?name=NAME&value=VALUE

Store a new value for given named metrics.

/pmapi/NNNNN/_store?pmid=PPPP&value=VALUE

Store a new value for given performance metric identifier (PMID).

In addition, either query may be suffixed with:

&instance=IIII,JJJJ

Restrict store to given instance code numbers.

&iname=INAME1,INAME2

Restrict store to given instance names.

If successful, the response from these requests is a JSON document of the form:

{ "success" : true }

DERIVED METRICS: pmRegisterDerived

/pmapi/NNNNN/_derive?name=NAME&expr=EXPRESSION

These are not currently supported.

CONTEXT COPY: pmDupContext

/pmapi/NNNNN/copy

These are not currently supported.

CONTEXT CLOSE: pmDestroyContext

/pmapi/NNNNN/destroy

This is not likely to be supported, as it is destructive and would offer a tempting target to brute-force attackers.  Instead, the pmwebd timeout is used to automatically free unused contexts.

Prometheus

Prometheus exporting of live metrics from a preexisting PMWEBAPI context is available:

The general form of the requests is:

/pmapi/NNNNN/metrics?target=NAME1,NAME2,...

Fetch current values for given named metrics.

For all numeric metrics with the given NAME prefixes, create a prometheus text export format giving their current value and related metadata.  The response has text/plain type rather than JSON, and is designed to be ingested by a Prometheus server, or pcp's own pmdaprometheus.

The native PCP metric metadata (metric name, semantics and units) are first output with the # PCP prefix. If the units string is empty, then none is output. The units metadata string may contain spaces and extends to the end of the line. Prometheus metric types are heuristically inferred from PCP metric types, and units/scales are converted to base seconds/bytes/count if possible, with a corresponding suffix added to the metric name. PCP metric names are mapped so that . are exchanged with :.  Instance domain instances are represented as Prometheus labels with quoted instance names.

# PCP proc.nprocs instant none
# HELP proc:nprocs instantaneous number of processes
# TYPE proc:nprocs gauge
proc:nprocs 7

# PCP kernel.pernode.cpu.intr counter millisec
# HELP kernel:pernode:cpu:intr_seconds_total total interrupt CPU time from /proc/stat for each node
# TYPE kernel:pernode:cpu:intr_seconds_total counter
kernel:pernode:cpu:intr_seconds_total{instance="node0"} 25603.540000000001

# PCP filesys.blocksize instant byte
# HELP filesys:blocksize_bytes Size of each block on mounted filesystem (Bytes)
# TYPE filesys:blocksize_bytes gauge
filesys:blocksize_bytes{instance="/dev/mapper/docker-253:0-83713-9a130460b46163fcf4443710db3159dea6bb5ec2aaca108515839a7a28c191ce"} 4096
filesys:blocksize_bytes{instance="/dev/mapper/VolGroup00-root17"} 4096

Graphite

When enabled, pmwebd can emulate a subset of the graphite web-api to allow web applications like graphite and grafana to extract data from all archives under the configured -A directory.  The graphite namespace is constructed from the PCP archives using a simple mapping that encodes the Cartesian product of archives, metrics, and instance-domain instances into dot-separated strings.  Some metacharacter-quoting is employed to encode general strings into components.  Only numeric PCP metrics are exposed; COUNTER semantic values are rate-converted.

position number purpose
1 1 encoded pathname of the archive .meta file (default),
or canonicalized archive hostname (-J mode)
2 N the N components of the pcp metric name
N+2 1 instance name of the metric (if any)

Since glob wildcarding is supported within metric name components, using them in the first component (an encoding of the archive name) is a good way to identify machines, or to match multiple archives spanning times of interest.

We list here only the broadest outline of the supported calls.  pmwebd does not support every graphite web-api option, so many querystring parameters may be ignored.  Arithmetic/statistical functions on metrics are not supported.

/graphite/render?format=json&target=FOO&from=TIME&until=TIME

Return a series of values of the given metrics, between the two times, sampled every 60 seconds.

/graphite/rawdata?target=FOO.BAR&from=TIME&until=TIME

Same, with a slightly different result encoding.

/graphite/render?format=png&target=FOO&from=TIME&until=TIME&....

Same, but render the curves into a PNG image file.  Several color- and rendering-control-related parameters are supported.

/graphite/metrics/find?query=FOO.BAR.*

Provide incremental metric-tree traversal using wildcards.

/graphite/graphlot/findmetric?query=FOO+BAR

Search through metrics with space-separated regular expressions.

/graphite/browser/search?q=FOO+BAR

Same, with a slightly different result encoding.

See Also

PCPIntro(1), PCPIntro(3), pmwebd(1), http://graphite.readthedocs.org/ and PMAPI(3)

Referenced By

pmhttpClientFetch(3), pmwebd(1).

PCP Performance Co-Pilot