27 Mayıs 2013 Pazartesi

Rest Api ve cbstats kullanarak CouchBase'den Bilgi Çekme

Bu hafta Nagios CouchBase eklentisinde eksik kalan kısımları tamamladım. Vbucket resources, disk queues gibi diğer alanlar eksikti. Ancak eklemem gereken yerlerin bir kısmını bulamadım. Couhcbase'den bu istatistikleri alabilmek için şuan "cbstats" komutunu kullanıyorum. En başta Rest api ile istatistikleri alırken daha sonra Rest Api ile bu istatistiklerin büyük bir kısmını bu şekilde alamayacağımı düşünüp "cbstats" kullanmaya başladım. Madem cbstats kullanıyorsam tüm bilgiyi onula çekeyim diye tüm kodu cbstats ile kullanılabilecek hale getirdim.

cbstats ile bilgi çekme şu şekilde:

./cbstats ip:11220 all -b bucket_name

"all" dediğimde bucket için olan tüm bilgiyi döndürüyor. İlgili alanı string üzerinde oynayarak elde ediyorum.

cbstats kullanmaya karar verdiğim akşam cbstats çıktısını nasıl anlamlandırıp hangi alan, web arayüzündeki değere karşılık geliyor diye nasıl bulacağımı düşünürken şunu fark ettim. cbstats komutunda değerler "vb_active_ops_update", "delete_hits" şeklindeki stringlere karşılık gelen değerler şeklinde dönüyor. Web arayüzünde de bilgisini çekmek istediğim alanın üzerine fare ile gelince ilgili alanın hangi değerler üzerinde işlem yapılarak hesaplandığı yazıyordu. Bunu bir kaç durum için kontrol edince cbstatsın değerleri byte olarak döndürdüğünü ve arayüzdeki belirtilen değerlerden bu sonuçların elde edildiğine emin oldum. Zaten "cache_miss_ratio" değerini kontrol etmeyi eklentiye ekleyecekken coucbase listesinde "cache_miss_ratio" nun hesaplanma şeklinin web arayüzünde fare ile üzerine gelince hesaplanan değerlerden oluştuğunu görünce emin oldum. Aslında hangi alanın cbstats'ın hangi çıktısına geldiği belgesinde de yazılı ancak hepsi yazılmış değil.



Bu haftaki eksikleri tamamlamak için baktığımda ise eksik kalan istatistikleri "cbstats" ile hesaplatamadığımı fark ettim. Aslında bir cevap dönüyor geriye ancak bu web arayüzünde gördüğümden farklı ve olması gerektiği değere nasıl dönüştüreceğimi bulamadım ve bu her istatistik için geçerli değil. Bazılarında durum bu şekilde. Listede Rest api kullanarak tüm istatistikleri bulabileceğimin önerilmesi ile birlikte Rest apide dönen değerler için bazı istatistik değerleri web arayüzündekinin aynısı. Ancak direkt arayüzdekinin aynısı bilgi döndüğü için, dönen değer gb mı, mb mı bilemiyorum. Bu iyi bir şey değil. Çünkü ben eklentiye birim bilgiside eklesem iyi olur :) Ve Rest api kullanarak da gene cbstats da olduğu gibi dönen değeri web arayüzdeki biçime dönüştüremiyorum. Çok bir şey değişmedi aslında bu durumda. Yani eklemem gereken istatistik bilgisi için bir cevap bulabiliyorum ancak webdeki ile aynı biçimde olmuyor. Bu durum cbstatsda da böyleydi. Muhtemelen yanlış bilgi dönmüyor ancak Rest apide elde ettiğim cevaplarda bir dizi içinde aynı değer 43 kere yazıyor gibi bir durum var. Ve webdeki bilgi ile aynı değil. Bu bilgiyi webdeki gibi anlamlı şekle nasıl dönüştürebilirim diye listede sordum. Ancak henüz cevap alamadım ve CouchBase belgesinde de bu yazılı değil, başka kaynak da bulamıyorum açıkçası.

Ben en başta Rest api ile bir çok bilgi eksik kalıyor zannettim dediğimde Rest apide dönen cevapta "streaming uri" gibi kısımlar var. Buradaki uri bilgisiyle bir kez daha http request isteğinde bulunduğumda ilgili alanları elde edebiliyorum. Bu istek için olan uri ise şu şekilde:

"ip:8091/pools/default/buckets/test_bucket/stats/vb_active_num"

Aslında burada son kısımda belirtilen "vb_active_num" alanı bilgisine "cbstats" ile de ulaşabiliyorum. Bu uri ile "vb_active_num" bilgisine ulaşacağımı

ip:8091/pools/default/buckets/default/statsDirectory

urisini kullanarak elde ediyorum. En başta cbstats ile arayüzde hesaplanan değerleri elde edebileceğimi bilmeden de buraya ulaşamazdım aslında.

Son olarak web arayüzde belirtilen "summary" kısmını eksiksiz olarak eklentiye ekledikten sonra projeyi paketleme ve belge yazma kısmına geçmeme karar verdik.


13 Mayıs 2013 Pazartesi

Nagios'da Kullanıcı Oluşturma

Nagios'da web arayüzünden kimlik kanıtlaması yaparak sistem durumunu inceleyebiliriz. Bu durumda birden fazla farklı yetkilere sahip kullanıcılar oluşturumamız gerekebilir. Örneğin bir kullanıcı sadece web arayüzündeki bilgileri okusun ancak değiştiremesin (read-only) istiyorsak şu şekilde yapmalıyız. Öncelikle belirlediğimiz kullanıcı adı ve parolayı "htpaswd" komutuyla "/etc/nagios3/htpasswd.users" dosyasına yazdırmalıyız.  "htpasswd htpasswd.users testuser" diyerek "testuser" isimli bir kullanıcı adı ve parolası belirlemiş olduk. htpaswd komutunun bir miktar parametresi var. Şifrelenmesi gereken parolanın şifreleme algoritması türünü seçebiliriz, parolayı düz metin olarak tutabiliriz, oluşturduğumuz kulllanıcıları silebiliriz gibi.

Oluşturduğumuz bu kullanıcıya sadece webten okuma yetkisi vermek ise şu şekilde:
Öncelikle "/etc/nagios3/cgi.cfg" dosyasında muhtemelen yorum satırı halinde bulunan "authorized_for_read_only=" satırının başındaki "#" kaldırıp oluşturduğumuz kullanıcı adını ekliyoruz. Zaten cgi.cfg dosyasından oluşturulan kullanılacalara hangi yetkileri verebileceğimiz ile ilgili bilgiler var. Oradan istediğimiz özellikleri açabiliriz.

Oluşturduğumuz kullanıcıyı contact.cfg ( /etc/nagios3/conf.d/contacts_nagios2.cfg ) dosyasında da tanımlamalıyız.

define contact{
        contact_name                    testuser
        alias                           alias2
        service_notification_period     24x7
        host_notifications_enabled      1
        service_notifications_enabled   1
        host_notification_period        24x7
        service_notification_options    w,u,c,r
        host_notification_options       d,r
        service_notification_commands   notify-service-by-email
        host_notification_commands      notify-host-by-email
        email                           mail_adresiniz
        }
   
define contactgroup{
  contactgroup_name       test
  alias                   alias_test
  members                 testuser
  }
 
Bu tanımlamalarıda ekledikten sonra, Nagios'da çalıştırdığımız komutların tanımlamalarını yaptığımız yerlere "testuser" kullanıcısını ait olduğu grup adını eklemeliyiz ki, izlenen servisler "testuser" kullanıcısı tarafından görülebilsin. O da şu şekilde olmalı:
 
define command{
  command_name        cb_disk_read
  command_line          $USER1$cb_disk_read  $ARG1$  $ARG2$ ...
  }
  
define service{
  use                  generic-service
  host_name            localhost
  service_description  Couchbase Disk Read
  check_command        cb_disk_read!10!0
  contact_groups       admins, test # testuser'in bulundugu grup
  }

Nagios Couchbase Eklentisinin Canlı Demosu Hazır

Bu dönem Kaan ile birlikte üzerinde çalıştığım Yakından Eğitim projesi olan Nagios Couchbase eklentisinin bu hafta büyük bir kısmını tamamladık, ve demosunu hazırladık. Uygulamanın çalışır halini web arayüzünden "testuser" kullanıcı adı ve "password"  parolası ile "http://54.234.80.73/nagios3/"  linkinden görebilirsiniz. Kullanıcı adı ve parolamızla sisteme girdikten sonra şöyle bir arayüzle karşılacağız:


Sol köşede "Current Status" kısmındaki "Services" bölümüne tıkladıktan sonra nagios kullanarak izlediğimiz servisleri görebiliriz.

Burada sistemin kendi üzerindeki kullanıcı sayısı, http servisi, ssh gibi çalışan süreçleri dışında benim CouchBase'den bilgi çekerek izlemimizi sağladığım özellikler de var. CouchBase, nagios ile aynı makine üzerine kurulu olduğundan localhost tanımlamasıyla nagios üzerinden izleme yaptım. Buradaki Couchbase'den aldığımız bilgilerin açıklaması ise şu şekilde:

CouchBase CAS: CAS aslında "check and set methods" kısaltması olarak kullanılıyor. Bu methodlarla var olan bilgiyi güncelleyebiliyoruz. 
CouchBase Create per second: Saniye başına disk üzerinde oluşturulan yeni verilerdir.
CouchBase Delete per second: Saniye başına disk üzerinde silinen verilerdir.
CouchBase Disk read: Belirtilen bucket için disk üzerinde yapılan okuma işlemleridir.
CouchBase Disk write queue: Belirtilen bir bucket üzerinde yazılmayı bekleyen kuyruktaki veriler.
CouchBase Memory usage: Kullanılmış olan bellek miktarı.
CouchBase Operation per second: Disk üzerinde saniye başına yapılan işlem sayısı.
CouchBase Disk update per second: Saniye başına disk üzerinde güncellenen veri miktarı.
CouchBase Disk set per second: Saniye başına disk üzerinde yapılan yazma işlemleri.

Nagios CouchBase Plugin diğer yaptığım projeler gibi bir özgür yazılım projesi ve GPL ile lisansladık. Uygulamanın kaynak koduna buradan bakabilir ve alıp kullanabilirsiniz. Gördüğünüz hataları, eksikleri, tavsiyelerinizi almaktan da oldukça memmun oluruz.

Bir kaç hafta içerisinde de CouchBase'den çekilmesi gereken diğer bilgilerle birlikte, daha fazla test etme, kod iyileştirme gibi kısımlarıda yaptıktan sonra projeyi bitirmiş olacağım.

6 Mayıs 2013 Pazartesi

Nagios Bildirimlerini Eposta Yoluyla Almak

Nagios'ta izlediğimiz hostların, servislerin durumlarından mail ya da sms ile haberdar olabiliriz. Bunun için ayar dosyalarında bir kaç tanımlama yapmak gerekli. Bu tanımlamalar ise şu şekilde:

1) /etc/nagios3/conf.d/contacts_nagios2.cfg dosyasında "contact" ve "contacgroup" tanımlamalarını ekliyoruz. Bu tanımlamalarda "contact" kısmındaki "contact_name", "contactgroup" daki "members"a referans verilmeli.

define contact{
        contact_name                    root
        alias                           Important Server Admin
        host_notifications_enabled      1
        service_notifications_enabled   1
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    w,u,r,c
        host_notification_options       d,r
        service_notification_commands   notify-service-by-email
        host_notification_commands      notify-host-by-email
        email                           mail_adresiniz
}

define  contactgroup{
        contactgroup_name               admins
        alias                           Important Administrators
        members                         root
        }
Daha sonra çalıştırmak istediğimiz hostun ve servisin tanımlamasını yaptığımız yerde de "contact_groups" bilgisini eklemeliyiz. Şu şekilde:

define host{
        use                     generic-host            
        host_name               localhost
        alias                   localhost
        address                 127.0.0.1
        contact_groups          admins
        }

define service{
        use                             generic-service
        host_name                       localhost
        service_description             Couchbase Mem Usage
        check_command                   ...
        contact_groups                  admins
}

1 Mayıs 2013 Çarşamba

Muğla Özgür Yazılım Semineri

Geçen hafta cuma günü Muğla'ya özgür yazılım semineri için gittik. Seminerin ana konusunu "Özgür yazılım projelerine nasıl katılabilir ve nasıl kendinizi yetiştirebilirsiniz?" olarak belirlemiştik. Seminerde Necdet hoca özgür yazılım felsefesinden bahsetti. Ahmet, Serhat ve ben de projelere nasıl katkı verilebileceğinden, özgür yazılımda hangi imkanların sunulduğundan bahsettik. Projelere katkı verme konusunda kendi deneyimlerimizden bahsedeceğimiz için anlatması biraz daha rahat oldu benim için. Konuşma yaptığım ilk seminer olduğu için oldukça heyecanlıydım. Genelde yüksek sesle konuşan biri olmadığımdan konuşma sırasında insanlar ne dediğimi duymazlar, anlatmak istediğimi anlatamam gibi olası durumlardan korkmadım değil :) Ama neyseki hiç böyle olmadı, anlatırken insanlara baygınlık geçirtmeden anlatabildim :) En çok korktuğum şeylerden biri sıkıcı bir şekilde anlatmaktı çünkü. Ahmet ve Serhat sunum konusunda geçen yıldan tecrübeli olduklarından onlar benden daha sakinlerdi.





Muğla'da Enis hoca ve Esra'nın misafiri olduk :)  Enis hoca bizi çok güzel bir şekilde ağırladı. Seminerden sonraki gün Muğla'da bir kaç yer gezdik. Kahvaltı için gittiğimiz yerlerdeki her şey çok doğaldı, bu yüzden midem (reflüden dolayı) fazla zorlanmadı :) Eski Muğla dedikleri bir semti de gezdik en çok orayı beğendim. Kurtuluş savaşı dönemine çok ilgiliyim, Eski Muğla'daki evler aynı öyleydi. O yüzden Eski Muğla'yı çok beğendim.

Muğla'daki seminer bu biraz yorucu ve bolca heyecanlı bir şekilde sonlandı benim için. Umarım herkes için faydalı olmuştur :)