#Statsd + Graphite + Carbon + Grafana #
install nodejs
sudo update
sudo apt-get -y install software-properties-common
sudo apt-get -y install python-software-properties
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get -y update
sudo apt-get -y install git nodejs
Since root directory of Graphite is /opt, I decide to set statsd running path to /opt as well.
cd /opt
git clone https://github.com/etsy/statsd.git
cd /opt/statsd
git checkout v0.7.2
cp config.example.js config.js
Config
{
"graphitePort": 2003,
"graphiteHost": "127.0.0.1",
"address": "0.0.0.0",
"port": 8125,
"flushInterval": 10000,
"percentThreshold": 90,
"deleteIdleStats": true,
"deleteGauges": true,
"deleteTimers": true,
"deleteSets": true,
"deleteCounters": false,
"graphite": {
"legacyNamespace": true,
"globalPrefix": "stats",
"prefixCounter": "counters",
"prefixTimer": "timers",
"prefixGauge": "gauges",
"prefixSet": "sets"
}
}
Run
statsd /opt/statsd/config.js
Install Required Package
apt-get -y install git \
python-django \
python-django-tagging \
python-simplejson \
python-memcache \
python-ldap \
python-cairo \
python-twisted \
python-pysqlite2 \
python-support \
python-pip \
python-dev
sudo pip install txAMQP==0.6.2
Graphite & Carbon & Whisper Installation
cd ~
git clone https://github.com/graphite-project/graphite-web.git
git clone https://github.com/graphite-project/carbon.git
git clone https://github.com/graphite-project/whisper.git
cd whisper && git checkout master && python setup.py install
cd carbon && git checkout 0.9.x && python setup.py install
cd graphite-web && git checkout 0.9.x && python check-dependencies.py; python setup.py install
storage-aggregation.conf
[min]
pattern = \.lower$
xFilesFactor = 0.1
aggregationMethod = min
[max]
pattern = \.upper$
xFilesFactor = 0.1
aggregationMethod = max
[sum]
pattern = \.sum$
xFilesFactor = 0
aggregationMethod = sum
[count]
pattern = \.count$
xFilesFactor = 0
aggregationMethod = sum
[count_legacy]
pattern = ^stats_counts.*
xFilesFactor = 0
aggregationMethod = sum
[default_average]
pattern = .*
xFilesFactor = 0.3
aggregationMethod = average
storage-schemas.conf
[stats]
pattern = ^stats.*
retentions = 10s:6h,10min:7d,1d:5y
[catchall]
pattern = ^.*
priority = 0
retentions = 60s:5y
####start carbon data collection daemon ####
- default port: 2003
sudo mkdir -p /var/log/carbon
sudo /opt/graphite/bin/carbon-cache.py start --logdir=/var/log/carbon
sudo apt-get -y install gunicorn
/usr/bin/gunicorn_django -b0.0.0.0:8000 -w2 graphite/settings.py
Install Elasticsearch
sudo apt-get -y update
sudo apt-get -y install openjdk-7-jre wget
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.2.deb
sudo dpkg -i elasticsearch-1.3.2.deb && rm elasticsearch-1.3.2.deb
run as daemon
sudo service elasticsearch start
Install Grafana
mkdir -p /src/grafana && cd /src/grafana
wget http://grafanarel.s3.amazonaws.com/grafana-1.7.0.tar.gz && tar -xzvf grafana-1.7.0.tar.gz && rm grafana-1.7.0.tar.gz
sudo chown -R www-data:www-data grafana-1.7.0/
config
// Graphite & Elasticsearch example setup
datasources: {
graphite: {
type: 'graphite',
url: "http://"+window.location.hostname+":80",
render_method: 'GET',
},
elasticsearch: {
type: 'elasticsearch',
url: "http://"+window.location.hostname+":9200",
index: 'grafana-dash',
grafanaDB: true,
}
},
user www-data;
worker_processes auto;
pid /ar/run/nginx.pid;
events {
worker_connections 1024;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
server_names_hash_bucket_size 32;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
server {
listen 81 default_server;
server_name _;
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;
location / {
root /src/grafana/grafana-1.7.0;
index index.html;
}
location /elasticsearch/ {
proxy_pass http://127.0.0.1:9200/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header Host $host;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, OPTIONS";
add_header Access-Control-Allow-Headers "origin, authorization, accept";
}
server {
listen 80 default_server;
server_name _;
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header Host $host;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, OPTIONS";
add_header Access-Control-Allow-Headers "origin, authorization, accept";
location /content {
alias /var/lib/graphite/webapp/content;
}
location /media {
alias /usr/share/pyshared/django/contrib/admin/media;
}
}
}
Reference:
1. https://github.com/kamon-io/docker-grafana-graphite
2. https://github.com/mopemope/graphite_docker
3. https://github.com/kkc/dockerana/blob/master/components/grafana/config.js