Skip to content

Commit

Permalink
Monitoring described.
Browse files Browse the repository at this point in the history
  • Loading branch information
idlesign committed Jul 13, 2017
1 parent aa9f9c1 commit c19f317
Show file tree
Hide file tree
Showing 7 changed files with 809 additions and 14 deletions.
6 changes: 6 additions & 0 deletions docs/source/grp_monitoring.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Monitoring
==========

.. automodule:: uwsgiconf.options.monitoring
:members:

1 change: 1 addition & 0 deletions docs/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ API
grp_logging
grp_main_process
grp_master_process
grp_monitoring
grp_networking
grp_queue
grp_spooler
Expand Down
147 changes: 147 additions & 0 deletions tests/options/test_monitoring.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
from uwsgiconf import Section
from uwsgiconf.exceptions import ConfigurationError

import pytest


def test_monitoring_snmp(assert_lines):

assert_lines([
'snmp = 192.168.1.1:2222',
'snmp-community = mymetr',
], Section().monitoring.enable_snmp('192.168.1.1:2222', 'mymetr'))


def test_monitoring_stats(assert_lines):

assert_lines([
'stats-server = 127.0.0.1:1717',
'stats-http = true',
], Section().monitoring.set_stats_params('127.0.0.1:1717', enable_http=True))


def test_monitoring_metrics(assert_lines):

assert_lines([
'enable-metrics = true',
'metrics-dir = /here',
], Section().monitoring.set_metrics_params(enable=True, store_dir='/here'))

assert_lines([
'metric-threshold = alarm=some,key=mycounter,reset=0,value=1000',
], Section().monitoring.set_metrics_threshold('mycounter', 1000, reset_to=0, alarm='some'))

section = Section()
assert_lines([
'alarm = pinger cmd:ping 127.0.0.1',
'metric-threshold = alarm=pinger,key=mycounter,value=2000',
], section.monitoring.set_metrics_threshold(
'mycounter', 2000, alarm=section.alarms.cls_alarm_command('pinger', 'ping 127.0.0.1')
))


def test_monitoring_register_metric(assert_lines):

monitoring = Section().monitoring

my_abs = monitoring.metric_types.absolute('myabs', initial_value=100)
my_abs2 = monitoring.metric_types.alias('myabs2', initial_value=200, alias_for=my_abs)

with pytest.raises(ConfigurationError):
# Alias without alias_for
monitoring.metric_types.alias('myabs3', initial_value=200)

assert_lines([
'metric = name=myabs,initial_value=100,type=absolute',
'metric = name=myabs2,alias=myabs,initial_value=200,type=alias',
'metric = name=mymet,collector=sum,children=worker.1.requests;myabs,type=gauge',

], monitoring.register_metric([
my_abs,
my_abs2,
monitoring.metric_types.gauge(
'mymet',
collector=monitoring.collectors.sum(['worker.1.requests', my_abs]),
)
]))


def test_monitoring_collectors(assert_lines):

collectors = Section().monitoring.collectors

assert str(collectors.manual()) == 'manual'
assert str(collectors.pointer()) == 'ptr'
assert str(collectors.file('/here/a', get_slot=2)) == 'file,arg1=/here/a,arg1n=2'
assert str(collectors.function('some')) == 'func,arg1=some'
assert str(collectors.sum(['a', 'b'])) == 'sum,children=a;b'
assert str(collectors.avg(['a', 'b'])) == 'avg,children=a;b'
assert str(collectors.accumulator(['a', 'b'])) == 'accumulator,children=a;b'
assert str(collectors.adder(['a', 'b'], 3)) == 'adder,arg1n=3,children=a;b'
assert str(collectors.multiplier(['a', 'b'], 4)) == 'multiplier,arg1n=4,children=a;b'


def test_monitoring_pushers(assert_lines):

monitoring = Section().monitoring
assert_lines([
'stats-push = socket:127.0.0.1:8125,myinstance',

], monitoring.register_stats_pusher(
monitoring.pushers.socket('127.0.0.1:8125', 'myinstance')
))

monitoring = Section().monitoring
pusher = monitoring.pushers.rrdtool('/here')
pusher.set_basic_params('libmyrdd.so')
assert_lines([
'stats-push = rrdtool:/here',
'rrdtool-lib = libmyrdd.so',

], monitoring.register_stats_pusher(pusher))

monitoring = Section().monitoring
pusher = monitoring.pushers.statsd('127.0.0.1:8125', 'myinstance')
pusher.set_basic_params(no_workers=True)
assert_lines([
'stats-push = statsd:127.0.0.1:8125,myinstance',
'statsd-no-workers = true',

], monitoring.register_stats_pusher(
pusher
))

monitoring = Section().monitoring
assert_lines([
'stats-push = carbon:127.0.0.1:2003',

], monitoring.register_stats_pusher(
monitoring.pushers.carbon('127.0.0.1:2003')
))

monitoring = Section().monitoring
pusher = monitoring.pushers.zabbix('127.0.0.1:10051')
pusher.set_basic_params('/put/here')
assert_lines([
'stats-push = zabbix:127.0.0.1:10051',
'zabbix-template = /put/here',

], monitoring.register_stats_pusher(
pusher
))

monitoring = Section().monitoring
assert_lines([
'stats-push = mongodb:collection=mycol,freq=10',

], monitoring.register_stats_pusher(
monitoring.pushers.mongo(collection='mycol', interval=10)
))

monitoring = Section().monitoring
assert_lines([
'stats-push = file:path=/here/a.json,freq=15',

], monitoring.register_stats_pusher(
monitoring.pushers.file('/here/a.json', interval=15)
))
8 changes: 7 additions & 1 deletion uwsgiconf/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ class ParametrizedValue(OptionsGroup):
alias = None
args_joiner = ' '
name_separator = ':'
name_separator_strip = False

def __init__(self, *args):
self.args = args
Expand All @@ -145,7 +146,12 @@ def __str__(self):
if self.alias:
result = '%s %s' % (self.alias, result)

return result.strip()
result = result.strip()

if self.name_separator_strip:
result = result.strip(self.name_separator)

return result


class SectionBase(OptionsGroup):
Expand Down
27 changes: 14 additions & 13 deletions uwsgiconf/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class Section(SectionBase):
logging = Options(Logging) # type: Logging
main_process = Options(MainProcess) # type: MainProcess
master_process = Options(MasterProcess) # type: MasterProcess
monitoring = Options(Monitoring) # type: Monitoring
networking = Options(Networking) # type: Networking
queue = Options(Queue) # type: Queue
spooler = Options(Spooler) # type: Spooler
Expand All @@ -61,43 +62,43 @@ class Vars(object):
"""
VERSION = '%V'
'''uWSGI version number'''
"""uWSGI version number"""

FORMAT_ESCAPE = '%['
'''ANSI escape \\033. useful for printing colors'''
"""ANSI escape \\033. useful for printing colors"""

FORMAT_END = '%s[0m' % FORMAT_ESCAPE

CONF_CURRENT_SECTION = '%x'
'''The current section identifier, eg. conf.ini:section.'''
"""The current section identifier, eg. conf.ini:section."""
CONF_CURRENT_SECTION_NTPL = '%x'

CONF_NAME_ORIGINAL = '%o'
'''The original conf filename, as specified on the command line'''
"""The original conf filename, as specified on the command line"""
CONF_NAME_ORIGINAL_NTPL = '%O'

TIMESTAMP_STARTUP_S = '%t'
'''Unix time s, gathered at instance startup.'''
"""Unix time s, gathered at instance startup."""
TIMESTAMP_STARTUP_MS = '%T'
'''Unix time ms, gathered at instance startup'''
"""Unix time ms, gathered at instance startup"""

DIR_VASSALS = '%v'
'''Vassals directory - pwd.'''
"""Vassals directory - pwd."""

HOST_NAME = '%h'
'''Host name.'''
"""Host name."""
CPU_CORES = '%k'
'''Detected CPU count.'''
"""Detected CPU count."""

USER_ID = '%u'
'''User ID.'''
"""User ID."""
USER_NAME = '%U'
'''User name.'''
"""User name."""

GROUP_ID = '%g'
'''Use group ID.'''
"""Use group ID."""
GROUP_NAME = '%G'
'''Use group name.'''
"""Use group name."""

@classmethod
def get_descriptions(cls):
Expand Down
1 change: 1 addition & 0 deletions uwsgiconf/options/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from .logging import Logging
from .main_process import MainProcess
from .master_process import MasterProcess
from .monitoring import Monitoring
from .networking import Networking
from .python import Python
from .queue import Queue
Expand Down

0 comments on commit c19f317

Please sign in to comment.