Это сообщение от
из блога Citrix.Когда идет дождь, он льет … Вот краткое описание того, как использовать Fluentd для регистрации событий и использования CloudStack. Fluentd — это программное обеспечение с открытым исходным кодом для сбора событий и журналов в формате JSON. Он имеет сотни плагинов, которые позволяют хранить журналы / события в вашем любимом хранилище данных, таких как AWS S3, MongoDB и дажеasticsearch. Это эквивалент logstash . Исходный код доступен на Github, но также может быть установлен через ваш любимый менеджер пакетов (например, brew, yum, apt, gem). Плагин CloudStackбыл написан, чтобы иметь возможность прослушивать события CloudStack и сохранять эти события в выбранной серверной части хранилища. В этом блоге я покажу вам, как хранить журналы CloudStack в MongoDB с помощью Fluent. Обратите внимание, что то же самое можно сделать с logstash, просто спросите @pyr. Документация довольно проста, но вот основные шаги.
Вам понадобится рабочий `fluentd`, установленный на вашей машине. Выберите нужный менеджер пакетов и установите `fluentd`, например, с` gem`, который мы бы сделали:
sudo gem install fluentd
`fluentd` теперь будет на вашем пути, вам нужно создать файл конфигурации и запустить` fluentd` с помощью этой конфигурации. Для дополнительных опций с `fluentd` просто введите` fluentd -h`. Опция `s` создаст пример файла конфигурации в рабочем каталоге. Опция `-c` запускает` fluentd` с использованием определенного файла конфигурации. Затем вы можете отправить тестовый журнал / сообщение о событии запущенному процессу с помощью `fluent-cat`.
$ fluentd -s conf $ fluentd -c conf/fluent.conf & $ echo '{"json":"message"}' | fluent-cat debug.test
Плагин CloudStack:
CloudStack имеет API `listEvents`, который делает то, что говорит :), он перечисляет события, происходящие в развертывании CloudStack. Такие события, как запуск и остановка виртуальной машины, создание групп безопасности, события жизненных циклов элементов хранения, моментальные снимки и т. Д. API `listEvents` хорошо документирован . Основанный главным образом на этом API и библиотеке fog ruby, Yuichi UEMURA написал плагин CloudStack для ` fluentd` . Это немного отличается от использования `logstash`, так как с помощью` logstash` вы можете отформатировать журналы log4j сервера управления CloudStack и непосредственно собирать их. Здесь мы полагаемся главным образом на API `listEvents`.
Вы можете установить его из источника:
git clone https://github.com/u-ichi/fluent-plugin-cloudstack
Затем соберите свой собственный гем и установите его с помощью `sudo gem build fluent-plugin-cloudstack.gemspec` и` sudo gem install fluent-plugin-cloudstack-0.0.8.gem `
Или вы устанавливаете драгоценный камень напрямую:
sudo gem install fluent-plugin-cloudstack
Сгенерируйте файл конфигурации с помощью `fluentd -s conf`, вы можете указать путь к вашему файлу конфигурации. Отредактируйте конфигурацию, чтобы определить «источник» как ваш хост CloudStack. Например, если вы работаете в среде разработки локально:
<source> type cloudstack host localhost apikey $cloudstack_apikey secretkey $cloustack_secretkey # optional protocol http # https or http, default https path /client/api # default /client/api port 8080 # default 443 #interval 300 # min 300, default 300 ssl false # true or false, default true domain_id $cloudstack_domain_id tag cloudstack </source>
В настоящее время в определении `interval` есть небольшая ошибка, поэтому я закомментировал ее. Вы также хотите явно определить тег как «облачный стек». Затем вы можете создать раздел `match` в файле конфигурации. Для простоты сначала мы просто отобразим события в `stdout`, поэтому просто добавим:
<match cloudstack.**> type stdout </match>
Запустите `fluentd` с` fluentd -c conf / fluent.conf & `, просмотрите пользовательский интерфейс CloudStack, создайте виртуальную машину, создайте сервисное предложение, просто сделайте несколько вещей, чтобы сгенерировать некоторые события, которые должны появиться в stdout. По истечении интервала вы увидите события, записываемые в `stdout`:
$ 2013-11-05 12:19:26 +0100 [info]: starting fluentd-0.10.39 2013-11-05 12:19:26 +0100 [info]: reading config file path="conf/fluent.conf" 2013-11-05 12:19:26 +0100 [info]: using configuration file: <ROOT> <source> type forward </source> <source> type cloudstack host localhost apikey 6QN8jOzEfhR7Fua69vk5ocDo_tfg8qqkT7-2w7nnTNsSRyPXyvRRAy23683qcrflgliHed0zA3m0SO4W9kh2LQ secretkey HZiu9vhPAxA8xi8jpGWMWb9q9f5OL1ojW43Fd7zzQIjrcrMLoYekeP1zT9d-1B3DDMMpScHSR9gAnnG45ewwUQ protocol http path /client/api port 8080 interval 3 ssl false domain_id a9e4b8f0-3fd5-11e3-9df7-78ca8b5a2197 tag cloudstack </source> <match debug.**> type stdout </match> <match cloudstack.**> type stdout </match> </ROOT> 2013-11-05 12:19:26 +0100 [info]: adding source type="forward" 2013-11-05 12:19:26 +0100 [info]: adding source type="cloudstack" 2013-11-05 12:19:27 +0100 [info]: adding match pattern="debug.**" type="stdout" 2013-11-05 12:19:27 +0100 [info]: adding match pattern="cloudstack.**" type="stdout" 2013-11-05 12:19:27 +0100 [info]: listening fluent socket on 0.0.0.0:24224 2013-11-05 12:19:27 +0100 [info]: listening cloudstack api on localhost 2013-11-05 12:19:30 +0100 cloudstack.usages: {"events_flow":0} 2013-11-05 12:19:30 +0100 cloudstack.usages: {"vm_sum":1,"memory_sum":536870912,"cpu_sum":1,"root_volume_sum":1400,"data_volume_sum":0,"Small Instance":1} 2013-11-05 12:19:33 +0100 cloudstack.usages: {"events_flow":0} 2013-11-05 12:19:33 +0100 cloudstack.usages: {"vm_sum":1,"memory_sum":536870912,"cpu_sum":1,"root_volume_sum":1400,"data_volume_sum":0,"Small Instance":1} 2013-11-05 12:19:36 +0100 cloudstack.usages: {"events_flow":0} 2013-11-05 12:19:36 +0100 cloudstack.usages: {"vm_sum":1,"memory_sum":536870912,"cpu_sum":1,"root_volume_sum":1400,"data_volume_sum":0,"Small Instance":1} 2013-11-05 12:19:39 +0100 cloudstack.usages: {"events_flow":0} ... 2013-11-05 12:19:53 +0100 cloudstack.event: {"id":"b5051963-33e5-4f44-83bc-7b78763dcd24","username":"admin","type":"VM.DESTROY","level":"INFO","description":"Successfully completed destroying Vm. Vm Id: 17","account":"admin","domainid":"a9e4b8f0-3fd5-11e3-9df7-78ca8b5a2197","domain":"ROOT","created":"2013-11-05T12:19:53+0100","state":"Completed","parentid":"d0d47009-050e-4d94-97d9-a3ade1c80ee3"} 2013-11-05 12:19:53 +0100 cloudstack.event: {"id":"39f8ff37-515c-49dd-88d3-eeb77d556223","username":"admin","type":"VM.DESTROY","level":"INFO","description":"destroying Vm. Vm Id: 17","account":"admin","domainid":"a9e4b8f0-3fd5-11e3-9df7-78ca8b5a2197","domain":"ROOT","created":"2013-11-05T12:19:53+0100","state":"Started","parentid":"d0d47009-050e-4d94-97d9-a3ade1c80ee3"} 2013-11-05 12:19:53 +0100 cloudstack.event: {"id":"d0d47009-050e-4d94-97d9-a3ade1c80ee3","username":"admin","type":"VM.DESTROY","level":"INFO","description":"destroying vm: 17","account":"admin","domainid":"a9e4b8f0-3fd5-11e3-9df7-78ca8b5a2197","domain":"ROOT","created":"2013-11-05T12:19:53+0100","state":"Scheduled"} 2013-11-05 12:19:55 +0100 cloudstack.usages: {"events_flow":3} 2013-11-05 12:19:55 +0100 cloudstack.usages: {"vm_sum":1,"memory_sum":536870912,"cpu_sum":1,"root_volume_sum":1400,"data_volume_sum":0,"Small Instance":1} ... 2013-11-05 12:20:18 +0100 cloudstack.event: {"id":"11136a76-1de0-4907-b31d-2557bc093802","username":"admin","type":"SERVICE.OFFERING.CREATE","level":"INFO","description":"Successfully completed creating service offering. Service offering id=13","account":"system","domainid":"a9e4b8f0-3fd5-11e3-9df7-78ca8b5a2197","domain":"ROOT","created":"2013-11-05T12:20:18+0100","state":"Completed"} 2013-11-05 12:20:19 +0100 cloudstack.usages: {"events_flow":1} 2013-11-05 12:20:19 +0100 cloudstack.usages: {"vm_sum":1,"memory_sum":536870912,"cpu_sum":1,"root_volume_sum":1400,"data_volume_sum":0,"Small Instance":1}
Я сократил некоторые выходные данные для краткости, заметьте, что у меня есть интервал, указанный как `3`, потому что я не хотел ждать 300 минут. Поэтому я установил из источника и пропатчил плагин, он должен быть скоро исправлен в источнике. У вас может быть другая конечная точка и, конечно, другие ключи, и не беспокойтесь о том, что я поделился этим секретным ключом, которым я пользуюсь симулятором, этот ключ уже пропал.
Получение событий и информации об использовании на stdout интересно, но главное — это сохранение данных в базе данных или поисковом индексе. В этом разделе мы покажем, как приблизиться к реальности и использовать MongoDBхранить данные. MongoDB — это база данных документов с открытым исходным кодом, которая не содержит схем и хранит документы в формате JSON (на самом деле BSON). Синтаксис установки и запроса MongoDB выходит за рамки этой главы. Кластеры MongoDB могут быть настроены с репликацией и разделением, в этом разделе мы используем MongoDB на одном хосте без разделения или дублирования. Чтобы использовать MongoDB в качестве бэкэнда для хранения событий, нам сначала нужно установить `mongodb`. На одном узле OSX это так же просто, как `sudo port install mongodb`. Для других ОС используйте соответствующий менеджер пакетов. Затем вы можете запустить mongodb с помощью `sudo mongod —dbpath = / path / to / your / database`. Создайте базу данных `fluentd` и пользователя` fluentd` с правами чтения / записи. В оболочке монго делайте:
$sudo mongo >use fluentd >db.AddUser({user:"fluentd", pwd: "foobar", roles: ["readWrite", "dbAdmin"]})
Затем нам нужно установить `fluent-plugin-mongodb`. Все еще используя `gem`, это будет сделано так:
$sudo gem install fluent-plugin-mongo.
Полная документация также объясняет, как изменить конфигурацию `fluentd` для использования этого бэкэнда. Ранее мы использовали `stdout` в качестве выходного бэкенда, чтобы использовать` mongodb`, нам просто нужно написать другой раздел « примерно так:
# Single MongoDB <match cloudstack.**> type mongo host fluentd port 27017 database fluentd collection test # for capped collection capped capped_size 1024m # authentication user fluentd password foobar # flush flush_interval 10s </match>
Обратите внимание, что вы не можете иметь несколько разделов `match` для одного и того же шаблона тега.
Для просмотра событий / использования в Mongo просто запустите оболочку mongo с помощью `mongo -u fluentd -p foobar fluentd` и перечислите коллекции. Вы увидите коллекцию `test`:
$ mongo -u fluentd -p foobar fluentd MongoDB shell version: 2.4.7 connecting to: fluentd Server has startup warnings: Fri Nov 1 13:11:44.855 [initandlisten] Fri Nov 1 13:11:44.855 [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000 > show collections system.indexes system.users test
Пара команд MongoDB получит ваш результат: `db.getCollection`,` count () `и` findOne () `:
> coll=db.getCollection('test') fluentd.test > coll.count() 181 > coll.findOne() { "_id" : ObjectId("5278d9822675c98317000001"), "events_flow" : 0, "time" : ISODate("2013-11-05T11:41:47Z") }
Вызов `find ()` возвращает все записи в коллекции.
> coll.find() { "_id" : ObjectId("5278d9822675c98317000001"), "events_flow" : 0, "time" : ISODate("2013-11-05T11:41:47Z") } { "_id" : ObjectId("5278d9822675c98317000002"), "vm_sum" : 0, "memory_sum" : 0, "cpu_sum" : 0, "root_volume_sum" : 1500, "data_volume_sum" : 0, "Small Instance" : 1, "time" : ISODate("2013-11-05T11:41:47Z") } { "_id" : ObjectId("5278d98d2675c98317000009"), "events_flow" : 0, "time" : ISODate("2013-11-05T11:41:59Z") } { "_id" : ObjectId("5278d98d2675c9831700000a"), "vm_sum" : 0, "memory_sum" : 0, "cpu_sum" : 0, "root_volume_sum" : 1500, "data_volume_sum" : 0, "Small Instance" : 1, "time" : ISODate("2013-11-05T11:41:59Z") } { "_id" : ObjectId("5278d98d2675c9831700000b"), "id" : "1452c56a-a1e4-43d2-8916-f83a77155a2f", "username" : "admin", "type" : "VM.CREATE", "level" : "INFO", "description" : "Successfully completed starting Vm. Vm Id: 19", "account" : "admin", "domainid" : "a9e4b8f0-3fd5-11e3-9df7-78ca8b5a2197", "domain" : "ROOT", "created" : "2013-11-05T12:42:01+0100", "state" : "Completed", "parentid" : "df68486e-c6a8-4007-9996-d5c9a4522649", "time" : ISODate("2013-11-05T11:42:01Z") } { "_id" : ObjectId("5278d98d2675c9831700000c"), "id" : "901f9408-ae05-424f-92cd-5693733de7d6", "username" : "admin", "type" : "VM.CREATE", "level" : "INFO", "description" : "starting Vm. Vm Id: 19", "account" : "admin", "domainid" : "a9e4b8f0-3fd5-11e3-9df7-78ca8b5a2197", "domain" : "ROOT", "created" : "2013-11-05T12:42:00+0100", "state" : "Scheduled", "parentid" : "df68486e-c6a8-4007-9996-d5c9a4522649", "time" : ISODate("2013-11-05T11:42:00Z") } { "_id" : ObjectId("5278d98d2675c9831700000d"), "id" : "df68486e-c6a8-4007-9996-d5c9a4522649", "username" : "admin", "type" : "VM.CREATE", "level" : "INFO", "description" : "Successfully created entity for deploying Vm. Vm Id: 19", "account" : "admin", "domainid" : "a9e4b8f0-3fd5-11e3-9df7-78ca8b5a2197", "domain" : "ROOT", "created" : "2013-11-05T12:42:00+0100", "state" : "Created", "time" : ISODate("2013-11-05T11:42:00Z") } { "_id" : ObjectId("5278d98d2675c9831700000e"), "id" : "924ba8b9-a9f2-4274-8bbd-c27947d2c246", "username" : "admin", "type" : "VM.CREATE", "level" : "INFO", "description" : "starting Vm. Vm Id: 19", "account" : "admin", "domainid" : "a9e4b8f0-3fd5-11e3-9df7-78ca8b5a2197", "domain" : "ROOT", "created" : "2013-11-05T12:42:00+0100", "state" : "Started", "parentid" : "df68486e-c6a8-4007-9996-d5c9a4522649", "time" : ISODate("2013-11-05T11:42:00Z") } { "_id" : ObjectId("5278d98d2675c9831700000f"), "events_flow" : 4, "time" : ISODate("2013-11-05T11:42:02Z") } { "_id" : ObjectId("5278d98d2675c98317000010"), "vm_sum" : 1, "memory_sum" : 536870912, "cpu_sum" : 1, "root_volume_sum" : 1600, "data_volume_sum" : 0, "Small Instance" : 1, "time" : ISODate("2013-11-05T11:42:02Z") } Type "it" for more
Мы предоставим вам возможность изучить синтаксис запросов MongoDB и великолепную структуру агрегации. Конечно, вы можете получить данные и вasticsearch ?