Merge pull request #3349 from rpv-tomsk/master
[collectd.git] / src / collectd-exec.pod
1 =encoding UTF-8
2
3 =head1 NAME
4
5 collectd-exec - Documentation of collectd's C<exec plugin>
6
7 =head1 SYNOPSIS
8
9   # See collectd.conf(5)
10   LoadPlugin exec
11   # ...
12   <Plugin exec>
13     Exec "myuser:mygroup" "myprog"
14     Exec "otheruser" "/path/to/another/binary" "arg0" "arg1"
15     NotificationExec "user" "/usr/lib/collectd/exec/handle_notification"
16   </Plugin>
17
18 =head1 DESCRIPTION
19
20 The C<exec plugin> forks off an executable either to receive values or to
21 dispatch notifications to the outside world. The syntax of the configuration is
22 explained in L<collectd.conf(5)> but summarized in the above synopsis.
23
24 If you want/need better performance or more functionality you should take a
25 long look at the C<perl plugin>, L<collectd-perl(5)>.
26
27 =head1 EXECUTABLE TYPES
28
29 There are currently two types of executables that can be executed by the
30 C<exec plugin>:
31
32 =over 4
33
34 =item C<Exec>
35
36 These programs are forked and values that it writes to C<STDOUT> are read back.
37 The executable is forked in a fashion similar to L<init>: It is forked once and
38 not again until it exits. If it exited, it will be forked again after at most
39 I<Interval> seconds. It is perfectly legal for the executable to run for a long
40 time and continuously write values to C<STDOUT>.
41
42 See L<EXEC DATA FORMAT> below for a description of the output format expected
43 from these programs.
44
45 B<Warning:> If the executable only writes one value and then exits it will be
46 executed every I<Interval> seconds. If I<Interval> is short (the default is 10
47 seconds) this may result in serious system load.
48
49 =item C<NotificationExec>
50
51 The program is forked once for each notification that is handled by the daemon.
52 The notification is passed to the program on C<STDIN> in a fashion similar to
53 HTTP-headers. In contrast to programs specified with C<Exec> the execution of
54 this program is not serialized, so that several instances of this program may
55 run at once if multiple notifications are received.
56
57 See L<NOTIFICATION DATA FORMAT> below for a description of the data passed to
58 these programs.
59
60 =back
61
62 =head1 EXEC DATA FORMAT
63
64 The forked executable is expected to print values to C<STDOUT>. The expected
65 format is as follows:
66
67 =over 4
68
69 =item Comments
70
71 Each line beginning with a C<#> (hash mark) is ignored.
72
73 =item B<PUTVAL> I<Identifier> [I<OptionList>] I<Valuelist>
74
75 Submits one or more values (identified by I<Identifier>, see below) to the
76 daemon which will dispatch it to all its write-plugins.
77
78 An I<Identifier> is of the form
79 C<I<host>B</>I<plugin>B<->I<instance>B</>I<type>B<->I<instance>> with both
80 I<instance>-parts being optional. If they're omitted the hyphen must be
81 omitted, too. I<plugin> and each I<instance>-part may be chosen freely as long
82 as the tuple (plugin, plugin instance, type instance) uniquely identifies the
83 plugin within collectd. I<type> identifies the type and number of values
84 (i.E<nbsp>e. data-set) passed to collectd. A large list of predefined
85 data-sets is available in the B<types.db> file. See L<types.db(5)> for a
86 description of the format of this file.
87
88 The I<OptionList> is an optional list of I<Options>, where each option is a
89 key-value-pair. A list of currently understood options can be found below, all
90 other options will be ignored. Values that contain spaces must be quoted with
91 double quotes.
92
93 I<Valuelist> is a colon-separated list of the time and the values, each either
94 an integer if the data-source is a counter, or a double if the data-source is
95 of type "gauge". You can submit an undefined gauge-value by using B<U>. When
96 submitting B<U> to a counter the behavior is undefined. The time is given as
97 epoch (i.E<nbsp>e. standard UNIX time) or B<N> to use the current time.
98
99 You can mix options and values, but the order is important: Options only
100 effect following values, so specifying an option as last field is allowed, but
101 useless. Also, an option applies to B<all> following values, so you don't need
102 to re-set an option over and over again.
103
104 The currently defined B<Options> are:
105
106 =over 4
107
108 =item B<interval=>I<seconds>
109
110 Gives the interval in which the data identified by I<Identifier> is being
111 collected.
112
113 =back
114
115 Please note that this is the same format as used in the B<unixsock plugin>, see
116 L<collectd-unixsock(5)>. There's also a bit more information on identifiers in
117 case you're confused.
118
119 Since examples usually let one understand a lot better, here are some:
120
121   PUTVAL leeloo/cpu-0/cpu-idle N:2299366
122   PUTVAL alice/interface/if_octets-eth0 interval=10 1180647081:421465:479194
123
124 =item B<PUTNOTIF> [I<OptionList>] B<message=>I<Message>
125
126 Submits a notification to the daemon which will then dispatch it to all plugins
127 which have registered for receiving notifications. 
128
129 The B<PUTNOTIF> if followed by a list of options which further describe the
130 notification. The B<message> option is special in that it will consume the rest
131 of the line as its value. The B<message>, B<severity>, and B<time> options are
132 mandatory.
133
134 Valid options are:
135
136 =over 4
137
138 =item B<message=>I<Message> (B<REQUIRED>)
139
140 Sets the message of the notification. This is the message that will be made
141 accessible to the user, so it should contain some useful information. As with
142 all options: If the message includes spaces, it must be quoted with double
143 quotes. This option is mandatory.
144
145 =item B<severity=failure>|B<warning>|B<okay> (B<REQUIRED>)
146
147 Sets the severity of the notification. This option is mandatory.
148
149 =item B<time=>I<Time> (B<REQUIRED>)
150
151 Sets the time of the notification. The time is given as "epoch", i.E<nbsp>e. as
152 seconds since January 1st, 1970, 00:00:00. This option is mandatory.
153
154 =item B<host=>I<Hostname>
155
156 =item B<plugin=>I<Plugin>
157
158 =item B<plugin_instance=>I<Plugin-Instance>
159
160 =item B<type=>I<Type>
161
162 =item B<type_instance=>I<Type-Instance>
163
164 These "associative" options establish a relation between this notification and
165 collected performance data. This connection is purely informal, i.E<nbsp>e. the
166 daemon itself doesn't do anything with this information. However, websites or
167 GUIs may use this information to place notifications near the affected graph or
168 table. All the options are optional, but B<plugin_instance> without B<plugin>
169 or B<type_instance> without B<type> doesn't make much sense and should be
170 avoided.
171
172 =item B<type:key=>I<value>
173
174 Sets user defined meta information. The B<type> key is a single character
175 defining the type of the meta information.
176
177 The current supported types are:
178
179 =over 8
180
181 =item B<s> A string passed as-is.
182
183 =back
184
185 =back
186
187 =back
188
189 Please note that this is the same format as used in the B<unixsock plugin>, see
190 L<collectd-unixsock(5)>.
191
192 When collectd exits it sends a B<SIGTERM> to all still running
193 child-processes upon which they have to quit.
194
195 =head1 NOTIFICATION DATA FORMAT
196
197 The notification executables receive values rather than providing them. In
198 fact, after the program is started C<STDOUT> is connected to C</dev/null>.
199
200 The data is passed to the executables over C<STDIN> in a format very similar to
201 HTTP: At first there is a "header" with one line per field. Every line consists
202 of a field name, ended by a colon, and the associated value until end-of-line.
203 The "header" is ended by two newlines immediately following another,
204 i.e. an empty line. The rest, basically the "body", is the message of the
205 notification.
206
207 The following is an example notification passed to a program:
208
209   Severity: FAILURE
210   Time: 1200928930.515
211   Host: myhost.mydomain.org
212   \n
213   This is a test notification to demonstrate the format
214
215 The following header files are currently used. Please note, however, that you
216 should ignore unknown header files to be as forward-compatible as possible.
217
218 =over 4
219
220 =item B<Severity>
221
222 Severity of the notification. May either be B<FAILURE>, B<WARNING>, or B<OKAY>.
223
224 =item B<Time>
225
226 The time in epoch, i.e. as seconds since 1970-01-01 00:00:00 UTC. The value
227 currently has millisecond precision (i.e. three decimal places), but scripts
228 should accept arbitrary numbers of decimal places, including no decimal places.
229
230 =item B<Host>
231
232 =item B<Plugin>
233
234 =item B<PluginInstance>
235
236 =item B<Type>
237
238 =item B<TypeInstance>
239
240 Identification of the performance data this notification is associated with.
241 All of these fields are optional because notifications do not B<need> to be
242 associated with a certain value.
243
244 =back
245
246 =head1 ENVIRONMENT
247
248 The following environment variables are set by the plugin before calling
249 I<exec>:
250
251 =over 4
252
253 =item COLLECTD_INTERVAL
254
255 Value of the global interval setting.
256
257 =item COLLECTD_HOSTNAME
258
259 Hostname used by I<collectd> to dispatch local values.
260
261 =back
262
263 =head1 USING NAGIOS PLUGINS
264
265 Though the interface is far from perfect, there are tons of plugins for Nagios.
266 You can use these plugins with collectd by using a simple transition layer,
267 C<exec-nagios.px>, which is shipped with the collectd distribution in the
268 C<contrib/> directory. It is a simple Perl script that comes with embedded
269 documentation. To see it, run the following command:
270
271   perldoc exec-nagios.px
272
273 This script expects a configuration file, C<exec-nagios.conf>. You can find an
274 example in the C<contrib/> directory, too.
275
276 Even a simple mechanism to submit "performance data" to collectd is
277 implemented. If you need a more sophisticated setup, please rewrite the plugin
278 to make use of collectd's more powerful interface.
279
280 =head1 CAVEATS
281
282 =over 4
283
284 =item *
285
286 The user, the binary is executed as, may not have root privileges, i.E<nbsp>e.
287 must have an UID that is non-zero. This is for your own good.
288
289 =item *
290
291 Early versions of the plugin did not use a command but treated all lines as if
292 they were arguments to the I<PUTVAL> command. When the I<PUTNOTIF> command was
293 implemented, this behavior was kept for lines which start with an unknown
294 command for backwards compatibility. This compatibility code has been removed
295 in I<collectdE<nbsp>5>.
296
297 =back
298
299 =head1 SEE ALSO
300
301 L<collectd(1)>,
302 L<collectd.conf(5)>,
303 L<collectd-perl(5)>,
304 L<collectd-unixsock(5)>,
305 L<fork(2)>, L<exec(3)>
306
307 =head1 AUTHOR
308
309 Florian Forster E<lt>octo@collectd.orgE<gt>
310
311 =cut