.\" Automatically generated by Pod::Man 2.1801 (Pod::Simple 3.08) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .ie \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .el \{\ . de IX .. .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "RRDGRAPH_LIBDBI 1" .TH RRDGRAPH_LIBDBI 1 "2009-06-09" "1.3.999" "rrdtool" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" rrdgraph_libdbi \- fetching data for graphing in rrdtool graph via libdbi .SH "SYNOPSIS" .IX Header "SYNOPSIS" = \fBsql///=/...[/rrdminstepsize=][/rrdfillmissing=]////[/derive]//.../\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" This pseudo-rrd-filename defines a sql datasource: .IP "\fBsql//\fR" 8 .IX Item "sql//" .Vb 1 \& magic cookie\-prefix for a libdbi type datasource .Ve .IP "\fB\fR" 8 .IX Item "" .Vb 1 \& which libdbi driver to use (e.g: mysql) .Ve .IP "\fB\fR=\fB\fR" 8 .IX Item "=" .Vb 2 \& defines the parameters that are required to connect to the database with the given libdbi driver \& (These drivers are libdbi dependent \- for details please look at the driver documentation of libdbi!) .Ve .IP "\fB/rrdminstepsize\fR=\fB\fR" 8 .IX Item "/rrdminstepsize=" .Vb 1 \& defines the minimum number of the step\-length used for graphing (default: 300 seconds) .Ve .IP "\fB/rrdfillmissing\fR=\fB\fR" 8 .IX Item "/rrdfillmissing=" .Vb 1 \& defines the number of steps to fill with the last value to avoid NaN boxes due to data\-insertation jitter (default: 0 steps) .Ve .IP "\fB
\fR" 8 .IX Item "
" .Vb 1 \& defines the table from which to fetch the resultset. \& \& If there is a need to fetch data from several tables, these tables can be defined by separating the tablenames with a "+" \& \& hex\-type\-encoding via %xx are translated to the actual value, use %% to use % .Ve .IP "\fB<[*]unixtimestamp column>\fR" 8 .IX Item "<[*]unixtimestamp column>" .Vb 2 \& defines the column of EtableE which contains the unix\-timestamp \& \- if this is a DATETIME field in the database, then prefix with leading \*(Aq*\*(Aq \& \& hex\-type\-encoding via %xx are translated to the actual value, use %% to use % .Ve .IP "\fB\fR" 8 .IX Item "" .Vb 1 \& defines the column of EtableE which contains the value column, which should be graphed \& \& hex\-type\-encoding via %xx are translated to the actual value, use %% to use % .Ve .IP "\fB/derive\fR" 8 .IX Item "/derive" .Vb 1 \& defines that the data value used should be the delta of the 2 consecutive values (to simulate COUNTER or DERIVE type datasources) .Ve .IP "\fB/\fR" 8 .IX Item "/" .Vb 1 \& defines one (ore more) where clauses that are joined with AND to filter the entries in the table \& \& hex\-type\-encoding via %xx are translated to the actual value, use %% to use % .Ve .PP the returned value column-names, which can be used as ds-names, are: .IP "\fBmin\fR, \fBavg\fR, \fBmax\fR, \fBcount\fR and \fBsigma\fR" 8 .IX Item "min, avg, max, count and sigma" .Vb 3 \& are returned to be used as ds\-names in your DS definition. \& The reason for using this is that if the consolidation function is used for min/avg and max, then the engine is used several times. \& And this results in the same SQL Statements used several times .Ve .SH "EXAMPLES" .IX Header "EXAMPLES" Here an example of a table in a MySQL database: .PP .Vb 5 \& DB connect information \& dbhost=127.0.0.1 \& user=rrd \& password=secret \& database=rrd \& \& here the table: \& CREATE TABLE RRDValue ( \& RRDKeyID bigint(20) NOT NULL, \& UnixTimeStamp int(11) NOT NULL, \& value double default NOT NULL, \& PRIMARY KEY (RRDKeyID,UnixTimeStamp) \& ); .Ve .PP and the RRDKeyID we want to graph for is: 1141942900757789274 .PP The pseudo rrd-filename to access this is: \&\*(L"sql//mysql/host=127.0.0.1/dbname=rrd/username=rrd/password=secret//RRDValue/UnixTimeStamp/value/RRDKeyID=1141464142203608274\*(R" .PP To illustrate this here a command to create a graph that contains the actual values. .PP .Vb 10 \& DS_BASE="sql//mysql/host=127.0.0.1/dbname=rrd/username=rrd/password=passwd//RRDValue/UnixTimeStamp/value/RRDKeyID=1141942900757789274" \& rrdtool graph test.png \-\-imgformat=PNG \-\-start=\-1day \-\-end=+3hours \-\-width=1000 \-\-height=600 \e \& "DEF:min=$DS_BASE:min:AVERAGE" \e \& "LINE1:min#FF0000:value" \e \& "DEF:avg=$DS_BASE:avg:AVERAGE" \e \& "LINE1:avg#00FF00:average" \e \& "DEF:max=$DS_BASE:max:AVERAGE" \e \& "LINE1:max#FF0000:max" \e \& "DEF:sigma=$DS_BASE:sigma:AVERAGE" \e \& "CDEF:upper=avg,4,sigma,*,+" \e \& "LINE1:upper#0000FF:+4 sigma" \e \& "CDEF:lower=avg,4,sigma,*,\-" \e \& "LINE1:lower#0000FF:\-4 sigma" .Ve .SH "NOTES" .IX Header "NOTES" * Naturally you can also use any other kind of driver that libdbi supports \- e.g postgres, ... .PP * From the way the datasource is joined, it should also be possible to do joins over different tables (separate tables with \*(L",\*(R" in table and add in the \s-1WHERE\s0 Clauses the table equal joins. This has not been tested!!!) .PP * It should also be relatively simple to add to the database using the same datasource string. This has not been implemented... .PP * The aggregation functions are ignored and several data columns are used instead to avoid querying the same \s-1SQL\s0 several times when minimum, average and maximum are needed for graphing... .PP * for \s-1DB\s0 efficiency you should think of having 2 tables, one containing historic values and the other containing the latest data. This second table should be kept small to allow for the least ammount of blocking \s-1SQL\s0 statements. Whith mysql you can even use myisam table-type for the first and InnoDB for the second. This is especially interresting as with tables with +100M rows myisam is much smaller then InnoDB. .PP * To debug the \s-1SQL\s0 statements set the environment variable \s-1RRDDEBUGSQL\s0 and the actual \s-1SQL\s0 statements and the timing is printed to stderr. .SH "BUGS" .IX Header "BUGS" * at least on Linux please make sure that the libdbi driver is explicitly linked against libdbi.so.0 check via ldd /usr/lib/dbd/libmysql.so, that there is a line with libdbi.so.0. otherwise at least the perl module RRDs will fail because the dynamic linker can not find some symbols from libdbi.so. (this only happens when the libdbi driver is actually used the first time!) This is \s-1KNOWN\s0 to be the case with \s-1RHEL4\s0 and \s-1FC4\s0 and \s-1FC5\s0! (But actually this is a bug with libdbi make files!) .PP * at least version 0.8.1 of libdbiexhibits a bug with \s-1BINARY\s0 fields (shorttext,text,mediumtext,longtext and possibly also \s-1BINARY\s0 and \s-1BLOB\s0 fields), that can result in coredumps of rrdtool. The tool will tell you on stderr if this occures, so that you know what may be the reason. If you are not experiencing these coredumps, then set the environment variable \s-1RRD_NO_LIBDBI_BUG_WARNING\s0, and then the message will not get shown. .SH "AUTHOR" .IX Header "AUTHOR" Martin Sperl