Graphite is a great graphing system with a very simple API for importing data, and a lot of support from other tools.
There are two parts to a Graphite installation:
- “Carbon” which is the process that handles receiving and storing data
- “graphite-web” which provides a front-end and HTTP API
Graphite-web is pretty complex to install however – especially if you have minimal python knowledge – with a number of dependencies (e.g. django, MySQL) and associated configuration. It’s also not the most elegant application to use.
As a result, a number of other front ends have been developed, one of which is the excellent Grafana. Using alternative front-ends means you only really need the HTTP API from Graphite, and not the whole web application (with django etc), but the main Graphite project doesn’t support installing just this element. There is however a project on Github that aims to provide just this – graphite-api.
This blog post will cover how to install carbon, graphite-api, and finally Grafana v1
Installing Carbon
Carbon can be install using apt:
apt-get install graphite-carbon
Once installed you should be able to start it with the standard “service carbon-cache start”. This will silently fail however, because for some inexplicable reason, the package is configured by default to be disabled, and the init script only reports this if it is in “verbose” mode, which again by default it isn’t. So the default install will just silently fail to do anything!
To fix this, edit /etc/default/graphite-carbon and change the line below to true:
CARBON_CACHE_ENABLED=true
Then “service carbon-cache start” should start the service.
Check carbon is running with the following python script:
import time import socket sock = socket.socket() sock.connect( ("localhost", 2003) ) sock.send("test.metric 50 %d \n" % time.time()) sock.close()
If this returns a “socket.error”, check if carbon is running with “ps -ef | grep carbon”, and check for errors in /var/log/carbon/console.log
Installing graphite-api
Follow the “Python” instructions at http://graphite-api.readthedocs.org/en/latest/installation.html#python-package
Install required dependencies
apt-get install python python-pip build-essential python-dev libcairo2-dev libffi-dev
And then graphite-api
pip install graphite-api
This will download and compile graphite-api. If you have cryptic errors about “gcc”, check you have installed “build-essential” and all the required “*-dev” libraries. Depending on your system, you may also need to install other dependencies, but “apt” should take care of this for you.
Configure carbon
Once installed you need to create the configuration file. Graphite-api will run without a config file, but the default file locations are different to what graphite-carbon used so we need to manually specify them.
Create “/etc/graphite-api.yml” with the following contents.
search_index: /var/lib/graphite/index finders: - graphite_api.finders.whisper.WhisperFinder functions: - graphite_api.functions.SeriesFunctions - graphite_api.functions.PieFunctions whisper: directories: - /var/lib/graphite/whisper carbon: hosts: - 127.0.0.1:7002 timeout: 1 retry_delay: 15 carbon_prefix: carbon replication_factor: 1
If you want to change the data locations, ensure you edit “/etc/carbon/carbon.conf” as well to match.
Deployment
Graphite-api doesn’t install a daemon like carbon, it needs to be run inside a web server. There are several options documented on the website. The simplest (although not most performant) is probably to use Apache and mod_wsgi
apt-get install libapache2-mod-wsgi
Then just follow the documented instructions.
Create /var/www/wsgi-scripts/graphite-api.wsgi
# /var/www/wsgi-scripts/graphite-api.wsgi from graphite_api.app import app as application
And /etc/apache2/sites-available/graphite.conf
# /etc/apache2/sites-available/graphite.conf LoadModule wsgi_module modules/mod_wsgi.so WSGISocketPrefix /var/run/wsgi Listen 8013 <VirtualHost *:8013> WSGIDaemonProcess graphite-api processes=5 threads=5 display-name='%{GROUP}' inactivity-timeout=120 WSGIProcessGroup graphite-api WSGIApplicationGroup %{GLOBAL} WSGIImportScript /var/www/wsgi-scripts/graphite-api.wsgi process-group=graphite-api application-group=%{GLOBAL} WSGIScriptAlias / /var/www/wsgi-scripts/graphite-api.wsgi <Directory /var/www/wsgi-scripts/> Order deny,allow Allow from all </Directory> </VirtualHost>
Then symlink this into /etc/apache2/sites-enabled/
ln -s ../sites-available/graphite.conf .
Finally restarting Apache:
service apache2 restart
This should start graphite-api on port 8013.
You can check this by browsing to http://<IP_OF_PI >:8013/render?target=test.metric
This should return a fairly dull graph showing the data entered using the basic test python script above. If you get a image back that says “No Data”, check you have run the test python above successfully, and that your data paths in /etc/carbon/carbon.conf and “/etc/graphite-api.yml” match.
Any errors will be logged into the standard Apache error log at /var/log/apache2/error.log
Installing Grafana
The final step is to install the “Grafana” frontend. The original Grafana is a pure HTML5 application that connected directly to the graphite API and didn’t require anything other than a webserver to host the pages. Grafana 2 has now been released, which as well as connecting to Graphite, also provides it’s own backend that is written in Go.
There aren’t prebuilt packages of Grafana 2 available for the Raspberry Pi, and building it from source would be quite a bit of time and hassle (if it’s even possible), so I’d recommend sticking to Grafana 1. The main limitation of Grafana 1 is being unable to directly save dashboards from the GUI. To save a dashboard, you will need to copy the JSON for it from the GUI, and save it manually as a file on the Pi to “/var/www/grafana/app/dashboards/”
Installation
- Download the latest 1.x release from http://grafana.org/download/
- Unzip this into /var/www/grafana
- copy “config.sample.js” to “config.js” and edit the datasources section to point at your graphite instance above. This is likely to be http://IP_OF_PI:8013
- Open a browser and point it at: http://IP_OF_PI/grafana and you should get the Grafana UI.
- If you don’t get this, check your Javascript console log for errors or typos in config.js file
Explaining how to use Grafana is out of scope of this blog post, but have fun graphing all your r-pi stats!