The files contained in this repository can be downloaded to your computer using a svn client.
On Linux you simply type the command displayed below.

This URL has Read-Only access.

Statistics
| Revision:

root / trunk / DomotiGaServer / ServerStats.module @ 788

History | View | Annotate | Download (6.1 kB)

1 239 rdnzl
' Gambas module file
2 239 rdnzl
3 239 rdnzl
' Description:
4 239 rdnzl
' ServerStats.module
5 239 rdnzl
' Support for server statistics monitoring.
6 239 rdnzl
7 239 rdnzl
' Development Status:
8 239 rdnzl
' Working.
9 239 rdnzl
10 239 rdnzl
' DomotiGa - an open source home automation program.
11 339 rdnzl
' Copyright(C) 2008-2010 Ron Klinkien
12 239 rdnzl
13 239 rdnzl
' Read file called COPYING for license details.
14 239 rdnzl
15 256 rdnzl
PUBLIC tServerStats AS Timer
16 239 rdnzl
17 256 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18 256 rdnzl
' start timer
19 256 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 256 rdnzl
PUBLIC SUB Run()
21 239 rdnzl
22 256 rdnzl
  ' if not enabled, return
23 256 rdnzl
  IF NOT Main.bRRDToolEnabled THEN RETURN
24 256 rdnzl
25 256 rdnzl
  ' check for missing rrd databases
26 256 rdnzl
  CreateRRDs()
27 256 rdnzl
28 256 rdnzl
  ' start poll timer for ServerStats
29 256 rdnzl
  tServerStats = NEW Timer AS "tServerStats"
30 536 rdnzl
  tServerStats.Delay = 60 * 1000 ' every minute
31 256 rdnzl
  tServerStats.Start
32 256 rdnzl
33 256 rdnzl
END
34 256 rdnzl
35 256 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
36 256 rdnzl
' gets called at each timer event
37 256 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38 256 rdnzl
PUBLIC SUB tServerStats_Timer()
39 256 rdnzl
40 256 rdnzl
  UpdateRRDs() ' update rrd values every polltime seconds
41 256 rdnzl
42 256 rdnzl
END
43 256 rdnzl
44 256 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
45 256 rdnzl
' create missing rrd databases for serverstats
46 256 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47 256 rdnzl
PRIVATE SUB CreateRRDs()
48 256 rdnzl
49 239 rdnzl
  DIM sRRDCmd, sRRD AS String
50 239 rdnzl
51 239 rdnzl
  sRRD = Main.sBaseDir &/ "rrd/serverload.rrd"
52 239 rdnzl
  IF NOT Exist(sRRD) THEN
53 239 rdnzl
    sRRDCmd = "rrdtool create " & sRRD & " -s 60 "
54 256 rdnzl
    sRRDCmd &= "DS:load1:GAUGE:300:0:U "
55 256 rdnzl
    sRRDCmd &= "DS:load5:GAUGE:300:0:U "
56 256 rdnzl
    sRRDCmd &= "DS:load15:GAUGE:300:0:U "
57 256 rdnzl
    sRRDCmd &= "RRA:AVERAGE:0.5:1:600 RRA:AVERAGE:0.5:2:600 RRA:AVERAGE:0.5:7:600 RRA:AVERAGE:0.5:30:600 RRA:AVERAGE:0.5:365:600"
58 256 rdnzl
    sRRDCmd &= " 2>&1 >/dev/null"
59 256 rdnzl
    IF Main.bServerStatsDebug THEN Main.WriteDebugLog(("[ServerStats] Create rrdtool database for server load with '") & sRRDCmd & "'.")
60 239 rdnzl
    SHELL sRRDCmd WAIT
61 239 rdnzl
  END IF
62 256 rdnzl
63 239 rdnzl
  sRRD = Main.sBaseDir &/ "rrd/servermemory.rrd"
64 239 rdnzl
  IF NOT Exist(sRRD) THEN
65 239 rdnzl
    sRRDCmd = "rrdtool create " & sRRD & " -s 60 "
66 256 rdnzl
    sRRDCmd &= "DS:used:GAUGE:300:U:U "
67 256 rdnzl
    sRRDCmd &= "DS:free:GAUGE:300:U:U "
68 256 rdnzl
    sRRDCmd &= "DS:buffers:GAUGE:300:U:U "
69 256 rdnzl
    sRRDCmd &= "DS:cached:GAUGE:300:U:U "
70 256 rdnzl
    sRRDCmd &= "RRA:AVERAGE:0.5:1:600 RRA:AVERAGE:0.5:2:600 RRA:AVERAGE:0.5:7:600 RRA:AVERAGE:0.5:30:600 RRA:AVERAGE:0.5:365:600"
71 256 rdnzl
    sRRDCmd &= " 2>&1 >/dev/null"
72 256 rdnzl
    IF Main.bServerStatsDebug THEN Main.WriteDebugLog(("[ServerStats] Create rrdtool database for memory usage with '") & sRRDCmd & "'.")
73 239 rdnzl
    SHELL sRRDCmd WAIT
74 239 rdnzl
  END IF
75 239 rdnzl
76 239 rdnzl
END
77 239 rdnzl
78 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
79 239 rdnzl
' get cpuload and memory values and update rrd files
80 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81 256 rdnzl
PRIVATE SUB UpdateRRDs()
82 239 rdnzl
83 239 rdnzl
  DIM sLoad, sMemory, sRRDCmd, sVal AS String
84 239 rdnzl
  DIM aLoad, aMemory AS String[]
85 239 rdnzl
  DIM cVal AS NEW Collection
86 239 rdnzl
87 256 rdnzl
  ' run tool to fetch system load and update database
88 239 rdnzl
  EXEC ["cat", "/proc/loadavg"] TO sLoad
89 239 rdnzl
  aLoad = Scan(sLoad, "* * * * *")
90 523 rdnzl
  sRRDCmd = "N:" & aLoad[0] & ":" & aLoad[1] & ":" & aLoad[2]
91 239 rdnzl
  IF Main.bServerStatsDebug THEN
92 256 rdnzl
    Main.WriteDebugLog("[ServerStats] Load: " & sLoad)
93 523 rdnzl
    Main.WriteDebugLog("[ServerStats] rrdtool update " & Main.sBaseDir &/ "rrd/serverload.rrd " & sRRDCmd)
94 239 rdnzl
  END IF
95 523 rdnzl
  EXEC ["rrdtool", "update", Main.sBaseDir &/ "rrd/serverload.rrd", sRRDCmd]
96 239 rdnzl
97 256 rdnzl
  ' get memory stats and update database
98 239 rdnzl
  EXEC ["cat", "/proc/meminfo"] TO sMemory
99 239 rdnzl
  FOR EACH sVal IN Split(sMemory, "\n", "", TRUE)
100 239 rdnzl
    aMemory = Split(sVal, " ", "", TRUE)
101 239 rdnzl
    cVal[Left$(aMemory[0], -1)] = Val(aMemory[1])
102 239 rdnzl
  NEXT
103 523 rdnzl
  sRRDCmd = "N:" & Str(cVal!MemTotal / 1024) & ":" & Str(cVal!MemFree / 1024) & ":" & Str(cVal!Buffers / 1024) & ":" & Str(cVal!Cached / 1024)
104 239 rdnzl
  IF Main.bServerStatsDebug THEN
105 239 rdnzl
    Main.WriteDebugLog("[ServerStats] MemTotal: " & cVal!MemTotal & " MemFree:" & cVal!MemFree & " Buffers: " & cVal!Buffers & " Cached: " & cVal!Cached)
106 523 rdnzl
    Main.WriteDebugLog("[ServerStats] rrdtool update " & Main.sBaseDir &/ "rrd/servermemory.rrd " & sRRDCmd)
107 239 rdnzl
  END IF
108 523 rdnzl
  EXEC ["rrdtool", "update", Main.sBaseDir &/ "rrd/servermemory.rrd", sRRDCmd]
109 239 rdnzl
110 535 rdnzl
CATCH
111 535 rdnzl
  Main.WriteDebugLog(("ERROR: ") & Error.Text & " at " & Error.Where)
112 535 rdnzl
113 258 rdnzl
END
114 258 rdnzl
115 258 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
116 258 rdnzl
' create graphs
117 258 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118 258 rdnzl
PUBLIC SUB CreateGraphs(sTime AS String)
119 258 rdnzl
120 258 rdnzl
  DIM sRRD, sRRDCmd, sGraphImage, sRRDName AS String
121 258 rdnzl
122 258 rdnzl
  IF NOT Main.bRRDToolEnabled THEN RETURN
123 258 rdnzl
124 258 rdnzl
  sRRD = Main.sBaseDir &/ "rrd/serverload.rrd"
125 258 rdnzl
  sGraphImage = Main.sBaseDir &/ "rrd/graphs/server-load" & "-" & sTime & ".png"
126 465 rdnzl
  sRRDCmd = "rrdtool graph " & sGraphImage & " --slope-mode --font DEFAULT:7: --lazy --units-exponent=0 --width 600 --height 100 --start -" & sTime & " -c SHADEA#FFFFFF -c SHADEB#FFFFFF -c BACK#FFFFFF -t '" & Main.sServerStatsName & " " & ("System Load") & "' -v Load DEF:load1=" & sRRD & ":load1:AVERAGE LINE1:load1#8080ff:'1 Minute load average' DEF:load5=" & sRRD & ":load5:AVERAGE LINE1:load5#ff8080:'5 Minute load average' DEF:load15=" & sRRD & ":load15:AVERAGE LINE1:load15#000000:'15 Minutes load average'"
127 258 rdnzl
  sRRDCmd &= " 2>&1 >/dev/null"
128 258 rdnzl
  IF Main.bServerStatsDebug THEN Main.WriteDebugLog("[ServerStats] " & sRRDCmd)
129 258 rdnzl
  SHELL sRRDCmd WAIT
130 258 rdnzl
131 258 rdnzl
  sRRD = Main.sBaseDir &/ "rrd/servermemory.rrd"
132 258 rdnzl
  sGraphImage = Main.sBaseDir &/ "rrd/graphs/server-memory" & "-" & sTime & ".png"
133 465 rdnzl
  sRRDCmd = "rrdtool graph " & sGraphImage & " --slope-mode --font DEFAULT:7: --width 600 --height 100 --lazy --base=1024 --alt-autoscale-max --lower-limit=0 --start -" & sTime & " -c SHADEA#FFFFFF -c SHADEB#FFFFFF -c BACK#FFFFFF -t '" & Main.sServerStatsName & " " & ("Memory Usage") & "' -v MBytes DEF:a=" & sRRD & ":used:AVERAGE AREA:a#6666FF:'Used' DEF:b=" & sRRD & ":free:AVERAGE STACK:b#99FF66:'Free' DEF:c=" & sRRD & ":buffers:AVERAGE LINE2:c#FFFF00:'Buffers' DEF:d=" & sRRD & ":cached:AVERAGE LINE2:d#663300:'Cached'"
134 258 rdnzl
  sRRDCmd &= " 2>&1 >/dev/null"
135 258 rdnzl
  IF Main.bServerStatsDebug THEN Main.WriteDebugLog("[ServerStats] " & sRRDCmd)
136 258 rdnzl
  SHELL sRRDCmd WAIT
137 258 rdnzl
138 258 rdnzl
END
139 258 rdnzl
140 258 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
141 258 rdnzl
' return names of graph images
142 258 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
143 258 rdnzl
PUBLIC FUNCTION Graphs() AS String
144 258 rdnzl
145 258 rdnzl
  ' return string with all graph image names in this group
146 258 rdnzl
  RETURN "|" & Main.sBaseDir &/ "rrd/graphs/server-load" & "|" & Main.sBaseDir &/ "rrd/graphs/server-memory" & "|"
147 258 rdnzl
148 258 rdnzl
END