Назад | Перейти на главную страницу

Как можно отслеживать статистику memcached в OpenNMS?

Я бы хотел заняться сбором данных по размеру и хитам ...

Создайте следующий сценарий (и сделайте его исполняемым):

#!/bin/bash
exec 5<> /dev/tcp/127.0.0.1/11211
if [ $? -eq 0 ]; then
        echo "stats" >&5
        echo "quit" >&5
        while read -u 5 -d $'\r' stat name value;
        do
                echo $value
        done
        exit 0
fi
exit 1

Мой /usr/local/bin/memcached_stats.sh

Он подключается к демону memcached и выводит очищенную версию команды memcached stats и выводит что-то вроде:

2754
2129139
1243545563
1.2.2
64
2299.898362
7336.774640
217721
7091925
1909177049
108
27653
633
234138327
7091925
220430936
13707391
352833
89610818966
1385141563315
2147483648
4

Добавьте следующее в свой /etc/snmp/snmpd.conf и перезапустите snmpd:

extend .1.3.6.1.4.1.1.900.100 memcached /usr/local/bin/memcached_stats.sh

Это создает таблицу на основе вывода скрипта, где каждая строка получает свой собственный узел.

Если вы хотите подтвердить это, запустите следующее:

snmpwalk -v2c -c public 127.0.0.1 .1.3.6.1.4.1.1.900.100

У вас должно получиться что-то вроде:

SNMPv2-SMI::enterprises.1.900.100.3.1.3.9.109.101.109.99.97.99.104.101.100 = INTEGER: 23
SNMPv2-SMI::enterprises.1.900.100.3.1.4.9.109.101.109.99.97.99.104.101.100 = INTEGER: 0
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.1 = STRING: "2754"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.2 = STRING: "2123005"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.3 = STRING: "1243539429"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.4 = STRING: "1.2.2"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.5 = STRING: "64"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.6 = STRING: "2290.369810"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.7 = STRING: "7308.630919"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.8 = STRING: "217652"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.9 = STRING: "7066934"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.10 = STRING: "1909286395"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.11 = STRING: "108"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.12 = STRING: "27628"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.13 = STRING: "633"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.14 = STRING: "233251848"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.15 = STRING: "7066934"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.16 = STRING: "219593496"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.17 = STRING: "13658352"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.18 = STRING: "348593"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.19 = STRING: "89233569948"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.20 = STRING: "1380956068373"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.21 = STRING: "2147483648"
SNMPv2-SMI::enterprises.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.22 = STRING: "4"

Исходя из этого, вы можете экстраполировать, какой узел и какой стат, но, к счастью для вас, я уже сделал все это.

В datacollection-config.xml добавьте в начало следующее, но после всего конфига rrd:

<resourceType name="MemcachedStats" label="memcached stats" resourceLabel="memcached">
    <persistenceSelectorStrategy class="org.opennms.netmgt.collectd.PersistAllSelectorStrategy"/>
    <storageStrategy class="org.opennms.netmgt.dao.support.IndexStorageStrategy"/>
</resourceType>

Тогда в группы раздел добавить следующее:

<group name="memcached_stats" ifType="all">
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.1" instance="MemcachedStats" alias="pid" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.2" instance="MemcachedStats" alias="uptime" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.3" instance="MemcachedStats" alias="time" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.4" instance="MemcachedStats" alias="version" type="string" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.5" instance="MemcachedStats" alias="pointer_size" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.4" instance="MemcachedStats" alias="rusage_user" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.7" instance="MemcachedStats" alias="rusage_system" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.8" instance="MemcachedStats" alias="curr_items" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.9" instance="MemcachedStats" alias="total_items" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.10" instance="MemcachedStats" alias="bytes" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.11" instance="MemcachedStats" alias="curr_connections" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.12" instance="MemcachedStats" alias="total_connections" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.13" instance="MemcachedStats" alias="connection_structures" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.14" instance="MemcachedStats" alias="cmd_get" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.15" instance="MemcachedStats" alias="cmd_set" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.16" instance="MemcachedStats" alias="get_hits" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.17" instance="MemcachedStats" alias="get_misses" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.18" instance="MemcachedStats" alias="evictions" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.19" instance="MemcachedStats" alias="bytes_read" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.20" instance="MemcachedStats" alias="bytes_written" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.21" instance="MemcachedStats" alias="limit_maxbytes" type="integer" />
    <mibObj oid=".1.3.6.1.4.1.1.900.100.4.1.2.9.109.101.109.99.97.99.104.101.100.22" instance="MemcachedStats" alias="threads" type="integer" />
</group>

И, наконец, ниже вы хотите найти systemDef теги для Сеть-SNMP & Сеть-SNMP (UCD) и добавьте следующее в собирать теги:

<includeGroup>memcached_stats</includeGroup>

Перезапустите OpenNMS, и вот оно что ... когда capsd повторно сканирует хосты, он начнет собирать эту статистику.

Ниже приведена ссылка на данные, которые можно получить из memcached:

  • pid: идентификатор процесса этого serverprocess
  • время работы: количество секунд, в течение которых этот сервер работал
  • время: текущее время UNIX по серверу
  • версия: строка версии этого сервера
  • pointer_size: размер указателей по умолчанию в ОС хоста
  • rusage_user: накопленное пользовательское время для этого процесса
  • rusage_system: накопленное системное время для этого процесса
  • curr_items: текущее количество элементов, хранящихся на сервере
  • total_items: общее количество элементов, хранящихся на этом сервере с момента его запуска
  • байты: текущее количество байтов, используемых этим сервером для хранения элементов
  • curr_connections: количество открытых соединений
  • total_connections: общее количество подключений, открытых с момента запуска сервера
  • connection_structures: количество структур соединений, выделенных сервером
  • cmd_get: совокупное количество запросов на получение
  • cmd_set: совокупное количество запросов на хранение
  • get_hits: количество запрошенных ключей, которые были обнаружены в наличии
  • get_misses: количество запрошенных и не найденных элементов
  • выселения: количество допустимых элементов, удаленных из кеша, чтобы освободить память для новых элементов
  • bytes_read: общее количество байтов, прочитанных этим сервером из сети
  • bytes_written: общее количество байтов, отправленных этим сервером в сеть
  • limit_maxbytes: количество байтов, которое сервер может использовать для хранения
  • потоки: количество запрошенных рабочих потоков

Все, что осталось, - это построить любые графики или отчеты, которые вам нужны.

(Работает на CentOS 5.2, OpenNMS 1.5.93-1, net-snmp 5.3.1, memcached 1.2.2)

Он встроен с версии 1.7.4.

Видеть http://www.opennms.org/wiki/Memcached_Monitor

Я реорганизовал ваш скрипт: (требуется netcat)

#!/bin/bash
echo -e "stats\nquit"|nc $1 11211 | while read  -d $'\r' stat
    name value;
        do
            echo $value
        done

к сведению: OpenNMS> 1.7.4 теперь имеет собственный мониторинг memcached. Найдите в вики OpenNMS наполовину законченную статью, которую я написал.

Отличная работа, Натан! Всего несколько комментариев.

Вы сделали это немного сложнее, чем нужно - использование настраиваемого resourceType не обязательно для скалярных объектов, то есть появляющихся только один раз для каждого узла. Если вы отбросите resourceType, вам просто нужно будет перенести последнюю цифру каждого атрибута «oid» <mibObj> в его атрибут «instance» и изменить атрибут «ifType» вашего <group> со «all» игнорировать".

Вам определенно нужно будет рассматривать некоторые из этих статистических данных как счетчики (монотонно возрастающие значения, так что разница между двумя выборками действительно имеет значение), указав «counter» вместо «integer» (или «gauge», то есть эквивалентно, но более ясно) для их типа. Хорошая мнемоника для запоминания, что такое датчик, а что счетчик, - это то, что датчик представляет, например количество людей в комнате прямо сейчас, тогда как счетчик представляет, например, количество людей, которые когда-либо проходили через турникет, чтобы войти в комнату. Итак, curr_items должен быть датчиком, а total_items - счетчиком. Другие тоже нуждаются в изменении, но этого должно быть достаточно, чтобы вы начали. Вам нужно будет перезапустить и удалить все файлы RRD, которые были созданы с неправильным типом; OpenNMS автоматически воссоздает файлы.

Наконец, вы могли бы сделать это и с помощью сборщика HTTP, но тогда вы бы не испытали радости от работы с SNMP;)

И последнее - как правило, предпочтительнее документировать подобные «рецепты» на вики opennms.org, а не на внешних сайтах, таких как ServerFault. Это потому, что через несколько лет XML-схема для сбора данных SNMP может измениться, и приятно иметь возможность соответствующим образом обновлять инструкции без необходимости создавать учетные записи на миллионе сайтов или отслеживать адреса электронной почты для миллиона авторов.

Протокол memcache определяет stat команда, с помощью которой вы можете получить всю эту информацию. Какой бы API вы ни использовали, он должен иметь привязку для этой команды.