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 / DomotiGa / ServerStats.module @ 140

History | View | Annotate | Download (7.8 kB)

1
' Gambas module file
2
3
' Description:
4
' ServerStats.module
5
' Support for server statistics monitoring.
6
7
' Development Status:
8
' Working.
9
10
' DomotiGa - an open source home automation program.
11
' Copyright(C) 2008 Ron Klinkien
12
13
' Read file called COPYING for license details.
14
15
PUBLIC tServerStats AS NEW Timer
16
17
PUBLIC FUNCTION CreateRRDs()
18
19
  DIM sRRDCmd, sRRD AS String
20
21
  sRRD = Main.sBaseDir &/ "rrd/serverload.rrd"
22
  IF NOT Exist(sRRD) THEN
23
    IF Main.bServerStatsDebug THEN 
24
      Main.WriteDebugLog("[ServerStats] Create rrdtool database for system load.")
25
      Main.WriteDebugLog(sRRDCmd)
26
    END IF
27
    sRRDCmd = "rrdtool create " & sRRD & " -s 60 "
28
    sRRDCmd = sRRDCmd & "DS:load1:GAUGE:300:0:U "
29
    sRRDCmd = sRRDCmd & "DS:load5:GAUGE:300:0:U "
30
    sRRDCmd = sRRDCmd & "DS:load15:GAUGE:300:0:U "
31
    sRRDCmd = 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"
32
    SHELL sRRDCmd WAIT
33
  END IF
34
  sRRD = Main.sBaseDir &/ "rrd/servermemory.rrd"
35
  IF NOT Exist(sRRD) THEN
36
    IF Main.bServerStatsDebug THEN
37
      Main.WriteDebugLog("[ServerStats] Create rrdtool database for memory usage.")
38
      Main.WriteDebugLog(sRRDCmd)
39
    END IF
40
    sRRDCmd = "rrdtool create " & sRRD & " -s 60 "
41
    sRRDCmd = sRRDCmd & "DS:used:GAUGE:300:U:U "
42
    sRRDCmd = sRRDCmd & "DS:free:GAUGE:300:U:U "
43
    sRRDCmd = sRRDCmd & "DS:buffers:GAUGE:300:U:U "
44
    sRRDCmd = sRRDCmd & "DS:cached:GAUGE:300:U:U "
45
    sRRDCmd = 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"
46
    SHELL sRRDCmd WAIT
47
  END IF
48
49
END
50
51
PUBLIC FUNCTION Run()
52
53
  IF NOT Main.bRRDToolEnabled THEN RETURN
54
55
  CreateRRDs() ' check for missing rrd databases
56
57
  ' start poll timer for ServerStats
58
  tServerStats = NEW Timer AS "tServerStats"
59
  tServerStats.Delay = 60 * 1000 ' every minute
60
  tServerStats.Start
61
62
END
63
64
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
65
' get cpuload and memory values and update rrd files
66
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
67
PUBLIC FUNCTION UpdateRRDs()
68
69
  DIM sLoad, sMemory, sRRDCmd, sVal AS String
70
  DIM aLoad, aMemory AS String[]
71
  DIM cVal AS NEW Collection
72
73
  ' run tool to fetch system load
74
  EXEC ["cat", "/proc/loadavg"] TO sLoad
75
  aLoad = Scan(sLoad, "* * * * *")
76
  'rrdtool update serverload.rrd N:$USER:$NICE:$SYSTEM:$IOWAIT:$IDLE
77
  sRRDCmd = "rrdtool update " & Main.sBaseDir &/ "rrd/serverload.rrd" & " N"
78
  sRRDCmd &= ":" & aLoad[0] & ":" & aLoad[1] & ":" & aLoad[2]
79
  IF Main.bServerStatsDebug THEN
80
    Main.WriteDebugLog("[ServerStats] " & sLoad)
81
    Main.WriteDebugLog("[ServerStats] " & sRRDCmd)
82
  ELSE
83
    sRRDCmd &= " >/dev/null" & " 2>&1"
84
  END IF
85
  SHELL sRRDCmd WAIT
86
87
  EXEC ["cat", "/proc/meminfo"] TO sMemory
88
  FOR EACH sVal IN Split(sMemory, "\n", "", TRUE)
89
    aMemory = Split(sVal, " ", "", TRUE)
90
    cVal[Left$(aMemory[0], -1)] = CInt(aMemory[1])
91
  NEXT
92
93
  ' rrdtool update servermemory.rrd N:$MEMUSED:$MEMFREE:$BUFFERS:$CACHED
94
  sRRDCmd = "rrdtool update " & Main.sBaseDir &/ "rrd/servermemory.rrd" & " N"
95
  sRRDCmd = sRRDCmd & ":" & Str(cVal!MemTotal / 1024) & ":" & Str(cVal!MemFree / 1024) & ":" & Str(cVal!Buffers / 1024) & ":" & Str(cVal!Cached / 1024)
96
  IF Main.bServerStatsDebug THEN
97
    Main.WriteDebugLog("[ServerStats] MemTotal: " & cVal!MemTotal & " MemFree:" & cVal!MemFree & " Buffers: " & cVal!Buffers & " Cached: " & cVal!Cached)
98
    Main.WriteDebugLog("[ServerStats] " & sRRDCmd)
99
  ELSE
100
    sRRDCmd &= " >/dev/null" & " 2>&1"
101
  END IF
102
  SHELL sRRDCmd WAIT
103
104
END
105
106
PUBLIC SUB tServerStats_Timer()
107
108
  UpdateRRDs() ' update rrd values every polltime seconds
109
110
END
111
112
PUBLIC SUB DisplayGraphs(iMode AS Integer, sGroup AS String, oPanel AS Object)
113
114
  DIM pGraph AS Picture
115
  DIM sGraphs AS String[]
116
  DIM sList, sGraph, sType, sName AS String
117
  DIM hPictureBox AS PictureBox
118
  DIM oObject AS Object
119
  DIM iHeight AS Integer
120
121
  CreateGraphs()
122
123
  SELECT CASE iMode
124
    CASE 0
125
      sType = "1h"
126
      sName = ("Hour")
127
    CASE 1
128
      sType = "1d"
129
      sName = ("Day")
130
    CASE 2
131
      sType = "1w"
132
      sName = ("Week")
133
    CASE 3
134
      sType = "1m"
135
      sName = ("Month")
136
    CASE 4
137
      sType = "1y"
138
      sName = ("Year")
139
  END SELECT
140
141
  ' delete previous graphs first
142
  FOR EACH oObject IN oPanel.Children
143
    oObject.Delete()
144
  NEXT
145
146
  Main.DisplayHeader(sGroup & (" Performance - Last") & " " & sName, oPanel)
147
  sList = ServerStats.Graphs()
148
  sGraphs = Split(sList, "|")
149
  FOR EACH sGraph IN sGraphs
150
    IF sGraph THEN
151
      sGraph &= "-" & sType & ".png"
152
      TRY pGraph = Picture.Load(sGraph)
153
      IF pGraph THEN
154
        hPictureBox = NEW PictureBox(oPanel) AS "Graph"
155
        WITH hPictureBox
156
          .Picture = pGraph
157
          .Height = 200
158
          .Width = 528
159
          .Tag = sGraph
160
        END WITH
161
      END IF
162
    END IF
163
  NEXT
164
  iHeight = 0
165
  ' calculated needed scrollview height
166
  FOR EACH oObject IN oPanel.Children
167
      iHeight += oObject.Height
168
  NEXT
169
  oPanel.Height = iHeight
170
171
END
172
173
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
174
' create graphs
175
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
176
PUBLIC FUNCTION CreateGraphs()
177
178
  DIM sRRD, sRRDCmd, sGraphImage, sRRDName, sTime AS String
179
  DIM aTimeFrame AS String[] = ["1h", "1d", "1w", "1m", "1y"]
180
  DIM aTimeStr AS String[]
181
182
  IF NOT Main.bRRDToolEnabled THEN RETURN
183
184
  sRRD = Main.sBaseDir &/ "rrd/serverload.rrd"
185
  ' rrdtool graph /home/ron/domotiga/rrd/graphs/server-load-hour.png --lazy --start -1h -c SHADEA#FFFFFF -c SHADEB#FFFFFF -c BACK#FFFFFF -t "Power Usage - Last Hour" -v "Watt" DEF:watt=/home/ron/domotiga/rrd/powerusage.rrd:watt:AVERAGE LINE2:watt#00FF00:"Watt"
186
  FOR EACH sTime IN aTimeFrame
187
    sGraphImage = Main.sBaseDir &/ "rrd/graphs/server-load" & "-" & sTime & ".png"
188
    sRRDCmd = "rrdtool graph " & sGraphImage & " --lazy --units-exponent=0 --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'"
189
    IF Main.bServerStatsDebug THEN
190
      Main.WriteDebugLog("[ServerStats] " & sRRDCmd)
191
    ELSE
192
      sRRDCmd &= " >/dev/null" & " 2>&1"
193
    END IF
194
    SHELL sRRDCmd WAIT
195
  NEXT
196
197
  sRRD = Main.sBaseDir &/ "rrd/servermemory.rrd"
198
  ' rrdtool graph /home/ron/domotiga/rrd/graphs/server-memory-hour.png --lazy --start -1h -c SHADEA#FFFFFF -c SHADEB#FFFFFF -c BACK#FFFFFF -t "Power Usage - Last Hour" -v "Watt" DEF:watt=/home/ron/domotiga/rrd/powerusage.rrd:watt:AVERAGE LINE2:watt#00FF00:"Watt"
199
  FOR EACH sTime IN aTimeFrame
200
    sGraphImage = Main.sBaseDir &/ "rrd/graphs/server-memory" & "-" & sTime & ".png"
201
    sRRDCmd = "rrdtool graph " & sGraphImage & " --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'"
202
    IF Main.bServerStatsDebug THEN
203
      Main.WriteDebugLog("[ServerStats] " & sRRDCmd)
204
    ELSE
205
      sRRDCmd &= " >/dev/null" & " 2>&1"
206
    END IF
207
    SHELL sRRDCmd WAIT
208
  NEXT
209
210
END
211
212
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
213
' return names of graph images
214
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
215
PUBLIC SUB Graphs() AS String
216
217
  ' return string with all graph image names in this group
218
  RETURN "|" & Main.sBaseDir &/ "rrd/graphs/server-load" & "|" & Main.sBaseDir &/ "rrd/graphs/server-memory" & "|"
219
220
END