From 26d2f6fedc4740b3fec08d9be33f3973f05d950c Mon Sep 17 00:00:00 2001 From: Sandy Walsh Date: Tue, 14 Jan 2014 21:07:35 +0000 Subject: [PATCH] setup and arch diagram --- docs/images/diagram.gif | Bin 0 -> 33868 bytes docs/index.rst | 6 +-- docs/intro.rst | 14 +++---- docs/setup.rst | 90 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+), 10 deletions(-) create mode 100644 docs/images/diagram.gif create mode 100644 docs/setup.rst diff --git a/docs/images/diagram.gif b/docs/images/diagram.gif new file mode 100644 index 0000000000000000000000000000000000000000..3d7afcb95b141cd3779042220c95a52de0b4b3b7 GIT binary patch literal 33868 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 k3R)q?&JJprJjQ{`u literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 4f67888..58d8010 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -9,10 +9,10 @@ Welcome to StackTach's documentation! Contents: .. toctree:: - :maxdepth: 2 + :maxdepth: 3 - intro - setup + intro + setup Indices and tables diff --git a/docs/intro.rst b/docs/intro.rst index 5370fd0..9c47136 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -2,11 +2,11 @@ An Introduction to StackTach ============================ -StackTach was initially created as a browser-based debugging tool -for OpenStack Nova. Since that time, StackTach has evolved into a +StackTach was initially created as a browser-based debugging tool +for OpenStack Nova. Since that time, StackTach has evolved into a tool that can do debugging, performance monitoring and perform audit, validation and reconcilation of Nova and Glance usage in a -manner suitable for billing. +manner suitable for billing. How it works @@ -15,7 +15,7 @@ How it works Nearly all OpenStack components are capable of generating *notifications* when significant events occur. Notifications are messages placed on the OpenStack queue (generally RabbitMQ) -for consumption by downstream systems. +for consumption by downstream systems. The OpenStack wiki has info on the `notification format`_. @@ -25,12 +25,12 @@ StackTach has a *worker* that is configured to read these notifications and store them in a database (ideally a database separate from the OpenStack production database). From there, StackTach reviews the stream of notifications to glean usage information and assemble it in an -easy-to-query fashion. +easy-to-query fashion. Users can inquire on instances, requests, servers, etc using the -browser interface or command line tool (`Stacky`_). +browser interface or command line tool (`Stacky`_). .. _Stacky: https://github.com/rackerlabs/stacky - +.. image:: images/diagram.gif diff --git a/docs/setup.rst b/docs/setup.rst new file mode 100644 index 0000000..2ed5b44 --- /dev/null +++ b/docs/setup.rst @@ -0,0 +1,90 @@ + +Installing StackTach +#################### + +The "Hurry Up" Install Guide +**************************** +#. Create a database for StackTach to use. By default, StackTach assumes MySql, but you can modify the settings.py file to others. +#. Install django and the other required libraries listed in ``./etc/pip-requires.txt`` (please let us know if any are missing) +#. Clone this repo +#. Copy and configure the config files in ``./etc`` (see below for details) +#. Create the necessary database tables (python manage.py syncdb) You don't need an administrator account since there are no user profiles used. +#. Configure OpenStack to publish Notifications back into RabbitMQ (see below) +#. Restart the OpenStack services. +#. Run the Worker to start consuming messages. (see below) +#. Run the web server (``python manage.py runserver``) +#. Point your browser to ``http://127.0.0.1:8000`` (the default server location) +#. Click on stuff, see what happens. You can't hurt anything, it's all read-only. + +Of course, this is only suitable for playing around. If you want to get serious about deploying StackTach you should set up a proper webserver and database on standalone servers. There is a lot of data that gets collected by StackTach (depending on your deployment size) ... be warned. Keep an eye on DB size. + +The Config Files +**************** +There are two config files for StackTach. The first one tells us where the second one is. A sample of these two files is in ``./etc/sample_*``. Create a local copy of these files and populate them with the appropriate config values as described below. + +The ``sample_stacktach_config.sh`` shell script defines the necessary environment variables StackTach needs. Most of these are just information about the database (assuming MySql) but some are a little different. Copy this file and modify it for your environment. ``source`` this +``stacktach_config.sh`` shell script to set up the necessary environment variables. + +``STACKTACH_INSTALL_DIR`` should point to where StackTach is running out of. In most cases this will be your repo directory, but it could be elsewhere if your going for a proper deployment. +The StackTach worker needs to know which RabbitMQ servers to listen to. This information is stored in the deployment file. ``STACKTACH_DEPLOYMENTS_FILE`` should point to this json file. To learn more about the deployments file, see further down. + +Finally, ``DJANGO_SETTINGS_MODULE`` tells Django where to get its configuration from. This should point to the ``setting.py`` file. You shouldn't have to do much with the ``settings.py`` file and most of what it needs is in these environment variables. + +The ``sample_stacktach_worker_config.json`` file tells StackTach where each of the RabbitMQ servers are that it needs to get events from. In most cases you'll only have one entry in this file, but for large multi-cell deployments, this file can get pretty large. It's also handy for setting up one StackTach for each developer environment. + +The file is in json format and the main configuration is under the ``deployments`` key, which should contain a list of deployment dictionaries. + +A blank worker config file would look like this: :: + + {"deployments": [] } + +But that's not much fun. A deployment entry would look like this: :: + + {"deployments": [ + { + "name": "east_coast.prod.cell1", + "durable_queue": false, + "rabbit_host": "10.0.1.1", + "rabbit_port": 5672, + "rabbit_userid": "rabbit", + "rabbit_password": "rabbit", + "rabbit_virtual_host": "/" + } + ]} + +where, *name* is whatever you want to call your deployment, and *rabbit_\** are the connectivity details for your rabbit server. It should be the same information in your `nova.conf` file that OpenStack is using. Note, json has no concept of comments, so using ``#``, ``//`` or ``/* */`` as a comment won't work. + +By default, Nova uses ephemeral queues. If you are using durable queues, be sure to change the necessary flag here. + +You can add as many deployments as you like. + +Starting the Worker +=================== + +Note: the worker now uses librabbitmq, be sure to install that first. + +``./worker/start_workers.py`` will spawn a worker.py process for each deployment defined. Each worker will consume from a single Rabbit queue. + + +Configuring Nova to Generate Notifications +========================================== + +In the OpenStack service you wish to have generate notifications, add the +following to its ``.conf`` file: :: + + --notification_driver=nova.openstack.common.notifier.rabbit_notifier + --notification_topics=monitor + +**Note:** *This will likely change once the various project switch to ``oslo.messaging`` +which uses endpoints to define the notification drivers.* + +This will tell OpenStack to publish notifications to a Rabbit exchange starting with +``monitor.*`` ... this may result in ``monitor.info``, ``monitor.error``, etc. + +You'll need to restart Nova once these changes are made. + +Next Steps +========== + +Once you have this working well, you should download and install ``Stacky`` and play with the command line tool. +