Статьи

Сбор данных контейнера Docker с помощью Fluentd

Сегодня для нас большая честь доставить вам гостевую должность Киото Тамура из 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:

  1. Плагин ввода для метрик контейнера Docker
  2. Выходной плагин для Librato

Ввод: сбор статистики контейнера Docker

Docker построен на основе  cgroups , функции ядра для ограничения, учета и изоляции использования ресурсов (ЦП, памяти, дискового ввода-вывода и т. Д.) Групп процессов от остальной части системы. Он записывает различные статистические данные для каждого контейнера в / sys / fs / cgroups. Например, если вас интересует RSS (размер резидентного набора) контейнера «foobar», он находится в /sys/fs/cgroups/memory/docker/foobar/memory.stat. Формат этих файлов — пары ключ-значение с разделителями строк.

Основываясь на этой информации, вот как я разработал плагин ввода «Docker metrics» для Fluentd.

  1. Напишите метод синтаксического анализа для анализа различных метрик. Что касается использования памяти и процессора, все показатели можно найти в memory.stat и cpuacct.stat соответственно. Нужно помнить, что некоторые метрики являются датчиками, в то время как другие являются счетчиками. Для Block IO необходимые данные разбросаны по нескольким файлам, поэтому необходимо прочитать несколько файлов. Опять же, статья в блоге Петаццони была чрезвычайно полезной.
  2. Парсер из шага 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 это равносильно написанию выходного плагина. Рабочий процесс написания выходного плагина выглядит следующим образом:

  1. Реализуйте методы инициализации / настройки: эти методы позволяют авторам плагинов вводить специфичные для плагина параметры, такие как ключи API, конечные точки REST API, параметры времени ожидания и так далее.
  2. Реализуйте метод «записи». Это метод, который записывает события 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 — это фантастический универсальный обработчик событий для данных журнала, который, как мы видели выше, легко распространяется на другие источники данных метрик. Будучи бесплатным, стабильным, высокопроизводительным, гибким и хорошо поддерживаемым, это отличный выбор для ваших усилий по сбору метрик. Если вы не  играли  с этим, вы пропускаете.