add all the files
This commit is contained in:
parent
73510a803c
commit
a0d08dc47e
5 changed files with 99 additions and 0 deletions
15
Dockerfile
Normal file
15
Dockerfile
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
FROM alpine:latest
|
||||||
|
MAINTAINER Jack Halford [jack.0x5.be]
|
||||||
|
|
||||||
|
# nut is in testing
|
||||||
|
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
|
||||||
|
|
||||||
|
# busybox-extras for inetd
|
||||||
|
RUN apk update && apk add busybox-extras nut bash gawk
|
||||||
|
|
||||||
|
COPY http_wrapper.sh /
|
||||||
|
COPY upsc_exporter.sh /
|
||||||
|
COPY upsc_to_prometheus.awk /
|
||||||
|
COPY inetd.conf /etc/
|
||||||
|
|
||||||
|
ENTRYPOINT ["inetd", "-f"]
|
||||||
20
http_wrapper.sh
Executable file
20
http_wrapper.sh
Executable file
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# small http wrapper for bash scripts via inetd
|
||||||
|
|
||||||
|
file="$1"
|
||||||
|
mime='text/plain'
|
||||||
|
|
||||||
|
if [ ! -f "$file" ]; then
|
||||||
|
echo "$1: No such file or directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
. $file > /tmp/.$$.output
|
||||||
|
|
||||||
|
size=$(stat -c "%s" "/tmp/.$$.output")
|
||||||
|
|
||||||
|
printf 'HTTP/1.1 200 OK\r\nDate: %s\r\nContent-Length: %s\r\nContent-Type: %s\r\nConnection: close\r\n\r\n' "$(date)" "$size" "$mime"
|
||||||
|
|
||||||
|
cat /tmp/.$$.output
|
||||||
|
|
||||||
|
rm -f /tmp/.$$.output
|
||||||
2
inetd.conf
Normal file
2
inetd.conf
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
# http_wrapper twice because its argv[0] argv[1] ...
|
||||||
|
9614 stream tcp nowait root /http_wrapper.sh http_wrapper.sh /upsc_exporter.sh
|
||||||
6
upsc_exporter.sh
Executable file
6
upsc_exporter.sh
Executable file
|
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# default to ups@localhost
|
||||||
|
UPS_TARGET="${UPS_TARGET:-ups@localhost}"
|
||||||
|
|
||||||
|
upsc "$UPS_TARGET" | ./upsc_to_prometheus.awk
|
||||||
56
upsc_to_prometheus.awk
Executable file
56
upsc_to_prometheus.awk
Executable file
|
|
@ -0,0 +1,56 @@
|
||||||
|
#!/usr/bin/awk -f
|
||||||
|
# Rationale:
|
||||||
|
# The output of upsc contains numerical metrics and strings. The
|
||||||
|
# numerical ones are made into prometheus series, while the strings
|
||||||
|
# are made into labels that are attaches to series by prefix.
|
||||||
|
|
||||||
|
# $1 == metric name
|
||||||
|
# $2 == metric value
|
||||||
|
BEGIN { FS=": "; RS="\n" }
|
||||||
|
# replace dots with underscores
|
||||||
|
{gsub(/\./,"_",$1)}
|
||||||
|
|
||||||
|
# split outlet_N into outletN to make multiple timeseries
|
||||||
|
$1 ~ /^outlet_[0-9]+/ {gsub("outlet_","outlet",$1)}
|
||||||
|
|
||||||
|
# convert status into number
|
||||||
|
$1 ~ /ups_status/ {
|
||||||
|
if ($2 ~ /OL/) {$2 = "0"};
|
||||||
|
if ($2 ~ /OB/) {$2 = "1"};
|
||||||
|
}
|
||||||
|
|
||||||
|
# numerical values are metrics
|
||||||
|
{ if ($2 ~ /^[0-9]*\.?[0-9]+$/) {
|
||||||
|
metrics[$1] = $2
|
||||||
|
}
|
||||||
|
# non numerical values are metric labels
|
||||||
|
else {
|
||||||
|
prefix = getprefix($1)
|
||||||
|
gsub(prefix"_","",$1);
|
||||||
|
label=$1;
|
||||||
|
value=$2;
|
||||||
|
if (labels[prefix] != "")
|
||||||
|
labels[prefix]=labels[prefix]", "
|
||||||
|
else
|
||||||
|
labels[prefix]="{"
|
||||||
|
labels[prefix]=labels[prefix]label"=\""value"\"";
|
||||||
|
}}
|
||||||
|
|
||||||
|
# print all ,etrics with corresponding labels
|
||||||
|
END {
|
||||||
|
for (metric in labels) { labels[metric]=labels[metric]"}" }
|
||||||
|
for (metric in metrics) {
|
||||||
|
prefix = getprefix(metric)
|
||||||
|
print "upsc_" metric labels[prefix], metrics[metric]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getprefix(str) {
|
||||||
|
n=split(str,array,"_");
|
||||||
|
return array[1]
|
||||||
|
# if (array[1] == "ups")
|
||||||
|
# prefix=array[1]"_"array[2]
|
||||||
|
# else
|
||||||
|
# prefix=array[1]
|
||||||
|
# return prefix
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue