| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
parent directory.. | ||||
python.d.plugin is a netdata external plugin. It is an orchestrator for data collection modules written in python.
Every module should be compatible with python2 and python3. All third party libraries should be installed system-wide or in python_modules directory. Module configurations are written in YAML and pyYAML is required.
Every configuration file must have one of two formats:
update_every : 2 # update frequency
priority : 20000 # where it is shown on dashboard
other_var1 : bla # variables passed to module
other_var2 : alb# module defaults:
update_every : 2
priority : 20000
local: # job name
update_every : 5 # job update frequency
other_var1 : some_val # module specific variable
other_job:
priority : 5 # job position on dashboard
other_var2 : val # module specific variableupdate_every and priority are always optional.
# become user netdata sudo su -s /bin/bash netdata
Depending on where Netdata was installed, execute one of the following commands to trace the execution of a python module:
# execute the plugin in debug mode, for a specific module /opt/netdata/usr/libexec/netdata/plugins.d/python.d.plugin <module> debug trace /usr/libexec/netdata/plugins.d/python.d.plugin <module> debug trace
Where [module] is the directory name under https://github.com/netdata/netdata/tree/master/collectors/python.d.plugin
Writing new python module is simple. You just need to remember to include 5 major things:
If you plan to submit the module in a PR, make sure and go through the PR checklist for new modules beforehand to make sure you have updated all the files you need to.
For a quick start, you can look at the example plugin.
ORDER list should contain the order of chart ids. Example:
ORDER = ['first_chart', 'second_chart', 'third_chart']CHART dictionary is a little bit trickier. It should contain the chart definition in following format:
CHART = {
id: {
'options': [name, title, units, family, context, charttype],
'lines': [
[unique_dimension_name, name, algorithm, multiplier, divisor]
]}All names are better explained in the External Plugins section. Parameters like priority and update_every are handled by python.d.plugin.
Every module needs to implement its own Service class. This class should inherit from one of the framework classes:
Also it needs to invoke the parent class constructor in a specific way as well as assign global variables to class variables.
Simple example:
from base import UrlService
class Service(UrlService):
def __init__(self, configuration=None, name=None):
UrlService.__init__(self, configuration=configuration, name=name)
self.order = ORDER
self.definitions = CHARTSThis method should grab raw data from _get_raw_data, parse it, and return a dictionary where keys are unique dimension names or None if no data is collected.
Example:
def _get_data(self):
try:
raw = self._get_raw_data().split(" ")
return {'active': int(raw[2])}
except (ValueError, AttributeError):
return NoneEvery framework class has some user-configurable variables which are specific to this particular class. Those variables should have default values initialized in the child class constructor.
If module needs some additional user-configurable variable, it can be accessed from the self.configuration list and assigned in constructor or custom check method. Example:
def __init__(self, configuration=None, name=None):
UrlService.__init__(self, configuration=configuration, name=name)
try:
self.baseurl = str(self.configuration['baseurl'])
except (KeyError, TypeError):
self.baseurl = "http://localhost:5001"Classes implement _get_raw_data which should be used to grab raw data. This method usually returns a list of strings.
This is last resort class, if a new module cannot be written by using other framework class this one can be used.
Example: ceph, sensors
It is the lowest-level class which implements most of module logic, like:
Examples: apache_cache, nginx_log
Variable from config file: log_path.
Object created from this class reads new lines from file specified in log_path variable. It will check if file exists and is readable. Also _get_raw_data returns list of strings where each string is one line from file specified in log_path.
Examples: exim, postfix
Variable from config file: command.
This allows to execute a shell command in a secure way. It will check for invalid characters in command variable and won't proceed if there is one of:
For additional security it uses python subprocess.Popen (without shell=True option) to execute command. Command can be specified with absolute or relative name. When using relative name, it will try to find command in PATH environment variable as well as in /sbin and /usr/sbin.
_get_raw_data returns list of decoded lines returned by command.
Examples: apache, nginx, tomcat
Variables from config file: url, user, pass.
If data is grabbed by accessing service via HTTP protocol, this class can be used. It can handle HTTP Basic Auth when specified with user and pass credentials.
_get_raw_data returns list of utf-8 decoded strings (lines).
Examples: dovecot, redis
Variables from config file: unix_socket, host, port, request.
Object will try execute request using either unix_socket or TCP/IP socket with combination of host and port. This can access unix sockets with SOCK_STREAM or SOCK_DGRAM protocols and TCP/IP sockets in version 4 and 6 with SOCK_STREAM setting.
Sockets are accessed in non-blocking mode with 15 second timeout.
After every execution of _get_raw_data socket is closed, to prevent this module needs to set _keep_alive variable to True and implement custom _check_raw_data method.
_check_raw_data should take raw data and return True if all data is received otherwise it should return False. Also it should do it in fast and efficient way.
This is a generic checklist for submitting a new Python plugin for Netdata. It is by no means comprehensive.
At minimum, to be buildable and testable, the PR needs to include:
| Back | FazBrowse Home | New Git URL |