InfxDB сумма первого значения метрики различных серий, но тот же интервал времени для графа графана
Я использую InflucDB Grafana и Collectd, и я хочу отобразить график использования памяти.
Collectd дает мне это значение метрики для памяти и сохраняет его в influenxdb
influxdb/memory/memory-buffered
influxdb/memory/memory-cached
influxdb/memory/memory-free
influxdb/memory/memory-used
Я хочу отобразить на графике Grafana общий объем памяти, поэтому мне нужно сложить следующие показатели:
memory_buffered + memory_cached + memory_free + memory_used
Как я могу запросить это в infxdb или в графане?
2 ответа
Я думаю, что это невозможно в данный момент (с InfluxDB 0,9). Чтобы вычислить отношения между временными рядами (полями), вы должны иметь возможность выполнять либо вложенные запросы, либо объединения, которые были объявлены устаревшими в InfluxDB 0.9:
SELECT errors_per_minute.value / pages_per_minute.value FROM errors_per_minute INNER JOIN pages_per_minute. В InfluxDB 0.9 не поддерживаются ни операции MERGE, ни JOIN.
Однако вы могли бы избежать таких запросов, если вы сообщаете значения уже в процентах от collectd (начиная с версии 5.5 он поддерживает представление CPU в процентах).
Это простой баш exec
скрипт для вычисления процента использования процессора, памяти и диска:
#!/bin/bash
# a collectd script reporting resources usage as percentage
HOSTNAME="${COLLECTD_HOSTNAME:-`hostname -f`}"
INTERVAL="${COLLECTD_INTERVAL:-10}"
# delay for measuring CPU
DELAY=${1:-1}
# source: http://codereview.stackexchange.com/questions/62425/using-proc-stat-to-calculate-cpu-usage
function getstat() {
grep 'cpu ' /proc/stat | sed -e 's/ */x/g' -e 's/^cpux//'
}
function extract() {
echo $1 | cut -d 'x' -f $2
}
function change() {
local e=$(extract $ENDSTAT $1)
local b=$(extract $STARTSTAT $1)
local diff=$(( $e - $b ))
echo $diff
}
while sleep "$INTERVAL"
do
#Record the start statistics
STARTSTAT=$(getstat)
sleep $DELAY
#Record the end statistics
ENDSTAT=$(getstat)
#http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt#1236
#echo "From $STARTSTAT"
#echo "TO $ENDSTAT"
# usr nice sys idle iowait irq guest
#From 177834 168085 1276260 3584351494 144468 154895 0 0 0 0
#TO 177834 168085 1276261 3584351895 144468 154895 0 0 0 0
USR=$(change 1)
NICE=$(change 2)
SYS=$(change 3)
IDLE=$(change 4)
IOW=$(change 5)
#echo USR $USR SYS $SYS IDLE $IDLE IOW $IOW
ACTIVE=$(( $USR + $SYS + $IOW + $NICE))
TOTAL=$(($ACTIVE + $IDLE))
PCT=$(( $ACTIVE * 100 / $TOTAL ))
#echo "BUSY $ACTIVE TOTAL $TOTAL $PCT %"
date=$(date +%s)
# percentage of used CPU
echo "PUTVAL $HOSTNAME/cpu/gauge-all_pct interval=$INTERVAL $date:$PCT"
# percentage of used memory
mem_used=$(free | awk 'FNR == 3 {print $3/($3+$4)*100}')
echo "PUTVAL $HOSTNAME/memory/gauge-mem_used interval=$INTERVAL $date:$mem_used"
# percentage of used disk
disk_used=$(df -hl | grep 'rootfs' | awk '{print substr($5, 0, length($5))}')
echo "PUTVAL $HOSTNAME/df/gauge-used_pct interval=$INTERVAL $date:$disk_used"
done
Вероятно, было бы более эффективно написать это как плагин Python. В любом случае, тогда вы можете запросить использование памяти:
SELECT mean("value") FROM "memory_value" WHERE "type" = 'gauge' AND $timeFilter GROUP BY time($interval), "host"
Я в настоящее время использую это на версии 1.5.1
:
SELECT sum("value") AS "total" FROM "memory_value" WHERE ("host" = 'my-host' AND "type_instance" =~ /(free|used|cached|buffered)/) AND time > now() -6h Group BY time(1m)
Чтобы получить все значения, я использую это регулярное выражение в запросе:
"type_instance" =~ /(free|used|cached|buffered)/)
Мне нужно установить time(1m)
к интервалу совпадений, который я использую в собранном 60
в моем случае в графане это выглядит так:
SELECT sum("value") AS "total" FROM "memory_value" WHERE ("host" =~ /^$host$/ AND "type_instance" =~ /(free|used|cached|buffered)/) AND $timeFilter GROUP BY time($__interval) fill(null)