Icinga2 Einbinden von Graphite zur graphischen Visualisierung - Installation und Konfiguration unter CentOS 7.x
Mit Graphite steht ein sehr mächtiges Werkzeug zur Verfügung, wenn es darum geht in Echtzeit skalierbare Graphen zur Verfügung zu stellen.
Obgleich es aktuell1) nur eine Vorabversion eines Icinga Web 2 Moduls gibt, lohnt es sich doch einen Blick auf die Möglichkeiten von Graphite und Icinga Web 2 zu werfen. Es wird spannend werden, welche zusätzlichen Möglichkeiten zur Visualisierung, insbesondere bei der graphischen Aufbereitung von Kurz- und Langzeitstatistiken bzw. Trends, das Entwicklerteam noch auflegen wird.
Installation
Vorbereitung
Die einfachste und schnellste Variante bei der Installation ist die aus dem Repository nausch.org. Hier reicht ein einfacher Aufruf von yum und alles wird automatisch installiert. Etwaige Paketabhängigkeiten werden so automatisch aufgelöst und Paketupdates werden so, automatisch angeboten und müssen nicht extra manuell heruntergeladen werden.
Informationen
Zum Erstellen und Einbinden der Graphen benötigen wir mehrere Programme und Daemons.
- Generierung Performancedaten
In Icinga Web 2 brauchen wir eine Möglichkeit, Performancedaten aus Icinga Web 2 zu erfassen und für die weitere Verarbeitung durch Graphite zur Verfügung zu stellen. Für diese Aufgabe benötigen wir das aktuelle Paket python-carbon aus dem Repository Mailserver.guru.
- Datenbank(files)
- Whisper
Zum Abspeichern der Rohdaten, greifen wir auf python-whisper einer Datenbank-Engine für schnelle und zuverlässige Speicherung von Daten, ähnlich wie Thomas Oetiker's Round-Robin-Archive RRD-Tools. Auch dieses Paket beziehen wir aus dem Repository Mailserver.guru. - MariaDB
Zum Speichern der Konfigurationsdaten zu den Graphiken und Dashboards sowie der userspezifischen Einstellungen nutzen wir unsere MariaDB auf unserem Monitoring Host.
- Aufbereiten der Daten und Generierung der Graphiken
Zum Aufbereiten der Rohdaten und zur Generierung der Statistik-Graphen bedienen wir uns des Projektes Graphite. Das passende RPM graphite-web stellt uns wiederum das Repository Mailserver.guru zur Verfügung.
- Icinga Web 2 Modul graphite
Zum Einbinden der Echtzeitgraphiken in Icinga Web 2 benötigen wir dann noch das Modul icingaweb2-module-graphite. Eine Vorabentwicklerversion laden holen wir uns direkt von der GitHub Projektseite.
RPM-Pakete
Die Installation der oben genannten Punkte 1 bis 3 erfolgt unter CentOS 7 wie immer mit Hilfe von YUM.
# yum install python-whisper python-carbon graphite-web MySQL-python uwsgi-plugin-carbon -y
Download von icingaweb2-module-graphite
Beim Icinga Web 2-Modul icingaweb2-module-graphite steht aktuell noch kein RPM zur Verfügung. Wir holen uns daher das aktuelle Vorabpaket direkt von der GitHub Projektseite.
# wget https://github.com/philiphoy/icingaweb2-module-graphite/archive/master.zip
Auspacken von icingaweb2-module-graphite
Dieses ZIP-Archiv entpacken wir nun an Ort und Stelle.
# unzip master.zip -d /usr/share/icingaweb2/modules
Abschließend ändern wir dann nur noch den Verzeichnis-Namen.
# mv /usr/share/icingaweb2/modules/icingaweb2-module-graphite-master/ /usr/share/icingaweb2/modules/graphite/
RPM-Inhalte
Von den beiden wichtigsten Paketen python-carbon und graphite-web lohnt in jedem Fall ein Blick in die jeweiligen Datei- und Verzeichnisstrukturen, vor allem dann, wenn man hilfreiche Dokumentationen zur Konfiguration der jeweiligen Pakete sucht.
python-carbon
# rpm -qil python-carbon
Name : python-carbon Version : 0.9.14 Release : 1.el7.centos Architecture: noarch Install Date: Fri 20 Nov 2015 10:14:01 PM CET Group : System Environment/Daemons Size : 372739 License : ASL 2.0 Signature : RSA/SHA1, Fri 20 Nov 2015 10:10:25 PM CET, Key ID 60ecfb9e8195aea0 Source RPM : python-carbon-0.9.14-1.el7.centos.src.rpm Build Date : Fri 20 Nov 2015 10:10:13 PM CET Build Host : vml000200.dmz.nausch.org Relocations : (not relocatable) Packager : Django <django@nausch.org> URL : https://github.com/graphite-project Summary : Back-end data caching and persistence daemon for Graphite Description : Carbon is one of the components of Graphite, and is responsible for receiving metrics over the network and writing them down to disk using a storage back-end. /etc/carbon /etc/carbon/carbon.conf /etc/carbon/storage-schemas.conf /etc/logrotate.d/python-carbon /usr/bin/carbon-aggregator /usr/bin/carbon-cache /usr/bin/carbon-client /usr/bin/carbon-relay /usr/bin/validate-storage-schemas /usr/lib/python2.7/site-packages/carbon /usr/lib/python2.7/site-packages/carbon-0.9.14-py2.7.egg-info /usr/lib/python2.7/site-packages/carbon/__init__.py /usr/lib/python2.7/site-packages/carbon/__init__.pyc /usr/lib/python2.7/site-packages/carbon/__init__.pyo /usr/lib/python2.7/site-packages/carbon/aggregator /usr/lib/python2.7/site-packages/carbon/aggregator/__init__.py /usr/lib/python2.7/site-packages/carbon/aggregator/__init__.pyc /usr/lib/python2.7/site-packages/carbon/aggregator/__init__.pyo /usr/lib/python2.7/site-packages/carbon/aggregator/buffers.py /usr/lib/python2.7/site-packages/carbon/aggregator/buffers.pyc /usr/lib/python2.7/site-packages/carbon/aggregator/buffers.pyo /usr/lib/python2.7/site-packages/carbon/aggregator/receiver.py /usr/lib/python2.7/site-packages/carbon/aggregator/receiver.pyc /usr/lib/python2.7/site-packages/carbon/aggregator/receiver.pyo /usr/lib/python2.7/site-packages/carbon/aggregator/rules.py /usr/lib/python2.7/site-packages/carbon/aggregator/rules.pyc /usr/lib/python2.7/site-packages/carbon/aggregator/rules.pyo /usr/lib/python2.7/site-packages/carbon/amqp0-8.xml /usr/lib/python2.7/site-packages/carbon/amqp_listener.py /usr/lib/python2.7/site-packages/carbon/amqp_listener.pyc /usr/lib/python2.7/site-packages/carbon/amqp_listener.pyo /usr/lib/python2.7/site-packages/carbon/amqp_publisher.py /usr/lib/python2.7/site-packages/carbon/amqp_publisher.pyc /usr/lib/python2.7/site-packages/carbon/amqp_publisher.pyo /usr/lib/python2.7/site-packages/carbon/cache.py /usr/lib/python2.7/site-packages/carbon/cache.pyc /usr/lib/python2.7/site-packages/carbon/cache.pyo /usr/lib/python2.7/site-packages/carbon/client.py /usr/lib/python2.7/site-packages/carbon/client.pyc /usr/lib/python2.7/site-packages/carbon/client.pyo /usr/lib/python2.7/site-packages/carbon/conf.py /usr/lib/python2.7/site-packages/carbon/conf.pyc /usr/lib/python2.7/site-packages/carbon/conf.pyo /usr/lib/python2.7/site-packages/carbon/events.py /usr/lib/python2.7/site-packages/carbon/events.pyc /usr/lib/python2.7/site-packages/carbon/events.pyo /usr/lib/python2.7/site-packages/carbon/exceptions.py /usr/lib/python2.7/site-packages/carbon/exceptions.pyc /usr/lib/python2.7/site-packages/carbon/exceptions.pyo /usr/lib/python2.7/site-packages/carbon/hashing.py /usr/lib/python2.7/site-packages/carbon/hashing.pyc /usr/lib/python2.7/site-packages/carbon/hashing.pyo /usr/lib/python2.7/site-packages/carbon/instrumentation.py /usr/lib/python2.7/site-packages/carbon/instrumentation.pyc /usr/lib/python2.7/site-packages/carbon/instrumentation.pyo /usr/lib/python2.7/site-packages/carbon/log.py /usr/lib/python2.7/site-packages/carbon/log.pyc /usr/lib/python2.7/site-packages/carbon/log.pyo /usr/lib/python2.7/site-packages/carbon/management.py /usr/lib/python2.7/site-packages/carbon/management.pyc /usr/lib/python2.7/site-packages/carbon/management.pyo /usr/lib/python2.7/site-packages/carbon/manhole.py /usr/lib/python2.7/site-packages/carbon/manhole.pyc /usr/lib/python2.7/site-packages/carbon/manhole.pyo /usr/lib/python2.7/site-packages/carbon/protocols.py /usr/lib/python2.7/site-packages/carbon/protocols.pyc /usr/lib/python2.7/site-packages/carbon/protocols.pyo /usr/lib/python2.7/site-packages/carbon/regexlist.py /usr/lib/python2.7/site-packages/carbon/regexlist.pyc /usr/lib/python2.7/site-packages/carbon/regexlist.pyo /usr/lib/python2.7/site-packages/carbon/relayrules.py /usr/lib/python2.7/site-packages/carbon/relayrules.pyc /usr/lib/python2.7/site-packages/carbon/relayrules.pyo /usr/lib/python2.7/site-packages/carbon/rewrite.py /usr/lib/python2.7/site-packages/carbon/rewrite.pyc /usr/lib/python2.7/site-packages/carbon/rewrite.pyo /usr/lib/python2.7/site-packages/carbon/routers.py /usr/lib/python2.7/site-packages/carbon/routers.pyc /usr/lib/python2.7/site-packages/carbon/routers.pyo /usr/lib/python2.7/site-packages/carbon/service.py /usr/lib/python2.7/site-packages/carbon/service.pyc /usr/lib/python2.7/site-packages/carbon/service.pyo /usr/lib/python2.7/site-packages/carbon/state.py /usr/lib/python2.7/site-packages/carbon/state.pyc /usr/lib/python2.7/site-packages/carbon/state.pyo /usr/lib/python2.7/site-packages/carbon/storage.py /usr/lib/python2.7/site-packages/carbon/storage.pyc /usr/lib/python2.7/site-packages/carbon/storage.pyo /usr/lib/python2.7/site-packages/carbon/util.py /usr/lib/python2.7/site-packages/carbon/util.pyc /usr/lib/python2.7/site-packages/carbon/util.pyo /usr/lib/python2.7/site-packages/carbon/writer.py /usr/lib/python2.7/site-packages/carbon/writer.pyc /usr/lib/python2.7/site-packages/carbon/writer.pyo /usr/lib/python2.7/site-packages/twisted /usr/lib/python2.7/site-packages/twisted/plugins /usr/lib/python2.7/site-packages/twisted/plugins/carbon_aggregator_plugin.py /usr/lib/python2.7/site-packages/twisted/plugins/carbon_aggregator_plugin.pyc /usr/lib/python2.7/site-packages/twisted/plugins/carbon_aggregator_plugin.pyo /usr/lib/python2.7/site-packages/twisted/plugins/carbon_cache_plugin.py /usr/lib/python2.7/site-packages/twisted/plugins/carbon_cache_plugin.pyc /usr/lib/python2.7/site-packages/twisted/plugins/carbon_cache_plugin.pyo /usr/lib/python2.7/site-packages/twisted/plugins/carbon_relay_plugin.py /usr/lib/python2.7/site-packages/twisted/plugins/carbon_relay_plugin.pyc /usr/lib/python2.7/site-packages/twisted/plugins/carbon_relay_plugin.pyo /usr/lib/systemd/system/carbon-aggregator.service /usr/lib/systemd/system/carbon-cache.service /usr/lib/systemd/system/carbon-relay.service /usr/share/doc/python-carbon-0.9.14 /usr/share/doc/python-carbon-0.9.14/README.md /usr/share/doc/python-carbon-0.9.14/conf /usr/share/doc/python-carbon-0.9.14/conf/aggregation-rules.conf.example /usr/share/doc/python-carbon-0.9.14/conf/blacklist.conf.example /usr/share/doc/python-carbon-0.9.14/conf/carbon.amqp.conf.example /usr/share/doc/python-carbon-0.9.14/conf/carbon.conf.example /usr/share/doc/python-carbon-0.9.14/conf/relay-rules.conf.example /usr/share/doc/python-carbon-0.9.14/conf/rewrite-rules.conf.example /usr/share/doc/python-carbon-0.9.14/conf/storage-aggregation.conf.example /usr/share/doc/python-carbon-0.9.14/conf/storage-schemas.conf.example /usr/share/doc/python-carbon-0.9.14/conf/whitelist.conf.example /usr/share/doc/python-carbon-0.9.14/examples /usr/share/doc/python-carbon-0.9.14/examples/example-client.py /usr/share/licenses/python-carbon-0.9.14 /usr/share/licenses/python-carbon-0.9.14/LICENSE /usr/share/man/man1/carbon-aggregator.1.gz /usr/share/man/man1/carbon-cache.1.gz /usr/share/man/man1/carbon-client.1.gz /usr/share/man/man1/carbon-relay.1.gz /usr/share/man/man1/validate-storage-schemas.1.gz /var/lib/carbon /var/lib/carbon/lists /var/lib/carbon/rrd /var/lib/carbon/whisper /var/log/carbon
python-whisper
# rpm -qil python-whisper
Name : python-whisper Version : 0.9.14 Release : 1.el7.centos Architecture: noarch Install Date: Fri 20 Nov 2015 09:46:35 PM CET Group : Development/Libraries Size : 131480 License : ASL 2.0 Signature : RSA/SHA1, Fri 20 Nov 2015 09:40:04 PM CET, Key ID 60ecfb9e8195aea0 Source RPM : python-whisper-0.9.14-1.el7.centos.src.rpm Build Date : Fri 20 Nov 2015 09:39:52 PM CET Build Host : vml000200.dmz.nausch.org Relocations : (not relocatable) Packager : Django <django@nausch.org> URL : https://github.com/graphite-project Summary : Simple database library for storing time-series data Description : Whisper is a fixed-size database, similar in design and purpose to RRD (round-robin-database). It provides fast, reliable storage of numeric data over time. Whisper allows for higher resolution (seconds per point) of recent data to degrade into lower resolutions for long-term retention of historical data. /usr/bin/rrd2whisper /usr/bin/whisper-create /usr/bin/whisper-diff /usr/bin/whisper-dump /usr/bin/whisper-fetch /usr/bin/whisper-fill /usr/bin/whisper-info /usr/bin/whisper-merge /usr/bin/whisper-resize /usr/bin/whisper-set-aggregation-method /usr/bin/whisper-update /usr/lib/python2.7/site-packages/whisper-0.9.14-py2.7.egg-info /usr/lib/python2.7/site-packages/whisper.py /usr/lib/python2.7/site-packages/whisper.pyc /usr/lib/python2.7/site-packages/whisper.pyo /usr/share/doc/python-whisper-0.9.14 /usr/share/doc/python-whisper-0.9.14/README.md /usr/share/licenses/python-whisper-0.9.14 /usr/share/licenses/python-whisper-0.9.14/LICENSE /usr/share/man/man1/rrd2whisper.1.gz /usr/share/man/man1/whisper-create.1.gz /usr/share/man/man1/whisper-dump.1.gz /usr/share/man/man1/whisper-fetch.1.gz /usr/share/man/man1/whisper-fill.1.gz /usr/share/man/man1/whisper-info.1.gz /usr/share/man/man1/whisper-merge.1.gz /usr/share/man/man1/whisper-resize.1.gz /usr/share/man/man1/whisper-set-aggregation-method.1.gz /usr/share/man/man1/whisper-update.1.gz
graphite-web
# rpm -qil graphite-web
Name : graphite-web Version : 0.9.14 Release : 1.el7.centos Architecture: noarch Install Date: Fri 20 Nov 2015 09:46:40 PM CET Group : Applications/Internet Size : 9170954 License : ASL 2.0 Signature : RSA/SHA1, Fri 20 Nov 2015 09:26:59 PM CET, Key ID 60ecfb9e8195aea0 Source RPM : graphite-web-0.9.14-1.el7.centos.src.rpm Build Date : Fri 20 Nov 2015 09:26:34 PM CET Build Host : vml000200.dmz.nausch.org Relocations : (not relocatable) Packager : Django <django@nausch.org> URL : https://github.com/graphite-project Summary : A Django web application for enterprise scalable realtime graphing Description : Graphite consists of a storage backend and a web-based visualization frontend. Client applications send streams of numeric time-series data to the Graphite backend (called carbon), where it gets stored in fixed-size database files similar in design to RRD. The web frontend provides user interfaces for visualizing this data in graphs as well as a simple URL-based API for direct graph generation. Graphite's design is focused on providing simple interfaces (both to users and applications), real-time visualization, high-availability, and enterprise scalability. /etc/graphite-web /etc/graphite-web/dashboard.conf /etc/graphite-web/local_settings.py /etc/graphite-web/local_settings.pyc /etc/graphite-web/local_settings.pyo /etc/httpd/conf.d/graphite-web.conf /etc/logrotate.d/graphite-web /usr/bin/graphite-build-index /usr/bin/graphite-manage /usr/lib/python2.7/site-packages/graphite /usr/lib/python2.7/site-packages/graphite/__init__.py /usr/lib/python2.7/site-packages/graphite/__init__.pyc /usr/lib/python2.7/site-packages/graphite/__init__.pyo /usr/lib/python2.7/site-packages/graphite/account /usr/lib/python2.7/site-packages/graphite/account/__init__.py /usr/lib/python2.7/site-packages/graphite/account/__init__.pyc /usr/lib/python2.7/site-packages/graphite/account/__init__.pyo /usr/lib/python2.7/site-packages/graphite/account/ldapBackend.py /usr/lib/python2.7/site-packages/graphite/account/ldapBackend.pyc /usr/lib/python2.7/site-packages/graphite/account/ldapBackend.pyo /usr/lib/python2.7/site-packages/graphite/account/models.py /usr/lib/python2.7/site-packages/graphite/account/models.pyc /usr/lib/python2.7/site-packages/graphite/account/models.pyo /usr/lib/python2.7/site-packages/graphite/account/urls.py /usr/lib/python2.7/site-packages/graphite/account/urls.pyc /usr/lib/python2.7/site-packages/graphite/account/urls.pyo /usr/lib/python2.7/site-packages/graphite/account/views.py /usr/lib/python2.7/site-packages/graphite/account/views.pyc /usr/lib/python2.7/site-packages/graphite/account/views.pyo /usr/lib/python2.7/site-packages/graphite/app_settings.py /usr/lib/python2.7/site-packages/graphite/app_settings.pyc /usr/lib/python2.7/site-packages/graphite/app_settings.pyo /usr/lib/python2.7/site-packages/graphite/browser /usr/lib/python2.7/site-packages/graphite/browser/__init__.py /usr/lib/python2.7/site-packages/graphite/browser/__init__.pyc /usr/lib/python2.7/site-packages/graphite/browser/__init__.pyo /usr/lib/python2.7/site-packages/graphite/browser/urls.py /usr/lib/python2.7/site-packages/graphite/browser/urls.pyc /usr/lib/python2.7/site-packages/graphite/browser/urls.pyo /usr/lib/python2.7/site-packages/graphite/browser/views.py /usr/lib/python2.7/site-packages/graphite/browser/views.pyc /usr/lib/python2.7/site-packages/graphite/browser/views.pyo /usr/lib/python2.7/site-packages/graphite/cli /usr/lib/python2.7/site-packages/graphite/cli/__init__.py /usr/lib/python2.7/site-packages/graphite/cli/__init__.pyc /usr/lib/python2.7/site-packages/graphite/cli/__init__.pyo /usr/lib/python2.7/site-packages/graphite/cli/commands.py /usr/lib/python2.7/site-packages/graphite/cli/commands.pyc /usr/lib/python2.7/site-packages/graphite/cli/commands.pyo /usr/lib/python2.7/site-packages/graphite/cli/completer.py /usr/lib/python2.7/site-packages/graphite/cli/completer.pyc /usr/lib/python2.7/site-packages/graphite/cli/completer.pyo /usr/lib/python2.7/site-packages/graphite/cli/parser.py /usr/lib/python2.7/site-packages/graphite/cli/parser.pyc /usr/lib/python2.7/site-packages/graphite/cli/parser.pyo /usr/lib/python2.7/site-packages/graphite/cli/urls.py /usr/lib/python2.7/site-packages/graphite/cli/urls.pyc /usr/lib/python2.7/site-packages/graphite/cli/urls.pyo /usr/lib/python2.7/site-packages/graphite/cli/views.py /usr/lib/python2.7/site-packages/graphite/cli/views.pyc /usr/lib/python2.7/site-packages/graphite/cli/views.pyo /usr/lib/python2.7/site-packages/graphite/composer /usr/lib/python2.7/site-packages/graphite/composer/__init__.py /usr/lib/python2.7/site-packages/graphite/composer/__init__.pyc /usr/lib/python2.7/site-packages/graphite/composer/__init__.pyo /usr/lib/python2.7/site-packages/graphite/composer/urls.py /usr/lib/python2.7/site-packages/graphite/composer/urls.pyc /usr/lib/python2.7/site-packages/graphite/composer/urls.pyo /usr/lib/python2.7/site-packages/graphite/composer/views.py /usr/lib/python2.7/site-packages/graphite/composer/views.pyc /usr/lib/python2.7/site-packages/graphite/composer/views.pyo /usr/lib/python2.7/site-packages/graphite/dashboard /usr/lib/python2.7/site-packages/graphite/dashboard/__init__.py /usr/lib/python2.7/site-packages/graphite/dashboard/__init__.pyc /usr/lib/python2.7/site-packages/graphite/dashboard/__init__.pyo /usr/lib/python2.7/site-packages/graphite/dashboard/admin.py /usr/lib/python2.7/site-packages/graphite/dashboard/admin.pyc /usr/lib/python2.7/site-packages/graphite/dashboard/admin.pyo /usr/lib/python2.7/site-packages/graphite/dashboard/models.py /usr/lib/python2.7/site-packages/graphite/dashboard/models.pyc /usr/lib/python2.7/site-packages/graphite/dashboard/models.pyo /usr/lib/python2.7/site-packages/graphite/dashboard/send_graph.py /usr/lib/python2.7/site-packages/graphite/dashboard/send_graph.pyc /usr/lib/python2.7/site-packages/graphite/dashboard/send_graph.pyo /usr/lib/python2.7/site-packages/graphite/dashboard/urls.py /usr/lib/python2.7/site-packages/graphite/dashboard/urls.pyc /usr/lib/python2.7/site-packages/graphite/dashboard/urls.pyo /usr/lib/python2.7/site-packages/graphite/dashboard/views.py /usr/lib/python2.7/site-packages/graphite/dashboard/views.pyc /usr/lib/python2.7/site-packages/graphite/dashboard/views.pyo /usr/lib/python2.7/site-packages/graphite/events /usr/lib/python2.7/site-packages/graphite/events/__init__.py /usr/lib/python2.7/site-packages/graphite/events/__init__.pyc /usr/lib/python2.7/site-packages/graphite/events/__init__.pyo /usr/lib/python2.7/site-packages/graphite/events/admin.py /usr/lib/python2.7/site-packages/graphite/events/admin.pyc /usr/lib/python2.7/site-packages/graphite/events/admin.pyo /usr/lib/python2.7/site-packages/graphite/events/models.py /usr/lib/python2.7/site-packages/graphite/events/models.pyc /usr/lib/python2.7/site-packages/graphite/events/models.pyo /usr/lib/python2.7/site-packages/graphite/events/urls.py /usr/lib/python2.7/site-packages/graphite/events/urls.pyc /usr/lib/python2.7/site-packages/graphite/events/urls.pyo /usr/lib/python2.7/site-packages/graphite/events/views.py /usr/lib/python2.7/site-packages/graphite/events/views.pyc /usr/lib/python2.7/site-packages/graphite/events/views.pyo /usr/lib/python2.7/site-packages/graphite/local_settings.py /usr/lib/python2.7/site-packages/graphite/local_settings.py.example /usr/lib/python2.7/site-packages/graphite/logger.py /usr/lib/python2.7/site-packages/graphite/logger.pyc /usr/lib/python2.7/site-packages/graphite/logger.pyo /usr/lib/python2.7/site-packages/graphite/manage.py /usr/lib/python2.7/site-packages/graphite/manage.pyc /usr/lib/python2.7/site-packages/graphite/manage.pyo /usr/lib/python2.7/site-packages/graphite/metrics /usr/lib/python2.7/site-packages/graphite/metrics/__init__.py /usr/lib/python2.7/site-packages/graphite/metrics/__init__.pyc /usr/lib/python2.7/site-packages/graphite/metrics/__init__.pyo /usr/lib/python2.7/site-packages/graphite/metrics/search.py /usr/lib/python2.7/site-packages/graphite/metrics/search.pyc /usr/lib/python2.7/site-packages/graphite/metrics/search.pyo /usr/lib/python2.7/site-packages/graphite/metrics/urls.py /usr/lib/python2.7/site-packages/graphite/metrics/urls.pyc /usr/lib/python2.7/site-packages/graphite/metrics/urls.pyo /usr/lib/python2.7/site-packages/graphite/metrics/views.py /usr/lib/python2.7/site-packages/graphite/metrics/views.pyc /usr/lib/python2.7/site-packages/graphite/metrics/views.pyo /usr/lib/python2.7/site-packages/graphite/remote_storage.py /usr/lib/python2.7/site-packages/graphite/remote_storage.pyc /usr/lib/python2.7/site-packages/graphite/remote_storage.pyo /usr/lib/python2.7/site-packages/graphite/render /usr/lib/python2.7/site-packages/graphite/render/__init__.py /usr/lib/python2.7/site-packages/graphite/render/__init__.pyc /usr/lib/python2.7/site-packages/graphite/render/__init__.pyo /usr/lib/python2.7/site-packages/graphite/render/attime.py /usr/lib/python2.7/site-packages/graphite/render/attime.pyc /usr/lib/python2.7/site-packages/graphite/render/attime.pyo /usr/lib/python2.7/site-packages/graphite/render/datalib.py /usr/lib/python2.7/site-packages/graphite/render/datalib.pyc /usr/lib/python2.7/site-packages/graphite/render/datalib.pyo /usr/lib/python2.7/site-packages/graphite/render/evaluator.py /usr/lib/python2.7/site-packages/graphite/render/evaluator.pyc /usr/lib/python2.7/site-packages/graphite/render/evaluator.pyo /usr/lib/python2.7/site-packages/graphite/render/functions.py /usr/lib/python2.7/site-packages/graphite/render/functions.pyc /usr/lib/python2.7/site-packages/graphite/render/functions.pyo /usr/lib/python2.7/site-packages/graphite/render/functions_test.py /usr/lib/python2.7/site-packages/graphite/render/functions_test.pyc /usr/lib/python2.7/site-packages/graphite/render/functions_test.pyo /usr/lib/python2.7/site-packages/graphite/render/glyph.py /usr/lib/python2.7/site-packages/graphite/render/glyph.pyc /usr/lib/python2.7/site-packages/graphite/render/glyph.pyo /usr/lib/python2.7/site-packages/graphite/render/grammar.py /usr/lib/python2.7/site-packages/graphite/render/grammar.pyc /usr/lib/python2.7/site-packages/graphite/render/grammar.pyo /usr/lib/python2.7/site-packages/graphite/render/hashing.py /usr/lib/python2.7/site-packages/graphite/render/hashing.pyc /usr/lib/python2.7/site-packages/graphite/render/hashing.pyo /usr/lib/python2.7/site-packages/graphite/render/urls.py /usr/lib/python2.7/site-packages/graphite/render/urls.pyc /usr/lib/python2.7/site-packages/graphite/render/urls.pyo /usr/lib/python2.7/site-packages/graphite/render/views.py /usr/lib/python2.7/site-packages/graphite/render/views.pyc /usr/lib/python2.7/site-packages/graphite/render/views.pyo /usr/lib/python2.7/site-packages/graphite/settings.py /usr/lib/python2.7/site-packages/graphite/settings.pyc /usr/lib/python2.7/site-packages/graphite/settings.pyo /usr/lib/python2.7/site-packages/graphite/storage.py /usr/lib/python2.7/site-packages/graphite/storage.pyc /usr/lib/python2.7/site-packages/graphite/storage.pyo /usr/lib/python2.7/site-packages/graphite/templates /usr/lib/python2.7/site-packages/graphite/templates/500.html /usr/lib/python2.7/site-packages/graphite/templates/browser.html /usr/lib/python2.7/site-packages/graphite/templates/browserHeader.html /usr/lib/python2.7/site-packages/graphite/templates/cli.html /usr/lib/python2.7/site-packages/graphite/templates/composer.html /usr/lib/python2.7/site-packages/graphite/templates/dashboard.html /usr/lib/python2.7/site-packages/graphite/templates/dashboardHelp.html /usr/lib/python2.7/site-packages/graphite/templates/editProfile.html /usr/lib/python2.7/site-packages/graphite/templates/event.html /usr/lib/python2.7/site-packages/graphite/templates/events.html /usr/lib/python2.7/site-packages/graphite/templates/login.html /usr/lib/python2.7/site-packages/graphite/templates/version.html /usr/lib/python2.7/site-packages/graphite/url_shortener /usr/lib/python2.7/site-packages/graphite/url_shortener/__init__.py /usr/lib/python2.7/site-packages/graphite/url_shortener/__init__.pyc /usr/lib/python2.7/site-packages/graphite/url_shortener/__init__.pyo /usr/lib/python2.7/site-packages/graphite/url_shortener/baseconv.py /usr/lib/python2.7/site-packages/graphite/url_shortener/baseconv.pyc /usr/lib/python2.7/site-packages/graphite/url_shortener/baseconv.pyo /usr/lib/python2.7/site-packages/graphite/url_shortener/models.py /usr/lib/python2.7/site-packages/graphite/url_shortener/models.pyc /usr/lib/python2.7/site-packages/graphite/url_shortener/models.pyo /usr/lib/python2.7/site-packages/graphite/url_shortener/views.py /usr/lib/python2.7/site-packages/graphite/url_shortener/views.pyc /usr/lib/python2.7/site-packages/graphite/url_shortener/views.pyo /usr/lib/python2.7/site-packages/graphite/urls.py /usr/lib/python2.7/site-packages/graphite/urls.pyc /usr/lib/python2.7/site-packages/graphite/urls.pyo /usr/lib/python2.7/site-packages/graphite/util.py /usr/lib/python2.7/site-packages/graphite/util.pyc /usr/lib/python2.7/site-packages/graphite/util.pyo /usr/lib/python2.7/site-packages/graphite/version /usr/lib/python2.7/site-packages/graphite/version/__init__.py /usr/lib/python2.7/site-packages/graphite/version/__init__.pyc /usr/lib/python2.7/site-packages/graphite/version/__init__.pyo /usr/lib/python2.7/site-packages/graphite/version/urls.py /usr/lib/python2.7/site-packages/graphite/version/urls.pyc /usr/lib/python2.7/site-packages/graphite/version/urls.pyo /usr/lib/python2.7/site-packages/graphite/version/views.py /usr/lib/python2.7/site-packages/graphite/version/views.pyc /usr/lib/python2.7/site-packages/graphite/version/views.pyo /usr/lib/python2.7/site-packages/graphite/views.py /usr/lib/python2.7/site-packages/graphite/views.pyc /usr/lib/python2.7/site-packages/graphite/views.pyo /usr/lib/python2.7/site-packages/graphite/whitelist /usr/lib/python2.7/site-packages/graphite/whitelist/__init__.py /usr/lib/python2.7/site-packages/graphite/whitelist/__init__.pyc /usr/lib/python2.7/site-packages/graphite/whitelist/__init__.pyo /usr/lib/python2.7/site-packages/graphite/whitelist/urls.py /usr/lib/python2.7/site-packages/graphite/whitelist/urls.pyc /usr/lib/python2.7/site-packages/graphite/whitelist/urls.pyo /usr/lib/python2.7/site-packages/graphite/whitelist/views.py /usr/lib/python2.7/site-packages/graphite/whitelist/views.pyc /usr/lib/python2.7/site-packages/graphite/whitelist/views.pyo /usr/lib/python2.7/site-packages/graphite_web-0.9.14-py2.7.egg-info /usr/share/doc/graphite-web-0.9.14 /usr/share/doc/graphite-web-0.9.14/README.fedora /usr/share/doc/graphite-web-0.9.14/dashboard.conf.example /usr/share/doc/graphite-web-0.9.14/example-client.py /usr/share/doc/graphite-web-0.9.14/example-graphite-vhost.conf /usr/share/doc/graphite-web-0.9.14/graphTemplates.conf.example /usr/share/doc/graphite-web-0.9.14/graphite.wsgi.example /usr/share/graphite /usr/share/graphite/graphite-web.wsgi /usr/share/graphite/webapp /usr/share/graphite/webapp/content /usr/share/graphite/webapp/content/css /usr/share/graphite/webapp/content/css/cli.css /usr/share/graphite/webapp/content/css/darkX /usr/share/graphite/webapp/content/css/darkX.css /usr/share/graphite/webapp/content/css/darkX/button-close-focused.png /usr/share/graphite/webapp/content/css/darkX/button-maximize-focused.png /usr/share/graphite/webapp/content/css/darkX/button-minimize-focused.png /usr/share/graphite/webapp/content/css/darkX/frame-bottom-left-focused.png /usr/share/graphite/webapp/content/css/darkX/frame-bottom-mid-focused.png /usr/share/graphite/webapp/content/css/darkX/frame-bottom-right-focused.png /usr/share/graphite/webapp/content/css/darkX/frame-left-focused.png /usr/share/graphite/webapp/content/css/darkX/frame-right-focused.png /usr/share/graphite/webapp/content/css/darkX/titlebar-left-focused.png /usr/share/graphite/webapp/content/css/darkX/titlebar-mid-focused.png /usr/share/graphite/webapp/content/css/darkX/titlebar-right-focused.png /usr/share/graphite/webapp/content/css/dashboard-default.css /usr/share/graphite/webapp/content/css/dashboard-white.css /usr/share/graphite/webapp/content/css/dashboard.css /usr/share/graphite/webapp/content/css/default /usr/share/graphite/webapp/content/css/default.css /usr/share/graphite/webapp/content/css/default/bottom_left.gif /usr/share/graphite/webapp/content/css/default/bottom_mid.gif /usr/share/graphite/webapp/content/css/default/bottom_right.gif /usr/share/graphite/webapp/content/css/default/bottom_right_resize.gif /usr/share/graphite/webapp/content/css/default/center_left.gif /usr/share/graphite/webapp/content/css/default/center_right.gif /usr/share/graphite/webapp/content/css/default/clear.gif /usr/share/graphite/webapp/content/css/default/close.gif /usr/share/graphite/webapp/content/css/default/inspect.gif /usr/share/graphite/webapp/content/css/default/maximize.gif /usr/share/graphite/webapp/content/css/default/minimize.gif /usr/share/graphite/webapp/content/css/default/overlay.png /usr/share/graphite/webapp/content/css/default/resize.gif /usr/share/graphite/webapp/content/css/default/sizer.gif /usr/share/graphite/webapp/content/css/default/top_left.gif /usr/share/graphite/webapp/content/css/default/top_mid.gif /usr/share/graphite/webapp/content/css/default/top_right.gif /usr/share/graphite/webapp/content/css/table.css /usr/share/graphite/webapp/content/html /usr/share/graphite/webapp/content/html/completerHelp.html /usr/share/graphite/webapp/content/html/searchHelp.html /usr/share/graphite/webapp/content/html/timeHelp.html /usr/share/graphite/webapp/content/img /usr/share/graphite/webapp/content/img/blank.gif /usr/share/graphite/webapp/content/img/calendar.png /usr/share/graphite/webapp/content/img/carbon-fiber.png /usr/share/graphite/webapp/content/img/clock.png /usr/share/graphite/webapp/content/img/clock_16.png /usr/share/graphite/webapp/content/img/graphite.png /usr/share/graphite/webapp/content/img/graphite_short.png /usr/share/graphite/webapp/content/img/leaf.gif /usr/share/graphite/webapp/content/img/mini-bottom2.gif /usr/share/graphite/webapp/content/img/mini-top2.gif /usr/share/graphite/webapp/content/img/overview.png /usr/share/graphite/webapp/content/img/refresh.png /usr/share/graphite/webapp/content/img/save.png /usr/share/graphite/webapp/content/img/share.png /usr/share/graphite/webapp/content/img/trash.png /usr/share/graphite/webapp/content/img/upload.png /usr/share/graphite/webapp/content/js /usr/share/graphite/webapp/content/js/ace /usr/share/graphite/webapp/content/js/ace/ace.js /usr/share/graphite/webapp/content/js/ace/keybinding-vim.js /usr/share/graphite/webapp/content/js/ace/mode-c_cpp.js /usr/share/graphite/webapp/content/js/ace/mode-clojure.js /usr/share/graphite/webapp/content/js/ace/mode-coffee.js /usr/share/graphite/webapp/content/js/ace/mode-csharp.js /usr/share/graphite/webapp/content/js/ace/mode-css.js /usr/share/graphite/webapp/content/js/ace/mode-groovy.js /usr/share/graphite/webapp/content/js/ace/mode-html.js /usr/share/graphite/webapp/content/js/ace/mode-java.js /usr/share/graphite/webapp/content/js/ace/mode-javascript.js /usr/share/graphite/webapp/content/js/ace/mode-json.js /usr/share/graphite/webapp/content/js/ace/theme-textmate.js /usr/share/graphite/webapp/content/js/ace/worker-javascript.js /usr/share/graphite/webapp/content/js/browser.js /usr/share/graphite/webapp/content/js/cli.js /usr/share/graphite/webapp/content/js/completer.js /usr/share/graphite/webapp/content/js/composer.js /usr/share/graphite/webapp/content/js/composer_widgets.js /usr/share/graphite/webapp/content/js/dashboard.js /usr/share/graphite/webapp/content/js/ext /usr/share/graphite/webapp/content/js/ext/adapter /usr/share/graphite/webapp/content/js/ext/adapter/ext /usr/share/graphite/webapp/content/js/ext/adapter/ext/ext-base-debug.js /usr/share/graphite/webapp/content/js/ext/adapter/ext/ext-base.js /usr/share/graphite/webapp/content/js/ext/adapter/jquery /usr/share/graphite/webapp/content/js/ext/adapter/jquery/ext-jquery-adapter-debug.js /usr/share/graphite/webapp/content/js/ext/adapter/jquery/ext-jquery-adapter.js /usr/share/graphite/webapp/content/js/ext/adapter/prototype /usr/share/graphite/webapp/content/js/ext/adapter/prototype/ext-prototype-adapter-debug.js /usr/share/graphite/webapp/content/js/ext/adapter/prototype/ext-prototype-adapter.js /usr/share/graphite/webapp/content/js/ext/adapter/yui /usr/share/graphite/webapp/content/js/ext/adapter/yui/ext-yui-adapter-debug.js /usr/share/graphite/webapp/content/js/ext/adapter/yui/ext-yui-adapter.js /usr/share/graphite/webapp/content/js/ext/examples /usr/share/graphite/webapp/content/js/ext/examples/shared /usr/share/graphite/webapp/content/js/ext/examples/shared/icons /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/arrow-down.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/arrow-up.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/SILK.txt /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/accept.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/add.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/add.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/application_go.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/application_view_list.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/book.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/cog.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/cog_edit.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/connect.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/connect.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/control_rewind.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/cross.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/delete.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/error.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/feed_add.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/feed_delete.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/feed_error.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/folder_go.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/folder_wrench.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/grid.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/image_add.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/information.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/plugin.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/plugin_add.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/rss_go.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/table_refresh.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_add.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_add.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_comment.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_delete.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_delete.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_edit.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_female.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_female.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_gray.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_green.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_green.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_orange.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_red.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_suit.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/fam/user_suit.png /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/save.gif /usr/share/graphite/webapp/content/js/ext/examples/shared/icons/silk.css /usr/share/graphite/webapp/content/js/ext/ext-all-debug.js /usr/share/graphite/webapp/content/js/ext/ext-all.js /usr/share/graphite/webapp/content/js/ext/license.txt /usr/share/graphite/webapp/content/js/ext/pkgs /usr/share/graphite/webapp/content/js/ext/pkgs/cmp-foundation-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/cmp-foundation.js /usr/share/graphite/webapp/content/js/ext/pkgs/data-foundation-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/data-foundation.js /usr/share/graphite/webapp/content/js/ext/pkgs/data-grouping-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/data-grouping.js /usr/share/graphite/webapp/content/js/ext/pkgs/data-json-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/data-json.js /usr/share/graphite/webapp/content/js/ext/pkgs/data-list-views-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/data-list-views.js /usr/share/graphite/webapp/content/js/ext/pkgs/data-xml-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/data-xml.js /usr/share/graphite/webapp/content/js/ext/pkgs/direct-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/direct.js /usr/share/graphite/webapp/content/js/ext/pkgs/ext-core-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/ext-core.js /usr/share/graphite/webapp/content/js/ext/pkgs/ext-dd-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/ext-dd.js /usr/share/graphite/webapp/content/js/ext/pkgs/ext-foundation-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/ext-foundation.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-buttons-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-buttons.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-charts-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-charts.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-forms-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-forms.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-grid-editor-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-grid-editor.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-grid-foundation-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-grid-foundation.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-grid-grouping-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-grid-grouping.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-grid-property-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-grid-property.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-history-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-history.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-menu-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-menu.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-tabs-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-tabs.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-tips-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-tips.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-toolbars-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-toolbars.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-tree-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/pkg-tree.js /usr/share/graphite/webapp/content/js/ext/pkgs/resizable-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/resizable.js /usr/share/graphite/webapp/content/js/ext/pkgs/state-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/state.js /usr/share/graphite/webapp/content/js/ext/pkgs/window-debug.js /usr/share/graphite/webapp/content/js/ext/pkgs/window.js /usr/share/graphite/webapp/content/js/ext/resources /usr/share/graphite/webapp/content/js/ext/resources/css /usr/share/graphite/webapp/content/js/ext/resources/css/README.txt /usr/share/graphite/webapp/content/js/ext/resources/css/debug.css /usr/share/graphite/webapp/content/js/ext/resources/css/ext-all-notheme.css /usr/share/graphite/webapp/content/js/ext/resources/css/ext-all.css /usr/share/graphite/webapp/content/js/ext/resources/css/reset-min.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure /usr/share/graphite/webapp/content/js/ext/resources/css/structure/borders.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/box.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/button.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/combo.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/core.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/date-picker.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/dd.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/debug.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/dialog.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/editor.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/form.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/grid.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/layout.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/list-view.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/menu.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/panel-reset.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/panel.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/pivotgrid.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/progress.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/qtips.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/reset.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/resizable.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/slider.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/tabs.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/toolbar.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/tree.css /usr/share/graphite/webapp/content/js/ext/resources/css/structure/window.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/borders.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/box.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/button.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/combo.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/core.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/date-picker.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/dd.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/debug.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/dialog.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/editor.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/form.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/grid.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/layout.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/list-view.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/menu.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/panel.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/progress.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/qtips.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/resizable.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/slider.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/tabs.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/toolbar.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/tree.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-access/window.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/borders.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/box.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/button.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/combo.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/core.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/date-picker.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/dd.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/debug.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/dialog.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/editor.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/form.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/grid.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/layout.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/list-view.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/menu.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/panel.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/pivotgrid.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/progress.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/qtips.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/resizable.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/slider.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/tabs.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/toolbar.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/tree.css /usr/share/graphite/webapp/content/js/ext/resources/css/theme-gray/window.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual /usr/share/graphite/webapp/content/js/ext/resources/css/visual/borders.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/box.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/button.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/combo.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/core.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/date-picker.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/dd.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/debug.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/dialog.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/editor.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/form.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/grid.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/layout.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/list-view.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/menu.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/panel.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/pivotgrid.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/progress.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/qtips.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/resizable.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/slider.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/tabs.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/toolbar.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/tree.css /usr/share/graphite/webapp/content/js/ext/resources/css/visual/window.css /usr/share/graphite/webapp/content/js/ext/resources/css/xtheme-access.css /usr/share/graphite/webapp/content/js/ext/resources/css/xtheme-blue.css /usr/share/graphite/webapp/content/js/ext/resources/css/xtheme-gray.css /usr/share/graphite/webapp/content/js/ext/resources/css/yourtheme.css /usr/share/graphite/webapp/content/js/ext/resources/images /usr/share/graphite/webapp/content/js/ext/resources/images/default /usr/share/graphite/webapp/content/js/ext/resources/images/default/box /usr/share/graphite/webapp/content/js/ext/resources/images/default/box/corners-blue.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/box/corners.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/box/l-blue.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/box/l.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/box/r-blue.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/box/r.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/box/tb-blue.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/box/tb.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/arrow.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/btn.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/group-cs.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/group-lr.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/group-tb.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/s-arrow-b-noline.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/s-arrow-b.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/s-arrow-bo.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/s-arrow-noline.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/s-arrow-o.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/button/s-arrow.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/dd /usr/share/graphite/webapp/content/js/ext/resources/images/default/dd/drop-add.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/dd/drop-no.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/dd/drop-yes.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/editor /usr/share/graphite/webapp/content/js/ext/resources/images/default/editor/tb-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/checkbox.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/clear-trigger.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/clear-trigger.psd /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/date-trigger.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/date-trigger.psd /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/error-tip-corners.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/exclamation.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/radio.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/search-trigger.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/search-trigger.psd /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/text-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/trigger-square.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/trigger-square.psd /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/trigger-tpl.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/trigger.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/form/trigger.psd /usr/share/graphite/webapp/content/js/ext/resources/images/default/gradient-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/arrow-left-white.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/arrow-right-white.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/col-move-bottom.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/col-move-top.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/columns.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/dirty.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/done.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/drop-no.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/drop-yes.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/footer-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid-blue-hd.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid-blue-split.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid-hrow.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid-loading.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid-split.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid-vista-hd.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid3-hd-btn.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid3-hrow-over.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid3-hrow.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid3-rowheader.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid3-special-col-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/group-by.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/group-collapse.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/group-expand-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/group-expand.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/hd-pop.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/hmenu-asc.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/hmenu-desc.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/hmenu-lock.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/hmenu-lock.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/hmenu-unlock.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/hmenu-unlock.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/invalid_line.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/loading.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/mso-hd.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/nowait.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/page-first-disabled.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/page-first.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/page-last-disabled.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/page-last.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/page-next-disabled.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/page-next.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/page-prev-disabled.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/page-prev.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/pick-button.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/refresh-disabled.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/refresh.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/row-check-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/row-expand-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/row-over.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/row-sel.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/sort-hd.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/sort_asc.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/sort_desc.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/grid/wait.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/collapse.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/expand.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/gradient-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/mini-bottom.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/mini-left.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/mini-right.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/mini-top.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/ns-collapse.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/ns-expand.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/panel-close.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/panel-title-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/panel-title-light-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/stick.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/stuck.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/tab-close-on.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/layout/tab-close.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/menu /usr/share/graphite/webapp/content/js/ext/resources/images/default/menu/checked.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/menu/group-checked.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/menu/item-over.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/menu/menu-parent.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/menu/menu.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/menu/unchecked.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/corners-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/left-right.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/light-hd.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/tool-sprite-tpl.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/tool-sprites.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/tools-sprites-trans.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/top-bottom.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/top-bottom.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/white-corners-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/white-left-right.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/panel/white-top-bottom.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/progress /usr/share/graphite/webapp/content/js/ext/resources/images/default/progress/progress-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/qtip /usr/share/graphite/webapp/content/js/ext/resources/images/default/qtip/bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/qtip/close.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/qtip/tip-anchor-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/qtip/tip-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/s.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/shadow-c.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/shadow-lr.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/shadow.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/shared /usr/share/graphite/webapp/content/js/ext/resources/images/default/shared/blue-loading.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/shared/calendar.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/shared/glass-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/shared/hd-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/shared/large-loading.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/shared/left-btn.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/shared/loading-balls.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/shared/right-btn.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/shared/warning.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/e-handle-dark.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/e-handle.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/ne-handle-dark.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/ne-handle.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/nw-handle-dark.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/nw-handle.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/s-handle-dark.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/s-handle.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/se-handle-dark.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/se-handle.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/square.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/sw-handle-dark.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/sizer/sw-handle.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/slider /usr/share/graphite/webapp/content/js/ext/resources/images/default/slider/slider-bg.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/slider/slider-thumb.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/slider/slider-v-bg.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/slider/slider-v-thumb.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/scroll-left.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/scroll-right.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/scroller-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tab-btm-left-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-left-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-right-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tab-btm-right-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tab-close.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tab-strip-btm-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tabs/tabs-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar/bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar/btn-arrow-light.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar/btn-arrow.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar/btn-over-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar/gray-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar/more.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar/tb-bg.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar/tb-btn-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar/tb-xl-btn-sprite.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/toolbar/tb-xl-sep.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/arrows.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/drop-add.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/drop-between.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/drop-no.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/drop-over.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/drop-under.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/drop-yes.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow-end-minus-nl.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow-end-minus.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow-end-plus-nl.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow-end-plus.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow-end.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow-line.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow-minus-nl.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow-minus.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow-plus-nl.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow-plus.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/elbow.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/folder-open.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/folder.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/leaf.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/loading.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/tree/s.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/window /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/icon-error.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/icon-info.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/icon-question.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/icon-warning.gif /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/left-corners.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/left-corners.psd /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/left-right.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/left-right.psd /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/right-corners.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/right-corners.psd /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/top-bottom.png /usr/share/graphite/webapp/content/js/ext/resources/images/default/window/top-bottom.psd /usr/share/graphite/webapp/content/js/ext/ux /usr/share/graphite/webapp/content/js/ext/ux/DataViewTransition.js /usr/share/graphite/webapp/content/js/scriptaculous /usr/share/graphite/webapp/content/js/scriptaculous/builder.js /usr/share/graphite/webapp/content/js/scriptaculous/controls.js /usr/share/graphite/webapp/content/js/scriptaculous/dragdrop.js /usr/share/graphite/webapp/content/js/scriptaculous/effects.js /usr/share/graphite/webapp/content/js/scriptaculous/scriptaculous.js /usr/share/graphite/webapp/content/js/scriptaculous/slider.js /usr/share/graphite/webapp/content/js/window /usr/share/graphite/webapp/content/js/window/effects.js /usr/share/graphite/webapp/content/js/window/prototype.js /usr/share/graphite/webapp/content/js/window/window.js /usr/share/graphite/webapp/content/js/window/window_effects.js /usr/share/licenses/graphite-web-0.9.14 /usr/share/licenses/graphite-web-0.9.14/LICENSE /var/lib/graphite-web /var/log/graphite-web
Konfiguration
python-carbon
carbon.conf
Die Konfiguration von python-carbon erfolgt mit Hilfe der Konfigurationsdatei /etc/carbon/carbon.conf. Die Konfigurationsarbeit ist schnell erledigt, da wir uns auf das tägliche Logrotation beschränken können.
# vim /etc/carbon/carbon.conf
- /etc/carbon/carbon.conf
[cache] # Configure carbon directories. # # OS environment variables can be used to tell carbon where graphite is # installed, where to read configuration from and where to write data. # # GRAPHITE_ROOT - Root directory of the graphite installation. # Defaults to ../ # GRAPHITE_CONF_DIR - Configuration directory (where this file lives). # Defaults to $GRAPHITE_ROOT/conf/ # GRAPHITE_STORAGE_DIR - Storage directory for whisper/rrd/log/pid files. # Defaults to $GRAPHITE_ROOT/storage/ # # To change other directory paths, add settings to this file. The following # configuration variables are available with these default values: # # STORAGE_DIR = $GRAPHITE_STORAGE_DIR # LOCAL_DATA_DIR = STORAGE_DIR/whisper/ # WHITELISTS_DIR = STORAGE_DIR/lists/ # CONF_DIR = STORAGE_DIR/conf/ # LOG_DIR = STORAGE_DIR/log/ # PID_DIR = STORAGE_DIR/ # # For FHS style directory structures, use: # # STORAGE_DIR = /var/lib/carbon/ # CONF_DIR = /etc/carbon/ # LOG_DIR = /var/log/carbon/ # PID_DIR = /var/run/ # #LOCAL_DATA_DIR = /opt/graphite/storage/whisper/ STORAGE_DIR = /var/lib/carbon/ LOCAL_DATA_DIR = /var/lib/carbon/whisper/ WHITELISTS_DIR = /var/lib/carbon/lists/ CONF_DIR = /etc/carbon/ LOG_DIR = /var/log/carbon/ PID_DIR = /var/run/ # Enable daily log rotation. If disabled, carbon will automatically re-open # the file if it's rotated out of place (e.g. by logrotate daemon) # Django : 2015-11-20 # default: ENABLE_LOGROTATION = False ENABLE_LOGROTATION = True # Specify the user to drop privileges to # If this is blank carbon runs as the user that invokes it # This user must have write access to the local data directory USER = carbon # # NOTE: The above settings must be set under [relay] and [aggregator] # to take effect for those daemons as well # Limit the size of the cache to avoid swapping or becoming CPU bound. # Sorts and serving cache queries gets more expensive as the cache grows. # Use the value "inf" (infinity) for an unlimited cache size. MAX_CACHE_SIZE = inf # Limits the number of whisper update_many() calls per second, which effectively # means the number of write requests sent to the disk. This is intended to # prevent over-utilizing the disk and thus starving the rest of the system. # When the rate of required updates exceeds this, then carbon's caching will # take effect and increase the overall throughput accordingly. MAX_UPDATES_PER_SECOND = 500 # If defined, this changes the MAX_UPDATES_PER_SECOND in Carbon when a # stop/shutdown is initiated. This helps when MAX_UPDATES_PER_SECOND is # relatively low and carbon has cached a lot of updates; it enables the carbon # daemon to shutdown more quickly. # MAX_UPDATES_PER_SECOND_ON_SHUTDOWN = 1000 # Softly limits the number of whisper files that get created each minute. # Setting this value low (e.g. 50) is a good way to ensure that your carbon # system will not be adversely impacted when a bunch of new metrics are # sent to it. The trade off is that any metrics received in excess of this # value will be silently dropped, and the whisper file will not be created # until such point as a subsequent metric is received and fits within the # defined rate limit. Setting this value high (like "inf" for infinity) will # cause carbon to create the files quickly but at the risk of increased I/O. MAX_CREATES_PER_MINUTE = 50 # Set the interface and port for the line (plain text) listener. Setting the # interface to 0.0.0.0 listens on all interfaces. Port can be set to 0 to # disable this listener if it is not required. LINE_RECEIVER_INTERFACE = 0.0.0.0 LINE_RECEIVER_PORT = 2003 # Set the TCP backlog for the listen socket created by the line receiver. You # shouldn't change this unless you know what you're doing. # LINE_RECEIVER_BACKLOG = 1024 # Set this to True to enable the UDP listener. By default this is off # because it is very common to run multiple carbon daemons and managing # another (rarely used) port for every carbon instance is not fun. ENABLE_UDP_LISTENER = False UDP_RECEIVER_INTERFACE = 0.0.0.0 UDP_RECEIVER_PORT = 2003 # Set the interface and port for the pickle listener. Setting the interface to # 0.0.0.0 listens on all interfaces. Port can be set to 0 to disable this # listener if it is not required. PICKLE_RECEIVER_INTERFACE = 0.0.0.0 PICKLE_RECEIVER_PORT = 2004 # Set the TCP backlog for the listen socket created by the pickle receiver. You # shouldn't change this unless you know what you're doing. # PICKLE_RECEIVER_BACKLOG = 1024 # Set to false to disable logging of successful connections LOG_LISTENER_CONNECTIONS = True # Per security concerns outlined in Bug #817247 the pickle receiver # will use a more secure and slightly less efficient unpickler. # Set this to True to revert to the old-fashioned insecure unpickler. USE_INSECURE_UNPICKLER = False CACHE_QUERY_INTERFACE = 0.0.0.0 CACHE_QUERY_PORT = 7002 # Set the TCP backlog for the listen socket created by the cache query # listener. You shouldn't change this unless you know what you're doing. # CACHE_QUERY_BACKLOG = 1024 # Set this to False to drop datapoints received after the cache # reaches MAX_CACHE_SIZE. If this is True (the default) then sockets # over which metrics are received will temporarily stop accepting # data until the cache size falls below 95% MAX_CACHE_SIZE. USE_FLOW_CONTROL = True # By default, carbon-cache will log every whisper update and cache hit. This can be excessive and # degrade performance if logging on the same volume as the whisper data is stored. LOG_UPDATES = False LOG_CACHE_HITS = False LOG_CACHE_QUEUE_SORTS = True # The thread that writes metrics to disk can use on of the following strategies # determining the order in which metrics are removed from cache and flushed to # disk. The default option preserves the same behavior as has been historically # available in version 0.9.10. # # sorted - All metrics in the cache will be counted and an ordered list of # them will be sorted according to the number of datapoints in the cache at the # moment of the list's creation. Metrics will then be flushed from the cache to # disk in that order. # # max - The writer thread will always pop and flush the metric from cache # that has the most datapoints. This will give a strong flush preference to # frequently updated metrics and will also reduce random file-io. Infrequently # updated metrics may only ever be persisted to disk at daemon shutdown if # there are a large number of metrics which receive very frequent updates OR if # disk i/o is very slow. # # naive - Metrics will be flushed from the cache to disk in an unordered # fashion. This strategy may be desirable in situations where the storage for # whisper files is solid state, CPU resources are very limited or deference to # the OS's i/o scheduler is expected to compensate for the random write # pattern. # CACHE_WRITE_STRATEGY = sorted # On some systems it is desirable for whisper to write synchronously. # Set this option to True if you'd like to try this. Basically it will # shift the onus of buffering writes from the kernel into carbon's cache. WHISPER_AUTOFLUSH = False # By default new Whisper files are created pre-allocated with the data region # filled with zeros to prevent fragmentation and speed up contiguous reads and # writes (which are common). Enabling this option will cause Whisper to create # the file sparsely instead. Enabling this option may allow a large increase of # MAX_CREATES_PER_MINUTE but may have longer term performance implications # depending on the underlying storage configuration. # WHISPER_SPARSE_CREATE = False # Only beneficial on linux filesystems that support the fallocate system call. # It maintains the benefits of contiguous reads/writes, but with a potentially # much faster creation speed, by allowing the kernel to handle the block # allocation and zero-ing. Enabling this option may allow a large increase of # MAX_CREATES_PER_MINUTE. If enabled on an OS or filesystem that is unsupported # this option will gracefully fallback to standard POSIX file access methods. WHISPER_FALLOCATE_CREATE = True # Enabling this option will cause Whisper to lock each Whisper file it writes # to with an exclusive lock (LOCK_EX, see: man 2 flock). This is useful when # multiple carbon-cache daemons are writing to the same files # WHISPER_LOCK_WRITES = False # Set this to True to enable whitelisting and blacklisting of metrics in # CONF_DIR/whitelist and CONF_DIR/blacklist. If the whitelist is missing or # empty, all metrics will pass through # USE_WHITELIST = False # By default, carbon itself will log statistics (such as a count, # metricsReceived) with the top level prefix of 'carbon' at an interval of 60 # seconds. Set CARBON_METRIC_INTERVAL to 0 to disable instrumentation # CARBON_METRIC_PREFIX = carbon # CARBON_METRIC_INTERVAL = 60 # Enable AMQP if you want to receve metrics using an amqp broker # ENABLE_AMQP = False # Verbose means a line will be logged for every metric received # useful for testing # AMQP_VERBOSE = False # AMQP_HOST = localhost # AMQP_PORT = 5672 # AMQP_VHOST = / # AMQP_USER = guest # AMQP_PASSWORD = guest # AMQP_EXCHANGE = graphite # AMQP_METRIC_NAME_IN_BODY = False # The manhole interface allows you to SSH into the carbon daemon # and get a python interpreter. BE CAREFUL WITH THIS! If you do # something like time.sleep() in the interpreter, the whole process # will sleep! This is *extremely* helpful in debugging, assuming # you are familiar with the code. If you are not, please don't # mess with this, you are asking for trouble :) # # ENABLE_MANHOLE = False # MANHOLE_INTERFACE = 127.0.0.1 # MANHOLE_PORT = 7222 # MANHOLE_USER = admin # MANHOLE_PUBLIC_KEY = ssh-rsa AAAAB3NzaC1yc2EAAAABiwAaAIEAoxN0sv/e4eZCPpi3N3KYvyzRaBaMeS2RsOQ/cDuKv11dlNzVeiyc3RFmCv5Rjwn/lQ79y0zyHxw67qLyhQ/kDzINc4cY41ivuQXm2tPmgvexdrBv5nsfEpjs3gLZfJnyvlcVyWK/lId8WUvEWSWHTzsbtmXAF2raJMdgLTbQ8wE= # Patterns for all of the metrics this machine will store. Read more at # http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol#Bindings # # Example: store all sales, linux servers, and utilization metrics # BIND_PATTERNS = sales.#, servers.linux.#, #.utilization # # Example: store everything # BIND_PATTERNS = # # To configure special settings for the carbon-cache instance 'b', uncomment this: #[cache:b] #LINE_RECEIVER_PORT = 2103 #PICKLE_RECEIVER_PORT = 2104 #CACHE_QUERY_PORT = 7102 # and any other settings you want to customize, defaults are inherited # from [carbon] section. # You can then specify the --instance=b option to manage this instance [relay] LINE_RECEIVER_INTERFACE = 0.0.0.0 LINE_RECEIVER_PORT = 2013 PICKLE_RECEIVER_INTERFACE = 0.0.0.0 PICKLE_RECEIVER_PORT = 2014 # Set to false to disable logging of successful connections LOG_LISTENER_CONNECTIONS = True # Carbon-relay has several options for metric routing controlled by RELAY_METHOD # # Use relay-rules.conf to route metrics to destinations based on pattern rules #RELAY_METHOD = rules # # Use consistent-hashing for even distribution of metrics between destinations #RELAY_METHOD = consistent-hashing # # Use consistent-hashing but take into account an aggregation-rules.conf shared # by downstream carbon-aggregator daemons. This will ensure that all metrics # that map to a given aggregation rule are sent to the same carbon-aggregator # instance. # Enable this for carbon-relays that send to a group of carbon-aggregators #RELAY_METHOD = aggregated-consistent-hashing RELAY_METHOD = rules # If you use consistent-hashing you can add redundancy by replicating every # datapoint to more than one machine. REPLICATION_FACTOR = 1 # For REPLICATION_FACTOR >=2, set DIVERSE_REPLICAS to True to guarantee replicas # across distributed hosts. With this setting disabled, it's possible that replicas # may be sent to different caches on the same host. This has been the default # behavior since introduction of 'consistent-hashing' relay method. # Note that enabling this on an existing pre-0.9.14 cluster will require rebalancing # your metrics across the cluster nodes using a tool like Carbonate. #DIVERSE_REPLICAS = False # This is a list of carbon daemons we will send any relayed or # generated metrics to. The default provided would send to a single # carbon-cache instance on the default port. However if you # use multiple carbon-cache instances then it would look like this: # # DESTINATIONS = 127.0.0.1:2004:a, 127.0.0.1:2104:b # # The general form is IP:PORT:INSTANCE where the :INSTANCE part is # optional and refers to the "None" instance if omitted. # # Note that if the destinations are all carbon-caches then this should # exactly match the webapp's CARBONLINK_HOSTS setting in terms of # instances listed (order matters!). # # If using RELAY_METHOD = rules, all destinations used in relay-rules.conf # must be defined in this list DESTINATIONS = 127.0.0.1:2004 # This defines the maximum "message size" between carbon daemons. # You shouldn't need to tune this unless you really know what you're doing. MAX_DATAPOINTS_PER_MESSAGE = 500 MAX_QUEUE_SIZE = 10000 # This is the percentage that the queue must be empty before it will accept # more messages. For a larger site, if the queue is very large it makes sense # to tune this to allow for incoming stats. So if you have an average # flow of 100k stats/minute, and a MAX_QUEUE_SIZE of 3,000,000, it makes sense # to allow stats to start flowing when you've cleared the queue to 95% since # you should have space to accommodate the next minute's worth of stats # even before the relay incrementally clears more of the queue QUEUE_LOW_WATERMARK_PCT = 0.8 # Set this to False to drop datapoints when any send queue (sending datapoints # to a downstream carbon daemon) hits MAX_QUEUE_SIZE. If this is True (the # default) then sockets over which metrics are received will temporarily stop accepting # data until the send queues fall below QUEUE_LOW_WATERMARK_PCT * MAX_QUEUE_SIZE. USE_FLOW_CONTROL = True # Set this to True to enable whitelisting and blacklisting of metrics in # CONF_DIR/whitelist and CONF_DIR/blacklist. If the whitelist is missing or # empty, all metrics will pass through # USE_WHITELIST = False # By default, carbon itself will log statistics (such as a count, # metricsReceived) with the top level prefix of 'carbon' at an interval of 60 # seconds. Set CARBON_METRIC_INTERVAL to 0 to disable instrumentation # CARBON_METRIC_PREFIX = carbon # CARBON_METRIC_INTERVAL = 60 [aggregator] LINE_RECEIVER_INTERFACE = 0.0.0.0 LINE_RECEIVER_PORT = 2023 PICKLE_RECEIVER_INTERFACE = 0.0.0.0 PICKLE_RECEIVER_PORT = 2024 # Set to false to disable logging of successful connections LOG_LISTENER_CONNECTIONS = True # If set true, metric received will be forwarded to DESTINATIONS in addition to # the output of the aggregation rules. If set false the carbon-aggregator will # only ever send the output of aggregation. Default value is set to false and will not forward FORWARD_ALL = False # Filenames of the configuration files to use for this instance of aggregator. # Filenames are relative to CONF_DIR. # # AGGREGATION_RULES = aggregation-rules.conf # REWRITE_RULES = rewrite-rules.conf # This is a list of carbon daemons we will send any relayed or # generated metrics to. The default provided would send to a single # carbon-cache instance on the default port. However if you # use multiple carbon-cache instances then it would look like this: # # DESTINATIONS = 127.0.0.1:2004:a, 127.0.0.1:2104:b # # The format is comma-delimited IP:PORT:INSTANCE where the :INSTANCE part is # optional and refers to the "None" instance if omitted. # # Note that if the destinations are all carbon-caches then this should # exactly match the webapp's CARBONLINK_HOSTS setting in terms of # instances listed (order matters!). DESTINATIONS = 127.0.0.1:2004 # If you want to add redundancy to your data by replicating every # datapoint to more than one machine, increase this. REPLICATION_FACTOR = 1 # This is the maximum number of datapoints that can be queued up # for a single destination. Once this limit is hit, we will # stop accepting new data if USE_FLOW_CONTROL is True, otherwise # we will drop any subsequently received datapoints. MAX_QUEUE_SIZE = 10000 # Set this to False to drop datapoints when any send queue (sending datapoints # to a downstream carbon daemon) hits MAX_QUEUE_SIZE. If this is True (the # default) then sockets over which metrics are received will temporarily stop accepting # data until the send queues fall below 80% MAX_QUEUE_SIZE. USE_FLOW_CONTROL = True # This defines the maximum "message size" between carbon daemons. # You shouldn't need to tune this unless you really know what you're doing. MAX_DATAPOINTS_PER_MESSAGE = 500 # This defines how many datapoints the aggregator remembers for # each metric. Aggregation only happens for datapoints that fall in # the past MAX_AGGREGATION_INTERVALS * intervalSize seconds. MAX_AGGREGATION_INTERVALS = 5 # By default (WRITE_BACK_FREQUENCY = 0), carbon-aggregator will write back # aggregated data points once every rule.frequency seconds, on a per-rule basis. # Set this (WRITE_BACK_FREQUENCY = N) to write back all aggregated data points # every N seconds, independent of rule frequency. This is useful, for example, # to be able to query partially aggregated metrics from carbon-cache without # having to first wait rule.frequency seconds. # WRITE_BACK_FREQUENCY = 0 # Set this to True to enable whitelisting and blacklisting of metrics in # CONF_DIR/whitelist and CONF_DIR/blacklist. If the whitelist is missing or # empty, all metrics will pass through # USE_WHITELIST = False # By default, carbon itself will log statistics (such as a count, # metricsReceived) with the top level prefix of 'carbon' at an interval of 60 # seconds. Set CARBON_METRIC_INTERVAL to 0 to disable instrumentation # CARBON_METRIC_PREFIX = carbon # CARBON_METRIC_INTERVAL = 60
storage-schemas.conf
Die Definition der Schematas der einzelnen whisper-Dateien erfolgt über die Datei /etc/carbon/storage-schemas.conf. Dort wir unter anderem die Retention der Dateien festgelegt. Unter Retension versteht man das Verdichten der Statistikdateien, ähnlich wie bei Tobias Oetiker's RRDtools, so sind z.B. bei der späteren Anzeige bei den Monatsgraphiken nicht mehr alle 1-Minuten Werte von Interesse, sondern berechnete Zwischenwerte.
Ein weiterer wichtiger Punkt, ist die Reihenfolge der Sectionen in der Konfigurationsdatei. Der erste Bereich der zur definierten Section passt, gilt. Wir müssen also dafür Sorge tragen, dass unser icinga2_default in der Konfigurationsdatei steht bevor der Default-Eintrag default_1min_for_1day kommt. Würde dies nicht passen, würden später auf Grund fehlender verdichteter Daten keine Graphen für die Langzeitstatistiken generiert werden können. Wir öffnen also die Datei /etc/carbon/storage-schemas.conf kontrollieren und passend diese bei Bedarf an.
# vim /etc/carbon/storage-schemas.conf
- /etc/carbon/storage-schemas.conf
# Schema definitions for Whisper files. Entries are scanned in order, # and first match wins. This file is scanned for changes every 60 seconds. # # [name] # pattern = regex # retentions = timePerPoint:timeToStore, timePerPoint:timeToStore, ... # Carbon's internal metrics. This entry should match what is specified in # CARBON_METRIC_PREFIX and CARBON_METRIC_INTERVAL settings [carbon] pattern = ^carbon\. retentions = 60:90d [icinga2_default] # intervals like PNP4Nagios uses them per default pattern = ^icinga2\. retentions = 1m:2d,5m:10d,30m:90d,360m:4y [default_1min_for_1day] pattern = .* retentions = 60s:1d
SQL-Datenbank
Zum Speichern der Konfigurationsdaten zu den Graphiken und Dashboards sowie der userspezifischen Einstellungen nutzen wir unsere MariaDB auf unserem Monitoring Host. Die Installation und Grundkonfiguration der Datenbank ist in diesem Kapitel ausführlich beschrieben.
Im RPM von graphite-web werden bei der Installation die notwendigen Datenbanktabellen-Definitionen mitgeliefert. Damit wir diese anlegen können benötigen wir noch drei Dinge, nämlich
- eine Datenbank
- einen Datenbankuser unter dessen Rechte später die Kommunikation zwischen graphite-web und der MariaDB ablaufen wird, und
- ein Passwort mit dem sich der Datenbankuser an der MariaDB anmelden kann.
Hierzu sind folgende Schritte notwendig:
- Anmelden auf dem Datenbankserver
- Datenbank anlegen
- Neuem Benutzer anlegen und diesem Benutzerprivilegien zuweisen
- Rechte der Nutzer in der Datenbank neu laden
- Beenden der Verbindung zum Datenbankserver
- Anmelden auf dem Datenbankserver
Wir melden uns also als berechtigter Datenbankuser an der MariaDB an.
# mysql -h localhost -u root -p
Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 42 Server version: 5.5.40-MariaDB MariaDB Server Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB>
- Datenbank anlegen
Mit folgendem Befehl legen wir uns einen neuen Nutzer an:
MariaDB> CREATE DATABASE graphite;
Query OK, 1 row affected (0.00 sec)
- Benutzer anlegen und Rechte zuweisen
Mit folgendem Befehl legen wir uns für graphite-web einen neuen Nutzer an und weisen ihm die nötigen Datenbankrechte zu:
MariaDB [(none)]> GRANT ALL ON graphite.* TO 'graphite_user'@'localhost' IDENTIFIED BY 'BUsq4abGxrPysYeqdq61eujDlSHKv1xNyww';
Query OK, 0 rows affected (0.00 sec)
sowie
MariaDB [(none)]> GRANT ALL ON graphite.* TO 'graphite_user'@'127.0.0.1' IDENTIFIED BY 'BUsq4abGxrPysYeqdq61eujDlSHKv1xNyww';
Query OK, 0 rows affected (0.00 sec)
und auch noch
MariaDB [(none)]> GRANT ALL ON graphite.* TO 'graphite_user'@'::1' IDENTIFIED BY 'BUsq4abGxrPysYeqdq61eujDlSHKv1xNyww';
Query OK, 0 rows affected (0.00 sec)
- Rechte der Nutzer in der Datenbank neu laden
Im letzten Schritt laden wir nun die Rechte unseres neuen Datenbankusers.
MariaDB> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
- Datenbankverbindung beenden
Unsere Konfiguration unseres neuen Datenbanknutzers ist hiermit beendet und wir können die Verbindung zur Datenbank wieder schließen.
MariaDB> exit
Bye
Zum Schluß testen wir noch, ob sich der User graphite_user erfolgreich an unserer MariaDB anmelden kann.
# mysql -h localhost -D graphite -u graphite_user -p
Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 208832 Server version: 5.5.44-MariaDB MariaDB Server Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [graphite]> quit Bye
graphite-web
Nachdem wir die Datenbank mit den benötigten Tabellen angelegt haben, ist es an der Zeit mit der Konfiguration von graphite-web zu beginnen. Hierzu bearbeiten wir die Konfigurationsdatei /etc/graphite-web/local_settings.py mit dem Editor unserer Wahl, wie z.B. vim.
Neben dem SECRET_KEY, der TIME_ZONE
# vim /etc/graphite-web/local_settings.py
- /etc/graphite-web/local_settings.py
## Graphite local_settings.py # Edit this file to customize the default Graphite webapp settings # # Additional customizations to Django settings can be added to this file as well ##################################### # General Configuration # ##################################### # Set this to a long, random unique string to use as a secret key for this # install. This key is used for salting of hashes used in auth tokens, # CRSF middleware, cookie storage, etc. This should be set identically among # instances if used behind a load balancer. #SECRET_KEY = 'UNSAFE_DEFAULT' # Django : 2015-03-20 # default: unset SECRET_KEY = '1r3ou$lSg71#cb2coery^hjbyc@6@yynfmd1$493^k8=l$lrs7' # In Django 1.5+ set this to the list of hosts your graphite instances is # accessible as. See: # https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-ALLOWED_HOSTS #ALLOWED_HOSTS = [ '*' ] # Set your local timezone (Django's default is America/Chicago) # If your graphs appear to be offset by a couple hours then this probably # needs to be explicitly set to your local timezone. #TIME_ZONE = 'America/Los_Angeles' # Django : 2015-03-20 # default: unset TIME_ZONE = 'Europe/Berlin' # Override this to provide documentation specific to your Graphite deployment #DOCUMENTATION_URL = "http://graphite.readthedocs.org/" # Logging #LOG_RENDERING_PERFORMANCE = True #LOG_CACHE_PERFORMANCE = True #LOG_METRIC_ACCESS = True # Enable full debug page display on exceptions (Internal Server Error pages) #DEBUG = True # If using RRD files and rrdcached, set to the address or socket of the daemon #FLUSHRRDCACHED = 'unix:/var/run/rrdcached.sock' # This lists the memcached servers that will be used by this webapp. # If you have a cluster of webapps you should ensure all of them # have the *exact* same value for this setting. That will maximize cache # efficiency. Setting MEMCACHE_HOSTS to be empty will turn off use of # memcached entirely. # # You should not use the loopback address (127.0.0.1) here if using clustering # as every webapp in the cluster should use the exact same values to prevent # unneeded cache misses. Set to [] to disable caching of images and fetched data #MEMCACHE_HOSTS = ['10.10.10.10:11211', '10.10.10.11:11211', '10.10.10.12:11211'] #DEFAULT_CACHE_DURATION = 60 # Cache images and data for 1 minute ##################################### # Filesystem Paths # ##################################### # Change only GRAPHITE_ROOT if your install is merely shifted from /opt/graphite # to somewhere else GRAPHITE_ROOT = '/usr/share/graphite' # Most installs done outside of a separate tree such as /opt/graphite will only # need to change these three settings. Note that the default settings for each # of these is relative to GRAPHITE_ROOT #CONF_DIR = '/opt/graphite/conf' #STORAGE_DIR = '/opt/graphite/storage' #CONTENT_DIR = '/opt/graphite/webapp/content' CONF_DIR = '/etc/graphite-web' STORAGE_DIR = '/var/lib/graphite-web' CONTENT_DIR = '/usr/share/graphite/webapp/content' # To further or fully customize the paths, modify the following. Note that the # default settings for each of these are relative to CONF_DIR and STORAGE_DIR # ## Webapp config files #DASHBOARD_CONF = '/opt/graphite/conf/dashboard.conf' #GRAPHTEMPLATES_CONF = '/opt/graphite/conf/graphTemplates.conf' DASHBOARD_CONF = '/etc/graphite-web/dashboard.conf' GRAPHTEMPLATES_CONF = '/etc/graphite-web/graphTemplates.conf' ## Data directories # NOTE: If any directory is unreadable in DATA_DIRS it will break metric browsing #WHISPER_DIR = '/opt/graphite/storage/whisper' #RRD_DIR = '/opt/graphite/storage/rrd' #DATA_DIRS = [WHISPER_DIR, RRD_DIR] # Default: set from the above variables #LOG_DIR = '/opt/graphite/storage/log/webapp' #INDEX_FILE = '/opt/graphite/storage/index' # Search index file WHISPER_DIR = '/var/lib/carbon/whisper' RRD_DIR = '/var/lib/carbon/rrd' DATA_DIRS = [WHISPER_DIR, RRD_DIR] # Default: set from the above variables LOG_DIR = '/var/log/graphite-web/' INDEX_FILE = '/var/lib/graphite-web/index' # Search index file ##################################### # Email Configuration # ##################################### # This is used for emailing rendered Graphs # Default backend is SMTP #EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #EMAIL_HOST = 'localhost' #EMAIL_PORT = 25 #EMAIL_HOST_USER = '' #EMAIL_HOST_PASSWORD = '' #EMAIL_USE_TLS = False # To drop emails on the floor, enable the Dummy backend: #EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend' ##################################### # Authentication Configuration # ##################################### ## LDAP / ActiveDirectory authentication setup #USE_LDAP_AUTH = True #LDAP_SERVER = "ldap.mycompany.com" #LDAP_PORT = 389 # OR #LDAP_URI = "ldaps://ldap.mycompany.com:636" #LDAP_SEARCH_BASE = "OU=users,DC=mycompany,DC=com" #LDAP_BASE_USER = "CN=some_readonly_account,DC=mycompany,DC=com" #LDAP_BASE_PASS = "readonly_account_password" #LDAP_USER_QUERY = "(username=%s)" #For Active Directory use "(sAMAccountName=%s)" # # If you want to further customize the ldap connection options you should # directly use ldap.set_option to set the ldap module's global options. # For example: # #import ldap #ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_ALLOW) #ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, "/etc/ssl/ca") #ldap.set_option(ldap.OPT_X_TLS_CERTFILE, "/etc/ssl/mycert.pem") #ldap.set_option(ldap.OPT_X_TLS_KEYFILE, "/etc/ssl/mykey.pem") # See http://www.python-ldap.org/ for further details on these options. ## REMOTE_USER authentication. See: https://docs.djangoproject.com/en/dev/howto/auth-remote-user/ #USE_REMOTE_USER_AUTHENTICATION = True # Override the URL for the login link (e.g. for django_openid_auth) #LOGIN_URL = '/account/login' ########################## # Database Configuration # ########################## # By default sqlite is used. If you cluster multiple webapps you will need # to setup an external database (such as MySQL) and configure all of the webapp # instances to use the same database. Note that this database is only used to store # Django models such as saved graphs, dashboards, user preferences, etc. # Metric data is not stored here. # # DO NOT FORGET TO RUN 'manage.py syncdb' AFTER SETTING UP A NEW DATABASE # # The following built-in database engines are available: # django.db.backends.postgresql # Removed in Django 1.4 # django.db.backends.postgresql_psycopg2 # django.db.backends.mysql # django.db.backends.sqlite3 # django.db.backends.oracle # # The default is 'django.db.backends.sqlite3' with file 'graphite.db' # located in STORAGE_DIR # #DATABASES = { # 'default': { # 'NAME': '/opt/graphite/storage/graphite.db', # 'ENGINE': 'django.db.backends.sqlite3', # 'USER': '', # 'PASSWORD': '', # 'HOST': '', # 'PORT': '' # } #} # # Django : 2015-03-20 DATABASES = { 'default': { 'NAME': 'graphite', 'ENGINE': 'django.db.backends.mysql', 'USER': 'graphite_user', 'PASSWORD': 'BUsq4abGxrPysYeqdq61eujDlSHKv1xNyww', 'HOST': '127.0.0.1', 'PORT': '3306' } } ######################### # Cluster Configuration # ######################### # (To avoid excessive DNS lookups you want to stick to using IP addresses only in this entire section) # # This should list the IP address (and optionally port) of the webapp on each # remote server in the cluster. These servers must each have local access to # metric data. Note that the first server to return a match for a query will be # used. #CLUSTER_SERVERS = ["10.0.2.2:80", "10.0.2.3:80"] ## These are timeout values (in seconds) for requests to remote webapps #REMOTE_STORE_FETCH_TIMEOUT = 6 # Timeout to fetch series data #REMOTE_STORE_FIND_TIMEOUT = 2.5 # Timeout for metric find requests #REMOTE_STORE_RETRY_DELAY = 60 # Time before retrying a failed remote webapp #REMOTE_FIND_CACHE_DURATION = 300 # Time to cache remote metric find results ## Remote rendering settings # Set to True to enable rendering of Graphs on a remote webapp #REMOTE_RENDERING = True # List of IP (and optionally port) of the webapp on each remote server that # will be used for rendering. Note that each rendering host should have local # access to metric data or should have CLUSTER_SERVERS configured #RENDERING_HOSTS = [] #REMOTE_RENDER_CONNECT_TIMEOUT = 1.0 # If you are running multiple carbon-caches on this machine (typically behind a relay using # consistent hashing), you'll need to list the ip address, cache query port, and instance name of each carbon-cache # instance on the local machine (NOT every carbon-cache in the entire cluster). The default cache query port is 7002 # and a common scheme is to use 7102 for instance b, 7202 for instance c, etc. # # You *should* use 127.0.0.1 here in most cases #CARBONLINK_HOSTS = ["127.0.0.1:7002:a", "127.0.0.1:7102:b", "127.0.0.1:7202:c"] #CARBONLINK_TIMEOUT = 1.0 ##################################### # Additional Django Settings # ##################################### # Uncomment the following line for direct access to Django settings such as # MIDDLEWARE_CLASSES or APPS #from graphite.app_settings import *
Whisper DB
Da die Vorbereitungen nun abgeschlossen sind, können wir nun daran machen in unserer Whisper-Datenbank graphite mit Leben zu erfüllen. Das Anlegen der Tabellen anzulegen erfolgt mit folgendem Befehl.
# /usr/lib/python*/site-packages/graphite/manage.py syncdb
Creating tables ...
Creating table account_profile
Creating table account_variable
Creating table account_view
Creating table account_window
Creating table account_mygraph
Creating table dashboard_dashboard_owners
Creating table dashboard_dashboard
Creating table events_event
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_session
Creating table django_admin_log
Creating table django_content_type
Creating table tagging_tag
Creating table tagging_taggeditem
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'root'): django
Email address: django@nausch.org
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
Apache vHost
Für den Einsatz des Apache Webserver wird bei der Installation des RPM-Paketes bereits eine ausreichende Konfigurationsdatei mitgeliefert. Sofern wir auf eine Regelung zum Zugriffsschutz rein auf ein vertrauenswürdigen Netzes beschränken, brauchen wir lediglich den Hostnamen und die Netzdefinition unseren Vorstellungen nach anzupassen.
# vim /etc/httpd/conf.d/graphite-web.conf
- /etc/httpd/conf.d/graphite-web.conf
# Graphite Web Basic mod_wsgi vhost <VirtualHost *:80> # Django : 2015-03-20 Festlegung des vHostnamens ServerName graphite-web.nausch.org DocumentRoot "/usr/share/graphite/webapp" ErrorLog /var/log/httpd/graphite-web-error.log CustomLog /var/log/httpd/graphite-web-access.log common # Header set Access-Control-Allow-Origin "*" # Header set Access-Control-Allow-Methods "GET, OPTIONS" # Header set Access-Control-Allow-Headers "origin, authorization, accept" # Header set Access-Control-Allow-Credentials true WSGIScriptAlias / /usr/share/graphite/graphite-web.wsgi WSGIImportScript /usr/share/graphite/graphite-web.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL} <Location "/content/"> SetHandler None </Location> Alias /media/ "/usr/lib/python2.7/site-packages/django/contrib/admin/media/" <Location "/media/"> SetHandler None </Location> <Directory "/usr/share/graphite/"> <IfModule mod_authz_core.c> # Apache 2.4 # Django : 2015-03-20 Nur Rechner aus dem eigenen Netz dürfen die Webseite aufrufen! # default: Require local Require ip 10.0 </IfModule> <IfModule !mod_authz_core.c> # Apache 2.2 Order Deny,Allow Deny from all Allow from 127.0.0.1 Allow from ::1 </IfModule> </Directory> </VirtualHost>
Da wir aber genau festlegen wollen, welcher Admin seine Arbeit über das Webfrontend Icinga Web 2 erledigen darf und muss und dadurch auch Zugriff auf die Echtzeitgraphiken bekommen soll, erweitern wir die Konfiguration nun etwas.
externe Authentifikation (htdigest)
Im ersten Konfigurationsbeispiel gehen wir auf die Authentifizierungsart ein, bei der Usernamen und Passwörter in einer lokal gespeicherten Datei vorgehalten werden. Unter Zuhilfenahme des Programms htdigest legen wir erst einmal einen User an und speichern das zugehörige Passwort ab, bzw. wir greifen auf die bereits bei der Konfiguration von Icinga Web 2 angelegten Daten zurück.
# htdigest -c /etc/icingaweb2/.icingawebdigest "Icinga Web 2" django
Adding password for django in realm Icinga Web 2.
New password:
Re-type new password:
Damit der Apache-Webserver für den Zugang zum Webfrontend von graphite den Usernamen und ein Passwort abfrägt, ergänzen wir die Datei /etc/httpd/conf.d/graphite-web.conf wie nachfolgend aufgezeigt.
# vim /etc/httpd/conf.d/graphite-web.conf
- /etc/httpd/conf.d/graphite-web.conf
# Graphite Web Basic mod_wsgi vhost <VirtualHost *:80> # Django : 2015-03-20 Festlegung des vHostnamens ServerName graphite-web.nausch.org DocumentRoot "/usr/share/graphite/webapp" ErrorLog /var/log/httpd/graphite-web-error.log CustomLog /var/log/httpd/graphite-web-access.log common # Header set Access-Control-Allow-Origin "*" # Header set Access-Control-Allow-Methods "GET, OPTIONS" # Header set Access-Control-Allow-Headers "origin, authorization, accept" # Header set Access-Control-Allow-Credentials true WSGIScriptAlias / /usr/share/graphite/graphite-web.wsgi WSGIImportScript /usr/share/graphite/graphite-web.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL} <Location "/content/"> SetHandler None </Location> Alias /media/ "/usr/lib/python2.7/site-packages/django/contrib/admin/media/" <Location "/media/"> SetHandler None </Location> <Directory "/usr/share/graphite/"> # Django : 2015-03-20 # Authentifizierung gegen eine Passwort-Datei AuthType digest AuthName "Icinga Web 2" AuthDigestProvider file AuthUserFile /etc/icingaweb2/.icingawebdigest Require valid-user django </Directory> </VirtualHost>
Wichtig:
Der realm aus der Passwort-Datei, in unserem Beispiel Icinga Web 2
muss mit dem Parameter AuthName in der Apache-Konfigurationsdatei übereinstimmen! Andernfalls wir die Authentifizierung kläglich scheitern, obwohl z.B. sowohl Passwort wie auch Usernamen richtig eingegeben worden sind!
Authentifikation gegen LDAP
Meist haben wir nicht nur eine Web-Anwendung an der sich User zum Arbeiten anmelden müssen, sondern mehrere bis mit unter sehr vielen. In diesem Umfeld bietet es sich förmlich an, die Authentifizierungsdaten zentral an einem LDAP-Server2) zu verwalten.
Damit der Apache-Webserver für den Zugang zum Webfrontend von graphite den Usernamen und ein Passwort abfrägt und gegen unseren openLDAP-Server prüft, ergänzen wir die /etc/httpd/conf.d/graphite-web.conf wie nachfolgend aufgezeigt.
# vim /etc/httpd/conf.d/graphite-web.conf
- /etc/httpd/conf.d/graphite-web.conf
<VirtualHost *:80> # Django : 2015-03-20 Festlegung des vHostnamens ServerName graphite-web.nausch.org DocumentRoot "/usr/share/graphite/webapp" ErrorLog /var/log/httpd/graphite-web-error.log CustomLog /var/log/httpd/graphite-web-access.log common # Header set Access-Control-Allow-Origin "*" # Header set Access-Control-Allow-Methods "GET, OPTIONS" # Header set Access-Control-Allow-Headers "origin, authorization, accept" # Header set Access-Control-Allow-Credentials true WSGIScriptAlias / /usr/share/graphite/graphite-web.wsgi WSGIImportScript /usr/share/graphite/graphite-web.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL} <Location "/content/"> SetHandler None </Location> Alias /media/ "/usr/lib/python2.7/site-packages/django/contrib/admin/media/" <Location "/media/"> SetHandler None </Location> <Directory "/usr/share/graphite/"> # Django : 2015-03-20 # Authentifizierung gegen unseren openLDAP-Server AuthType Basic AuthName "Icinga Monitoring Server" AuthBasicProvider ldap AuthLDAPUrl ldap://ldap.dmz.nausch.org:636/ou=People,dc=nausch,dc=org?uid AuthLDAPBindDN cn=Technischer_User,dc=nausch,dc=org AuthLDAPBindPassword Kl4u5-157-d3r-gr035573(03nk7_3r)! AuthLDAPBindAuthoritative on Require ldap-user django </Directory> </VirtualHost>
TLS-Verschlüsselung
Wichtig:
Der Vollständigkeit halber darf natürlich nicht vergessen werden, den Transportweg gegen unberechtigtes Abgreifen der Authentifizierungsdaten abzusichern. Daher ist es zwingend geboten, den Transportweg mit Hilfe von TLS abzusichern!
Bevor wir unsere Konfigurationsänderungen scharf schalten überprüfen wir noch unsere Apache-Konfigurationsdatei auf syntaktische Fehler.
# apachectl -t
Syntax OK
Ist alles in Ordnung spricht nichts mehr dagegen die Änderungen zu aktivieren.
# systemctl restart httpd.service
icingaweb2
Im ersten Teil der Icinga Web 2 Konfiguration legen wir uns die Konfigurationsdatei /etc/icingaweb2/modules/graphite/config.ini an.
# vim /etc/icingaweb2/modules/graphite/config.ini
- /etc/icingaweb2/modules/graphite/config.ini
; Django : 2015-03-20 [graphite] metric_prefix = icinga2 base_url = https://orwell.nausch.org/render? legacy_mode = false ;if legacy mode is false (2.4 and newer): service_name_template = "$host.name$.services.$service.name$.$service.check_command$.perfdata" host_name_template = "$host.name$.host.$host.check_command$.perfdata" ;if legacy mode is true (pre 2.4): ;service_name_template = "$host.name$.services.$service.name$.$service.check_command$" ;host_name_template = "$host.name$.host.$host.check_command$" ;this template is used for the small image, macro $target$ can used. graphite_args_template = "&target=$target$&source=0&width=300&height=120&hideAxes=true&lineWidth=2&hideLegend=true&colorList=049BAF" ;this template is used for the large image, macro $target$ can used. graphite_large_args_template = "&target=alias(color($target$_warn,'yellow'),'warning')&target=alias(color($target$_crit,'red'),'critical')&target=$target$&source=0&width=800&height=700&colorList=049BAF&lineMode=connected"
Programmstart
Nachdem wir die Konfigurationsschritte allesamt erfolgreich erledigt haben, ist es nun an der Zeit die Echtzeitgraphiken zu aktivieren.
carbon-cache
Als erstes aktivieren wir den carbon-cache, der die Performancedaten von Icinga web 2 entgegen nimmt.
# systemctl start carbon-cache.service
Damit der Daemon automatisch beim Hochfahren des Monitoring-Servers gestartet wird, aktivieren wir dies mit folgendem Aufruf.
# systemctl enable carbon-cache.service
ln -s '/usr/lib/systemd/system/carbon-cache.service' '/etc/systemd/system/multi-user.target.wants/carbon-cache.service'
Möchten wir den Status des Daemon abfragen, benutzen wir ebenfalls den Befehl systemctl.
# systemctl status carbon-cache.service
carbon-cache.service - Graphite Carbon Cache Loaded: loaded (/usr/lib/systemd/system/carbon-cache.service; enabled) Active: active (running) since Mon 2015-03-23 21:32:14 CET; 24h ago Main PID: 16070 (carbon-cache) CGroup: /system.slice/carbon-cache.service └─16070 /usr/bin/python /usr/bin/carbon-cache --config=/etc/carbon/carbon.conf --pidfile=/var/run/carbon-cache.pid --logdir=/var/log/carbon/ start Mar 23 21:32:12 vml000117.dmz.nausch.org systemd[1]: Starting Graphite Carbon Cache...
icinga2
Als nächstes aktivieren wir das Icinga2 Modul graphite.
# icinga2 feature enable graphite
Enabling feature graphite Make sure to restart Icinga 2 for these changes to take effect.
Damit die Änderungen auch wirksam werden, starten wir wie gewünscht den icinga2-Daemon einmal durch.
# systemctl restart icinga2
icinga-web2
Die Konfiguration von Icinga Web2 nehmen wir über das Webfrontend vor. Hierzu rufen wir die URL https://orwell.nausch.org/icingaweb2/authentication/login auf.
$ firefox https://orwell.nausch.org/icingaweb2/config/modules
Da wir uns an unserem Monitoring-Server als berechtigter Nutzer ausweisen müssen, wird uns erst einmal das Anmeldefenster päsentiert.
Nach erfolgreicher Anmeldung befinden wir uns gleich an Ort uns Stelle, an der die Konfiguration der Module erfolgt. Wir erreichen den betreffenden Menüpunkt auch manuell über das Menü auf der linken Seite: System ⇒ Module.
Hier klicken wir auf das Modul graphite und es werden Hinweise zum Modul graphite angezeigt.
Beim Modulstatus wird uns aktuell noch angezeigt, dass dieses noch nicht aktiviert, der Modulstatus noch disabled ist. Zum Aktivieren klicken wir auf den Optionspunkt enable.
Die erfolgreiche Aktivierung des Moduls wir uns mit der Einblendung Module „graphite“ enabled angezeigt.
Aktivierung der Echtzeitgraphen am Beispiel Netzwerktraffic
In folgendem Beispiel des Netzwerktraffics einer Netzwerkschnittstelle unseres Monitoring-Servers aktivieren wir die graphite Echtzeitgraphiken.
Als erstes rufen wir in Icinga Web2 den Service auf, der für die Überwachung der Netzwerkschnittstelle eth0 zuständig ist.
In der Detailansicht des Servicechecks System: Traffic eth0 finden wir bei den Performance data die Bezeichnungen Label.
Die beiden Labels inUsage und outUsage hinterlegen wir nun in der Konfigurationsdatei unseres Services, damit Icinga2 die zugehörigen Daten an den carbon-cache-Daemon übergeben kann. Dazu öffnen wir mit dem Editor vim die besagte Datei (in unserem Beispiel eben /etc/icinga2/conf.d/nausch.org/services/traffic_eth0.conf.
# vim /etc/icinga2/conf.d/nausch.org/services/traffic_eth0.conf
- /etc/icinga2/conf.d/nausch.org/services/traffic_eth0.conf
apply Service "System : Traffic eth0" { import "generic-service" check_command = "nrpe" vars.nrpe_command = "check_traffic_eth0" // Django : 2015-03-20 Die Performancedaten "inUsage" und "outUsage" an den // carbon-cache-Daemon übergeben vars.graphite_keys =["inUsage","outUsage"] assign where host.name == NodeName }
Zur Aktivierung der Erweiterung unseres Service-Checks führen wir nun eine Überprüfung der Konfigurationsdateien und einen Reload des icinga2-Damon durch.
# icinga2 daemon -C && systemctl reload icinga2
Nun rufen wir erneut die Seite zum Status des Service System: Traffic eth0 auf.
Da wir den Zugriff auf die graphite-Graphen zugriffsbeschränkt haben, wird nun 1x pro Sitzung der Username und das zugehörige Passwort abgefragt.
Nach erfolgreicher Anmeldung werden uns in der Übersichtsseite des Services kleine Vorschaugraphiken eingeblendet. Klicken wir auf einen der kleinen Graphen, werden uns im Browser links die Service Detail Informationen und rechts der Detailgraph angezeigt.