На днях наконец-то дошли руки до модернизации той части мониторинга, которая отвечает за сбор метрик, и набивший оскомину Munin был окончательно заменен на Graphite + CollectD. Теперь воцарилась идиллия - Icinga2 складывает метрики из perfdata в Graphite, и CollectD отправляет все метрики туда же.
Хочется отдельно отметить, что несмотря на то, что изначально CollectD мне не очень понравился (кому может сейчас понравиться Apache-подобный конфиг?), при дальнейшем изучении я был приятно поражен богатством возможностей этого продукта и крайне бережным его отношением к ресурсам наблюдаемой системы.
Так вот, в процессе переезда с Munin я столкнулся с задачей сбора в CollectD метрик с замечательной реализации приватного S3-совместимого хранилища - Riak CS.
К слову сказать, с Riak я работаю уже не первый год, и всегда был очень доволен этим решением, и Riak CS также оправдал все ожидания - он удобный в настройке и эксплуатации (начиная с версии 2.0 появился даже удобный конфиг - раньше конфиг был на Erlang), быстрый, надежный, отказоустойчивый, и очень просто масштабируется. Так что если выбираете хранилище для файлов, доступ к которому нужен по HTTP и библиотеки для работы с которым есть для любого языка - Riak CS это отличный выбор, тем более можно при желании смигрировать на любое S3-совместимое хранилище - на Ceph, например.
Сам Riak CS построен как надстройка над Riak, для которого в официальной документации есть пример конфига для CollectD.
К сожалению, для Riak CS такой фокус с плагином curl_json не пройдет - для доступа к статистике HTTP-запрос должен быть подписан по всем правилам авторизации S3, поэтому пришлось писать свой плагин, благо CollectD предоставляет очень простой интерфейс для написания плагинов на Python, а в Python есть шикарная библиотека requests, к которой есть удобный модуль для работы с S3 - requests-aws.
Для написания простейшего плагина к CollectD надо реализовать и зарегистрировать всего одну функцию - read. То есть вот так выгладит минимальный плагин к Colletcd:
Пример из официальной документации:
import collectd
def read(data=None):
"""collectt and dispatch some data"""
vl = collectd.Values(type='gauge')
vl.plugin='python.spam'
vl.dispatch(values=[random.random() * 100])
collectd.register_read(read)
Мне, конечно, пришлось написать немного больше кода, но поскольку сам Riak CS очень помогает c метриками - он отдает всю нужную информацию, включая 95й и 99й перцентили задержек различных операций, в в обычном JSON, это действительно немного больше кода.
Плагин получился крошечным - меньше 100 строк кода - и очень простым.
Код плагина к CollectD для снятия метрик с Riak CS трационно опубликован под свободной лицензией MIT на Github - collectd-riakcs, а сам плагин подготовлен к удобной установке через pip.