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
+