@cryptotaxi247 / netdata-1 / commits / 17bab0b33

add nginx_log module

paulfantom committed Aug 14, 2016 at 15:17 UTC 17bab0b33cc22042e3eaeda2a8179210e70d5c27
5 files changed +144
conf.d/Makefile.am
+1
@@ -30,6 +30,7 @@ dist_pythonconfig_DATA = \
30 python.d/memcached.conf \
31 python.d/mysql.conf \
32 python.d/nginx.conf \
33 + python.d/nginx_log.conf \
34 python.d/phpfpm.conf \
35 python.d/postfix.conf \
36 python.d/redis.conf \
conf.d/python.d.conf
+1
@@ -33,6 +33,7 @@ example: no
33 # memcached: yes
34 # mysql: yes
35 # nginx: yes
36 +# nginx_log: yes
37 # phpfpm: yes
38 # postfix: yes
39 # redis: yes
conf.d/python.d/nginx_log.conf new
+72
@@ -0,0 +1,72 @@
1 +# netdata python.d.plugin configuration for nginx 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, nginx_log also supports the following:
58 +#
59 +# path: 'PATH' # the path to nginx's access.log
60 +#
61 +
62 +# ----------------------------------------------------------------------
63 +# AUTO-DETECTION JOBS
64 +# only one of them will run (they have the same name)
65 +
66 +nginx_log:
67 + name: 'local'
68 + path: '/var/log/nginx/access.log'
69 +
70 +nginx_log2:
71 + name: 'local'
72 + path: '/var/log/nginx/nginx-access.log'
python.d/Makefile.am
+1
@@ -19,6 +19,7 @@ dist_python_SCRIPTS = \
19 memcached.chart.py \
20 mysql.chart.py \
21 nginx.chart.py \
22 + nginx_log.chart.py \
23 phpfpm.chart.py \
24 postfix.chart.py \
25 redis.chart.py \
python.d/nginx_log.chart.py new
+69
@@ -0,0 +1,69 @@
1 +# -*- coding: utf-8 -*-
2 +# Description: nginx log netdata python.d module
3 +# Author: Pawel Krupa (paulfantom)
4 +
5 +from base import LogService
6 +import re
7 +
8 +priority = 60000
9 +retries = 60
10 +# update_every = 3
11 +
12 +ORDER = ['codes']
13 +CHARTS = {
14 + 'codes': {
15 + 'options': [None, 'nginx status codes', 'requests/s', 'requests', 'nginx_log.codes', 'stacked'],
16 + 'lines': [
17 + ["20X", None, "incremental"],
18 + ["30X", None, "incremental"],
19 + ["40X", None, "incremental"],
20 + ["50X", None, "incremental"]
21 + ]}
22 +}
23 +
24 +
25 +class Service(LogService):
26 + def __init__(self, configuration=None, name=None):
27 + LogService.__init__(self, configuration=configuration, name=name)
28 + if len(self.log_path) == 0:
29 + self.log_path = "/var/log/nginx/access.log"
30 + self.order = ORDER
31 + self.definitions = CHARTS
32 + pattern = r'" ([0-9]{3}) ?'
33 + #pattern = r'(?:" )([0-9][0-9][0-9]) ?'
34 + self.regex = re.compile(pattern)
35 +
36 + def _get_data(self):
37 + """
38 + Parse new log lines
39 + :return: dict
40 + """
41 + data = {'20X': 0,
42 + '30X': 0,
43 + '40X': 0,
44 + '50X': 0}
45 + try:
46 + raw = self._get_raw_data()
47 + if raw is None:
48 + return None
49 + elif not raw:
50 + return data
51 + except (ValueError, AttributeError):
52 + return None
53 +
54 + regex = self.regex
55 + for line in raw:
56 + code = regex.search(line)
57 + beginning = code.group(1)[0]
58 +
59 + if beginning == '2':
60 + data["20X"] += 1
61 + elif beginning == '3':
62 + data["30X"] += 1
63 + elif beginning == '4':
64 + data["40X"] += 1
65 + elif beginning == '5':
66 + data["50X"] += 1
67 +
68 + return data
69 +