]>
git.ipfire.org Git - collecty.git/blob - src/collecty/plugins/latency.py
a4be42e1d27f2be2440ea417a403ca7ea1aaf4f0
2 ###############################################################################
4 # collecty - A system statistics collection daemon for IPFire #
5 # Copyright (C) 2012 IPFire development team #
7 # This program is free software: you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 3 of the License, or #
10 # (at your option) any later version. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
26 from .. import _collecty
27 from ..colours
import *
31 # gateway is a special name that is automatically
32 # resolved by myhostname to the default gateway.
35 # The IPFire main server
39 class GraphTemplateLatency(base
.GraphTemplate
):
46 _
= self
.locale
.translate
50 # Compute the biggest loss and convert into percentage
51 "CDEF:ploss=loss6,loss4,MAX,100,*",
53 # Compute standard deviation
54 "CDEF:stddevarea6=stddev6,2,*",
55 "CDEF:spacer6=latency6,stddev6,-",
56 "CDEF:stddevarea4=stddev4,2,*",
57 "CDEF:spacer4=latency4,stddev4,-",
59 "CDEF:l005=ploss,0,5,LIMIT,UN,UNKN,INF,IF",
60 "CDEF:l010=ploss,5,10,LIMIT,UN,UNKN,INF,IF",
61 "CDEF:l025=ploss,10,25,LIMIT,UN,UNKN,INF,IF",
62 "CDEF:l050=ploss,25,50,LIMIT,UN,UNKN,INF,IF",
63 "CDEF:l099=ploss,50,99,LIMIT,UN,UNKN,INF,IF",
65 "LINE2:latency6_avg%s:%s" % (
66 transparency(COLOUR_IPV6
, .5),
67 _("Average latency (IPv6)"),
69 "LINE2:latency4_avg%s:%s\\r" % (
70 transparency(COLOUR_IPV4
, .5),
71 _("Average latency (IPv4)"),
74 "COMMENT:%s" % _("Packet Loss"),
76 transparency(colour_bg
, .2), _("0-5%"),
79 transparency(colour_bg
, .4), _("5-10%"),
82 transparency(colour_bg
, .6), _("10-25%"),
85 transparency(colour_bg
, .8), _("25-50%"),
87 "AREA:l099%s:%s\\r" % (colour_bg
, _("50-99%")),
89 "COMMENT: \\n", # empty line
92 "AREA:stddevarea4%s:STACK" % lighten(COLOUR_IPV4
, STDDEV_OPACITY
),
93 "LINE2:latency4%s:%s" % (COLOUR_IPV4
, _("Latency (IPv4)")),
94 "GPRINT:latency4_max:%12s\:" % _("Maximum") + " %6.2lf",
95 "GPRINT:latency4_min:%12s\:" % _("Minimum") + " %6.2lf",
96 "GPRINT:latency4_avg:%12s\:" % _("Average") + " %6.2lf\\n",
99 "AREA:stddevarea6%s:STACK" % lighten(COLOUR_IPV6
, STDDEV_OPACITY
),
100 "LINE2:latency6%s:%s" % (COLOUR_IPV6
, _("Latency (IPv6)")),
101 "GPRINT:latency6_max:%12s\:" % _("Maximum") + " %6.2lf",
102 "GPRINT:latency6_min:%12s\:" % _("Minimum") + " %6.2lf",
103 "GPRINT:latency6_avg:%12s\:" % _("Average") + " %6.2lf\\n",
107 def graph_title(self
):
108 _
= self
.locale
.translate
110 if self
.object.hostname
== "gateway":
111 hostname
= _("Default Gateway")
113 hostname
= self
.object.hostname
115 return _("Latency to %s") % hostname
118 def graph_vertical_label(self
):
119 _
= self
.locale
.translate
120 return _("Milliseconds")
123 def rrd_graph_args(self
):
125 "--legend-direction=bottomup",
129 class LatencyObject(base
.Object
):
131 "DS:latency6:GAUGE:0:U",
132 "DS:stddev6:GAUGE:0:U",
133 "DS:loss6:GAUGE:0:100",
134 "DS:latency4:GAUGE:0:U",
135 "DS:stddev4:GAUGE:0:U",
136 "DS:loss4:GAUGE:0:100",
140 return "<%s %s>" % (self
.__class
__.__name
__, self
.hostname
)
142 def init(self
, hostname
):
143 self
.hostname
= hostname
152 for family
in (socket
.AF_INET6
, socket
.AF_INET
):
154 p
= _collecty
.Ping(self
.hostname
, family
=family
)
155 p
.ping(count
=5, deadline
=10)
157 result
+= (p
.average
, p
.stddev
, p
.loss
)
159 except _collecty
.PingAddHostError
as e
:
160 self
.log
.debug(_("Could not add host %(host)s for family %(family)s") \
161 % { "host" : self
.hostname
, "family" : family
})
164 result
+= (None, None, None)
167 except _collecty
.PingNoReplyError
:
168 # Unknown but 100% loss
169 result
+= (None, None, 1)
172 except _collecty
.PingError
as e
:
173 self
.log
.warning(_("Could not run latency check for %(host)s: %(msg)s") \
174 % { "host" : self
.hostname
, "msg" : e
})
176 # A hundred percent loss
177 result
+= (None, None, 1)
182 class LatencyPlugin(base
.Plugin
):
184 description
= "Latency (ICMP ping) Plugin"
186 templates
= [GraphTemplateLatency
]
188 # Because this plugin has the potential to block, we give it a slightly lower priority
193 for hostname
in PING_HOSTS
:
194 yield LatencyObject(self
, hostname
)