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
' 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-2010 Ron Klinkien
12
13
' Read file called COPYING for license details.
14
15
PUBLIC tServerStats AS Timer
16
17
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18
' start timer
19
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20
PUBLIC SUB Run()
21
22
  ' if not enabled, return
23
  IF NOT Main.bRRDToolEnabled THEN RETURN
24
25
  ' check for missing rrd databases
26
  CreateRRDs()
27
28
  ' start poll timer for ServerStats
29
  tServerStats = NEW Timer AS "tServerStats"
30
  tServerStats.Delay = 60 * 1000 ' every minute
31
  tServerStats.Start
32
33
END
34
35
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
36
' gets called at each timer event
37
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38
PUBLIC SUB tServerStats_Timer()
39
40
  UpdateRRDs() ' update rrd values every polltime seconds
41
42
END
43
44
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
45
' create missing rrd databases for serverstats
46
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47
PRIVATE SUB CreateRRDs()
48
49
  DIM sRRDCmd, sRRD AS String
50
51
  sRRD = Main.sBaseDir &/ "rrd/serverload.rrd"
52
  IF NOT Exist(sRRD) THEN
53
    sRRDCmd = "rrdtool create " & sRRD & " -s 60 "
54
    sRRDCmd &= "DS:load1:GAUGE:300:0:U "
55
    sRRDCmd &= "DS:load5:GAUGE:300:0:U "
56
    sRRDCmd &= "DS:load15:GAUGE:300:0:U "
57
    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
    sRRDCmd &= " 2>&1 >/dev/null"
59
    IF Main.bServerStatsDebug THEN Main.WriteDebugLog(("[ServerStats] Create rrdtool database for server load with '") & sRRDCmd & "'.")
60
    SHELL sRRDCmd WAIT
61
  END IF
62
63
  sRRD = Main.sBaseDir &/ "rrd/servermemory.rrd"
64
  IF NOT Exist(sRRD) THEN
65
    sRRDCmd = "rrdtool create " & sRRD & " -s 60 "
66
    sRRDCmd &= "DS:used:GAUGE:300:U:U "
67
    sRRDCmd &= "DS:free:GAUGE:300:U:U "
68
    sRRDCmd &= "DS:buffers:GAUGE:300:U:U "
69
    sRRDCmd &= "DS:cached:GAUGE:300:U:U "
70
    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
    sRRDCmd &= " 2>&1 >/dev/null"
72
    IF Main.bServerStatsDebug THEN Main.WriteDebugLog(("[ServerStats] Create rrdtool database for memory usage with '") & sRRDCmd & "'.")
73
    SHELL sRRDCmd WAIT
74
  END IF
75
76
END
77
78
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
79
' get cpuload and memory values and update rrd files
80
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81
PRIVATE SUB UpdateRRDs()
82
83
  DIM sLoad, sMemory, sRRDCmd, sVal AS String
84
  DIM aLoad, aMemory AS String[]
85
  DIM cVal AS NEW Collection
86
87
  ' run tool to fetch system load and update database
88
  EXEC ["cat", "/proc/loadavg"] TO sLoad
89
  aLoad = Scan(sLoad, "* * * * *")
90
  sRRDCmd = "N:" & aLoad[0] & ":" & aLoad[1] & ":" & aLoad[2]
91
  IF Main.bServerStatsDebug THEN
92
    Main.WriteDebugLog("[ServerStats] Load: " & sLoad)
93
    Main.WriteDebugLog("[ServerStats] rrdtool update " & Main.sBaseDir &/ "rrd/serverload.rrd " & sRRDCmd)
94
  END IF
95
  EXEC ["rrdtool", "update", Main.sBaseDir &/ "rrd/serverload.rrd", sRRDCmd]
96
97
  ' get memory stats and update database
98
  EXEC ["cat", "/proc/meminfo"] TO sMemory
99
  FOR EACH sVal IN Split(sMemory, "\n", "", TRUE)
100
    aMemory = Split(sVal, " ", "", TRUE)
101
    cVal[Left$(aMemory[0], -1)] = Val(aMemory[1])
102
  NEXT
103
  sRRDCmd = "N:" & Str(cVal!MemTotal / 1024) & ":" & Str(cVal!MemFree / 1024) & ":" & Str(cVal!Buffers / 1024) & ":" & Str(cVal!Cached / 1024)
104
  IF Main.bServerStatsDebug THEN
105
    Main.WriteDebugLog("[ServerStats] MemTotal: " & cVal!MemTotal & " MemFree:" & cVal!MemFree & " Buffers: " & cVal!Buffers & " Cached: " & cVal!Cached)
106
    Main.WriteDebugLog("[ServerStats] rrdtool update " & Main.sBaseDir &/ "rrd/servermemory.rrd " & sRRDCmd)
107
  END IF
108
  EXEC ["rrdtool", "update", Main.sBaseDir &/ "rrd/servermemory.rrd", sRRDCmd]
109
110
CATCH
111
  Main.WriteDebugLog(("ERROR: ") & Error.Text & " at " & Error.Where)
112
113
END
114
115
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
116
' create graphs
117
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118
PUBLIC SUB CreateGraphs(sTime AS String)
119
120
  DIM sRRD, sRRDCmd, sGraphImage, sRRDName AS String
121
122
  IF NOT Main.bRRDToolEnabled THEN RETURN
123
124
  sRRD = Main.sBaseDir &/ "rrd/serverload.rrd"
125
  sGraphImage = Main.sBaseDir &/ "rrd/graphs/server-load" & "-" & sTime & ".png"
126
  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
  sRRDCmd &= " 2>&1 >/dev/null"
128
  IF Main.bServerStatsDebug THEN Main.WriteDebugLog("[ServerStats] " & sRRDCmd)
129
  SHELL sRRDCmd WAIT
130
131
  sRRD = Main.sBaseDir &/ "rrd/servermemory.rrd"
132
  sGraphImage = Main.sBaseDir &/ "rrd/graphs/server-memory" & "-" & sTime & ".png"
133
  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
  sRRDCmd &= " 2>&1 >/dev/null"
135
  IF Main.bServerStatsDebug THEN Main.WriteDebugLog("[ServerStats] " & sRRDCmd)
136
  SHELL sRRDCmd WAIT
137
138
END
139
140
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
141
' return names of graph images
142
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
143
PUBLIC FUNCTION Graphs() AS String
144
145
  ' return string with all graph image names in this group
146
  RETURN "|" & Main.sBaseDir &/ "rrd/graphs/server-load" & "|" & Main.sBaseDir &/ "rrd/graphs/server-memory" & "|"
147
148
END