Skip to content

Instantly share code, notes, and snippets.

@kkc
Last active October 5, 2021 10:24
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kkc/ca716b02bbd50ae46134 to your computer and use it in GitHub Desktop.
Save kkc/ca716b02bbd50ae46134 to your computer and use it in GitHub Desktop.
#Statsd + Graphite + Carbon + Grafana #

#Statsd + Graphite + Carbon + Grafana #

Installation

Statsd

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

Graphite + Carbon + Whisper

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

Config

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

start graphite by gunicorn

sudo apt-get -y install gunicorn
/usr/bin/gunicorn_django -b0.0.0.0:8000 -w2 graphite/settings.py

Grafana & Elasticsearch

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,
   }
},

nginx settings

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


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment