1
0
Fork 0
nix-config/hosts/nncp/collectd_nncp.nim

48 lines
1.6 KiB
Nim

import std/[os, strutils]
import posix
proc getFileSize(path: string): BiggestInt =
var rawInfo: Stat
if stat(path, rawInfo) < 0'i32:
raiseOSError(osLastError(), path)
rawInfo.st_size
let
hostname = getEnv("COLLECTD_HOSTNAME", "localhost")
interval = max(60, getEnv("COLLECTD_INTERVAL", "0").parseFloat.int)
args = commandLineParams()
doAssert(args.len == 1, "pass only the NNCP spool directry as an argument")
type DirStats = tuple[size: BiggestInt, packets: int]
proc sumDir(path: string): DirStats =
for kind, path in walkDir path:
if kind == pcFile:
result.size = result.size + getFileSize(path)
inc result.packets
while true:
var stats: tuple[rx: DirStats, tx: DirStats]
for kind, path in walkDir args[0]:
if kind == pcDir:
block:
var rx = sumDir(path / "rx")
stats.rx.size = stats.rx.size + rx.size
stats.rx.packets.inc rx.packets
block:
var tx = sumDir(path / "tx")
stats.tx.size = stats.tx.size + tx.size
stats.tx.packets.inc tx.packets
stdout.writeLine("""PUTVAL "$#/exec-nncp/bytes-rx" interval=$# N:$#""" %
[hostname, $interval, $stats.rx.size])
stdout.writeLine("""PUTVAL "$#/exec-nncp/pending_operations-rx" interval=$# N:$#""" %
[hostname, $interval, $stats.rx.packets])
stdout.writeLine("""PUTVAL "$#/exec-nncp/bytes-tx" interval=$# N:$#""" %
[hostname, $interval, $stats.tx.size])
stdout.writeLine("""PUTVAL "$#/exec-nncp/pending_operations-tx" interval=$# N:$#""" %
[hostname, $interval, $stats.tx.packets])
flushFile stdout
sleep interval*1000