/collectors/python.d: remove unbound module (#7853)
* collectors/python.d/unbound: remove * /docs: remove python unbound mentions * README.md: remove python unbound mentions
Ilya Mashchenko committed
Jan 28, 2020 at 19:17 UTC
492af0d614d7026d3771745369cb2db2cbdf7850
8 files changed
-533
README.md
-1
@@ -552,7 +552,6 @@ Python, Node.js, Ruby, Java, Bash, Perl, and more!
552
queries, updates, failures and several per view metrics. All versions of bind after 9.9.10 are supported.
553
- **[NSD](collectors/python.d.plugin/nsd/)** - queries, zones, protocols, query types, transfers, etc.
554
- **[PowerDNS](collectors/python.d.plugin/powerdns/)** - queries, answers, cache, latency, etc.
555
-- **[unbound](collectors/python.d.plugin/unbound/)** - performance and resource usage metrics.
555
- **[dns_query_time](collectors/python.d.plugin/dns_query_time/)** - DNS query time statistics.
556
557
### Time Servers
collectors/python.d.plugin/Makefile.am
-1
@@ -103,7 +103,6 @@ include squid/Makefile.inc
103
include tomcat/Makefile.inc
104
include tor/Makefile.inc
105
include traefik/Makefile.inc
106
-include unbound/Makefile.inc
106
include uwsgi/Makefile.inc
107
include varnish/Makefile.inc
108
include w1sensor/Makefile.inc
collectors/python.d.plugin/unbound/Makefile.inc
deleted
-13
@@ -1,13 +0,0 @@
1
-# SPDX-License-Identifier: GPL-3.0-or-later
2
-
3
-# THIS IS NOT A COMPLETE Makefile
4
-# IT IS INCLUDED BY ITS PARENT'S Makefile.am
5
-# IT IS REQUIRED TO REFERENCE ALL FILES RELATIVE TO THE PARENT
6
-
7
-# install these files
8
-dist_python_DATA += unbound/unbound.chart.py
9
-dist_pythonconfig_DATA += unbound/unbound.conf
10
-
11
-# do not install these files, but include them in the distribution
12
-dist_noinst_DATA += unbound/README.md unbound/Makefile.inc
13
-
collectors/python.d.plugin/unbound/README.md
deleted
-114
@@ -1,114 +0,0 @@
1
-# unbound
2
-
3
-## Deprecation Notes
4
-
5
-This module is deprecated. Please use [new version](https://github.com/netdata/go.d.plugin/tree/master/modules/unbound) instead.
6
-
7
-___
8
-
9
-Monitoring uses the remote control interface to fetch statistics.
10
-
11
-Provides the following charts:
12
-
13
-1. **Queries Processed**
14
-
15
- - Ratelimited
16
- - Cache Misses
17
- - Cache Hits
18
- - Expired
19
- - Prefetched
20
- - Recursive
21
-
22
-2. **Request List**
23
-
24
- - Average Size
25
- - Max Size
26
- - Overwritten Requests
27
- - Overruns
28
- - Current Size
29
- - User Requests
30
-
31
-3. **Recursion Timings**
32
-
33
-- Average recursion processing time
34
-- Median recursion processing time
35
-
36
-If extended stats are enabled, also provides:
37
-
38
-4. **Cache Sizes**
39
-
40
- - Message Cache
41
- - RRset Cache
42
- - Infra Cache
43
- - DNSSEC Key Cache
44
- - DNSCrypt Shared Secret Cache
45
- - DNSCrypt Nonce Cache
46
-
47
-## Configuration
48
-
49
-Unbound must be manually configured to enable the remote-control protocol.
50
-Check the Unbound documentation for info on how to do this. Additionally,
51
-if you want to take advantage of the autodetection this plugin offers,
52
-you will need to make sure your `unbound.conf` file only uses spaces for
53
-indentation (the default config shipped by most distributions uses tabs
54
-instead of spaces).
55
-
56
-Once you have the Unbound control protocol enabled, you need to make sure
57
-that either the certificate and key are readable by Netdata (if you're
58
-using the regular control interface), or that the socket is accessible
59
-to Netdata (if you're using a UNIX socket for the contorl interface).
60
-
61
-By default, for the local system, everything can be auto-detected
62
-assuming Unbound is configured correctly and has been told to listen
63
-on the loopback interface or a UNIX socket. This is done by looking
64
-up info in the Unbound config file specified by the `ubconf` key.
65
-
66
-To enable extended stats for a given job, add `extended: yes` to the
67
-definition.
68
-
69
-You can also enable per-thread charts for a given job by adding
70
-`per_thread: yes` to the definition. Note that the numbe rof threads
71
-is only checked on startup.
72
-
73
-A basic local configuration with extended statistics and per-thread
74
-charts looks like this:
75
-
76
-```yaml
77
-local:
78
- ubconf: /etc/unbound/unbound.conf
79
- extended: yes
80
- per_thread: yes
81
-```
82
-
83
-While it's a bit more complicated to set up correctly, it is recommended
84
-that you use a UNIX socket as it provides far better performance.
85
-
86
-### Troubleshooting
87
-
88
-If you've configured the module and can't get it to work, make sure and
89
-check all of the following:
90
-
91
-- If you're using autodetection, double check that your `unbound.conf`
92
- file is actually using spaces instead of tabs, and that appropriate
93
- indentation is present. Most Linux distributions ship a default config
94
- for Unbound that uses tabs, and the plugin can't read such a config file
95
- correctly. Also, make sure this file is actually readable by Netdata.
96
-- Ensure that the control protocol is actually configured correctly.
97
- You can check this quickly by running `unbound-control stats_noreset`
98
- as root, which should print out a bunch of info about the internal
99
- statistics of the server. If this returns an error, you don't have
100
- the control protocol set up correctly.
101
-- If using the regular control interface, make sure that the certificate
102
- and key file you have configured in `unbound.conf` are readable by
103
- Netdata. In general, it's preferred to use ACL's on the files to
104
- provide the required permissions.
105
-- If using a UNIX socket, make sure that the socket is both readable
106
- _and_ writable by Netdata. Just like with the regular control
107
- interface, it's preferred to use ACL's to provide these permissions.
108
-- Make sure that SELinux, Apparmor, or any other mandatory access control
109
- system isn't interfering with the access requirements mentioned above.
110
- In some cases, you may have to add a local rule to allow this access.
111
-
112
----
113
-
114
-[](<>)
collectors/python.d.plugin/unbound/unbound.chart.py
deleted
-317
@@ -1,317 +0,0 @@
1
-# -*- coding: utf-8 -*-
2
-# Description: unbound netdata python.d module
3
-# Author: Austin S. Hemmelgarn (Ferroin)
4
-# SPDX-License-Identifier: GPL-3.0-or-later
5
-
6
-import os
7
-import sys
8
-from copy import deepcopy
9
-
10
-from bases.FrameworkServices.SocketService import SocketService
11
-from bases.loaders import load_config
12
-
13
-PRECISION = 1000
14
-
15
-ORDER = [
16
- 'queries',
17
- 'recursion',
18
- 'reqlist',
19
-]
20
-
21
-CHARTS = {
22
- 'queries': {
23
- 'options': [None, 'Queries Processed', 'queries', 'Unbound', 'unbound.queries', 'line'],
24
- 'lines': [
25
- ['ratelimit', 'ratelimited', 'absolute', 1, 1],
26
- ['cachemiss', 'cache_miss', 'absolute', 1, 1],
27
- ['cachehit', 'cache_hit', 'absolute', 1, 1],
28
- ['expired', 'expired', 'absolute', 1, 1],
29
- ['prefetch', 'prefetched', 'absolute', 1, 1],
30
- ['recursive', 'recursive', 'absolute', 1, 1]
31
- ]
32
- },
33
- 'recursion': {
34
- 'options': [None, 'Recursion Timings', 'milliseconds', 'Unbound', 'unbound.recursion', 'line'],
35
- 'lines': [
36
- ['recursive_avg', 'average', 'absolute', 1, 1],
37
- ['recursive_med', 'median', 'absolute', 1, 1]
38
- ]
39
- },
40
- 'reqlist': {
41
- 'options': [None, 'Request List', 'items', 'Unbound', 'unbound.reqlist', 'line'],
42
- 'lines': [
43
- ['reqlist_avg', 'average_size', 'absolute', 1, 1],
44
- ['reqlist_max', 'maximum_size', 'absolute', 1, 1],
45
- ['reqlist_overwritten', 'overwritten_requests', 'absolute', 1, 1],
46
- ['reqlist_exceeded', 'overruns', 'absolute', 1, 1],
47
- ['reqlist_current', 'current_size', 'absolute', 1, 1],
48
- ['reqlist_user', 'user_requests', 'absolute', 1, 1]
49
- ]
50
- }
51
-}
52
-
53
-# These get added too if we are told to use extended stats.
54
-EXTENDED_ORDER = ['cache']
55
-
56
-EXTENDED_CHARTS = {
57
- 'cache': {
58
- 'options': [None, 'Cache Sizes', 'items', 'Unbound', 'unbound.cache', 'stacked'],
59
- 'lines': [
60
- ['cache_message', 'message_cache', 'absolute', 1, 1],
61
- ['cache_rrset', 'rrset_cache', 'absolute', 1, 1],
62
- ['cache_infra', 'infra_cache', 'absolute', 1, 1],
63
- ['cache_key', 'dnssec_key_cache', 'absolute', 1, 1],
64
- ['cache_dnscss', 'dnscrypt_Shared_Secret_cache', 'absolute', 1, 1],
65
- ['cache_dnscn', 'dnscrypt_Nonce_cache', 'absolute', 1, 1]
66
- ]
67
- }
68
-}
69
-
70
-# This is used as a templates for the per-thread charts.
71
-PER_THREAD_CHARTS = {
72
- '_queries': {
73
- 'options': [None, '{longname} Queries Processed', 'queries', 'Queries Processed',
74
- 'unbound.threads.queries', 'line'],
75
- 'lines': [
76
- ['{shortname}_ratelimit', 'ratelimited', 'absolute', 1, 1],
77
- ['{shortname}_cachemiss', 'cache_miss', 'absolute', 1, 1],
78
- ['{shortname}_cachehit', 'cache_hit', 'absolute', 1, 1],
79
- ['{shortname}_expired', 'expired', 'absolute', 1, 1],
80
- ['{shortname}_prefetch', 'prefetched', 'absolute', 1, 1],
81
- ['{shortname}_recursive', 'recursive', 'absolute', 1, 1]
82
- ]
83
- },
84
- '_recursion': {
85
- 'options': [None, '{longname} Recursion Timings', 'milliseconds', 'Recursive Timings',
86
- 'unbound.threads.recursion', 'line'],
87
- 'lines': [
88
- ['{shortname}_recursive_avg', 'average', 'absolute', 1, 1],
89
- ['{shortname}_recursive_med', 'median', 'absolute', 1, 1]
90
- ]
91
- },
92
- '_reqlist': {
93
- 'options': [None, '{longname} Request List', 'items', 'Request List', 'unbound.threads.reqlist', 'line'],
94
- 'lines': [
95
- ['{shortname}_reqlist_avg', 'average_size', 'absolute', 1, 1],
96
- ['{shortname}_reqlist_max', 'maximum_size', 'absolute', 1, 1],
97
- ['{shortname}_reqlist_overwritten', 'overwritten_requests', 'absolute', 1, 1],
98
- ['{shortname}_reqlist_exceeded', 'overruns', 'absolute', 1, 1],
99
- ['{shortname}_reqlist_current', 'current_size', 'absolute', 1, 1],
100
- ['{shortname}_reqlist_user', 'user_requests', 'absolute', 1, 1]
101
- ]
102
- }
103
-}
104
-
105
-# This maps the Unbound stat names to our names and precision requiremnets.
106
-STAT_MAP = {
107
- 'total.num.queries_ip_ratelimited': ('ratelimit', 1),
108
- 'total.num.cachehits': ('cachehit', 1),
109
- 'total.num.cachemiss': ('cachemiss', 1),
110
- 'total.num.zero_ttl': ('expired', 1),
111
- 'total.num.prefetch': ('prefetch', 1),
112
- 'total.num.recursivereplies': ('recursive', 1),
113
- 'total.requestlist.avg': ('reqlist_avg', 1),
114
- 'total.requestlist.max': ('reqlist_max', 1),
115
- 'total.requestlist.overwritten': ('reqlist_overwritten', 1),
116
- 'total.requestlist.exceeded': ('reqlist_exceeded', 1),
117
- 'total.requestlist.current.all': ('reqlist_current', 1),
118
- 'total.requestlist.current.user': ('reqlist_user', 1),
119
- # Unbound reports recursion timings as fractional seconds, but we want to show them as milliseconds.
120
- 'total.recursion.time.avg': ('recursive_avg', PRECISION),
121
- 'total.recursion.time.median': ('recursive_med', PRECISION),
122
- 'msg.cache.count': ('cache_message', 1),
123
- 'rrset.cache.count': ('cache_rrset', 1),
124
- 'infra.cache.count': ('cache_infra', 1),
125
- 'key.cache.count': ('cache_key', 1),
126
- 'dnscrypt_shared_secret.cache.count': ('cache_dnscss', 1),
127
- 'dnscrypt_nonce.cache.count': ('cache_dnscn', 1)
128
-}
129
-
130
-# Same as above, but for per-thread stats.
131
-PER_THREAD_STAT_MAP = {
132
- '{shortname}.num.queries_ip_ratelimited': ('{shortname}_ratelimit', 1),
133
- '{shortname}.num.cachehits': ('{shortname}_cachehit', 1),
134
- '{shortname}.num.cachemiss': ('{shortname}_cachemiss', 1),
135
- '{shortname}.num.zero_ttl': ('{shortname}_expired', 1),
136
- '{shortname}.num.prefetch': ('{shortname}_prefetch', 1),
137
- '{shortname}.num.recursivereplies': ('{shortname}_recursive', 1),
138
- '{shortname}.requestlist.avg': ('{shortname}_reqlist_avg', 1),
139
- '{shortname}.requestlist.max': ('{shortname}_reqlist_max', 1),
140
- '{shortname}.requestlist.overwritten': ('{shortname}_reqlist_overwritten', 1),
141
- '{shortname}.requestlist.exceeded': ('{shortname}_reqlist_exceeded', 1),
142
- '{shortname}.requestlist.current.all': ('{shortname}_reqlist_current', 1),
143
- '{shortname}.requestlist.current.user': ('{shortname}_reqlist_user', 1),
144
- # Unbound reports recursion timings as fractional seconds, but we want to show them as milliseconds.
145
- '{shortname}.recursion.time.avg': ('{shortname}_recursive_avg', PRECISION),
146
- '{shortname}.recursion.time.median': ('{shortname}_recursive_med', PRECISION)
147
-}
148
-
149
-
150
-def is_readable(name):
151
- return os.access(name, os.R_OK)
152
-
153
-
154
-# Used to actually generate per-thread charts.
155
-def _get_perthread_info(thread):
156
- sname = 'thread{0}'.format(thread)
157
- lname = 'Thread {0}'.format(thread)
158
- charts = dict()
159
- order = []
160
- statmap = dict()
161
-
162
- for item in PER_THREAD_CHARTS:
163
- cname = '{0}{1}'.format(sname, item)
164
- chart = deepcopy(PER_THREAD_CHARTS[item])
165
- chart['options'][1] = chart['options'][1].format(longname=lname)
166
-
167
- for index, line in enumerate(chart['lines']):
168
- chart['lines'][index][0] = line[0].format(shortname=sname)
169
-
170
- order.append(cname)
171
- charts[cname] = chart
172
-
173
- for key, value in PER_THREAD_STAT_MAP.items():
174
- statmap[key.format(shortname=sname)] = (value[0].format(shortname=sname), value[1])
175
-
176
- return charts, order, statmap
177
-
178
-
179
-class Service(SocketService):
180
- def __init__(self, configuration=None, name=None):
181
- # The unbound control protocol is always TLS encapsulated
182
- # unless it's used over a UNIX socket, so enable TLS _before_
183
- # doing the normal SocketService initialization.
184
- configuration['tls'] = True
185
- self.port = 8935
186
- SocketService.__init__(self, configuration, name)
187
- self.ext = self.configuration.get('extended', None)
188
- self.ubconf = self.configuration.get('ubconf', None)
189
- self.perthread = self.configuration.get('per_thread', False)
190
- self.threads = None
191
- self.order = deepcopy(ORDER)
192
- self.definitions = deepcopy(CHARTS)
193
- self.request = 'UBCT1 stats\n'
194
- self.statmap = deepcopy(STAT_MAP)
195
- self._parse_config()
196
- self._auto_config()
197
- self.debug('Extended stats: {0}'.format(self.ext))
198
- self.debug('Per-thread stats: {0}'.format(self.perthread))
199
- if self.ext:
200
- self.order = self.order + EXTENDED_ORDER
201
- self.definitions.update(EXTENDED_CHARTS)
202
- if self.unix_socket:
203
- self.debug('Using unix socket: {0}'.format(self.unix_socket))
204
- else:
205
- self.debug('Connecting to: {0}:{1}'.format(self.host, self.port))
206
- self.debug('Using key: {0}'.format(self.key))
207
- self.debug('Using certificate: {0}'.format(self.cert))
208
-
209
- def _auto_config(self):
210
- self.load_unbound_config()
211
-
212
- if not self.key:
213
- self.key = '/etc/unbound/unbound_control.key'
214
- if not self.cert:
215
- self.cert = '/etc/unbound/unbound_control.pem'
216
- if not self.port:
217
- self.port = 8953
218
-
219
- def load_unbound_config(self):
220
- if not (self.ubconf and is_readable(self.ubconf)):
221
- self.debug('Unbound configuration not found.')
222
- return
223
-
224
- self.debug('Loading Unbound config: {0}'.format(self.ubconf))
225
-
226
- try:
227
- conf = load_config(self.ubconf)
228
- except Exception as error:
229
- self.error("error on loading '{0}' : {1}".format(self.ubconf, error))
230
- return
231
-
232
- srv = conf.get('server')
233
- if self.ext is None:
234
- if srv and 'extended-statistics' in srv:
235
- self.ext = srv['extended-statistics']
236
-
237
- rc = conf.get('remote-control')
238
- if not (rc and isinstance(rc, dict)):
239
- return
240
-
241
- if rc.get('control-use-cert', False):
242
- self.key = self.key or rc.get('control-key-file')
243
- self.cert = self.cert or rc.get('control-cert-file')
244
- self.port = self.port or rc.get('control-port')
245
- else:
246
- ci = rc.get('control-interface', str())
247
- is_socket = '/' in ci
248
- if is_socket:
249
- self.unix_socket = ci
250
-
251
- def _generate_perthread_charts(self):
252
- tmporder = list()
253
- for thread in range(0, self.threads):
254
- charts, order, statmap = _get_perthread_info(thread)
255
- tmporder.extend(order)
256
- self.definitions.update(charts)
257
- self.statmap.update(statmap)
258
- self.order.extend(sorted(tmporder))
259
-
260
- def check(self):
261
- if not is_readable(self.key):
262
- self.error("ssl key '{0}' is not readable".format(self.key))
263
- return False
264
-
265
- if not is_readable(self.cert):
266
- self.error("ssl certificate '{0}' is not readable".format(self.certificate))
267
- return False
268
-
269
- # Check if authentication is working.
270
- self._connect()
271
- result = bool(self._sock)
272
- self._disconnect()
273
- # If auth works, and we need per-thread charts, query the server
274
- # to see how many threads it's using. This somewhat abuses the
275
- # SocketService API to get the data we need.
276
- if result and self.perthread:
277
- tmp = self.request
278
- if sys.version_info[0] < 3:
279
- self.request = 'UBCT1 status\n'
280
- else:
281
- self.request = b'UBCT1 status\n'
282
- raw = self._get_raw_data()
283
- if raw is None:
284
- result = False
285
- self.warning('Received no data from socket.')
286
- else:
287
- for line in raw.splitlines():
288
- if line.startswith('threads'):
289
- self.threads = int(line.split()[1])
290
- self._generate_perthread_charts()
291
- break
292
- if self.threads is None:
293
- self.info('Unable to auto-detect thread counts, disabling per-thread stats.')
294
- self.perthread = False
295
- self.request = tmp
296
- return result
297
-
298
- def _get_data(self):
299
- raw = self._get_raw_data()
300
- data = dict()
301
- tmp = dict()
302
- if raw is not None:
303
- for line in raw.splitlines():
304
- stat = line.split('=')
305
- tmp[stat[0]] = stat[1]
306
- for item in self.statmap:
307
- if item in tmp:
308
- data[self.statmap[item][0]] = float(tmp[item]) * self.statmap[item][1]
309
- else:
310
- self.warning('Received no data from socket.')
311
- return data
312
-
313
- @staticmethod
314
- def _check_raw_data(data):
315
- # The server will close the connection when it's done sending
316
- # data, so just keep looping until that happens.
317
- return False
collectors/python.d.plugin/unbound/unbound.conf
deleted
-85
@@ -1,85 +0,0 @@
1
-# netdata python.d.plugin configuration for unbound
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
-# penalty indicates whether to apply penalty to update_every in case of failures.
31
-# Penalty will increase every 5 failed updates in a row. Maximum penalty is 10 minutes.
32
-# penalty: yes
33
-
34
-# autodetection_retry sets the job re-check interval in seconds.
35
-# The job is not deleted if check fails.
36
-# Attempts to start the job are made once every autodetection_retry.
37
-# This feature is disabled by default.
38
-# autodetection_retry: 0
39
-
40
-# ----------------------------------------------------------------------
41
-# JOBS (data collection sources)
42
-#
43
-# The default JOBS share the same *name*. JOBS with the same name
44
-# are mutually exclusive. Only one of them will be allowed running at
45
-# any time. This allows autodetection to try several alternatives and
46
-# pick the one that works.
47
-#
48
-# Any number of jobs is supported.
49
-#
50
-# All python.d.plugin JOBS (for all its modules) support a set of
51
-# predefined parameters. These are:
52
-#
53
-# job_name:
54
-# name: myname # the JOB's name as it will appear at the
55
-# # dashboard (by default is the job_name)
56
-# # JOBs sharing a name are mutually exclusive
57
-# update_every: 1 # the JOB's data collection frequency
58
-# priority: 60000 # the JOB's order on the dashboard
59
-# penalty: yes # the JOB's penalty
60
-# autodetection_retry: 0 # the JOB's re-check interval in seconds
61
-#
62
-# Additionally to the above, unbound also supports the following:
63
-#
64
-# host: localhost # The host to connect to.
65
-# port: 8953 # WHat port to use (defaults to 8953)
66
-# socket: /path/to/socket # A path to a UNIX socket to use instead
67
-# # of a TCP connection
68
-# tls_key_file: /path/to/key # The key file to use for authentication
69
-# tls_cert_file: /path/to/key # The certificate to use for authentication
70
-# extended: false # Whether to collect extended stats or not
71
-# per_thread: false # Whether to show charts for per-thread stats
72
-#
73
-# In addition to the above, you can set the following to try and
74
-# auto-detect most settings based on the unbound configuration:
75
-#
76
-# ubconf: /etc/unbound/unbound.conf
77
-#
78
-# Note that the SSL key and certificate need to be readable by the user
79
-# unbound runs as if you're using the regular control interface.
80
-# If you're using a UNIX socket, that has to be readable by the netdata user.
81
-
82
-# The following should work for most users if they have unbound configured
83
-# correctly.
84
-local:
85
- ubconf: /etc/unbound/unbound.conf
docs/Add-more-charts-to-netdata.md
-1
@@ -223,7 +223,6 @@ These are all the data collection plugins currently available.
223
| nsd|python<br/>v2 or v3|Charts the nsd received queries and zones.<br/> <br/>Netdata plugin: [python.d.plugin](../collectors/python.d.plugin)<br/>plugin module: [nsd.chart.py](../collectors/python.d.plugin/nsd)<br/>configuration file: [python.d/nsd.conf](../collectors/python.d.plugin/nsd)|
224
| powerdns|python<br/>v2 or v3|Monitors powerdns performance and health metrics <br/> <br/>Netdata plugin: [python.d.plugin](../collectors/python.d.plugin)<br/>plugin module: [powerdns.chart.py](../collectors/python.d.plugin/powerdns)<br/>configuration file: [python.d/powerdns.conf](../collectors/python.d.plugin/powerdns)|
225
| dnsdist|python<br/>v2 or v3|Monitors dnsdist performance and health metrics <br/> <br/>Netdata plugin: [python.d.plugin](../collectors/python.d.plugin)<br/>plugin module: [dnsdist.chart.py](../collectors/python.d.plugin/dnsdist)<br/>configuration file: [python.d/dnsdist.conf](../collectors/python.d.plugin/dnsdist)|
226
-| unbound|python<br/>v2 or v3|Monitors Unbound performance and resource usage metrics <br/> <br/>Netdata plugin: [python.d.plugin](../collectors/python.d.plugin)<br/>plugin module: [unbound.chart.py](../collectors/python.d.plugin/unbound)<br/>configuration file: [python.d/unbound.conf](../collectors/python.d.plugin/unbound)|
226
227
---
228
docs/what-is-netdata.md
-1
@@ -325,7 +325,6 @@ Its [Plugin API](../collectors/plugins.d/) supports all programing languages (an
325
- **[ISC Bind (named)](../collectors/node.d.plugin/named/)** - multiple servers, each showing: clients, requests, queries, updates, failures and several per view metrics. All versions of bind after 9.9.10 are supported.
326
- **[NSD](../collectors/python.d.plugin/nsd/)** - queries, zones, protocols, query types, transfers, etc.
327
- **[PowerDNS](../collectors/python.d.plugin/powerdns/)** - queries, answers, cache, latency, etc.
328
-- **[unbound](../collectors/python.d.plugin/unbound/)** - performance and resource usage metrics.
328
- **[dns_query_time](../collectors/python.d.plugin/dns_query_time/)** - DNS query time statistics.
329
330
#### Time Servers