@cryptotaxi247 / netdata-1 / commits / 06b713400

Add go_expvar module for the python.d.plugin

kralewitz committed Jun 8, 2017 at 09:53 UTC 06b713400b16279ad2b3780c07380e328a374c7d
9 files changed +395 -2
conf.d/Makefile.am
+1
@@ -35,6 +35,7 @@ dist_pythonconfig_DATA = \
35 python.d/exim.conf \
36 python.d/fail2ban.conf \
37 python.d/freeradius.conf \
38 + python.d/go_expvar.conf \
39 python.d/haproxy.conf \
40 python.d/hddtemp.conf \
41 python.d/ipfs.conf \
conf.d/python.d.conf
+1 -1
@@ -45,7 +45,7 @@ example: no
45
46 # gunicorn_log has been replaced by web_log
47 gunicorn_log: no
48 -
48 +go_expvar: no
49 # haproxy: yes
50 # hddtemp: yes
51 # ipfs: yes
conf.d/python.d/go_expvar.conf new
+106
@@ -0,0 +1,106 @@
1 +# netdata python.d.plugin configuration for go_expvar
2 +#
3 +# This file is in YaML format. Generally the format is:
4 +#
5 +# name: value
6 +#
7 +# There are 2 sections:
8 +# - global variables
9 +# - one or more JOBS
10 +#
11 +# JOBS allow you to collect values from multiple sources.
12 +# Each source will have its own set of charts.
13 +#
14 +# JOB parameters have to be indented (using spaces only, example below).
15 +
16 +# ----------------------------------------------------------------------
17 +# Global Variables
18 +# These variables set the defaults for all JOBs, however each JOB
19 +# may define its own, overriding the defaults.
20 +
21 +# update_every sets the default data collection frequency.
22 +# If unset, the python.d.plugin default is used.
23 +# update_every: 1
24 +
25 +# priority controls the order of charts at the netdata dashboard.
26 +# Lower numbers move the charts towards the top of the page.
27 +# If unset, the default for python.d.plugin is used.
28 +# priority: 60000
29 +
30 +# retries sets the number of retries to be made in case of failures.
31 +# If unset, the default for python.d.plugin is used.
32 +# Attempts to restore the service are made once every update_every
33 +# and only if the module has collected values in the past.
34 +# retries: 5
35 +
36 +# ----------------------------------------------------------------------
37 +# JOBS (data collection sources)
38 +#
39 +# Any number of jobs is supported.
40 +#
41 +# All python.d.plugin JOBS (for all its modules) support a set of
42 +# predefined parameters. These are:
43 +#
44 +# job_name:
45 +# name: my_name # the JOB's name as it will appear at the
46 +# # dashboard. If name: is not supplied the
47 +# # job_name: will be used (use _ for spaces)
48 +# # JOBs sharing a name are mutually exclusive
49 +# update_every: 1 # the JOB's data collection frequency
50 +# priority: 60000 # the JOB's order on the dashboard
51 +# retries: 5 # the JOB's number of restoration attempts
52 +#
53 +# Additionally to the above, this plugin also supports the following:
54 +#
55 +# url: 'http://127.0.0.1/debug/vars' # the URL of the expvar endpoint
56 +# ss_cert: # ignore HTTPS self-signed certificate
57 +# proxy: # use HTTP proxy
58 +#
59 +# As the plugin cannot possibly know the port your application listens on, there is no default value. Please include
60 +# the whole path of the endpoint, as the expvar handler can be installed in a non-standard location.
61 +#
62 +# if the URL is password protected, the following are supported:
63 +#
64 +# user: 'username'
65 +# pass: 'password'
66 +#
67 +# collect_memstats: true # enables charts for Go runtime's memory statistics
68 +# extra_charts: {} # defines extra data/charts to monitor, please see the example below
69 +#
70 +# If collect_memstats is disabled and no extra charts are defined, this module will disable itself, as it has no data to
71 +# collect.
72 +#
73 +# Please visit the module wiki page for more information on how to use the extra_charts variable:
74 +#
75 +# https://github.com/firehol/netdata/wiki/Monitoring-Go-Applications#monitoring-custom-vars-with-go_expvar
76 +#
77 +# Configuration example
78 +# ---------------------
79 +
80 +#app1:
81 +# name : 'app1'
82 +# url : 'http://127.0.0.1:8080/debug/vars'
83 +# collect_memstats: true
84 +# extra_charts:
85 +# - id: "runtime_goroutines"
86 +# options:
87 +# name: num_goroutines
88 +# title: "runtime: number of goroutines"
89 +# units: goroutines
90 +# family: runtime
91 +# context: expvar.runtime.goroutines
92 +# chart_type: line
93 +# lines:
94 +# - {expvar_key: 'runtime.goroutines', expvar_type: int, id: runtime_goroutines}
95 +# - id: "foo_counters"
96 +# options:
97 +# name: counters
98 +# title: "some random counters"
99 +# units: awesomeness
100 +# family: counters
101 +# context: expvar.foo.counters
102 +# chart_type: line
103 +# lines:
104 +# - {expvar_key: 'counters.cnt1', expvar_type: int, id: counters_cnt1}
105 +# - {expvar_key: 'counters.cnt2', expvar_type: float, id: counters_cnt2}
106 +
diagrams/netdata-overview.xml
+1 -1
@@ -1 +1 @@
1 -<mxfile userAgent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" version="6.6.5" editor="www.draw.io" type="github"><diagram name="Page-1">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</diagram></mxfile>
\ No newline at end of file
1 +<mxfile userAgent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36" version="6.7.3" editor="www.draw.io" type="github"><diagram name="Page-1">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</diagram></mxfile>
\ No newline at end of file
python.d/Makefile.am
+1
@@ -25,6 +25,7 @@ dist_python_DATA = \
25 exim.chart.py \
26 fail2ban.chart.py \
27 freeradius.chart.py \
28 + go_expvar.chart.py \
29 haproxy.chart.py \
30 hddtemp.chart.py \
31 ipfs.chart.py \
python.d/README.md
+38
@@ -483,6 +483,44 @@ and restart/reload your FREERADIUS server.
483
484 ---
485
486 +# go_expvar
487 +
488 +---
489 +
490 +The `go_expvar` module can monitor any Go application that exposes its metrics with the use of `expvar` package from the Go standard library.
491 +
492 +`go_expvar` produces charts for Go runtime memory statistics and optionally any number of custom charts. Please see the [wiki page](https://github.com/firehol/netdata/wiki/Monitoring-Go-Applications) for more info.
493 +
494 +For the memory statistics, it produces the following charts:
495 +
496 +1. **Heap allocations** in kB
497 + * alloc: size of objects allocated on the heap
498 + * inuse: size of allocated heap spans
499 +
500 +2. **Stack allocations** in kB
501 + * inuse: size of allocated stack spans
502 +
503 +3. **MSpan allocations** in kB
504 + * inuse: size of allocated mspan structures
505 +
506 +4. **MCache allocations** in kB
507 + * inuse: size of allocated mcache structures
508 +
509 +5. **Virtual memory** in kB
510 + * sys: size of reserved virtual address space
511 +
512 +6. **Live objects**
513 + * live: number of live objects in memory
514 +
515 +7. **GC pauses average** in ns
516 + * avg: average duration of all GC stop-the-world pauses
517 +
518 +### configuration
519 +
520 +Please see the [wiki page](https://github.com/firehol/netdata/wiki/Monitoring-Go-Applications#using-netdata-go_expvar-module) for detailed info about module configuration.
521 +
522 +---
523 +
524 # haproxy
525
526 Module monitors frontend and backend metrics such as bytes in, bytes out, sessions current, sessions in queue current.
python.d/go_expvar.chart.py new
+228
@@ -0,0 +1,228 @@
1 +# -*- coding: utf-8 -*-
2 +# Description: go_expvar netdata python.d module
3 +# Author: Jan Kral (kralewitz)
4 +
5 +from __future__ import division
6 +from base import UrlService
7 +import json
8 +
9 +# default module values (can be overridden per job in `config`)
10 +# update_every = 2
11 +priority = 60000
12 +retries = 60
13 +
14 +
15 +MEMSTATS_CHARTS = {
16 + 'memstats_heap': {
17 + 'options': ['heap', 'memory: size of heap memory structures', 'kB', 'memstats', 'expvar.memstats.heap', 'line'],
18 + 'lines': [
19 + ['memstats_heap_alloc', 'alloc', 'absolute', 1, 1024],
20 + ['memstats_heap_inuse', 'inuse', 'absolute', 1, 1024]
21 + ]},
22 + 'memstats_stack': {
23 + 'options': ['stack', 'memory: size of stack memory structures', 'kB', 'memstats', 'expvar.memstats.stack', 'line'],
24 + 'lines': [
25 + ['memstats_stack_inuse', 'inuse', 'absolute', 1, 1024]
26 + ]},
27 + 'memstats_mspan': {
28 + 'options': ['mspan', 'memory: size of mspan memory structures', 'kB', 'memstats', 'expvar.memstats.mspan', 'line'],
29 + 'lines': [
30 + ['memstats_mspan_inuse', 'inuse', 'absolute', 1, 1024]
31 + ]},
32 + 'memstats_mcache': {
33 + 'options': ['mcache', 'memory: size of mcache memory structures', 'kB', 'memstats', 'expvar.memstats.mcache', 'line'],
34 + 'lines': [
35 + ['memstats_mcache_inuse', 'inuse', 'absolute', 1, 1024]
36 + ]},
37 + 'memstats_live_objects': {
38 + 'options': ['live_objects', 'memory: number of live objects', 'objects', 'memstats', 'expvar.memstats.live_objects', 'line'],
39 + 'lines': [
40 + ['memstats_live_objects', 'live']
41 + ]},
42 + 'memstats_sys': {
43 + 'options': ['sys', 'memory: size of reserved virtual address space', 'kB', 'memstats', 'expvar.memstats.sys', 'line'],
44 + 'lines': [
45 + ['memstats_sys', 'sys', 'absolute', 1, 1024]
46 + ]},
47 + 'memstats_gc_pauses': {
48 + 'options': ['gc_pauses', 'memory: average duration of GC pauses', 'ns', 'memstats', 'expvar.memstats.gc_pauses', 'line'],
49 + 'lines': [
50 + ['memstats_gc_pauses', 'avg']
51 + ]},
52 +}
53 +
54 +MEMSTATS_ORDER = ['memstats_heap', 'memstats_stack', 'memstats_mspan', 'memstats_mcache', 'memstats_sys', 'memstats_live_objects', 'memstats_gc_pauses']
55 +
56 +
57 +def flatten(d, top='', sep='.'):
58 + items = []
59 + for key, val in d.items():
60 + nkey = top + sep + key if top else key
61 + if isinstance(val, dict):
62 + items.extend(flatten(val, nkey, sep=sep).items())
63 + else:
64 + items.append((nkey, val))
65 + return dict(items)
66 +
67 +
68 +class Service(UrlService):
69 + def __init__(self, configuration=None, name=None):
70 + UrlService.__init__(self, configuration=configuration, name=name)
71 +
72 + # if memstats collection is enabled, add the charts and their order
73 + if self.configuration.get('collect_memstats'):
74 + self.definitions = MEMSTATS_CHARTS
75 + self.order = MEMSTATS_ORDER
76 + else:
77 + self.definitions = dict()
78 + self.order = list()
79 +
80 + # if extra charts are defined, parse their config
81 + extra_charts = self.configuration.get('extra_charts')
82 + if extra_charts:
83 + self._parse_extra_charts_config(extra_charts)
84 +
85 + def check(self):
86 + """
87 + Check if the module can collect data:
88 + 1) At least one JOB configuration has to be specified
89 + 2) The JOB configuration needs to define the URL and either collect_memstats must be enabled or at least one
90 + extra_chart must be defined.
91 +
92 + The configuration and URL check is provided by the UrlService class.
93 + """
94 +
95 + if not (self.configuration.get('extra_charts') or self.configuration.get('collect_memstats')):
96 + self.error('Memstats collection is disabled and no extra_charts are defined, disabling module.')
97 + return False
98 +
99 + return UrlService.check(self)
100 +
101 + def _parse_extra_charts_config(self, extra_charts_config):
102 +
103 + # a place to store the expvar keys and their types
104 + self.expvars = dict()
105 +
106 + for chart in extra_charts_config:
107 +
108 + chart_dict = dict()
109 + chart_id = chart.get('id')
110 + chart_lines = chart.get('lines')
111 + chart_opts = chart.get('options', dict())
112 +
113 + if not all([chart_id, chart_lines]):
114 + self.info('Chart {0} has no ID or no lines defined, skipping'.format(chart))
115 + continue
116 +
117 + chart_dict['options'] = [
118 + chart_opts.get('name', ''),
119 + chart_opts.get('title', ''),
120 + chart_opts.get('units', ''),
121 + chart_opts.get('family', ''),
122 + chart_opts.get('context', ''),
123 + chart_opts.get('chart_type', 'line')
124 + ]
125 + chart_dict['lines'] = list()
126 +
127 + # add the lines to the chart
128 + for line in chart_lines:
129 +
130 + ev_key = line.get('expvar_key')
131 + ev_type = line.get('expvar_type')
132 + line_id = line.get('id')
133 +
134 + if not all([ev_key, ev_type, line_id]):
135 + self.info('Line missing expvar_key, expvar_type, or line_id, skipping: {0}'.format(line))
136 + continue
137 +
138 + if ev_type not in ['int', 'float']:
139 + self.info('Unsupported expvar_type "{0}". Must be "int" or "float"'.format(ev_type))
140 + continue
141 +
142 + if ev_key in self.expvars:
143 + self.info('Duplicate expvar key {0}: skipping line.'.format(ev_key))
144 + continue
145 +
146 + self.expvars[ev_key] = (ev_type, line_id)
147 +
148 + chart_dict['lines'].append(
149 + [
150 + line.get('id', ''),
151 + line.get('name', ''),
152 + line.get('algorithm', ''),
153 + line.get('multiplier', 1),
154 + line.get('divisor', 100 if ev_type == 'float' else 1),
155 + line.get('hidden', False)
156 + ]
157 + )
158 +
159 + self.order.append(chart_id)
160 + self.definitions[chart_id] = chart_dict
161 +
162 + def _get_data(self):
163 + """
164 + Format data received from http request
165 + :return: dict
166 + """
167 +
168 + raw_data = self._get_raw_data()
169 + if not raw_data:
170 + return None
171 +
172 + data = json.loads(raw_data)
173 +
174 + expvars = dict()
175 + if self.configuration.get('collect_memstats'):
176 + expvars.update(self._parse_memstats(data))
177 +
178 + if self.configuration.get('extra_charts'):
179 + # the memstats part of the data has been already parsed, so we remove it before flattening and checking
180 + # the rest of the data, thus avoiding needless iterating over the multiply nested memstats dict.
181 + del (data['memstats'])
182 + flattened = flatten(data)
183 + for k, v in flattened.items():
184 + ev = self.expvars.get(k)
185 + if not ev:
186 + # expvar is not defined in config, skip it
187 + continue
188 + try:
189 + key_type, line_id = ev
190 + if key_type == 'int':
191 + expvars[line_id] = int(v)
192 + elif key_type == 'float':
193 + # if the value type is float, multiply it by 1000 and set line divisor to 1000
194 + expvars[line_id] = float(v) * 100
195 + except ValueError:
196 + self.info('Failed to parse value for key {0} as {1}, ignoring key.'.format(k, key_type))
197 + del self.expvars[k]
198 +
199 + return expvars
200 +
201 + @staticmethod
202 + def _parse_memstats(data):
203 +
204 + memstats = data['memstats']
205 +
206 + # calculate the number of live objects in memory
207 + live_objs = int(memstats['Mallocs']) - int(memstats['Frees'])
208 +
209 + # calculate GC pause times average
210 + # the Go runtime keeps the last 256 GC pause durations in a circular buffer,
211 + # so we need to filter out the 0 values before the buffer is filled
212 + gc_pauses = memstats['PauseNs']
213 + try:
214 + gc_pause_avg = sum(gc_pauses) / len([x for x in gc_pauses if x > 0])
215 + # no GC cycles have occured yet
216 + except ZeroDivisionError:
217 + gc_pause_avg = 0
218 +
219 + return {
220 + 'memstats_heap_alloc': memstats['HeapAlloc'],
221 + 'memstats_heap_inuse': memstats['HeapInuse'],
222 + 'memstats_stack_inuse': memstats['StackInuse'],
223 + 'memstats_mspan_inuse': memstats['MSpanInuse'],
224 + 'memstats_mcache_inuse': memstats['MCacheInuse'],
225 + 'memstats_sys': memstats['Sys'],
226 + 'memstats_live_objects': live_objs,
227 + 'memstats_gc_pauses': gc_pause_avg,
228 + }
web/dashboard_info.js
+11
@@ -277,6 +277,12 @@ netdataDashboard.menu = {
277 title: 'SNMP',
278 icon: '<i class="fa fa-random" aria-hidden="true"></i>',
279 info: undefined
280 + },
281 +
282 + 'go_expvar': {
283 + title: 'Go - expvars',
284 + icon: '<i class="fa fa-eye" aria-hidden="true"></i>',
285 + info: 'Statistics about running Go applications exposed by the <a href="https://golang.org/pkg/expvar/" target="_blank">expvar package</a>.'
286 }
287 };
288
@@ -389,6 +395,11 @@ netdataDashboard.submenu = {
395 else
396 return 'Statistics for per CPUs core SoftIRQs related to network receive work. Total for all CPU cores can be found at <a href="#menu_system_submenu_softnet_stat">System / softnet statistics</a>.';
397 }
398 + },
399 +
400 + 'go_expvar.memstats': {
401 + title: 'Memory statistics',
402 + info: 'Go runtime memory statistics. See <a href="https://golang.org/pkg/runtime/#MemStats" target="_blank">runtime.MemStats</a> documentation for more info about each chart and the values.'
403 }
404 };
405
web/index.html
+8
@@ -1226,6 +1226,14 @@
1226 chart.menu_pattern = 'cgroup';
1227 break;
1228
1229 + case 'go':
1230 + chart.menu = chart.type;
1231 + if(parts.length > 2 && parts[1] === 'expvar')
1232 + chart.menu_pattern = tmp + '_' + parts[1];
1233 + else if(parts.length > 1)
1234 + chart.menu_pattern = tmp;
1235 + break;
1236 +
1237 case 'isc':
1238 chart.menu = chart.type;
1239 if(parts.length > 2 && parts[1] === 'dhcpd')