meters

Remind Supply Chain Risks


Install
pip install meters==0.1.0

Documentation

meters - Yet another metrics library

Build Status Coverage Status Latest Version

Tracks server state and statistics, allowing you to see what your server is doing. It can also send metrics to Graphite for graphing or to a file for crash forensics. It has flexible scalability.

Installation

From PyPI:

pip install meters

Complete example of usage

import math
import time
import logging

import meters
import meters.scales.shared

meters.configure({
        "placeholders": {
            "env":   "os.environ",
            "uname": "meters.shortcuts.get_node",
            "app":   "meters.shortcuts.get_app",
        },

        "common": {
            "prefix": "servers.{uname}.{env[USER]}.{app}",
        },

        "handlers": {
            "graphite-server-a": {
                "class":   "meters.handlers.graphite.GraphiteHandler",
                "url":     "tcp://graphite-a.example.com:2025",
                "timeout": 1,
                "period":  1,
            },
            "graphite-server-b": {
                "class":   "meters.handlers.graphite.GraphiteHandler",
                "url":     "udp://graphite-b.example.com:2025",
                "timeout": 1,
                "period":  1,
            },
            "log": "meters.handlers.log.LoggingHandler",
        },

        "meters": {
            "proc.la":    "meters.scales.procfs.LoadAverage",
            "proc.stat":  "meters.scales.procfs.Stat",
            "proc.self":  "meters.scales.procfs.SelfStat",
            "py_threads": "meters.scales.python.Threads",
            "py_objects": "meters.scales.python.Objects",
            "py_rusage" : {
                "class": "meters.scales.python.Resources",
                "who":   "RUSAGE_CHILDREN",
            },
            "time.now": time.time,
        },
    })

# Catch all messages
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
logging.getLogger().addHandler(handler)
logging.getLogger().setLevel(logging.DEBUG)

foo = meters.add_meter("foo", meters.scales.shared.Value(float))
meters.start()

count = 0
while True:
    foo.set(math.sin(count))
    time.sleep(1)
    count += 1

The result will be the following metrics:

servers.reki.mdevaev.foo=0.0
servers.reki.mdevaev.proc.la.la1=0.87
servers.reki.mdevaev.proc.la.la15=0.71
servers.reki.mdevaev.proc.la.la5=0.81
servers.reki.mdevaev.proc.self.cstime=0.0
servers.reki.mdevaev.proc.self.cutime=0.0
servers.reki.mdevaev.proc.self.rss=10048.0
servers.reki.mdevaev.proc.self.stime=0.01
servers.reki.mdevaev.proc.self.utime=0.11
servers.reki.mdevaev.proc.self.vsize=2091663.36
servers.reki.mdevaev.proc.stat.cpu.guest=0
servers.reki.mdevaev.proc.stat.cpu.guest_nice=0
servers.reki.mdevaev.proc.stat.cpu.idle=27298939
servers.reki.mdevaev.proc.stat.cpu.iowait=176185
servers.reki.mdevaev.proc.stat.cpu.irq=61
servers.reki.mdevaev.proc.stat.cpu.nice=1386
servers.reki.mdevaev.proc.stat.cpu.softirq=7285
servers.reki.mdevaev.proc.stat.cpu.steal=0
servers.reki.mdevaev.proc.stat.cpu.system=3463200
servers.reki.mdevaev.proc.stat.cpu.user=7594520
servers.reki.mdevaev.py_objects.gc_objects=9082
servers.reki.mdevaev.py_rusage.ru_idrss=0
servers.reki.mdevaev.py_rusage.ru_inblock=0
servers.reki.mdevaev.py_rusage.ru_isrss=0
servers.reki.mdevaev.py_rusage.ru_ixrss=0
servers.reki.mdevaev.py_rusage.ru_majflt=0
servers.reki.mdevaev.py_rusage.ru_maxrss=7372
servers.reki.mdevaev.py_rusage.ru_minflt=788
servers.reki.mdevaev.py_rusage.ru_msgrcv=0
servers.reki.mdevaev.py_rusage.ru_msgsnd=0
servers.reki.mdevaev.py_rusage.ru_nivcsw=2
servers.reki.mdevaev.py_rusage.ru_nsignals=0
servers.reki.mdevaev.py_rusage.ru_nswap=0
servers.reki.mdevaev.py_rusage.ru_nvcsw=3
servers.reki.mdevaev.py_rusage.ru_oublock=0
servers.reki.mdevaev.py_rusage.ru_stime=0.0
servers.reki.mdevaev.py_rusage.ru_utime=0.003333
servers.reki.mdevaev.py_threads.alive_threads=3
servers.reki.mdevaev.time.now=1395266477.651378