diff options
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r--[l---------] | Makefile | 32 | ||||
l--------- | README.md | 1 | ||||
-rw-r--r-- | config.mk | 12 | ||||
-rw-r--r-- | config.mk.in | 198 | ||||
-rw-r--r-- | systemd.conf.in | 12 | ||||
-rwxr-xr-x | systemd.py | 73 | ||||
-rw-r--r-- | systemd.types.db | 2 |
8 files changed, 134 insertions, 200 deletions
@@ -1,3 +1,7 @@ +*.pyc +/systemd.conf +/collectd-* + .tmp.* .var.* @@ -1 +1,31 @@ -build-aux/Makefile.README.mk
\ No newline at end of file +PACKAGE = collectd-systemd +VERSION = 20170820 + +include $(dir $(lastword $(MAKEFILE_LIST)))/config.mk +include $(topsrcdir)/build-aux/Makefile.head.mk + +files.out.all += systemd.conf +#files.out.all += systemd.types.db +#files.out.all += systemd.py + +files.sys.all += $(collectdconfdir)/systemd.conf +files.sys.all += $(collectdtypesdir)/systemd.types.db +files.sys.all += $(collectdpythondir)/systemd.py + +$(outdir)/%: $(srcdir)/%.in + sed $(foreach v,$(patsubst $(var.)%,%,$(filter $(var.)%,$^)), -e 's|@$(v)@|$($(v))|g' ) < $< > $@ + +$(outdir)/systemd.conf: $(var.)collectd_typesdir +$(outdir)/systemd.conf: $(var.)collectd_pythondir + +$(DESTDIR)$(collectdconfdir)/systemd.conf: $(outdir)/systemd.conf + $(INSTALL_DATA) -DT $< $@ +$(DESTDIR)$(collectdtypesdir)/systemd.types.db: $(srcdir)/systemd.types.db + $(INSTALL_DATA) -DT $< $@ +$(DESTDIR)$(collectdpythondir)/systemd.py: $(srcdir)/systemd.py + $(INSTALL_PROGRAM) -DT $< $@ + +.SECONDARY: +.DELETE_ON_ERROR: + +include $(topsrcdir)/build-aux/Makefile.tail.mk diff --git a/README.md b/README.md deleted file mode 120000 index 5e5ea4a..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -build-aux/Makefile.README.txt
\ No newline at end of file diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..46cbc00 --- /dev/null +++ b/config.mk @@ -0,0 +1,12 @@ +# In addition to the variables in the default version of this file, +# you may set any of the standard GNU configuration variables. +ifeq ($(origin topsrcdir),undefined) +topoutdir := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +topsrcdir := $(topoutdir) + +collectd_pkgdatadir = $(datadir)/collectd +collectd_confdir = $(collectd_pkgdatadir) +collectd_typesdir = $(collectd_pkgdatadir) +collectd_pythondir = $(collectd_pkgdatadir) + +endif diff --git a/config.mk.in b/config.mk.in deleted file mode 100644 index be95ab4..0000000 --- a/config.mk.in +++ /dev/null @@ -1,198 +0,0 @@ -# Copyright (C) 2016-2017 Luke Shumaker -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# This is based on §7.2 "Makefile Conventions" of the July 25, 2016 -# release of the GNU Coding Standards. -# -# Grep for '^##' in this file to see which Autoconf macros it depends -# on. - -dist.pkgname = @PACKAGE_TARNAME@ -gnuconf.pkgname = @PACKAGE_NAME@ - -# 7.2.2: Utilities in Makefiles -# ----------------------------- - -# It's ok to hard-code these commands in rules, but who wants to -# memorize the list of what's ok? - -## AC_PROG_AWK -## AC_PROG_GREP -## AC_PROG_EGREP -## AC_PROG_SED - -AWK = @AWK@ -CAT = cat -CMP = cmp -CP = cp -DIFF = diff -ECHO = echo -EGREP = @EGREP@ -EXPR = expr -FALSE = false -GREP = @GREP@ -INSTALL_INFO = install-info -LN = ln -LS = ls -MKDIR = mkdir -MV = mv -PRINTF = printf -PWD = pwd -RM = rm -RMDIR = rmdir -SED = @SED@ -SLEEP = sleep -SORT = sort -TAR = tar -TEST = test -TOUCH = touch -TR = tr -TRUE = true - -# 7.2.2: Utilities in Makefiles/7.2.3: Variables for Specifying Commands -# ---------------------------------------------------------------------- - -# Standard user-configurable programs. -# -# The list of programs here is specified in §7.2.2, but the associated FLAGS -# variables are specified in §7.2.3. I found it cleaner to list them together. - -## AC_PROG_INSTALL # @INSTALL@ @INSTALL_PROGRAM@ @INSTALL_SCRIPT@ @INSTALL_DATA@ -## AC_PROG_LEX # @LEX@ @LEXLIB@ -## AC_PROG_RANLIB -## AC_PROG_YACC -## AC_PROG_CC -# -# TODO: What causes Autoconf to define @AR@? - -AR = @AR@ -ARFLAGS = -BISON = bison -BISONFLAGS = -CC = @CC@ -CFLAGS = @CFLAGS@ # CFLAGS instead of CCFLAGS -FLEX = flex -FLEXFLAGS = -INSTALL = @INSTALL@ -# There is no INSTALLFLAGS[0] -LD = ld -LDFLAGS = @LDFLAGS@ -LDCONFIG = ldconfig # TODO[1] -LDCONFIGFLAGS = -LEX = @LEX@ -LFLAGS = #LFLAGS instead of LEXFLAGS -#MAKE -MAKEINFO = makeinfo -MAKEINFOFLAGS = -RANLIB = @RANLIB@ -RANLIBFLAGS = -TEXI2DVI = texi2dvi -TEXI2DVIFLAGS = -YACC = @YACC@ -YFLAGS = # YFLAGS instead of YACCFLAGS - -CPPFLAGS = @CPPFLAGS@ - -LN_S = @LN_S@ - -CHGRP = chgrp -CHGRPFLAGS = -CHMOD = chmod -CHMODFLAGS = -CHOWN = chown -CHOWNFLAGS = -MKNOD = mknod -MKNODFLAGS = - -# [0]: There is no INSTALLFLAGS because it would be inconsistent with how the -# standards otherwise recommend using $(INSTALL); with INSTALL_PROGRAM and -# INSTALL_DATA; which are specified in a way precluding the use of -# INSTALLFLAGS. To have the variable, but to ignore it in the common case -# would be confusing. -# -# [1]: The RANLIB and LDCONFIG variables need some extra smarts; §7.2.2 says: -# -# > When you use ranlib or ldconfig, you should make sure nothing bad -# > happens if the system does not have the program in question. Arrange -# > to ignore an error from that command, and print a message before the -# > command to tell the user that failure of this command does not mean a -# > problem. (The Autoconf ‘AC_PROG_RANLIB’ macro can help with this.) - -# 7.2.3: Variables for Specifying Commands -# ---------------------------------------- - -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ - -# 7.2.5: Variables for Installation Directories -# --------------------------------------------- - -# Root for the installation -prefix = @prefix@ -exec_prefix = @exec_prefix@ -# Executable programs -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -# Data files (Autoconf won't support runstatedir until version 2.70) -datarootdir = @datarootdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -runstatedir = $(localstatedir)/run -# Specific types of files -includedir = @includedir@ -oldincludedir = @oldincludedir@ -docdir = @docdir@ -infodir = @infodir@ -htmldir = @htmldir@ -dvidir = @dvidir@ -pdfdir = @pdfdir@ -psdir = @psdir@ -libdir = @libdir@ -lispdir = $(datarootdir)/emacs/site-lisp -localedir = @localedir@ - -mandir = @mandir@ -man1dir = $(mandir)/man1 -man2dir = $(mandir)/man2 -man3dir = $(mandir)/man3 -man4dir = $(mandir)/man4 -man5dir = $(mandir)/man5 -man6dir = $(mandir)/man6 -man7dir = $(mandir)/man7 -man8dir = $(mandir)/man8 - -manext = .1 -man1ext = .1 -man2ext = .2 -man3ext = .3 -man4ext = .4 -man5ext = .5 -man6ext = .6 -man7ext = .7 -man8ext = .8 - -# 7.2.7: Install Command Categories -# --------------------------------- - -PRE_INSTALL = -POST_INSTALL = -NORMAL_INSTALL = - -PRE_UNINSTALL = -POST_UNINSTALL = -NORMAL_UNINSTALL = diff --git a/systemd.conf.in b/systemd.conf.in new file mode 100644 index 0000000..b07019f --- /dev/null +++ b/systemd.conf.in @@ -0,0 +1,12 @@ +TypesDB "@collectd_typesdir@/systemd.types.db" + +LoadPlugin python +<Plugin python> + ModulePath "@collectd_pythondir@" + LogTraces true + Interactive false + Import "systemd" + + <Module systemd> + </Module> +</Plugin> diff --git a/systemd.py b/systemd.py new file mode 100755 index 0000000..18cdb77 --- /dev/null +++ b/systemd.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# +# This should be both valid Python 2 and 3, as the collectd Python +# plugin can be either Python 2 or 3 (decided at compile time). +# +# Oddly, the Arch 'collectd' package chose Python 2, despite using +# Python 3 as the default system Python. I assume they have a good +# reason for it, though I can't find it discussed anywhere. + +import sys +import dbus + +# For compatibility with Python 2 & 3 +if sys.version_info.major is 2: + def iteritems(d): + return d.iteritems() +else: + def iteritems(d): + return d.items() + +# DBus utility function +def get_property(dbus_iface, propname): + return dbus_iface.proxy_object.Get(dbus_iface.dbus_interface, propname, dbus_interface='org.freedesktop.DBus.Properties') + +# The main program + +def init(): + global system_manager + system_manager = dbus.Interface(dbus.SystemBus().get_object("org.freedesktop.systemd1", "/org/freedesktop/systemd1"), "org.freedesktop.systemd1.Manager") + +def read(): + global system_manager + + dat = { + # These are the values of the + # basic/unit-name.h:UnitActiveStates enum. + ('sd_units', 'active'): 0, + ('sd_units', 'reloading'): 0, + ('sd_units', 'inactive'): 0, + ('sd_units', 'failed'): 0, + ('sd_units', 'activating'): 0, + ('sd_units', 'deactivating'): 0, + } + for unit in system_manager.ListUnits(): + key = ('sd_units', str(unit[3])) + dat[key] = dat[key] + 1 + + dat[('sd_jobs', 'queued')] = int(get_property(system_manager, 'NJobs')) + dat[('sd_jobs', 'installed')] = int(get_property(system_manager, 'NInstalledJobs')) + dat[('sd_jobs', 'failed')] = int(get_property(system_manager, 'NFailedJobs')) + + return dat + +if __name__ == '__main__': + init() + for (key, val) in iteritems(read()): + print("%s => %s" % (key, val)) +else: + import collectd + def _config(conf): + pass + def _read(): + for (key, val) in iteritems(read()): + collectd.Values( + plugin='systemd', + type=key[0], + type_instance=key[1] + ).dispatch( + values=[val] + ) + collectd.register_config(_config) + collectd.register_init(init) + collectd.register_read(_read, 1) diff --git a/systemd.types.db b/systemd.types.db new file mode 100644 index 0000000..bf45e3a --- /dev/null +++ b/systemd.types.db @@ -0,0 +1,2 @@ +sd_units value:GAUGE:0:U +sd_jobs value:GAUGE:0:U |