noble (1) pmdaopenmetrics.1.gz

Provided by: pcp_6.2.0-1.1build4_amd64 bug

NAME

       pmdaopenmetrics - OpenMetrics PMDA

SYNOPSIS

       $PCP_PMDAS_DIR/openmetrics/pmdaopenmetrics  [-D]  [-n] [-c config] [-d domain] [-l logfile] [-r root] [-t
       timeout] [-u user]

DESCRIPTION

       pmdaopenmetrics is a Performance Metrics Domain Agent (PMDA) which dynamically creates PCP  metrics  from
       configured  OpenMetrics  endpoints,  which  provide  HTTP  based access to application metrics.  The PMDA
       essentially implements a bridge between Prometheus and PCP, allowing PCP  to  easily  ingest  performance
       data from more than 650 registered end-points and many other application specific end-points.

       The  default  config  directory  is  $PCP_PMDAS_DIR/openmetrics/config.d/,  see ``CONFIGURATION SOURCES''
       below.  The default URL fetch timeout is 2 seconds.  The default user,  if  not  specified  with  the  -u
       option,  is  the  current  user.   If the -n option is given, the list of configuration files will not be
       sorted prior to processing.  This list is sorted by default but that can be  expensive  if  there  are  a
       large number of configuration files (URLs and/or scripts).

       If  the -D option is given, additional diagnostic messages will be written to the PMDA log file, which is
       $PCP_LOG_DIR/pmcd/openmetrics.log  by  default   (see   also   -lbelow).    In   addition,   the   metric
       openmetrics.control.debug controls the same debug flag and can be set with the following command:
            pmstore openmetrics.control.debug value
       where value is either 1 (to enable verbose log messages) or 0 (to disable verbose log messages).  This is
       particularly useful for examining the http headers passed to each  fetch  request,  filter  settings  and
       other processing details that are logged when the debugging flag is enabled.

       The  -d  option  may be used to override the default performance metrics domain number, which defaults to
       144.  It is strongly recommended not to change this.  The domain number should  be  different  for  every
       PMDA  on  the  one host, and the same domain number should be used for pmdaopenmetrics PMDA on all hosts.
       See also the -r option, which allows the root of the dynamic namespace to be  changed  from  the  default
       openmetrics.

       The -l option may be used to specify logfile as the destination for PMDA messages instead of the default,
       $PCP_LOG_DIR/pmcd/openmetrics.log.  As a special case, logfile may be "-" to send messages to the  stderr
       stream  instead,  e.g.   -l-.   This would normally be the stderr stream for the parent process, pmcd(1),
       which may itself have redirected stderr.  This redirection is normally most  useful  in  a  containerized
       environment, or when using dbpmda(1).

       The  -r  option  allows  the  root  of  the  dynamic  namespace  to  be changed to root from the default,
       openmetrics.  In conjunction with other command line options, this allows pmdaopenmetrics to be  deployed
       as  a  different  PMDA  with distinct metrics namespace and metrics domain on the same host system.  Note
       that all PMDAs require a unique domain number so the -d option must also be specified.   Use  of  the  -r
       option  may  also change the defaults for some other command line options, e.g. the default log file name
       and the default configuration directory.

CONFIGURATION SOURCES

       As it  runs,  pmdaopenmetrics  periodically  recursively  scans  the  $PCP_PMDAS_DIR/openmetrics/config.d
       directory  (or  the  directory  specified  with  the -c option), looking for source URL files (*.url) and
       executable scripts or binaries.  Any files that do not have the .url suffix or are  not  executable,  are
       ignored  -  this  allows documentation files such as "README" and non-executable "common" script function
       definitions to be present without being considered as config files.

       A remote server does not have to be up or stay running - the PMDA tolerates remote URLs that may come and
       go  over  time.  The PMDA will relay data and metadata when/if they are available, and will return errors
       when/if they are down.  PCP metric IDs, internal and external instance domain identifiers  are  persisted
       and  will  be restored when individual metric sources become available and/or when the PMDA is restarted.
       In addition,  the  PMDA  checks  directory  modification  times  and  will  rescan  for  new  or  changed
       configuration  files  dynamically.   It  is  not  necessary  to restart the PMDA when adding, removing or
       changing configuration files.

URL SOURCES

       Each file with the .url suffix found in the config directory or sub-directory contains one complete  HTTP
       or  HTTPS  URL  at  which  pmdaopenmetrics  can  reach a OpenMetrics endpoint.  Local file access is also
       supported with a conventional file:///somepath/somefile  URL,  in  which  case  somepath/somefile  should
       contain openmetrics formatted metric data.

       The  first  line  of a .url config file should be the URL, as described above.  Subsequent lines, if any,
       are prefixed with a keyword that can be used to alter the http GET request.  A keyword must end with  ':'
       (colon) and the text extends to the end of the line.  Comment lines that start with # and blank lines are
       ignored.  The only currently supported keywords are HEADER: and FILTER:.

       HEADER: headername: value ... to end of line
       Adds headername and its value to the headers passed in the http GET request for the configured  URL.   An
       example configuration file that provides 3 commonly used headers and an authentication token might be :

          http://somehost/path/endpoint.html
          # this is a comment
          HEADER: Accept: text/html
          HEADER: Keep-Alive: 300
          HEADER: Connection: keep-alive
          HEADER: Authorization: token ABCDEF1234567890

       As  mentioned above, header values extend to the end of the line.  They may contain any valid characters,
       including colons.  Multiple spaces will be collapsed to a single space, and leading and  trailing  spaces
       are  trimmed.   A common use for headers is to configure a proxy agent and the assorted parameters it may
       require.

METRIC FILTERING

       Metric filtering is a configuration file feature that allows ingested metrics to be included or excluded,
       i.e. filtered.  This is useful because most end-points return multiple metrics, and usually only some are
       interesting for monitoring purposes.  The syntax is:
       FILTER: INCLUDE METRIC regex
       or
       FILTER: EXCLUDE METRIC regex
       Dynamically created metric names that match regex will be either included or excluded in the name  space,
       as  specified.   Note  that  only  the  PMNS  leaf component of the metric name (as ingested from the URL
       source) is compared with the regex pattern.  The simple rule is that the first matching filter regex  for
       a  particular  metric  leaf  name is the rule that prevails.  If no filter regex matches (or there are no
       filters), then the metric is included by default, i.e. the  default  filter  if  none  are  specified  is
       FILTER: INCLUDE METRIC .*  This is backward compatible with older versions of the configuration file that
       did not support filters.  Multiple FILTER: lines would normally be used, e.g. to include some metrics but
       exclude  all  others,  use  FILTER:  EXCLUDE  METRIC  .*  as the last of several filters that include the
       desired metrics.  Conversely, to exclude some metrics but include all others, use FILTER: EXCLUDE  METRIC
       regex.  In this case it's not necessary (though doesn't hurt) to specify the final FILTER: INCLUDE METRIC
       .*  because, as stated above, any metric that does not  match  any  filter  regex  will  be  included  by
       default.

LABEL FILTERING

       Label  filtering  uses  similar  FILTER: syntax and semantics as metric filtering.  FILTER: EXCLUDE LABEL
       regex will delete all labels with label name matching regex from all metrics defined by the configuration
       file.   The  same  rules  as  for  metric filters apply for label filters too - an implicit rule: FILTER:
       INCLUDE LABEL .*  applies to all labels that do  not  match  any  earlier  label  filter  rule.   FILTER:
       OPTIONAL  LABEL  regex  specifies  that  matching  label  names are to be included in the returned metric
       labelsets (i.e. included), but are not to be used as part  of  the  the  external  instance  names.   All
       included  labels that are not optional (i.e. the intrinsic labels) will be concatenated together and used
       for external instance naming.  In addition, non-intrinsic labels (i.e. labels tagged  as  OPTIONAL)  will
       have  the PM_LABEL_OPTIONAL flag set in the labelsets returned by notes callbacks.  This flag affects how
       the labels are used in certain clients.  For further details, see pmLookupLabels(3) and related man pages
       for  further  details.  Note that external instance names begin with the unique numeric internal instance
       identifier followed by a space, so external instance names are always unique.

       Caution is needed with label filtering because by default, all labels  are  used  to  construct  the  PCP
       instance  name.  By excluding some labels (or changing them to optional), the instance names will change.
       In addition, excluding all labels for a particular metric changes that metric to be singular,  i.e.  have
       no  instance  domain.   By  excluding  some  labels,  different instances returned by the URL or scripted
       configuration entry for the same metric may become duplicates.  When  such  duplicates  occur,  the  last
       duplicate  instance  returned  by  the  end-point URL or script prevails over any earlier instances.  For
       these reasons, it is recommended that label filtering rules be configured when the configuration file  is
       first  defined,  and  not changed thereafter.  If a label filtering change is required, the configuration
       file should be renamed, which effectively defines a new metric (or set of peer metrics as returned by the
       URL or script), with the new (or changed) instance naming.

       Unrecognized keywords in configuration files are reported in the PMDA log file but otherwise ignored.

SCRIPTED SOURCES

       Executable  scripts  present in the $PCP_PMDAS_DIR/openmetrics/config.d directory or sub-directories will
       be executed and the stdout stream containing openmetrics formatted metric data will be parsed  as  though
       it had come from a URL or file.  The stderr stream from a script will be sent to the PMDA log file, which
       by default can be found in $(PCP_LOG_DIR)/pmcd/openmetrics.log.

       Note that scripted sources do not support label or metric filtering (as described above for URL  sources)
       -  they  can  simply do their own filtering in the script itself with sed(1), awk(1), or whatever tool is
       desired.

       A simple example of a scripted config entry follows:

          #! /bin/sh
          awk '{
              print("# HELP loadavg local load average")
              print("# TYPE loadavg gauge")
              printf("loadavg {interval=\"1-minute\"} %.2f\n", $1)
              printf("loadavg {interval=\"5-minute\"} %.2f\n", $2)
              printf("loadavg {interval=\"15-minute\"} %.2f\n", $3)
          }' /proc/loadavg

       This script produces the following OpenMetrics-formatted metric data when run:

          # HELP loadavg local load average
          # TYPE loadavg gauge
          loadavg {interval="1-minute"} 0.12
          loadavg {interval="5-minute"} 0.27
          loadavg {interval="15-minute"} 0.54

       If    the    above    script    was    saved    and    made    executable     in     a     file     named
       $PCP_PMDAS_DIR/openmetrics/config.d/local/system.sh  then  this  would  result  in a new PCP metric named
       openmetrics.local.system.loadavg which would have three instances for the current  load  average  values:
       1-minute, 5-minute and 15-minute.

       Scripted  config  entries  may  produce  more  than  one  PCP  leaf  metric name.  For example, the above
       "system.sh" script could also export other metrics such as CPU statistics, by reading /proc/stat  on  the
       local  system.   Such additional metrics would appear as peer metrics in the same PCP metric subtree.  In
       the case of CPU counters, the metric type definition should be counter, not gauge.  For full  details  of
       the                  openmetrics                  exposition                 formats,                 see
       https://github.com/OpenObservability/OpenMetrics/blob/master/specification/OpenMetrics.md.

SELinux CONSIDERATIONS

       Scripted config files are executed by the pmdaopenmetrics PMDA with the same SELinux context  and  policy
       as  the  local  pmcd(1).   For  simple scripts, such as the load average example described above, this is
       normally fine.  However AVC errors may result for scripts that make library  or  system  calls  that  are
       restricted  by  the  prevailing  SELinux  context  and  policies.   In  these cases it is not feasible to
       unilaterally grant pmcd or it's PMDAs an unconfined execution policy.  In these site  specific  cases  it
       will  be  necessary  to  create  a  local  SELinux  policy module.  This can be done by capturing the AVC
       record(s) from the local audit log, generate a local policy module using audit2allow, and then  load  the
       new module using semodule, e.g. as follows :

              $ sudo grep '^type=AVC.*pcp' /var/log/audit/audit.log \
              | audit2allow -M mypolicy
              $ sudo semodule -i mypolicy.pp

       If  these  local  policies  need  to  be persistent across reboots, then a scriptlet similar to the above
       example may be added to the local pmcd RC file (typically /etc/pcp/pmcd/rc.local).  For further  details,
       see audit2allow(1) and semodule(1).

METRIC NAMING

       All metrics from a file named JOB.*  will be exported as PCP metrics with the openmetrics.JOB metric name
       prefix.  Therefore, the JOB name must be a valid non-leaf name for PCP PMNS metric  names.   If  the  JOB
       name  has  multiple  dot-separated components, the resulting PMNS names will include those components and
       care is needed to ensure there are no overlapping definitions, e.g. metrics returned by JOB.response  may
       overlap or conflict with metrics returned by JOB.response.time.

       Config file entries (URLs or scripts) found in subdirectories of the config directory will also result in
       hierarchical      metric      names.       For       example,       a       config       file       named
       $PCP_PMDAS_DIR/openmetrics/config.d/mysource/latency/get.url  will  result  in  metrics being created (by
       fetching that source URL) below openmetrics.mysource.latency.get in the PCP namespace.  Scripts found  in
       subdirectories of the config directory similarly result in hierarchical PCP metric names.

DYNAMIC METRIC NAMES

       As described above, changes and new additions can be made to files in the configuration directory without
       having to restart the PMDA.  These changes are detected automatically and  the  PCP  metric  names  below
       openmetrics  in  the  PMNS will be updated accordingly, i.e. new metrics will be dynamically added and/or
       existing metrics removed.  In addition, pmdaopenmetrics honors the PMCD_NAMES_CHANGE pmFetch(3)  protocol
       that  was introduced in PCP version 4.0.  In particular, if openmetrics metrics are being logged by a PCP
       version 4.0 or later  pmlogger(1),  new  metrics  that  appear  as  a  result  of  changes  in  the  PMDA
       configuration  directory will automatically start to be logged, provided the root of the openmetrics PMDA
       namespace is configured for logging in the pmlogger configuration file.  See pmlogger(1) for details.  An
       example of such a pmlogger configuration file is :

          log mandatory on 2 second {
               # log all metrics below the root of the openmetrics namespace
               openmetrics
          }

METADATA

       Metric  data returned by URL or scripted configuration files may contain metadata that can be used by the
       openmetrics PMDA to specify the semantics, data type, scaling and units of dynamically  created  metrics.
       This  metadata  is prefixed with # PCP5 or # PCP in the ingested metric data.  For additional information
       about PCP metadata, see pmLookupDesc(3) and pmParseUnitsStr(3)  and  examples  in  shipped  configuration
       files.

       In-line  "PCP5" metadata must be supplied by the metrics source end-pont (URL or script).  An alternative
       is to specify this in the URL configuration file directly, which has  the  advantage  of  not  having  to
       modify  the  source/end-point  if  the  metadata  is incorrect or missing.  Metadata specified in the URL
       configuration file over-rides any in-line metadata.

       The configuration file syntax for specifying metadata is:
       METADATA: regex type indom semantics units ... to EOL
       Where:
       METADATA: is literal
       regex is an extended regular expression to match one or more metric names returned by the URL,
       type is one of the PCP numeric types (32, u32, 64, u64, float or double),
       indom is an arbitrary instance domain name, or PM_INDOM_NULL,
       semantics is either counter, instant or discrete and
       units is either none or a string extending to end of line that is parseable by  pmParseUnitsStr(3),  i.e.
       the units, dimensions and scaling to be used for matching metrics.

       An  example  configuration  file  that  ingests metrics from the Grafana /metrics end-point on localhost,
       filters out all metrics returned by  that  URL  except  for  grafana_api_response_status_total  and  then
       specifies  the  metric  type  is  an  unsigned  32  bit integer with a non-singular instance domain named
       response and counter semantics with units of count.

       http://localhost:3000/metrics
       FILTER: INCLUDE METRIC grafana_api_response_status_total
       FILTER: EXCLUDE METRIC .*
       METADATA: grafana_api_response_status_total u32 response counter count

       Note that the name in the indom field is presently ignored unless it is PM_INDOM_NULL, in which case  the
       metric  has  no  instance domain (i.e. singular), even if it has labels which would otherwise be used for
       instance naming.

CONTROL METRICS

       The PMDA maintains special control metrics, as described below.   Apart  from  openmetrics.control.debug,
       each  of  these  metrics  has  one instance for each configured metric source.  All of these metrics have
       integer values with counter semantics, except openmetrics.control.status, which has a string  value.   It
       is  important  to note that fetching any of the openmetrics.control metrics will only update the counters
       and status values if the corresponding URL is actually fetched.  If the source URL is  not  fetched,  the
       control  metric values do not trigger a refresh and the control values reported represent the most recent
       fetch of each corresponding source.

       The instance domain for the openmetrics.control metrics  is  adjusted  dynamically  as  new  sources  are
       discovered.   If  there  are  no  sources configured, the metric names are still defined but the instance
       domain will be empty and a fetch will return no values.

       openmetrics.control.status
              A string representing the status of the  last  fetch  of  the  corresponding  source.   This  will
              generally  be  success  for  an  http  response  code of 200.  This metric can be used for service
              availability monitoring - provided, as stated above, the corresponding source URL is fetched too.

       openmetrics.control.status_code
              This metric is similar to openmetrics.control.status except that it is the integer  response  code
              of  the  last  fetch.  A value of 200 usually signifies success and any other value failure.  This
              metric  can  also  be  used  for  service  availability  monitoring,  with  the  same  caveats  as
              openmetrics.control.status.

       openmetrics.control.calls
              total  number  of times each configured metric source has been fetched (if it's a URL) or executed
              (if it's a script), since the PMDA started.  This metric has counter semantics and would  normally
              be converted to a rate/second by client tools.

       openmetrics.control.fetch_time
              Total  time  in  milliseconds  that  each configured metric source has taken to return a document,
              excluding the time to parse the document.  This metric has counter semantics and would normally be
              rate  converted by client tools but is also useful in raw form as the accumulated parse time since
              the PMDA was started.

       openmetrics.control.parse_time
              Total time in milliseconds that each configured metric source has taken to  parse  each  document,
              excluding the time to fetch the document.  This metric has counter semantics and would normally be
              rate converted by client tools but is also useful in raw form as the accumulated parse time  since
              the PMDA was started.

       When  converted  to  a  rate,  the calls metric represents the average fetch rate of each source over the
       sampling interval (time delta between samples).  The fetch_time and parse_time counters,  when  converted
       to a rate, represent the average fetch and parsing latency (respectfully), during the sampling interval.

       The  openmetrics.control.debug  metric  has  a  singular  value, defaulting to 0.  If a non-zero value is
       stored into this metric using pmstore(1), additional debug messages will be written to the PMDA log file.

LIMITATIONS

       pmdaopenmetrics and libpcp internals impose some  numerical  constraints  about  the  number  of  sources
       (4095), metrics (1024) within each source, and instances for each metric (4194304).

INSTALLATION

       Install the OpenMetrics PMDA by using the Install script as root:

           # cd $PCP_PMDAS_DIR/openmetrics
           # ./Install

       To uninstall, the following must be done as root:

           # cd $PCP_PMDAS_DIR/openmetrics
           # ./Remove

       pmdaopenmetrics  is  launched  by  pmcd(1) and should never be executed directly.  The Install and Remove
       scripts notify pmcd when the agent is installed or removed.

       When scripts and .url files are added, removed or changed in the configuration directory, it  is  usually
       not  necessary  to  restart the PMDA - the changes will be detected and managed on subsequent requests to
       the PMDA.

FILES

       $PCP_PMDAS_DIR/openmetrics/Install
           installation script for the pmdaopenmetrics agent

       $PCP_PMDAS_DIR/openmetrics/Remove
           undo installation script for the pmdaopenmetrics agent

       $PCP_PMDAS_DIR/openmetrics/config.d/
           contains URLs and scripts used by the pmdaopenmetrics agent as sources of openmetrics metric data.

       $PCP_LOG_DIR/pmcd/openmetrics.log
           default log file for error messages from pmdaopenmetrics

       $PCP_VAR_DIR/config/144.*
           files containing internal tables for metric and instance ID number persistence (domain 144).

PCP ENVIRONMENT

       Environment variables with the prefix PCP_ are used to parameterize the file and directory names used  by
       PCP.   On  each  installation, the file /etc/pcp.conf contains the local values for these variables.  The
       $PCP_CONF variable may be used to specify an alternative configuration file, as described in pcp.conf(5).

SEE ALSO

       PCPIntro(1),  audit2allow(1),  pmcd(1),  pminfo(1),  pmlogger(1),  pmstore(1),  PMWEBAPI(3),  pmFetch(3),
       pmLookupLabels(3), semodule(1), and https://prometheus.io/docs/instrumenting/exposition_formats.