1PMDA(3) Library Functions Manual PMDA(3)
2
3
4
6 PMDA - introduction to the Performance Metrics Domain Agent support
7 library
8
10 #include <pcp/pmapi.h>
11 #include <pcp/pmda.h>
12
13 cc ... -lpcp_pmda -lpcp
14
16 To assist in the development of Performance Metric Domain Agents
17 (PMDAs) for the Performance Co-Pilot (PCP), a procedural interface is
18 provided that extends the Performance Metrics Application Programming
19 Interface ( PMAPI(3)) library. These procedures are designed to enable
20 a programmer to quickly build a PMDA which can then be tested and
21 refined. However, this also implies that a PMDA has a particular
22 structure which may not be suitable for all PMDA implementations.
23
24 Once you are familiar with the PCP and PMDA frameworks, you can quickly
25 implement a new PMDA with only a few data structures and functions.
26 This is covered in far greater detail in the Performance Co-Pilot Pro‐
27 grammer's Guide.
28
29 A PMDA is responsible for a set of performance metrics, in the sense
30 that it must respond to requests from pmcd(1) for information about
31 performance metrics, instance domains, and instantiated values.
32
33 This man page contains sections of the simple PMDA which is located at
34 $PCP_PMDAS_DIR/simple.
35
37 Two approaches may be used for connecting a PMDA to a pmcd(1) process.
38 A Dynamic Shared Object (DSO) can be attached by pmcd(1) using
39 dlopen(3) when the pmcd(1) process is started. A procedural interface
40 referenced through a shared data structure is used to handle requests
41 from pmcd(1) to the PMDA .
42
43 The preferred approach is for a separate process (daemon) to communi‐
44 cate with pmcd(1) using the Performance Data Units (PDU) Inter-Process
45 Communication (IPC) protocol.
46
47 All PMDAs are launched and controlled by the pmcd(1) process on the
48 local host. The requests from the clients are received by pmcd(1) and
49 forwarded to the appropriate PMDAs. Responses, when required, are
50 returned through pmcd(1) to the clients. The requests (PDUs) that may
51 be sent to a PMDA from pmcd(1) are PDU_FETCH, PDU_PROFILE,
52 PDU_INSTANCE_REQ, PDU_DESC_REQ, PDU_TEXT_REQ and PDU_RESULT. If the
53 PMDA implements any dynamic metrics it may also receive PDU_PMNS_CHILD,
54 PDU_PMNS_IDS, PDU_PMNS_NAMES and PDU_PMNS_TRAVERSE PDUs.
55
57 To allow a consistent framework, pmdaMain(3) can be used by a daemon
58 PMDA to handle the communication protocol using the same callbacks as a
59 DSO PMDA. The structure pmdaInterface is used to convey the common
60 procedural interface and state information that is used by pmcd(1) and
61 a PMDA. This state information includes tables describing the sup‐
62 ported metrics and instance domains.
63
64 As most of the procedural interface is identical for all PMDAs, they
65 are provided as part of this support library (pmdaProfile(3),
66 pmdaFetch(3), pmdaInstance(3), pmdaDesc(3), pmdaText(3) and pmdaS‐
67 tore(3)). However, these routines require access to the pmdaInterface
68 state information so it must be correctly initialized using pmdaCon‐
69 nect(3), pmdaDaemon(3), pmdaOpenLog(3), pmdaDSO(3), pmdaGetOpt(3) and
70 pmdaInit(3).
71
73 Three structures are declared in /usr/include/pcp/pmda.h which provide
74 a framework for declaring the metrics and instances supported by the
75 PMDA.
76
77 Every instance requires a unique integer identifier and a unique name,
78 as defined by the structure pmdaInstid:
79
80 /*
81 * Instance description: index and name
82 */
83
84 typedef struct {
85 int i_inst; /* internal instance identifier */
86 char *i_name; /* external instance identifier */
87 } pmdaInstid;
88
89 An instance domain requires its own unique identification (pmInDom),
90 the number of instances the domain represents, and a pointer to an
91 array of instance descriptions. This is defined in the structure
92 pmdaIndom:
93
94 /*
95 * Instance domain description: unique instance id,
96 * number of instances in this domain, and the list of
97 * instances (not null terminated).
98 */
99
100 typedef struct {
101 pmInDom it_indom; /* indom, filled in */
102 int it_numinst; /* number of instances */
103 pmdaInstid *it_set; /* instance identifiers */
104 } pmdaIndom;
105
106 The simple PMDA has one instance domain for simple.color with three
107 instances (red, green and blue), and a second instance domain for sim‐
108 ple.now with instances which can be specified at run-time. These
109 instance domains are defined as:
110
111 static pmdaInstid _color[] = {
112 { 0, "red" }, { 1, "green" }, { 2, "blue" }
113 };
114 static pmdaInstid *_timenow = NULL;
115
116 static pmdaIndom indomtab[] = {
117 #define COLOR_INDOM 0
118 { COLOR_INDOM, 3, _color },
119 #define NOW_INDOM 1
120 { NOW_INDOM, 0, NULL },
121 };
122
123 The preprocessor macros COLOR_INDOM and NOW_INDOM are used in the met‐
124 ric description table to identify the instance domains of individual
125 metrics. These correspond to the serial value in the instance domain
126 pmInDom structure (the domain field is set by pmdaInit(3) at run-time).
127 The serial value must be unique for each instance domain within the
128 PMDA.
129
130 The indom table shown above which is usually passed to pmdaInit(3) does
131 not need to be created if one wants to write one's own Fetch and
132 Instance functions. See pmdaInit(3) for more details.
133
135 Every PMDA has its own unique namespace using the format defined in
136 pmns(5). In summary, the namespace matches the names of the metrics to
137 the unique identifier. The simple PMDA defines five metrics: sim‐
138 ple.numfetch, simple.color, simple.time.user, simple.time.sys and sim‐
139 ple.now. The namespace for these metrics is defined in
140 $PCP_PMDAS_DIR/simple/pmns and is installed as:
141
142 simple {
143 numfetch 253:0:0
144 color 253:0:1
145 time
146 now 253:2:4
147 }
148
149 simple.time {
150 user 253:1:2
151 sys 253:1:3
152 }
153
154 The domain number of 253 is obtained from $PCP_VAR_DIR/pmns/stdpmid.
155 New PMDAs should specify a unique domain number in this file, and
156 obtain the number during installation. This allows the domain number
157 to change by modifying only the file $PCP_VAR_DIR/pmns/stdpmid.
158
159 The simple.time and simple.now metrics are defined in separate clusters
160 to the other metrics which allows a PMDA to support more than 1024 met‐
161 rics, as well as grouping similar metrics together. Therefore, the
162 item numbers for a new cluster may be identical to the item numbers in
163 other clusters. The simple PMDA continues to increment the item num‐
164 bers to permit direct mapping (see pmdaInit(3)).
165
166 The namespace file should be installed and removed with the agent using
167 pmnsadd(1) and pmnsdel(1). See the later sections on INSTALLATION and
168 REMOVAL.
169
170 A simple ASCII namespace can be constructed by creating a file similar
171 to $PCP_PMDAS_DIR/simple/root:
172
173 /*
174 * fake "root" for validating the local PMNS subtree
175 */
176
177 #include "$PCP_VAR_DIR/pmns/stdpmid"
178
179 root { simple }
180
181 #include "pmns"
182
183
184 and can be referred to with the -n option in most PCP tools.
185
187 Each metric requires a description (pmDesc), which contains its Perfor‐
188 mance Metric Identifier (PMID), data type specification, instance
189 domain, semantics and units (see pmLookupDesc(3)). A handle is also
190 provided for application specific information in the pmdaMetric struc‐
191 ture:
192
193 /*
194 * Metric description: handle for extending description,
195 * and the description.
196 */
197
198 typedef struct {
199 void* m_user; /* for users external use */
200 pmDesc m_desc; /* metric description */
201 } pmdaMetric;
202
203 The simple PMDA defines the metrics as:
204
205 static pmdaMetric metrictab[] = {
206 /* numfetch */
207 { (void *)0,
208 { PMDA_PMID(0,0), PM_TYPE_U32, PM_INDOM_NULL, PM_SEM_INSTANT,
209 { 0,0,0,0,0,0} }, },
210 /* color */
211 { (void *)0,
212 { PMDA_PMID(0,1), PM_TYPE_32, COLOR_INDOM, PM_SEM_INSTANT,
213 { 0,0,0,0,0,0} }, },
214 /* time.user */
215 { (void*)0,
216 { PMDA_PMID(1,2), PM_TYPE_DOUBLE, PM_INDOM_NULL, PM_SEM_COUNTER,
217 { 0, 1, 0, 0, PM_TIME_SEC, 0 } }, },
218 /* time.sys */
219 { (void*)0,
220 { PMDA_PMID(1,3), PM_TYPE_DOUBLE, PM_INDOM_NULL, PM_SEM_COUNTER,
221 { 0, 1, 0, 0, PM_TIME_SEC, 0 } }, },
222 /* now */
223 { NULL,
224 { PMDA_PMID(2,4), PM_TYPE_U32, NOW_INDOM, PM_SEM_INSTANT,
225 { 0,0,0,0,0,0 } }, },
226 };
227
228 The macro PMDA_PMID (defined in /usr/include/pcp/pmda.h) is used to
229 specify each metric's cluster and item fields of the associated pmID.
230 As with instance domains, the domain field is set by pmdaInit(3) at
231 run-time, however, the default domain is assumed to be defined by the
232 PMDA in the macro MYDOMAIN.
233
234 The metric table shown above which is usually passed to pmdaInit(3)
235 does not need to be created if one wants to write one's own Fetch and
236 Descriptor functions. See pmdaInit(3) for more details.
237
239 A PMDA that is run as a DSO is opened by pmcd(1) with dlopen(3).
240 pmcd(1) will call the PMDA's initialization function that is specified
241 in $PCP_PMCDCONF_PATH. This function is passed a pointer to a pmdaIn‐
242 terface structure which must be completed. Any callbacks which are not
243 the default PMDA support library callbacks must be specified in the
244 pmdaInterface structure.
245
246 The simple PMDA uses its own store and fetch callback. simple_fetch()
247 calls pmdaFetch(3) which requires a callback to be set with pmdaSet‐
248 FetchCallBack(3) as can be seen in $PCP_PMDAS_DIR/simple/simple.c.
249
250 The flag _isDSO is used to determine if the PMDA is a daemon or a DSO
251 so that the correct initialization routine, pmdaDaemon(3) or
252 pmdaDSO(3), is called.
253
255 A PMDA that is run as a daemon is forked and executed by pmcd(1).
256 Therefore, unlike a DSO PMDA, the starting point for a daemon PMDA is
257 main(). The agent should parse the command line arguments, create a
258 log file and initialize some data structures that pmcd(1) would ini‐
259 tialize for a DSO agent.
260
261 The pmdaInterface structure must be completely defined by the daemon
262 PMDA. The function pmdaDaemon(3) can be called at the start of main()
263 to set most of these fields. Command line parsing can be simplified by
264 using pmdaGetOpt(3), which is similar to getopt(2), but extracts a com‐
265 mon set of options into the pmdaInterface structure. stderr can be
266 mapped to a log file using pmdaOpenLog(3) to simplify debugging and
267 error messages. The connection to pmcd(1) can be made with pmdaCon‐
268 nect(3) and the loop which handles the incoming PDUs, pmdaMain(3),
269 should be the last function called. This can be seen in
270 $PCP_PMDAS_DIR/simple/simple.c.
271
272 The simple_init() routine is common to an agent that can be run as both
273 a Daemon and DSO PMDA.
274
276 Each PMDA must be able to provide pmcd(1) with the help text for each
277 metric. Most PMDAs use specially created files with indexes to support
278 efficient retrieval of the help text. Tools are provided with PCP to
279 create the help text files of appropriate format. See newhelp(1).
280
282 A series of shell procedures are defined in
283 $PCP_SHARE_DIR/lib/pmdaproc.sh which greatly simplify the installation
284 and removal of a PMDA.
285
286 The Install scripts for most PMDAs should only need to specify the name
287 of the PMDA in iam, call pmdaSetup which sets up some default vari‐
288 ables, checks permissions (you have to be ``root'' to install or remove
289 a PMDA), checks that you're in the right directory (somewhere that ends
290 with /pmdas/$iam), optionally generate the Performance Metrics Name
291 Space (PMNS) and PMDA domain number files for Perl or Python PMDAs,
292 checks the PMDA domain number is valid, etc., specify the communication
293 protocols, and finally call pmdaInstall to do all the work of updating
294 the PMNS, updating the pmcd(1) control file, notifying or restarting
295 pmcd(1),
296
297 Beyond pmdaSetup and pmdaInstall, another optional helper routines is
298 pmdaChooseConfigFile that may be used to interactively select or create
299 a PMDA-specific configuration file, e.g. pmdalogger(1).
300
301 The Remove scripts are even simpler as setting up the communication
302 protocols are not required, so set the name of the PMDA in iam, then
303 call pmdaSetup followed by a call to pmdaRemove.
304
305 Further information is contained in the $PCP_SHARE_DIR/lib/pmdaproc.sh
306 file and the following section.
307
308 Optionally, a PMDA may provide an Upgrade script alongside Install and
309 Remove. If present this script will be used by the pmcd startup
310 process to ensure corrections to an installation have been made before
311 starting the PMDA. Examples of such corrections include: updates to
312 pmcd.conf when a PMDA script or binary has been renamed, when the PMDA
313 supports a new format of its configuration file, or if there is some
314 latent problem from an earlier install (e.g. some PMDAs may need to
315 introduce use of the notready keyword in pmcd.conf, as described
316 below).
317
319 As outlined below there are a number of variables that can be set in a
320 PMDA's Install script to influence the behaviour of the installation
321 procedures. These would typically need to be set before the call to
322 pmdaInstall, but in some instances (like $iam and the cases specifi‐
323 cally noted below), before the call to pmdaSetup.
324
325 The following variables control the communication options between the
326 PMDA and pmcd(1). At least one of $daemon_opt, $dso_opt, $perl_opt or
327 $python_opt must be set to define the supported mode(s) of communica‐
328 tion. If more than one of these is set the user will be prompted to
329 make a selection when the Install script is run.
330
331 daemon_opt We are willing to install the PMDA as a daemon.
332 Default: true
333
334 dso_opt We are willing to install the PMDA as a DSO, so pmcd(1)
335 will use the dynamic linking loader to attach the
336 PMDA's DSO at run-time and communication from pmcd(1)
337 to the PMDA and back uses procedure calls, not an IPC
338 channel.
339 Default: false
340
341 dso_entry For a DSO PMDA, this is the name of the PMDA's initial‐
342 ization routine.
343 Default: ${iam}_init
344
345 dso_name For a DSO PMDA, this is the full pathanme of the PMDA's
346 DSO file.
347 Default: $PCP_PMDAS_DIR/$iam/pmda_$iam.$dso_suffix
348
349 pipe_opt For a daemon PMDA, is the default IPC channel via a
350 pipe(2)?
351 Default: Platform-specific, so true for most, but false
352 for Windows
353
354 perl_opt We are willing to install the PMDA as a Perl script and
355 pmcd(1) will use the perl(1) interpreter to run the
356 PMDA.
357 Default: false
358
359 pmda_dir Full pathname to the directory where the PMDA's instal‐
360 lation files (executable, script, PMNS source, help
361 text source, etc) are to be found.
362 Default: output from pwd(1)
363
364 If set, must be done before the call to pmdaSetup.
365
366 pmda_name For a daemon PMDA, this is the name of the PMDA's exe‐
367 cutable binary relative to the $pmda_dir directory.
368 Default: pmda$iam
369
370 python_opt We are willing to install the PMDA as a Python script
371 and pmcd(1) will use the python(1) interpreter to run
372 the PMDA.
373 Default: false
374
375 ipc_prot For a daemon PMDA, this can be set to either binary or
376 text. The default is binary and text is rarely used.
377 In addition, an optional IPC parameter notready can be
378 used to signify that the PMDA will start up in the
379 notready state, e.g. ipc_prot="binary notready". Note
380 that the quotes are required. The IPC parameters for a
381 PMDA appear in pmcd.conf in the IPC Params column. For
382 further details, see pmcd(1) but basically pmcd will
383 not issue any requests to a PMDA that has started in
384 the notready state until the PMDA sends a
385 PM_ERR_PMDAREADY PDU. This allows PMDAs with long
386 startup times to initialize correctly without timing
387 out. For details, see pmdaSendError(3) and pmcd(1).
388 When a PMDA is in the notready state, any client
389 requests sent to pmcd for the PMDA domain will return
390 with the PM_ERR_PMDANOTREADY error.
391
392 socket_inet_def For a daemon PMDA using a socket(2) as the IPC channel
393 the default Internet port number or service name (if
394 known).
395 Default: ""
396
397 socket_opt For a daemon PMDA, is the default IPC channel via a
398 socket(2)?
399 Default: Platform-specific, so false for most, but true
400 for Windows
401
402 The following variables control the PMNS options.
403
404 pmns_dupok Most PMDAs do not have duplicate names for the same
405 PMID in their PMNS. But if this is not the case,
406 pmns_dupok should be set to true.
407 Default: false
408
409 pmns_name Each PMDA will add one or more non-leaf nodes to the
410 top of the PMNS. The most common case is that all of
411 the metrics for a PMDA will be placed below the node
412 named $iam. If this is not the case, and especially
413 when the PMDA adds more than one non-leaf node at the
414 top of the PMNS, pmns_name needs to be set to the list
415 of node names (separated by white space), e.g. for
416 pmdaproc(1) pmns_name is set to "proc cgroup hotproc".
417 Default: $iam
418
419 It is most important that if pmns_name is set to a non-
420 default value in the Install script then it must also
421 be set to the same value in the Remove script.
422
423 pmns_source The name of the PMDA's PMNS source file. By default,
424 the name is interpreted as a relative pathname from the
425 $pmda_dir directory.
426 Default: pmns
427
428 The following variables provide assorted additional options associated
429 with the installation of a PMDA.
430
431 args Additional command line args for the PMDA. These will
432 be appended to the PMDA's control line in $PCP_PMCD‐
433 CONF_PATH.
434 Default: ""
435
436 check_delay Delay (in seconds) after finishing the PMDA installa‐
437 tion (or removal) before checking the availability of
438 metrics from the PMDA. May need to be increased if the
439 PMDA has a lengthy startup procedure.
440 Default: 0.3
441
442 signal_delay Delay (in seconds) after notifying pmcd(1) with a sig‐
443 nal. Required to allow pmcd(1) to complete processing
444 before proceeding to the next step of the installation
445 (or removal).
446 Default: 1
447
448 configdir Determines the directory in which a PMDA's configura‐
449 tion file will be stored. Used by pmdaChooseConfigFile
450 so should be set before calling that procedure.
451 Default: $PCP_VAR_DIR/config/$iam
452
453 configfile Preferred configuration file for the PMDA. Used by
454 pmdaChooseConfigFile so should be set before calling
455 that procedure.
456 Default: ""
457
458 default_configfile
459 Default configuration file for the PMDA. Used by pmda‐
460 ChooseConfigFile so should be set before calling that
461 procedure.
462 Default: ""
463
464 dso_suffix Standard suffix for a DSO. Should not need to be
465 changed under normal circumstances.
466 Default: Platform-specific, so 'so' for Linux, 'dylib'
467 for Mac OS X, 'dll' for Windows, etc.
468
469 If set, must be done before the call to pmdaSetup.
470
471 help_source The name of the help text source file that should be
472 used as input to pmnewhelp(1). By default, the name is
473 interpreted as a relative pathname from the $pmda_dir
474 directory.
475 Default: help
476
477 python_name Full pathname of the Python script for a Python PMDA.
478 Default: $pmda_dir/pmda$iam.python or
479 $pmda_dir/pmda$iam.py
480
481 The shell procedures in $PCP_SHARE_DIR/lib/pmdaproc.sh manipulate a
482 number of temporary files using the variable $tmp as the prefix for the
483 name of the temporary files. $tmp is a directory that is created, used
484 and removed internally within the procedures of
485 $PCP_SHARE_DIR/lib/pmdaproc.sh but can also be used as the prefix for
486 temporary files needed by a PMDA's Install or Remove scripts. When
487 used in this way, $tmp should be followed by a ``/'' and then a suffix,
488 e.g. $tmp/myfoo. The Install and Remove scripts should not use other
489 temporary file name prefixes nor use sh(1) trap statements to clean up
490 temporary files as this is all done within
491 $PCP_SHARE_DIR/lib/pmdaproc.sh.
492
494 Any PMDA which uses this library can set PMAPI(3) debugging control
495 option libpmda (with -Dlibpmda on the command line or via 3pmSetDe‐
496 bug[1m(3)) to to enable the display of debugging information which may be
497 useful during development (see pmdbg(1)).
498
499 The status field of the pmdaInterface structure should be zero after
500 pmdaDaemon, pmdaDSO, pmdaGetOpt, pmdaConnect and pmdaInit are called.
501 A value less than zero indicates that initialization has failed.
502
503 Some error messages that are common to most functions in this library
504 are:
505
506 PMDA interface version interface not supported
507 Most of the functions require that the comm.version
508 field of the pmdaInterface structure be set to
509 PMDA_INTERFACE_2 or later. PMDA_INTERFACE_2 or
510 PMDA_INTERFACE_3 implies that the version.two fields are
511 correctly initialized, while PMDA_INTERFACE_4 implies
512 that the version.four fields are correctly initialized
513 (see pmdaDaemon(3) and pmdaDSO(3)).
514
516 Failing to complete any of the data structures or calling any of the
517 library routines out of order may cause unexpected behavior in the
518 PMDA.
519
520 Due to changes to the PMAPI(3) and PMDA(3) API in the PCP 2.0 release,
521 as described in the product release notes, PMDAs built using PCP 2.0
522 must specify PMDA_INTERFACE_2 or later and link with libpcp_pmda.so.2
523 and libpcp.so.2. Pre-existing Daemon PMDAs specifying PMDA_PROTOCOL_1
524 will continue to function using the backwards compatible
525 libpcp_pmda.so.1 and libpcp.so.1 libraries and may be recompiled using
526 the headers installed in /usr/include/pcp1.x/ without any modification.
527 These backwards compatible headers and libraries are contained in the
528 pcp.sw.compat subsystem.
529
531 /usr/include/pcp/pmda.h
532 Header file for the PMDA support library.
533
534 /usr/lib/libpcp_pmda.so
535 Dynamic library containing PMDA support library routines.
536
537 $PCP_PMDAS_DIR/trivial
538 The source of the trivial PMDA.
539
540 $PCP_PMDAS_DIR/simple
541 The source of the simple PMDA.
542
543 $PCP_PMDAS_DIR/txmon
544 The source of the txmon PMDA.
545
546 $PCP_PMCDCONF_PATH
547 Configuration file for pmcd(1).
548
549 $PCP_VAR_DIR/pmns
550 Location of namespace descriptions for every PMDA.
551
552 $PCP_VAR_DIR/pmns/stdpmid
553 The unique domain identifiers for each PMDA.
554
555 $PCP_SHARE_DIR/lib/pmdaproc.sh
556 Shell procedures for installing and removing a PMDA.
557
559 Environment variables with the prefix PCP_ are used to parameterize the
560 file and directory names used by PCP. On each installation, the file
561 /etc/pcp.conf contains the local values for these variables. The
562 $PCP_CONF variable may be used to specify an alternative configuration
563 file, as described in pcp.conf(5). Values for these variables may be
564 obtained programmatically using the pmGetConfig(3) function.
565
567 dbpmda(1), newhelp(1), pmcd(1), pmnsadd(1), pmnsdel(1), PMAPI(3), pmda‐
568 Connect(3), pmdaDaemon(3), pmdaDesc(3), pmdaDSO(3), pmdaFetch(3),
569 pmdaGetOpt(3), pmdaInit(3), pmdaInstance(3), pmdaMain(3), pmdaOpen‐
570 Log(3), pmdaProfile(3), pmdaStore(3), pmdaText(3), pmLookupDesc(3) and
571 pmns(5).
572
573 For a complete description of the pcp_pmda library and the PMDA devel‐
574 opment process, refer to the Insight book Performance Co-Pilot Program‐
575 mer's Guide.
576
577
578
579Performance Co-Pilot PCP PMDA(3)