@cryptotaxi247 / netdata-1 / commits / 8919e42ca

Added gunicorn log conf and chart.py files

Jeff Willette committed Dec 9, 2016 at 17:44 UTC 8919e42ca50c0b31ea21b3c27e1c4c634780b0e8
2 files changed +145
conf.d/python.d/gunicorn_log.conf new
+73
@@ -0,0 +1,73 @@
1 +# netdata python.d.plugin configuration for nginx gunicorn log
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 +# The default JOBS share the same *name*. JOBS with the same name
40 +# are mutually exclusive. Only one of them will be allowed running at
41 +# any time. This allows autodetection to try several alternatives and
42 +# pick the one that works.
43 +#
44 +# Any number of jobs is supported.
45 +#
46 +# All python.d.plugin JOBS (for all its modules) support a set of
47 +# predefined parameters. These are:
48 +#
49 +# job_name:
50 +# name: myname # the JOB's name as it will appear at the
51 +# # dashboard (by default is the job_name)
52 +# # JOBs sharing a name are mutually exclusive
53 +# update_every: 1 # the JOB's data collection frequency
54 +# priority: 60000 # the JOB's order on the dashboard
55 +# retries: 5 # the JOB's number of restoration attempts
56 +#
57 +# Additionally to the above, gunicorn_log also supports the following:
58 +#
59 +# path: 'PATH' # the path to gunicorn's access.log
60 +#
61 +
62 +# ----------------------------------------------------------------------
63 +# AUTO-DETECTION JOBS
64 +# only one of them will run (they have the same name)
65 +
66 +gunicorn_log:
67 + name: 'local'
68 + path: '/var/log/gunicorn/access.log'
69 +
70 +gunicorn_log2:
71 + name: 'local'
72 + path: '/var/log/gunicorn/gunicorn-access.log'
73 +
python.d/gunicorn_log.chart.py new
+72
@@ -0,0 +1,72 @@
1 +# -*- coding: utf-8 -*-
2 +# Description: nginx log netdata python.d module
3 +# Author: Pawel Krupa (paulfantom)
4 +# Modified for Gunicorn by: Jeff Willette (deltaskelta)
5 +
6 +from base import LogService
7 +import re
8 +
9 +priority = 60000
10 +retries = 60
11 +# update_every = 3
12 +
13 +ORDER = ['codes']
14 +CHARTS = {
15 + 'codes': {
16 + 'options': [None, 'gunicorn status codes', 'requests/s', 'requests', 'gunicorn_log.codes', 'stacked'],
17 + 'lines': [
18 + ["2xx", None, "incremental"],
19 + ["3xx", None, "incremental"],
20 + ["4xx", None, "incremental"],
21 + ["5xx", None, "incremental"]
22 + ]}
23 +}
24 +
25 +
26 +class Service(LogService):
27 + def __init__(self, configuration=None, name=None):
28 + LogService.__init__(self, configuration=configuration, name=name)
29 + if len(self.log_path) == 0:
30 + self.log_path = "/var/log/gunicorn/access.log"
31 + self.order = ORDER
32 + self.definitions = CHARTS
33 + pattern = r'" ([0-9]{3}) '
34 + #pattern = r'(?:" )([0-9][0-9][0-9]) ?'
35 + self.regex = re.compile(pattern)
36 +
37 + def _get_data(self):
38 + """
39 + Parse new log lines
40 + :return: dict
41 + """
42 + data = {'2xx': 0,
43 + '3xx': 0,
44 + '4xx': 0,
45 + '5xx': 0}
46 + try:
47 + raw = self._get_raw_data()
48 + if raw is None:
49 + return None
50 + elif not raw:
51 + return data
52 + except (ValueError, AttributeError):
53 + return None
54 +
55 + regex = self.regex
56 + for line in raw:
57 + code = regex.search(line)
58 + try:
59 + beginning = code.group(1)[0]
60 + except AttributeError:
61 + continue
62 +
63 + if beginning == '2':
64 + data["2xx"] += 1
65 + elif beginning == '3':
66 + data["3xx"] += 1
67 + elif beginning == '4':
68 + data["4xx"] += 1
69 + elif beginning == '5':
70 + data["5xx"] += 1
71 +
72 + return data