Тема: Правильные и удобные метрики (Graphite+Grafana+Collectd|Diamond)

Само собой это не единственное решение, но мне понравилось. Проблема только в том что нету нормального алертинга для всего этого дела. Есть проект seyren, но назвать его нормальным как-то язык не поворачивается.

Давайте поговорим о Graphite, Grafana, Collectd, Diamond, Carbon, Whisper, Apache. Вот пример как это все смотрится в реале. Это графики жизнедеятельности CEPH 

http://s8.postimg.org/hl9y4mgit/grafana.png

Я тут покажу как просто и быстро можно создать нестандартные метрики на этой системе и если кому-то это будет интересно то опишу как это все настраивается.

Задача - показать рост OpenStack'a - это наш внутренний клауд.

Сам опенстак имеет достаточно удобный коммандлайновый интерфейс, api - полная опа! Вот она наша статистика, которую я хочу показать широкой общественности

$ nova hypervisor-stats
+----------------------+---------+
| Property             | Value   |
+----------------------+---------+
| count                | 25      |
| current_workload     | 7       |
| disk_available_least | 695206  |
| free_disk_gb         | 1228026 |
| free_ram_mb          | 1523170 |
| local_gb             | 1247272 |
| local_gb_used        | 19246   |
| memory_mb            | 5649902 |
| memory_mb_used       | 4126732 |
| running_vms          | 357     |
| vcpus                | 760     |
| vcpus_used           | 1674    |
+----------------------+---------+

Отправлять в Carbon можно несколькими способами, на Debian мы используем Diamond, на Centos Collectd.

$ cat /etc/collectd/collectd.d/write_graphite.conf 
LoadPlugin write_graphite
<Plugin write_graphite>
    <Carbon>
        Host "1.1.1.1"
        Port "2003"
        StoreRates true
        AlwaysAppendDS false
        EscapeCharacter "_"
    </Carbon>
</Plugin>

А вот и "плугин" для отправки метрик, есть и другой способ, но этот быстрый, с условием что не надо отправлять часто метрики.

$ cat /etc/collectd/collectd.d/exec.conf 
LoadPlugin exec
<Plugin exec>
  Exec "nova" "/etc/collectd/sh/openstack.sh"
</Plugin>

Суть скрипта openstack.sh - выдать параметры в виде

PUTVAL server/openstack/key interval=XXX N:XXX
$ cat /etc/collectd/sh/openstack.sh
#!/bin/bash

HOSTNAME="${COLLECTD_HOSTNAME:-`hostname -f`}"
INTERVAL="${COLLECTD_INTERVAL:-60}"

export OS_USERNAME=xxx
export OS_PASSWORD=xxx
export OS_TENANT_NAME=xxx
export OS_AUTH_URL=http://2.2.2.2:35357/v2.0

while sleep "$INTERVAL"
do
    TMP_K=""
    TMP_V=""
    declare -A arr

    CMD=`/usr/bin/nova hypervisor-stats | grep -v '| Pro' | grep '|' | awk '{print ""$2"="$4}'`
    while read line; do    
    TMP_K=`echo "$line" | cut -d "=" -sf 1`
    TMP_V=`echo "$line" | cut -d "=" -sf 2-`
        arr["$TMP_K"]=$TMP_V
    done <<-EOL
    $CMD
    EOL

    for key in ${!arr[@]}; do
    echo "PUTVAL $HOSTNAME/openstack/${key} interval=$INTERVAL N:${arr[${key}]}"
    done

    unset arr 
done

Все новые типы (ключи) должны быть описаны в Collectd.

$ diff /usr/share/collectd/types.db /usr/share/collectd/types.db_copy
192,204d191
< 
< current_workload value:GAUGE:U:U
< memory_mb_used value:GAUGE:U:U
< free_ram_mb value:GAUGE:U:U
< running_vms value:GAUGE:U:U
< local_gb_used value:GAUGE:U:U
< count value:GAUGE:U:U
< vcpus value:GAUGE:U:U
< vcpus_used value:GAUGE:U:U
< free_disk_gb value:GAUGE:U:U
< local_gb value:GAUGE:U:U
< memory_mb value:GAUGE:U:U
< disk_available_least value:GAUGE:U:U

Метрики дошли до базы
http://s15.postimg.org/6arv6rhdn/os_grap.png

Можно создавать графики, это делается очень просто, либо клик-клик-клик, либо просто пишем строку запроса
http://s3.postimg.org/s6b7o7ng3/os_graf_edit.png

Все.
http://s3.postimg.org/p7vvbjm9f/os_graf.png