On Wed, 4 Apr 2012 10:59:20 -0500, "Jay A. Kreibich" <[email protected]> wrote:
> Not to mention avg(). > > You might want to have a look at how RRDtool deals with condensing > data. It is common pratice to plot average, min, and max to preserve > outliers, while still showing trends. > > http://oss.oetiker.ch/rrdtool/ > > > -j I second this, just dump all your data into a well configured rrdtool round robin database. ################################ ## CONSTANTS ################################ # sample interval in seconds, 5 minutes INTERVAL=300 # max interval to miss (heartbeat) HEARTBEAT=900 ## Aggregate parameters # aggregate1 is 1 samples = 1 * 300 = 300 sec = 5 min @ 2016 rows = 168 hrs = 7 days = 1 week # aggregate2 is 12 samples = 12 * 300 = 3600 sec = 1 hr @ 1008 rows = 1008 hrs = 42 days = 6 weeks (5 + 1 ^^ ) # aggregate3 is 72 samples = 72 * 300 = 21600 sec = 6 hr @ 896 rows = 5376 hrs = 224 days = 32 weeks (26+5+1 ^^ ^^ ) # aggregate3 is 288 samples = 288 * 300 = 86400 sec = 24 hr @ 616 rows = 14784 hrs = 616 days = 88 weeks (56+26+5+1 round up^^ ^^ ^^) STEPS1=1 STEPS2=12 STEPS3=72 STEPS4=288 # nr of aggregared generations 42 days ROWS1=2016 ROWS2=1008 ROWS3=896 ROWS4=616 ################################ ### create and populate the round robin database "once" ################################ rrcreate () { test -f "${RRFN}" && rm "${RRFN}" rrdtool create "${RRFN}" \ --start $(printf ".separator :\nSELECT epstamp - 300 FROM rrdfrom;\n" | sqlite3 ${dbfn}) \ --step ${INTERVAL} \ DS:UpstreamBitRate:GAUGE:${HEARTBEAT}:0:4096000 \ DS:DnstreamBitRate:GAUGE:${HEARTBEAT}:0:32768000 \ DS:BytesSent:COUNTER:${HEARTBEAT}:0:500000000000 \ DS:BytesRecv:COUNTER:${HEARTBEAT}:0:1000000000000 \ DS:Connected:GAUGE:${HEARTBEAT}:0:3 \ RRA:AVERAGE:0.1:${STEPS1}:${ROWS1} \ RRA:MIN:0.1:${STEPS1}:${ROWS1} \ RRA:MAX:0.1:${STEPS1}:${ROWS1} \ RRA:AVERAGE:0.1:${STEPS2}:${ROWS2} \ RRA:MIN:0.1:${STEPS2}:${ROWS2} \ RRA:MAX:0.1:${STEPS2}:${ROWS2} \ RRA:AVERAGE:0.1:${STEPS3}:${ROWS3} \ RRA:MIN:0.1:${STEPS3}:${ROWS3} \ RRA:MAX:0.1:${STEPS3}:${ROWS3} \ RRA:AVERAGE:0.1:${STEPS4}:${ROWS4} \ RRA:MIN:0.1:${STEPS4}:${ROWS4} \ RRA:MAX:0.1:${STEPS4}:${ROWS4} ### POPULATE RRD, printf ".separator :\nSELECT * FROM rrdupdate;\n" \ | sqlite3 "${dbfn}" \ | gawk -v rr="${RRFN}" 'BEGIN{ # group 24 measurements into one update line for speed buf="" } function prbuf(){ printf "update %s%s\n",rr,buf buf="" } ( 0 == (NR % 24)){ prbuf() } { buf = buf " " $0 } END{ if (buf != "") prbuf() }' | rrdtool - } where rrdfrom is a view to define the start timestamp of the RRD: CREATE VIEW rrdfrom AS SELECT strftime('%s',MIN(dtstamp)) AS epstamp FROM T_Statistics AS ST ; rrdupdate is a view providing the data: CREATE VIEW rrdupdate AS SELECT strftime('%s',dtstamp) AS epstamp , Layer1UpstreamMaxBitRate , Layer1DownstreamMaxBitRate , TotalBytesSent , TotalBytesReceived , CASE CS.cs_val WHEN 'Connected' THEN 1 ELSE 0 END AS ConnectionStatus FROM T_Statistics AS ST INNER JOIN ConnectionStatuss AS CS ON ST.cs_id == CS.cs_id ORDER BY dtstamp; T_Statistics is a table: CREATE TABLE T_Statistics ( -- ST st_id INTEGER PRIMARY KEY NOT NULL , dtstamp REAL NOT NULL -- julianday(), UTC , rc INTEGER NOT NULL , cs_id INTEGER NOT NULL REFERENCES ConnectionStatuss (cs_id) ON UPDATE CASCADE ON DELETE CASCADE , le_id INTEGER NOT NULL REFERENCES LastConnectionErrors (le_id) ON UPDATE CASCADE ON DELETE CASCADE , uptime INTEGER NOT NULL -- seconds , wa_id INTEGER NOT NULL REFERENCES WANAccessTypes (wa_id) ON UPDATE CASCADE ON DELETE CASCADE , Layer1UpstreamMaxBitRate INTEGER NOT NULL , Layer1DownstreamMaxBitRate INTEGER NOT NULL , pl_id INTEGER NOT NULL REFERENCES PhysicalLinkStatuss (pl_id) ON UPDATE CASCADE ON DELETE CASCADE , ByteSendRate INTEGER NOT NULL , ByteReceiveRate INTEGER NOT NULL , PacketSendRate INTEGER NOT NULL , PacketReceiveRate INTEGER NOT NULL , TotalBytesSent INTEGER NOT NULL , TotalBytesReceived INTEGER NOT NULL , AutoDisconnectTime INTEGER NOT NULL , IdleDisconnectTime INTEGER NOT NULL , dn_id1 INTEGER NOT NULL REFERENCES DNSServers (dn_id) ON UPDATE CASCADE ON DELETE CASCADE , dn_id2 INTEGER NOT NULL REFERENCES DNSServers (dn_id) ON UPDATE CASCADE ON DELETE CASCADE , vd_id1 INTEGER NOT NULL REFERENCES VoipDNSServers (vd_id) ON UPDATE CASCADE ON DELETE CASCADE , vd_id2 INTEGER NOT NULL REFERENCES VoipDNSServers (vd_id) ON UPDATE CASCADE ON DELETE CASCADE , UpnpControlEnabled INTEGER NOT NULL , RoutedBridgedModeBoth INTEGER NOT NULL ); ConnectionStatuss is a related table: CREATE TABLE ConnectionStatuss ( -- CS cs_id INTEGER PRIMARY KEY NOT NULL , cs_val TEXT UNIQUE NOT NULL ); [[tested, yet not guaranteed :D ]] -- Regards, Kees Nuyt _______________________________________________ sqlite-users mailing list [email protected] http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

