pmNewContext - establish a new PMAPI context
#include <pcp/pmapi.h>
int pmNewContext(int
type, const char *
name);
cc ... -lpcp
An application using the Performance Metrics Application Programming Interface
(PMAPI) may manipulate several concurrent contexts, each associated with a
source of performance metrics, e.g.
pmcd(1) on some host, or a set of
archive logs of performance metrics as created by
pmlogger(1), or a
standalone connection on the local host that does not involve
pmcd(1).
pmNewContext may be used to establish a new context. The source of the
metrics is identified by
name, and may be either a host name
(
type is
PM_CONTEXT_HOST), or a comma-separated list of names
referring to a set of archive logs (
type is
PM_CONTEXT_ARCHIVE).
Each element of the list may either be the base name common to all of the
physical files of an archive log or the name of a directory containing archive
logs.
For a
type of
PM_CONTEXT_HOST, in addition to identifying a host
the
name may also be used to encode additional optional information in
the form of a
pmcd(1) port number, a
pmproxy(1) hostname and a
proxy port number. For example the
name
"app23:14321,
[email protected]:11111" specifies a connection
on port
14321 (or port
4321 if
14321 is unavailable) to
pmcd(1) on the host
app23 via port
11111 to
pmproxy(1) on the host
firewall.example.com.
For a
type of
PM_CONTEXT_ARCHIVE, each element of the list of
names in
name may also be the name of any of the physical files of an
archive, e.g.
myarchive.meta (the metadata file) or
myarchive.index (the temporal index) or
myarchive.0 (the first data volume of the archive) or
myarchive.0.bz2 or
myarchive.0.bz (the first data
volume compressed with
bzip2(1)) or
myarchive.0.gz or
myarchive.0.Z or
myarchive.0.z (the first data
volume compressed with
gzip(1)),
myarchive.1 or
myarchive.3.bz2 or
myarchive.42.gz etc.
If more than one archive is specified for a
type of
PM_CONTEXT_ARCHIVE, there are some restrictions on the archives within
the set:
- •
- The archives must all have been generated on the same
host.
- •
- The archives must not overlap in time.
- •
- The archives must all have been created using the same time
zone.
- •
- The PMID of each metric should be the same in all of
the archives. Multiple PMIDs are currently tolerated by using the
first PMID defined for each metric and ignoring subsequent
PMIDs.
- •
- The type of each metric must be the same in all of the
archives.
- •
- The semantics of each metric must be the same in all of the
archives.
- •
- The units of each metric must be the same in all of the
archives.
- •
- The instance domain of each metric must be the same in all
of the archives.
In the case where
type is
PM_CONTEXT_LOCAL,
name is
ignored, and the context uses a standalone connection to the PMDA methods used
by
pmcd(1). When this type of context is used, the range of accessible
performance metrics is constrained to those from the operating system, and
optionally the ``proc'', ``sample'' and ``ib'' PMDAs.
In the case where
type is
PM_CONTEXT_HOST, additional flags can be
added to the
type to indicate if the connection to
pmcd(1)
should be encrypted (
PM_CTXFLAG_SECURE), deferred
(
PM_CTXFLAG_SHALLOW) and if the file descriptor used to communicate
with
pmcd(1), should not be shared across contexts (
PM_CTXFLAG_EXCLUSIVE). Both the
PM_CTXFLAG_SHALLOW and
PM_CTXFLAG_EXCLUSIVE flags are now deprecated and ignored.
The initial instance profile is set up to select all instances in all instance
domains. In the case of a set of archives, the initial collection time is also
set to zero, so that an initial
pmFetch(3) will result in the earliest
set of metrics being returned from the set of archives.
Once established, the association between a context and a source of metrics is
fixed for the life of the context, however routines are provided to
independently manipulate both the instance profile (see
pmAddProfile(3)
and
pmDelProfile(3)) and the collection time for archives (see
pmSetMode(3)).
pmNewContext returns a handle that may be used with subsequent calls to
pmUseContext(3).
The new context remains the current PMAPI context for all subsequent calls
across the PMAPI, until another call to is made, or the
context is explicitly changed with a call to
pmDupContext(3) or
pmUseContext(3), or destroyed using
pmDestroyContext(3).
When attempting to connect to a remote
pmcd(1) on a machine that is
booting,
pmNewContext could potentially block for a long time until the
remote machine finishes its initialization.
pmNewContext will abort and
return an error if the connection has not been established after some
specified interval has elapsed. The default interval is 5 seconds. This may be
modified by setting
PMCD_CONNECT_TIMEOUT in the environment to a real
number of seconds for the desired timeout. This is most useful in cases where
the remote host is at the end of a slow network, requiring longer latencies to
establish the connection correctly.
When using a
type of
PM_CONTEXT_LOCAL, the operating system PMDA
may export data structures directly from the kernel, which means that the
pmNewContext caller should be an executable program compiled for the
same object code format as the booted kernel.
In addition, applications using a
PM_CONTEXT_LOCAL context must be
single-threaded because the various DSO PMDAs may not be thread-safe. This
restriction is enforced at the
PMAPI(3), where routines may return the
error code
PM_ERR_THREAD if the library detects calls from more than
one thread.
Applications that use
gethostbyname(3) should exercise caution because
the static fields in
struct hostent may not be preserved across some
PMAPI(3) calls. In particular, and
pmReconnectContext(3) both may call
gethostbyname(3) internally.
PM_ERR_PERMISSION
- No permission to perform requested operation
PM_ERR_CONNLIMIT
- PMCD connection limit for this host exceeded
PM_ERR_NOCONTEXT
- Requested context type was not PM_CONTEXT_LOCAL,
PM_CONTEXT_HOST or PM_CONTEXT_ARCHIVE.
PM_ERR_LOGOVERLAP
- Archives overlap in time
PM_ERR_LOGHOST
- Archives differ by host
PM_ERR_LOGTIMEZONE
- Archives differ by time zone.
PM_ERR_LOGCHANGETYPE
- The type of a metric differs among archives
PM_ERR_LOGCHANGESEM
- The semantics of a metric differs among archives
PM_ERR_LOGCHANGEINDOM
- The instance domain of a metric differs among archives
PM_ERR_LOGCHANGEUNITS
- The units of a metric differs among archives
- PMCD_CONNECT_TIMEOUT
- Timeout period (in seconds) for pmcd(1) connection
attempts.
- PMCD_PORT
- TCP/IP port(s) for connecting to pmcd(1),
historically was 4321 and more recently the officially registered port
44321; in the current release, pmcd listens on both these ports as
a transitional arrangement. If used, should be set to a comma-separated
list of numerical port numbers.
- PMDA_PATH
- When searching for PMDAs to be loaded when type is
PM_CONTEXT_LOCAL, the PMDA_PATH environment variable may be
used to define a search path of directories to be used to locate the PMDA
executables. The default search path is
$PCP_SHARE_DIR/lib:/usr/pcp/lib.
pmcd(1),
pmproxy(1),
pmAddProfile(3),
PMAPI(3),
pmDelProfile(3),
pmDestroyContext(3),
pmDupContext(3),
pmGetConfig(3),
pmReconnectContext(3),
pmSetMode(3),
pmUseContext(3),
pmWhichContext(3),
pcp.conf(5) and
pcp.env(5).