From c553ffcaf66917bcae79c65e7bf45bf79c06134e Mon Sep 17 00:00:00 2001 From: jurgenhaas <juergen@paragon-es.de> Date: Thu, 12 Jan 2017 16:52:09 +0100 Subject: [PATCH] Update for new haproxy plugin --- files/haproxy.chart.py | 165 ----------------------------------------- files/haproxy.conf | 40 +--------- tasks/install.yml | 12 --- tasks/main.yml | 19 +++++ 4 files changed, 21 insertions(+), 215 deletions(-) delete mode 100755 files/haproxy.chart.py diff --git a/files/haproxy.chart.py b/files/haproxy.chart.py deleted file mode 100755 index d3648d9..0000000 --- a/files/haproxy.chart.py +++ /dev/null @@ -1,165 +0,0 @@ -# -*- coding: utf-8 -*- -# Description: haproxy netdata python.d module -# Author: l2isbad - -from base import UrlService, SocketService - -# default module values (can be overridden per job in `config`) -# update_every = 2 -priority = 60000 -retries = 60 - -# charts order (can be overridden if you want less charts, or different order) -ORDER = ['fbin', 'fbout', 'fscur', 'fqcur', 'bbin', 'bbout', 'bscur', 'bqcur', 'health_down'] -CHARTS = { - 'fbin': { - 'options': [None, "Kilobytes in", "kilobytes in/s", 'Frontend', 'f.bin', 'line'], - 'lines': [ - ]}, - 'fbout': { - 'options': [None, "Kilobytes out", "kilobytes out/s", 'Frontend', 'f.bout', 'line'], - 'lines': [ - ]}, - 'fscur': { - 'options': [None, "Sessions active", "sessions", 'Frontend', 'f.scur', 'line'], - 'lines': [ - ]}, - 'fqcur': { - 'options': [None, "Session in queue", "sessions", 'Frontend', 'f.qcur', 'line'], - 'lines': [ - ]}, - 'bbin': { - 'options': [None, "Kilobytes in", "kilobytes in/s", 'Backend', 'b.bin', 'line'], - 'lines': [ - ]}, - 'bbout': { - 'options': [None, "Kilobytes out", "kilobytes out/s", 'Backend', 'b.bout', 'line'], - 'lines': [ - ]}, - 'bscur': { - 'options': [None, "Sessions active", "sessions", 'Backend', 'b.scur', 'line'], - 'lines': [ - ]}, - 'bqcur': { - 'options': [None, "Sessions in queue", "sessions", 'Backend', 'b.qcur', 'line'], - 'lines': [ - ]}, - 'health_down': { - 'options': [None, "Servers in DOWN state", "failed servers", 'Health', 'h.down', 'line'], - 'lines': [ - ]} -} - - -class Service(UrlService, SocketService): - def __init__(self, configuration=None, name=None): - SocketService.__init__(self, configuration=configuration, name=name) - self.user = self.configuration.get('user') - self.password = self.configuration.get('pass') - self.request = 'show stat\n' - self.poll_method = (UrlService, SocketService) - self.order = ORDER - self.order_front = [_ for _ in ORDER if _.startswith('f')] - self.order_back = [_ for _ in ORDER if _.startswith('b')] - self.definitions = CHARTS - self.charts = True - - def check(self): - if self.configuration.get('url'): - self.poll_method = self.poll_method[0] - url = self.configuration.get('url') - if not url.endswith(';csv;norefresh'): - self.error('Bad url(%s). Must be http://<ip.address>:<port>/<url>;csv;norefresh' % url) - return False - elif self.configuration.get('socket'): - self.poll_method = self.poll_method[1] - else: - self.error('No configuration is specified') - return False - - if self.poll_method.check(self): - self.info('Plugin was started succesfully. We are using %s.' % self.poll_method.__name__) - return True - - def create_charts(self, front_ends, back_ends): - for _ in range(len(front_ends)): - self.definitions['fbin']['lines'].append(['_'.join(['fbin', front_ends[_]['# pxname']]), front_ends[_]['# pxname'], 'incremental', 1, 1024]) - self.definitions['fbout']['lines'].append(['_'.join(['fbout', front_ends[_]['# pxname']]), front_ends[_]['# pxname'], 'incremental', 1, 1024]) - self.definitions['fscur']['lines'].append(['_'.join(['fscur', front_ends[_]['# pxname']]), front_ends[_]['# pxname'], 'absolute']) - self.definitions['fqcur']['lines'].append(['_'.join(['fqcur', front_ends[_]['# pxname']]), front_ends[_]['# pxname'], 'absolute']) - - for _ in range(len(back_ends)): - self.definitions['bbin']['lines'].append(['_'.join(['bbin', back_ends[_]['# pxname']]), back_ends[_]['# pxname'], 'incremental', 1, 1024]) - self.definitions['bbout']['lines'].append(['_'.join(['bbout', back_ends[_]['# pxname']]), back_ends[_]['# pxname'], 'incremental', 1, 1024]) - self.definitions['bscur']['lines'].append(['_'.join(['bscur', back_ends[_]['# pxname']]), back_ends[_]['# pxname'], 'absolute']) - self.definitions['bqcur']['lines'].append(['_'.join(['bqcur', back_ends[_]['# pxname']]), back_ends[_]['# pxname'], 'absolute']) - self.definitions['health_down']['lines'].append(['_'.join(['hdown', back_ends[_]['# pxname']]), back_ends[_]['# pxname'], 'absolute']) - - def _get_data(self): - """ - Format data received from http request - :return: dict - """ - try: - raw_data = self.poll_method._get_raw_data(self).splitlines() - except Exception as e: - self.error(str(e)) - return None - - all_instances = [dict(zip(raw_data[0].split(','), raw_data[_].split(','))) for _ in range(1, len(raw_data))] - - back_ends = list(filter(is_backend, all_instances)) - front_ends = list(filter(is_frontend, all_instances)) - servers = list(filter(is_server, all_instances)) - - if self.charts: - self.create_charts(front_ends, back_ends) - self.charts = False - - to_netdata = dict() - - for frontend in front_ends: - for _ in self.order_front: - to_netdata.update({'_'.join([_, frontend['# pxname']]): int(frontend[_[1:]]) if frontend.get(_[1:]) else 0}) - - for backend in back_ends: - for _ in self.order_back: - to_netdata.update({'_'.join([_, backend['# pxname']]): int(backend[_[1:]]) if backend.get(_[1:]) else 0}) - - for _ in range(len(back_ends)): - to_netdata.update({'_'.join(['hdown', back_ends[_]['# pxname']]): - len([server for server in servers if is_server_down(server, back_ends, _)])}) - - return to_netdata - - def _check_raw_data(self, data): - """ - Check if all data has been gathered from socket - :param data: str - :return: boolean - """ - return not bool(data) - -def is_backend(backend): - try: - return backend['svname'] == 'BACKEND' and backend['# pxname'] != 'stats' - except Exception: - return False - -def is_frontend(frontend): - try: - return frontend['svname'] == 'FRONTEND' and frontend['# pxname'] != 'stats' - except Exception: - return False - -def is_server(server): - try: - return not server['svname'].startswith(('FRONTEND', 'BACKEND')) - except Exception: - return False - -def is_server_down(server, back_ends, _): - try: - return server['# pxname'] == back_ends[_]['# pxname'] and server['status'] != 'UP' - except Exception: - return False diff --git a/files/haproxy.conf b/files/haproxy.conf index 29550b5..e34365c 100644 --- a/files/haproxy.conf +++ b/files/haproxy.conf @@ -1,38 +1,2 @@ -# netdata python.d.plugin configuration for haproxy -# -# This file is in YaML format. Generally the format is: -# -# name: value -# -# There are 2 sections: -# - global variables -# - one or more JOBS -# -# JOBS allow you to collect values from multiple sources. -# Each source will have its own set of charts. -# -# JOB parameters have to be indented (using spaces only, example below). - -# ---------------------------------------------------------------------- -# Global Variables -# These variables set the defaults for all JOBs, however each JOB -# may define its own, overriding the defaults. - -# update_every sets the default data collection frequency. -# If unset, the python.d.plugin default is used. -# update_every: 1 - -# priority controls the order of charts at the netdata dashboard. -# Lower numbers move the charts towards the top of the page. -# If unset, the default for python.d.plugin is used. -# priority: 60000 - -# retries sets the number of retries to be made in case of failures. -# If unset, the default for python.d.plugin is used. -# Attempts to restore the service are made once every update_every -# and only if the module has collected values in the past. -# retries: 5 - -localurl: - name: 'local' - url: 'http://localhost:7000/haproxy_stats/;csv;norefresh' +via_socket: + socket: '/run/haproxy/admin.sock' diff --git a/tasks/install.yml b/tasks/install.yml index ff329eb..d6b9f30 100644 --- a/tasks/install.yml +++ b/tasks/install.yml @@ -16,15 +16,3 @@ args: chdir: /opt/netdata when: netdata_clone.changed - -- name: "Copy additional files" - copy: - src: '{{ item.filename }}' - dest: '{{ item.path }}/{{ item.filename }}' - with_items: - - filename: 'haproxy.chart.py' - path: '/usr/libexec/netdata/python.d' - - filename: 'haproxy.conf' - path: '/etc/netdata/python.d' - notify: - - "Restart NetData" diff --git a/tasks/main.yml b/tasks/main.yml index 5ecc701..e561c19 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -86,6 +86,25 @@ line: ' killproc -p ${PIDFILE} $DAEMON_PATH/$DAEMON && sleep 1' when: ansible_lsb.major_release == '12' + + - block: + + - name: "Add NetData User to HaProxy Group" + user: + name: 'netdata' + groups: 'haproxy' + append: yes + + - name: "Configure HaProxy Plugin" + copy: + src: 'haproxy.conf' + dest: '/etc/netdata/python.d/haproxy.conf' + owner: 'netdata' + group: 'netdata' + mode: '660' + + when: groups['proxyserver'] is defined and inventory_hostname in groups['proxyserver'] + - block: - name: "Enable Apache Status Module" -- GitLab