Сегодня для нас большая честь доставить вам гостевую должность Киото Тамура из Treasure Data . Киото — евангелист-разработчик в Treasure Data и один из сопровождающих Fluentd, сборщика данных с открытым исходным кодом для упрощения и масштабирования управления журналами. Математик и бывший количественный аналитик, он любит собирать и анализировать данные. Сегодня Kiyoto проведет вас через создание двух плагинов Fluentd, которые экспортируют метрики систем для каждого контейнера из Docker в Librato. Как сопровождающий Fluentd, он делает это легко; интеграция Docker с Librato в сотни строк кода.
Что такое Докер?
Docker — чрезвычайно популярная контейнерная технология с открытым исходным кодом для Linux. Первоначально разработанный при запуске PaaS dotCloud, он распространялся как лесной пожар. Тяжелые провайдеры IaaS, такие как Amazon, Google и IBM, объявили о поддержке Docker на своей платформе. RedHat делает Docker одним из самых ярких моментов последнего RHEL. Он провел свою первую пользовательскую конференцию и выпустил вер. 1 во время конференции. Docker, вероятно, самый популярный проект с открытым исходным кодом 2014 года.
По мере того, как все больше и больше людей начинают использовать Docker, мониторинг и инструментарий контейнеров становятся все более важными, особенно если вы работаете с приложениями внутри Docker. Итак, как бы вы это сделали?
В октябре прошлого года Джером Петаццони написал информативную статью в блоге о метриках контейнера Docker . Исходя из этого, я решил создать плагин метрик Docker для Fluentd.
Что такое Fluentd?
Fluentd — это сборщик данных с открытым исходным кодом для упрощения и масштабирования управления журналами . Общие случаи использования включают в себя:
- Агрегация системного журнала в Elasticsearch
- Практически в реальном времени архивирование данных мобильных или веб-приложений в Amazon S3
- Сбор данных для бэкэнд-систем Big Data, таких как Hadoop
Fluentd поддерживает разнообразный ассортимент вариантов использования благодаря своей архитектуре плагинов. Написав немного кода на Ruby (Fluentd реализован на C и Ruby), можно добавлять новые источники данных (входы) и приемники (выходы). На момент написания статьи было добавлено более 300 пользовательских плагинов.
Для целей этой статьи я решил пойти дальше и добавить два плагина в экосистему Fluentd:
- Плагин ввода для метрик контейнера Docker
- Выходной плагин для Librato
Ввод: сбор статистики контейнера Docker
Docker построен на основе cgroups , функции ядра для ограничения, учета и изоляции использования ресурсов (ЦП, памяти, дискового ввода-вывода и т. Д.) Групп процессов от остальной части системы. Он записывает различные статистические данные для каждого контейнера в / sys / fs / cgroups. Например, если вас интересует RSS (размер резидентного набора) контейнера «foobar», он находится в /sys/fs/cgroups/memory/docker/foobar/memory.stat. Формат этих файлов — пары ключ-значение с разделителями строк.
Основываясь на этой информации, вот как я разработал плагин ввода «Docker metrics» для Fluentd.
- Напишите метод синтаксического анализа для анализа различных метрик. Что касается использования памяти и процессора, все показатели можно найти в memory.stat и cpuacct.stat соответственно. Нужно помнить, что некоторые метрики являются датчиками, в то время как другие являются счетчиками. Для Block IO необходимые данные разбросаны по нескольким файлам, поэтому необходимо прочитать несколько файлов. Опять же, статья в блоге Петаццони была чрезвычайно полезной.
- Парсер из шага 1 должен работать внутри Fluentd. Каждый плагин Fluentd имеет свой собственный цикл событий, и автор плагина может зарегистрировать произвольное событие. Вы можете настроить события для периодического запуска. Вот соответствующая часть кода из плагина метрик Docker:
def start @loop = Coolio::Loop.new tw = TimerWatcher.new(@stats_interval, true, @log, &method(:get_metrics)) tw.attach(@loop) @thread = Thread.new(&method(:run)) end def run @loop.run rescue log.error "unexpected error", :error=>$!.to_s log.error_backtrace end
Метод «get_metrics» выполняет всю тяжелую работу при разборе псевдофайлов cgroups. Заинтересованные читатели могут проверить код здесь .
Вот как выглядят события Docker внутри Fluentd:
2014-06-12 02:33:04 +0000 docker.cpuacct.stat: {"key":"cpuacct_stat_user","value":51,"source":"docker:precise64:e5a4f22aeedb3fe293b9ea68b7062ec5e086975ed62fe423c74693bc06877039"}
Каждая строка представляет собой отдельное событие, соответствующее отдельной метрике контейнера. Например, первая строка показывает, что загрузка процессора для идентификатора контейнера = «e5a4f22…» на хосте «точный 64».
Вывод: Librato Metrics
Теперь давайте отправим собранные метрики в Librato. В мире Fluentd это равносильно написанию выходного плагина. Рабочий процесс написания выходного плагина выглядит следующим образом:
- Реализуйте методы инициализации / настройки: эти методы позволяют авторам плагинов вводить специфичные для плагина параметры, такие как ключи API, конечные точки REST API, параметры времени ожидания и так далее.
- Реализуйте метод «записи». Это метод, который записывает события Fluentd в систему назначения. В данном примере мы отправляем данные в Librato.
Благодаря хорошо документированной клиентской библиотеке Ruby Librato , это было очень просто. Вот соответствующий фрагмент кода:
def configure(conf) super require 'librato/metrics' Librato::Metrics.authenticate @email, @apikey @queue = Librato::Metrics::Queue.new end def write(chunk) chunk.msgpack_each { |tag, time, record| missing_keys = [@measurement_key, @value_key, @source_key].select { |k| !record[k] } if missing_keys.length > 0 log.warn "missing the required field(s) " + missing_keys.join(",") next end @queue.add( record[@measurement_key].to_s => { :source => record[@source_key], :value => record[@value_key], :type => record[@type_key] || "gauge" }) } @queue.submit end
@Queue является очередью Librato , которая имеет отдельные события. Если не указано иное, метрикой по умолчанию является калибр (в отличие от счетчика). Затем события в очереди отправляются в Librato по HTTP. Что делать, если связь между Fluentd и Librato не работает? Не стоит беспокоиться. Fluentd буферизует данные (как в памяти, так и на диске) и повторяет попытку позже.
Настройка Fluentd
Fluentd может быть установлен в виде пакетов Gem или Linux / OSX (как td-agent ). Он имеет декларативную конфигурацию DSL для маршрутизации сообщений. Например, вот тот, который я использовал для сбора метрик контейнера данных Docker в Librato (используя два моих плагина):
<source> type docker_metrics stats_interval 1m </source> <match docker.**> type librato email LIBRATO_EMAIL apikey LIBRATO_APIKEY </match>
Графы!
Лучшая часть Librato? Вам не нужно настраивать свой собственный бэкэнд или знать что-либо о построении диаграмм библиотек, чтобы получить результаты. Мне буквально потребовалось 5 минут, чтобы настроить эти графики:
Каждый график показывает разные метрики для контейнеров, позволяя пользователю увидеть, какой контейнер потребляет много ресурсов ЦП / Памяти / Дискового ввода-вывода.
Следующие шаги
По общему признанию, это было много вещей, чтобы покрыть единственное гостевое сообщение в блоге, так что вот некоторые ссылки, чтобы узнать больше о Docker и Fluentd.
- Сайт Docker — отличное место, чтобы узнать, что такое Docker. Я особенно фанат их эмулятора в браузере
- Веб- сайт Fluentd содержит много информации об архитектуре и вариантах использования. Если вы хакер Ruby и вам интересно, как все работает, проверьте исходный код на GitHub (ядро довольно маленькое: это ~ 5000 строк Ruby).
Как упоминалось в публикации Librato’s Collector Patterns , Fluentd — это фантастический универсальный обработчик событий для данных журнала, который, как мы видели выше, легко распространяется на другие источники данных метрик. Будучи бесплатным, стабильным, высокопроизводительным, гибким и хорошо поддерживаемым, это отличный выбор для ваших усилий по сбору метрик. Если вы не играли с этим, вы пропускаете.