Neymis bu Graphite … (Giris)

En son  soyleyecegimi basta soylemek gerekir ise Graphite aynen RRDtool gibi geldi , uygulamanizdan, sunucularinizdan hatta metrik toplayabileceginiz x seyden mesela networkden aldiginiz degerleri saklayip bunu icin grafikler cizebiliyor size, bu sekilde hem performans hemde durum bilgilerini toparlayip bir ekrandan veya kendinize ozel ekranlar yaratabilir ve diger ucuncu parti yazilimlarla ornegin cabot ile alarm uretebiliyorsunuz.

Benim Graphite’yi incelememdeki amac tam olarak “Tracking Dynamic Host and Application Metrics at Scale” bunla beraber sirada ilgili kitap da Docker monitor etmek icin yontemlerden biri Graphite hakkinda bilgiler veriyor.

Graphite’ye bir sekilde metrikleri yollamaniz gerekiyor, bildigim ozel bir metrik toplayicisi yok bunla ilgili bir liste var fakat ben bu makalede sadece telnet ve/veya python kullanarak nasil ve ne yaratabiliriz Graphite uzerinde onu deneyecegim.

Ikinci adim event-driven , bu metrikleri alacak ve ilgili metrikleri veritabanina yazabilecek , gerektiginde buyuyebilecek bir katman olan Carbon isin icine giriyor. Bu arada carbon’un alternatifleride mevcut mesela GO il yazilan graphite-ng veya riemann gibi uygulamalar mevcut ki riemann ayni zamanda alarm tanimlarinada sahipmis.

Ucuncu adim bunlari saklamak, bunu icin varsayili olarak python’da yazilmis Whisper adinda bir uygulama var (servis olarak calismiyor), kendisi dosya tabanli bir time-series veritabani (TSD) ve carbon veriyi buraya yaziyor. Her metrik icin bir dosya yaratiliyor , haliyle yuklu ortamlar icin hizli bir disk uzerinde olmak gerekli, aslinda bos laf🙂 SSD SSD SSD (Test icin gerek yok🙂 )

Whisper’in yarattigi dosya uzantilari .wsp ,  benim kurulumum icin dosyalar /var/lib/graphite/whisper dizin altinda, dosyalar goreceksiniz belli bir boyutta ve boyutu belirleyen datapoint‘ler.

Alternatif olarak InfluxDB kullanilabilir ki kendisi SQL tabanli sorgulamalara cevap verebiliyor. Diger bir alternaif ise Cassandra tabanli Cyanite. Sonra graphite-influxdb bakiyor olacagiz.

Bu arada time-series bir data veya stream diyince aklimiza x.y.x.metrik:birtakim_degerler:zaman_damgasi gelicek , ornegin –> cpu:30:1465373286 –> yani cpu_metrik:deger=30(belki%30):ve_saat_GMT: Wed, 08 Jun 2016 08:08:06 GMT
Ilgili zaman tanimina (1465373286) Epoch, ki kendisi olcumun yapildigi referans noktasi , ingilizcede cag olarak geciyor. Normal zamani epoch haline cevirmek icin http://www.epochconverter.com veya python’da asagidaki gibi kullanabilir veya linux console’dan elde edebilirsiniz.

Linux console’da date kullanarak

vahric:~ vahricmuhtaryan$ date +%s

1465373909

veya python’da

>>> import time
>>> print time.time()
1465373633.25
>>> print int(time.time())
1465373656

En son okudugumuz, yazdigimizi cizecegiz bunun icinde Graphite-Web modulu gerekli. Django tabanli, cizimler tam takoz gibi🙂 ama ilgili link’i bir kontrol edin , visualization kisminda Grapite-API kullanarak guzel cizimler yapabilecek ucuncu partiler var mesela Grafana, vallaha kendisi cok guzel bence.

Bu arada graphite’yi sevmeyenlerde varmis, onlarin dediklerinede kulak vermek lazim.

Graphite kurulumu icin makalenin en sonuna bakabilirsiniz, simdi yavastan isinalim ;

Simdi metriklerimizi bir sekilde Graphite’ye atmamiz gerekiyor , bunu icin graphite iki adet port’u dinliyor varsayili olarak biri 2003, diger 2004 . 2003 Line Receiver , 2004 is Pickle receiver olarak geciyor , 2003 plaintext protokol kullanarak ilgili porta metric:veri:tatih formatinda veriyi yolluyorsunuz , Pickle is toplu gonderimler icin kullaniyor cok fazla sayida metrik’i gonderebilmek fakat bunu icin carbon-relay servisini calismasi , bir toplayici/dagitici olarak is gormesi gerektiriyorki bu makalenin konusu degil.

Diger onemli bir konu , topladigimiz metrikleri nasil bir yapida gormek istiyoruz (?) , bunlarin ornekleme/saklama periodlari nelerdir (?) , farkli metrikler icin farkli ornekleme/saklama degerlerini nasil  tanimlayabilirim ? Bunlarin hepsi storage sema ayarlamasi gerektiriyor , ilgili dosya “storage-schemas.conf” ilgili dizin altindadir  “/etc/carbon/” . Varsayili olarak asagidaki gibi iki kisim goreceksiniz ;

[carbon]

pattern = ^carbon\.

retentions = 60:90d

[default_1min_for_1day]

pattern = .*

retentions = 60s:1d

Adim adim incelemek gerekir ise ;

  • [ ]  Her bir koseli parantez bize yeni bir bolum/girdi yaratıyor , farkli kaliplar (pattern) icin ve veriyi farkli ornekleme ve tutma ayarlari yapmamizi sagliyor
  • Kaliplar (pattern) , tamamen regex tabanli , metrikleri isimlerinden yakalayip ilgili  ornekleme ve tutma ayarlarinin uygulanmasini sagliyor. Ornegin “staging$” dedigimizde sonu staging ile biten metrik adlari gelecek bize veya soyle bir tanimda olabilir “^servers\.www.*\.workers\.busyWorkers$” :)))
  • Retention kismi ise bize metrikleri toplama sikligi ile saklama suresini belirlememizi sagliyor
  • Tarama yukardan asagi yapiliyor , yani yukarda asagiya [bolum1] [bolum2] [bolum3] gibi siraladiysaniz gelen veriyi ilgili bolumlerdeki pattern’lerle match etmek icin sirasiyla tariyor ve ilk yakaladigi uyusan kalipta duruyor.
  • Eger bu ayarlarda bir degisiklik varsa ilgili .wsp dosyalari bundan etkilenmiyor bu durumda “whisper-resize.py” calistirmak gerekiyor.
  • retentions illa tek bir tanim olmak zorunda degil , isterseniz tek bir satirda birden fazla tanim yapip hassasiyet ayari yapabilirsiniz, ornegin “15s:7d,1m:21d,15m:5y”. Genel olarak verilen metriklerin ortalamasi alindigindan zaman ilerledikce verilerin ortalamasi alindigindan yakalamak istediginiz seyin disina cikacaginizdan daha kati orneklemeler yapip bir uygulamanin veya sunucunun degerlerini inceleyebilir , zaman icersindeki seyrini ise genel olarak bakabilirsiniz.
  • Frekans ayari s , m , h , d , y olarak tanimlanabiliyor.
  • En son bolum ise tipik bir hepsini yakala satiri , kaliplara uymayan diger metrikleri ilgili retention degerlerini uygulayacak.
  • retentions = 60:90d bize 60 saniyelik dilimlerde veri topladigini , her bir 60 saniye icin bir datapoint yarattigini ve bunu 90 gun boyunca saklayacagini beliritiyor
  • Burada bizim icin onemli olan sey 60 saniyelik dilimler icerindeki en son gelen deger nihayi deger olarak gelecektir eger bu sekilde olmasini istemiyorsaniz carbon-aggregator veya StatsD kullanmak gerekiyor bu sayede ilgili zaman dilimi icersindeki veriyi toplayarak alabilirsiniz.
  • 15s:7d,1m:21d,15m:5y ilgili ornekte ise en hassas olan olcumlemeden orta ve daha az hassas olan araliga gecerken graphite bu veriyi en hassas olandan aggregate ederek daha az hassas olana tasiyor.

Son bir sozde Graphite Web icin, anlik veriyi gosterebilmek icin sadece .wsp dosyalarini degil ayni zamanda direkt carbon-cache servisi uzerindende okumayapar boylece disk’e yazilmayan verininde grafigine sahip olunur. Graphite Web ayni zamanda API uzerindede data okuyabilir (clustering) veya disariya veri verebilir.

Graphite clustering ile ilgilenenler icin guzel bir link.

Burada birde storage-aggregation olayina bakmakta fayda var, storage-aggregation.conf diye bir dosya yok🙂 yani bu opsiyonel bir ayar ornek /usr/share/doc/graphite-carbon/examples/storage-aggregation.conf.example . Aktive etmek istediginizde /etc/carbon altina storage-aggregation.conf olarak kopyalayip gerekli degisiklikleri yapmaniz yeterli.

Uc onemli opsiyon var, biri aggregation icin min/max/min/avg/sum/last ne kullanacagimiz, digeri xFileFactor ki kendisi 0 ile 1 arasi set edilebiliyor mesela 0.2 diye set ettigimizde en az %20 veri gelmis olmali hesaplamak icin (ornegin 10 deger geliyor ise 2 deger mutlaka olmali yoksa degeri null atar) birde pattern ki hangi metric icin ilgili aggregation’in tanimlanacagini bilelim.

Ilgili konfig degisiklikleri yapildiktan sonra carbon-cache servisini reload/restart etmemiz yeterli.

Ornek

[all_min]
pattern = \.min$
xFilesFactor = 0.1
aggregationMethod = min

Veriyi silmek adina herhangi birsey rastlamadim🙂 olusan .wsp leri elle veya script ile siliyorsunuz🙂

Simdi Sira Artik Veriyi Gondermede

Once linux cli> dan nasil gonderebilecegimiz bir bakalim , bunun icin nc (netcat) komutunu kullanacagiz.

noroot@graphite2:~$ echo “metrik 10 `date +%s`” | nc -q0 127.0.0.1 2003

noroot@graphite2:~$ echo “prefix.metrik 10 `date +%s`” | nc -q0 127.0.0.1 2003

noroot@graphite2:~$ echo “prefix.group1.metrik1 10 `date +%s`” | nc -q0 127.0.0.1 2003

noroot@graphite2:~$ echo “prefix.group2.metrik1 10 `date +%s`” | nc -q0 127.0.0.1 2003

Not : cli> kullanirken tirnak isaretlerine dikkat eger tarih veya x bir degeri atayamazsaniz graphite bunu anlayamadigindan ilgili metrigi yaratamamis ve/veya veriyi gonderememis olacaksiniz.

Nasil Yanimis …

Screen Shot 2016-06-09 at 16.58.40

Burada farkli sekillerde isteklerde bulunamamizin sebebi su ;

  • istek yaparken sadece metrik yollayabilirsiniz
  • prefix vererek, o prefixin altina metrik yollayabilirim
  • yine prefix vererek farkli grouplar yaratip ilgili guruplar icersine farkli metrikler koyabilirim

Simdi istediginiz bir metrigi istediginiz degerlerle storage-schema retations ayarlarina gore gonderin. Beyaz fon uzerine geriye donuk ok isareti olan dugmeyi tiklayip cizim icin ornekleyecegimiz araligi belirleyin.

Screen Shot 2016-06-09 at 17.15.02

Yeni gondereceginiz veriler icin refresh ederek grafigi takip edin

Screen Shot 2016-06-09 at 17.16.59

Cizimleri birbirine baglamak icin Line Mode –> Connected secebilirsiniz.

Screen Shot 2016-06-09 at 17.17.56

Simdi birde bunu python kullanarak yapalim;

Oncelikle graphitesend diye bir python modulu var, bunu kodlamayi yapacaginiz yerde kurun pip install graphitesend. Source kodu icin burayi tiklayin.

Ornek kod asagidaki gibi ;


# Ilgili modulu yukluyoruz
import graphitesend

# Graphite kurulu sunucumuzu server adli bir degere atiyoruz
server = "10.111.21.131"

# Basliyoruz , paramtereler asagida acikladigim gibi gonderiyoruz
a=graphitesend.init(init_type='plaintext_tcp', # Line Receiver kullanacagiz , port 2003 \
                    graphite_server=server, # Graphte serveri belirtiyoruz, yazmazsak localhost'u arayacak \
                    prefix='openstack.customerX', # Prefix vermek istiyorum \
                    system_name='bizim_sistem' , # grafitesend calistigi yerin hostname'ini gonderiyor, ozellestirdim \
                    group = 'group1') # Birde cli> da oldugu gibi guruplamayida yapiyorum

# Hem yazdiriyoruz, hemde metrigi yolluyoruz
# Dikkat ederseniz bir zaman damgasi vurmadik onu graphitesend modulu kendi tamamliyor fakat istenirse eklenebilir
print a.send('vcpu',10)

Socket kullandigimda gordum ki once tuple diye bilinen (TUH-pul) olarak okunan “ordered  set of values” denilen sirali degerlerin bir kerede gonderilmesi gibi bir olay varmis . Kendisini veriyi graphite’ye atmak istedigimizde gerekli bilgileri bir cirpida gondermek icin kullanmam gerekiyormus.


>>> import socket
>>> import time
>>> timestamp = int(time.time())
>>> gserver="10.111.21.132"
>>> gserverport=2003
>>> baglanti=socket.socket()
>>> baglanti.connect((gserver,gserverport))
>>> gonder = 'socket.gurup1.metrik1 100 %d\n' %timestamp
>>> baglanti.sendall(gonder)
>>> baglanti.close()
>>> 

Hepsi bu …

Graphite Kurulumu Icin digitalocean dokumani oldukca guzel, ben yinede kisaca kendimce ozet olarak yapilacaklari belirttim.

Sirayla asagidaki komutlari calistirin ;

noroot@graphite2:~$ sudo apt-get update

noroot@graphite2:~$ sudo apt-get install graphite-web graphite-carbon -y

/var/lib/graphite/whisper dizini verilerin yazildigi yer , su an bir dosya mevcut degil varsayili ne ise secip gecebiliriz.

Graphite-web django uygulamasi oldugu icin bilgiler tutacagi bir veritabanina ihtiyaci var, varsayili olarak sqllite kullaniliyor , digitalocean dokumaninda postgre onerilmis , bende mysql kurayim dedim🙂 Burada herhangi bir metrik datasi yok sadece auth ve django icin gerekli olan tabolar olacak.

Simdi Mysql Kuralim

noroot@graphite2:~$ sudo apt-get install python-pip python-dev mysql-server libmysqlclient-dev -y

Uygun bir sifre mesela ben “sapsik123” set ettim , sonra sirasiyla asagidaki komutlari calistirin

Mysql 5.7.6 ve sonrasinda artik mysql_install_db calistirmaya gerek yok, bende hala eski version 5.5.x kurulu Ubuntu 14.04 uzerinde

noroot@graphite2:~$ sudo mysql_install_db
noroot@graphite2:~$ sudo mysql_secure_installation

Simdi graphite uzerinde ilgili veritabani , kullaniciyi yaratip , django ayarlarini yapalim ; 

mysql> CREATE DATABASE graphite CHARACTER SET UTF8;

Query OK, 1 row affected (0.00 sec)

mysql> CREATE USER graphite@localhost IDENTIFIED BY ‘password’;

Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON graphite.* TO graphite@localhost;

Query OK, 0 rows affected (0.00 sec)

Django Graphite Web Uygulamasini Duzenleyelim ; 

Burada onemli olan iki konu var, time zone ve db ayarlari , ilgili secret_key ekliyoruz ve time_zone duzeltiyoruz

noroot@graphite2:~$ sudo vi /etc/graphite/local_settings.py

SECRET_KEY = ‘hx92EkF8oMpzSZ30F4oL848bTPWVC4sw’

TIME_ZONE = ‘Europe/Istanbul’

ilgili satirin onundek # kaldirin …

USE_REMOTE_USER_AUTHENTICATION = True

Veritabani ayarlari …

DATABASES = {

‘default’: {

‘NAME’: ‘graphite’,

‘ENGINE’: ‘django.db.backends.mysql’,

‘USER’: ‘graphite’,

‘PASSWORD’: ‘password’,

‘HOST’: ‘127.0.0.1’,

‘PORT’: ”

}

}

Henuz veritabani yapimiz olusmus degil ; 

mysql> use graphite;

Database changed

mysql> show tables;

Empty set (0.00 sec)

Yaratalim ama oncesinde mysqlclient kuralim …. 

noroot@graphite2:~$ sudo pip install mysqlclient

–> Asagidaki komutu calistirdiginizda gerekli veritabani yapisi olusacak ek olarak graphite uzerinde grafikleri kaydetmek ve arayuzu ozellestirme hakki olan superkullanici yaratmanizi isteyecek sizde, bunla login olup islemlerimizi yapacagiz.

noroot@graphite2:~$ sudo graphite-manage 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’):

Email address: vahric@gmail.com

Password:

Password (again):

Superuser created successfully.

Installing custom SQL …

Installing indexes …

Installed 0 object(s) from 0 fixture(s)

Carbon konfigrasyonu , ilgili degeri false to true yapiyoruz , acilista carbon-cache aktive ediyoruz (listener); 

noroot@graphite2:~$ sudo vi /etc/default/graphite-carbon

CARBON_CACHE_ENABLED=true

Aslinda carbon.conf’da cok konfigrasyon var mesela nekadar yazma istegini gerceklestirmek istediginizi , cache boyutunu , carbon’un dinledigi port/interface , metrikleri messaging queue ile alma , aggregation ayarlari ama sadece log’u rotate edecegiz veya bosverdim, onada gerek yok ama degistmek isterseniz bu degerleri ilgili dosyaya basvurabilirsiniz.

noroot@graphite2:~$ sudo vi /etc/carbon/carbon.conf

Carbon-Cache Calistiralim

noroot@graphite2:~$ sudo service carbon-cache start

* Starting Graphite backend daemon carbon-cache                                                                                                                  Starting carbon-cache (instance a)

En son yapacagimiz apache ve wsgi modulunu yuklemek olacak

noroot@graphite2:~$ sudo apt-get install apache2 libapache2-mod-wsgi -y

Default site’i disable edelim

noroot@graphite2:~$ sudo a2dissite 000-default

Graphite sag olsun , apache conf dsyasinida hazirlamis wsgi icin 

noroot@graphite2:~$ sudo cp /usr/share/graphite-web/apache2-graphite.conf /etc/apache2/sites-available

Enable edelim

noroot@graphite2:~$ sudo a2ensite apache2-graphite

Reload Apache

noroot@graphite2:~$ sudo service apache2 reload

Simdi http://ip.adre.sini.vererek sayfaya erisin , atadiginiz sifre ile root kullanici ile login olun. Solda bir alan goreceksiniz , Graphite altinda varsayili olarak carbon adiyla baslayan bir prefix , cache diye bir gurup ve metrikleri goreceksiniz.

Screen Shot 2016-06-09 at 16.52.40

VM

Posted on 09/06/2016, in Graphite and tagged , , , , , , , , , , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: