Статьи

Свободный рецепт для CloudStack

Это сообщение от из блога 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 ?