Category Archives: Monitoring

F5 Belirli Node Hangi Pool’a üye Tesbiti

Pool altında node lar listeleniyor fakat büyük yapılarda her zaman hangi node hangi pool lara dahil buna da çok ihtiyaç duyulmakta. Kendi çalışmalarımdan biliyorum.
Tek tek tüm pool lara bakmak yerine ve gui de bir çözüm olmadığından dolayı 2 yöntem mevcut.

Bunlar ;

Yöntem – 1

#Full config Save eder.
tmsh save sys config file /tmp/1.txt
cat 1.txt|grep "ltm pool" -A10|grep ASLTEST01 -B10|grep "ltm pool"
 
#yada
 
cat 1.txt|grep "ltm pool" -A10|grep ASLTEST01 -B5|grep "ltm pool"

Gibi bakılabilir diye düşünüyorum. Parse edecek bir şey yazarak tespit edebilirsiniz bu yöntem grep After before fazla member ile bozulabilir. O yüzden parser yazmak daha mantıklı ben sadece örnek olarak bu şekilde bir yöntem ile bakılabildiğini göstermek istedim.

Yöntem – 2

2′nci yöntemimiz daha basit ve tek satır ile tespit fakat snmp aktif olması gerekiyor. F5-BIGIP-LOCAL-MIB mibi ile ltmpoolmemberpoolname ile hangi node hangi poola üye grep ile kesin görebiliyoruz.

#snmpwalk -v2c -c snmp_community lb_ip -m F5-BIGIP-LOCAL-MIB ltmPoolMemberPoolName|grep -i ASLTEST01
 
F5-BIGIP-LOCAL-MIB::ltmPoolMemberPoolName."/asltest/ap-test-ssl"."/asltest/ASLTEST01".8443 = STRING: /asltest/ap-test-ssl
F5-BIGIP-LOCAL-MIB::ltmPoolMemberPoolName."/asltest/ap-test-http"."/asltest/ASLTEST01".8080 = STRING: /asltest/ap-test-http
F5-BIGIP-LOCAL-MIB::ltmPoolMemberPoolName."/asltest/test_bandwith_vserver"."/asltest/ASLTEST01".8080 = STRING: /asltest/test_bandwith_vserver

F5 High Speed Logging Irule & Splunk Entegrasyonu

High speed logging özelliği F5 tarafından yüksek volume ve düşük yük için design edilmiştir. Açıkcası çokda başarılı olduğunu söylemeliyim.

https://devcentral.f5.com/wiki/irules.HSL.ashx

Ben F5 loglarını splunk tarafında topluyorum. Siz Splunk kullanmıyorsanız syslog-ng v.b. gibi bir çok seçenek kullanabilirsiniz. Ayrıca opensource log indexerlar olarak graylog, logstash2 de deneyebilirsiniz.

Splunk tarafı için hazırlıklarımız;

Settings -> Data -> Forwarding and receiving kısmına gidiyoruz.
Configure Receiving kısmında geçiyoruz. New seçerek yeni listener oluşturuyoruz.
Gerekli listen portunu yazıyoruz ve save diyoruz.

splunk1

Bizim örneğimizde bu port udp 515. Böylece F5 tarafından yollanan logları splunk listener olan 515 portuna gönderiyor olacağız.

splunk2Splunk tarafındaki ayarlamayı tamamladıktan sonra. Splunk indexer makinemizi F5 tarafına önce node olarak ekliyoruz.

f5_1

Ardından Bu node ile syslog poolumuzu oluşturuyoruz. Port 515 ile nodu poola ekliyoruz. Poolumuzun adı syslog

f5_2

En sonunda HSL Irule’u işleyelim.

Logu response ile yazıyoruz. Client accept ve http request tarafında değişkenleri set ediyoruz.

HSL::send $hsl "$clientip $host - \[$now\] \"$method $uri HTTP/[HTTP::version]\" [HTTP::status] $contentlength \"$referer\" \"$agent\"\n"

Bu HSL ile yer alan dizilim splunk access_combined log formatı ile birebir uyumlu olduğundan splunk indexer bunu access log olarak algılıyor ve ona göre indexliyor. Böylece useragent, uri, ident gibi tüm unsurları filtreleyerek arama konusunda hiç bir sorun yaşamıyoruz.

#HSL Loglama
when CLIENT_ACCEPTED {
   set hsl [HSL::open -proto UDP -pool syslog]
   set clientip [IP::remote_addr]
}
when HTTP_REQUEST {
   set method [HTTP::method]
   set uri [HTTP::uri]
   set host [HTTP::host]
   set referer [HTTP::header "Referer"]
   set agent  [HTTP::header "User-Agent"]
}
when HTTP_RESPONSE {
   set now [clock format [clock seconds] -format "%d/%b/%Y:%H:%M:%S %z"]
   set contentlength [HTTP::header "Content-Length"]
   HSL::send $hsl "$clientip $host - \[$now\] \"$method $uri HTTP/[HTTP::version]\" [HTTP::status] $contentlength \"$referer\" \"$agent\"\n"
}

Loglamak istediğiniz HTTP servis edilen vserver larınıza bind edebilirsiniz. Splunk bunları ident=http_host headerında yer alan domainlere göre size filtreleme imkanı veriyor.

Splunk örnek olarak bunu gösterebiliriz. 515 port udp ve access_combined olarak setli F5 tarafından HSL den gelen indexlenmiş bir satır log.

splunk3

Bir sonraki yazımızda HSL ile request ve response time larıda access log ile birlikte loglamayı sağlayan bir irule inceleyeceğiz. Böylece Farklı bir tool kullanmadan request/response time larınızı görebilir ve bunları grafiğe splunk tarafında dökebilirsiniz, en çok süren ve yavaş çalışan url yada iç servislerinizi görebilirsiniz.

F5 Monitoring Collectd&Graphite Kombinasyonu

Öncelike sizlere collectd ve graphite dan bahsediyim artı sorularınız olursa email ile iletişime geçebilirsiniz.

https://collectd.org/
http://graphite.wikidot.com/

Collectd

Collectd ile snmp kullanarak F5 üstünden verileri topluyoruz ve rrd formatında kaydediyoruz. Collectd ayrıca farklı monitoring işlemleri içinde kullanılıyor. Verileri toplamak için çok başarılı bir tool ayrıca kendi agentı mevcut ve puppet ile kolay şekilde mass deploy ile çalışıyor. Bir central sistem ve tüm agentlar info gönderiyor center sistemde bunları rrd olarak kaydediyor. Regex , interval belirleme gibi çok yararlı özellikleri var. Interval çok önemli lakin 100.000 grafiğiniz varsa bunların update interval leri size I/O Hell verebilir. Açıkcası en az intervalde monitoring için mutlaka bir ssd raid array lazım. Çok ince şekilde çalıştığını gördüm. Anlık peak olayları instant yakalamanıza yardımcı oluyor. Çok tertipli şekilde çalışıyor. Eksikleri tabiki var özellikle hala mysql plugini çok eski innodb değerlerini toplamak için custom perl moduller kullanarak saatlerce istediğimiz şekile getirmek için edit etmek gerekti. Fakat F5 tarafını izlemek için birebir. Özellikle snmp configurasyon syntax tarafı çok kolaylaştırıyor işi ve bir kere ekledikten sonra tekrar tekrar yeni güncelleme ve eklemeleri vserver/pool gibi hiç bir şekilde eklemenize gerek kalmıyor auto pull ediyor.

Not : Collectd tarafında en can sıkıcı bug scale 8 fonksiyonu uygulanan interface bandwidth metriklerinde bit cinsinden istenen datayı işlerden assertation hatası vermesi ve applikasyondan çıkmasıdır. Halen bu bug mevcuttur (20/08/2014) . Bunun üstesinden scale 8 işlemini grafite tarafında uygulayarak çözüyoruz.

Graphite

Graphite carbon ana merkez, whisper dosya formatı, graphite-web paketide gui olmak üzere 3 unsurdan oluşmaktadır. Graphite’ın yaptıklarına gelince bir örnek olarak benim kullandığım sistemde 100.000 load average grafiği içinden top 5 tanesini gösterebiliyor. Böylece cacti ve variantlarındaki gibi tek tek grafiklere bakılması gerekmiyor. Düzgün bir dashboard ile 1 milyon farklı metriğin grafiğe döküldüğü bir yapıda çok basit şekilde anomaly tespit edilebilmekte oluyor. Ayrıca farklı zaman dilimleri ile birlikte karşılaştırma yapmaya imkan veriyor. Böylece 7 gün önce aynı zaman dilimi ile şuan ki zaman dilimi karşılaştırılarak farklar görülebilmektedir. Sayfasını incelemenizi tavsiye ederim. Bu zamana kadar gördüğüm en güçlü realtime monitoring imkan ve kabiliyetlerine sahip yazılım.

Not: Graphite tarafında tek eksik nokta grafik üstünden alert üretememesi. Bununla ilgili bir kaç deneme yapılmış hepsini test ettim fakat sonuç alamadım. Bir windows makineden grafikler render edilerek autoit gibi uygulamalar ile custom alert sistemleri geliştirilebilir fakat uğraştırıcı olacağı kanaatindeyim.

Collectd & Graphite kurulumlarınızı gerçekleştirdikten sonra ;

#Collectd Installation için

https://collectd.org/wiki/index.php/First_steps
http://edoceo.com/howto/collectd
http://linuxdrops.com/install-collectd-statistics-collecter-on-centos-rhel-ubuntu-debian/

#Graphite Installation için

http://graphite.readthedocs.org/en/latest/install.html
https://www.digitalocean.com/community/tutorials/installing-and-configuring-graphite-and-statsd-on-an-ubuntu-12-04-vps
http://kaivanov.blogspot.com.tr/2012/02/how-to-install-and-use-graphite.html

Not: Tavsiyem son sürümü source dan kurmanızdır.

Monitoring sistememizin başlıklarını anlattıktan sonra snmp için F5 miblerine bakalım. (Mibleri F5 sitesinden alabilirsiniz)

APM, COMMON, GLOBAL, LOCAL, SYSTEM, WAM

F5-BIGIP-APM-MIB.txt
F5-BIGIP-COMMON-MIB.txt
F5-BIGIP-GLOBAL-MIB.txt
F5-BIGIP-LOCAL-MIB.txt
F5-BIGIP-SYSTEM-MIB.txt
F5-BIGIP-WAM-MIB.txt

Mibleri incelediğimde almayı kararlaştırdığım metrikler şöyle;

Şase Fan
Şase Isı
Global Active Connections
Rx / Tx Bandwidth
Rx / Tx PPS
F5 vserver Rx / Tx Bandwidth
F5 vserver Rx / Tx Pps
F5 vserver Active Connections
F5 vserver Req/sec
F5 Cpu Kullanımı
F5 Memory Kullanımı
F5 Compression Kullanımı (Post/Pre)

Not : Siz ihtiyaçlarına göre listeyi genişletebilirsiniz.
Collectd tarafında snmp plugin ve write to graphite bölümlerini aktif etmeliyiz.

Not: Oid lerin hepsini miblerden snmptranslate ile elde ettim.

Örnek ;

snmptranslate -On F5-BIGIP-SYSTEM-MIB::sysHttpCompressionStatPostcompressBytes.0
.1.3.6.1.4.1.3375.2.1.1.2.22.3.0

#Yada ;

snmptranslate -On F5-BIGIP-SYSTEM-MIB::sysGlobalStat.sysStatMemoryUsed.0
.1.3.6.1.4.1.3375.2.1.1.2.1.45.0

Bu veriler ile collectd tarafını config ediyoruz.

#Graphite Tarafı

Burdaki en önemli unsur storage-schemas.conf Burdaki retention ile collectd tarafındaki retention match etmez ise metric grafikleriniz tutmaz dolayısı ile kopuk çizgiler görürsünüz. Burası önemli.

[Network]
pattern = .*\.snmp\.*
retentions = 5m:90d, 15m:1y, 30m:2y, 1h:4y, 24h:10y

Geri kalan bir çok detay mevcut bunlara döküman ve testler yaparak kullanışınız için en polished hale getirebilirsiniz. Tüm bunları tamamladıktan sonra daha detaylı incelemeye hazırız demektir.

Graphite Kullanımı

Öncelikle eklediğimiz metricleri birer örnek ile inceleyelim.

#Son 24 saat Post,Pre F5 compression değerleri scale 8 fonksiyonu ile byte değilde bit cinsinden görüntülenen hali

f5_compression

#Son 24 saat Bandwidth Rx/tx Aggregate interfaceler olduğundan 2.1 ve 2.2 interfacelerinin rx+rx tx+tx şeklinde alıyoruz ve scale 8 ile bit cinsinden gösteriyoruz.

f5bw

#Son 24 saat Bandwidth Rx/tx bu sefer vserver lardan bir tanesi için bw durumu

f5vserverbw

#Son 24 saat PPS Rx/tx Değerleri üstte bandwidth gösterdiğimiz aynı vserver için

f5vserverpps
#Son 24 Saat aynı vserver için http istek/saniye değeri

f5vserverreqsec

Gibi örneklendirebiliriz. Şimdi buraya kadar normal bir monitoring sisteminden farkı yok gibi duruyor değilmi? :) Graphite’ın en güçlü özellikler fonksiyonlarında gizlidir.

Örneklere şöyle başlıyabilirim;

timeshift() # Zaman dilimleri karşılaştırma

Alttaki örnekde fonksiyon kullanılmamış metrik son 24 saati ifade ediyor Kırmızı, Yeşil olan aynı zaman diliminin 7 gün öncesi, Mavi olanda aynı zaman diliminin 1 gün öncesi olarak karşılaştırma imkanı veriyor.
Böyle trafik,request,pps, connections, temp, cpu usage, memory aklınıza gelebilecek her metriği istediğiniz zaman dilimleri ile karşılaştırabilirsiniz.

timeshift_!

 highestcurrent() & lowestcurrent # Belirli Metrikteki en yüksek rakamları generate edenleri gösterir

Alttaki örnekde tüm istek/saniye metrikleri arasında en yüksek 6 tanesini gösteriyor. Böylece 1000 lerce vserverınız olan bir yapıda en çok http/istek oluşturan vserverlarınızı anlık görebilirsiniz.
Herhangi bir layer 7 http ddos saldırısı esnasında hemen farktan hangi vserver’a saldırı aldığınızı görebilirsiniz. Bir anomaly durumlarını tespit edebilir siniz.
Highest current ile normal günlük akışınızı zaten biraz gözlemleme ile çok rahat anlayabilirsiniz. Bu arada sadece bu kısımda değil tüm monitoring metriclerinde bunu kullanarak hangi makineniz en çok load average yapmış, hangisi en çok ram kullanıyor, bunlara tek bir satır yazarak görebilirsiniz böylece tüm grafikleri incelemenize gerek kalmaz. Ayrıca diğer bir ekranda da zaman dilimleri ile karşılaştırabilirsiniz.

Aynı şekilde lowestcurrent() fonksiyonu ile de en az şekilde kullanım gösteren değerleri belirttiğiniz metrik için kullanabilirsiniz.

highestcurrent

hitcount() #Az önce incelediğimiz grafikte görünün per second değerlerini toplayarak verilen zamanda toplam olarak ne elde ettiğimizi gösterir.

Bizim örneğimizde en çok http istek/saniye generate eden 6 vserver’ın requestlerini ayrı ayrı toplayarak verilen zamanda toplam kaç hit olduğunu gösterir.

hitcount

Bunun gibi bir çok yararlı ve çok işinize yarayabilecek fonksiyon mevcut graphite içinde. Biraz dökümantasyon ve test ile ne kadar güçlü olduğunu görebilirsiniz.

Şimdi yazımızın son kısmı Örnek bir Dashboard;

Örnek Dashboardumuz aşağıdaki gibi. Örnek gösterdiğimiz fonksiyonlarıda kullandık. Graphite için bir çok farklı dashboard seçeneği mevcut ben kendi dashboardunu kullanmayı tercih ediyorum.

dashboard

 

Yazımız biraz uzun oldu fakat çok ama çok yararlı olduğunu düşünüyorum. Biraz zaman harcayarak çok mükemmel anomaly tespit için dashboardlar yapmak mümkün. Belirttiğim gibi tek eksik tarafı alert mekanizması yok.

Var olanlarda ne yazık ki efektif çalışmıyorlar. İleride eklenirse ve properly çalıştığını gözlemlersem tekrar ekleyeceğim. Şimdilik tek çözüm render leyerek autoit gibi çözümler ile alerting.

Herhangi bir soru için email ile iletişime geçebilirsiniz.

 

Not: Bu arada daha önce bulamadığım alert mekanizması için nagios kullananlar var ise bunla ilgili bir python dosyası yapılmış. Test ettim başarılı çalışıyor fonksiyonlu grafiklerde dahi işe yarıyor.Böylece artık alert generate işlemide tamam demektir.

Graphite Alerting with Nagios

 

 

F5 Ltm Clone Pool Özelliği

İhtiyaç nedeni ile canlıdaki bir pool’dan trafiği clone_pool’ada mirror etmem gerekti. Bu switch den yada tap switch ile full network mirroring den daha az harcama ile bir çözüm. Ayrıca sadece clone lamak istediğiniz vserver/pool’u clone luyorsunuz.

Kısaca anlatarak açıklayacağım.;

Bir makineyi node olarak F5′e ekledim sonra clone_sniff adında bir pool yarattım ve bu yeni makineyi bu pool’a dahil ettim.

Daha sonra, trafiğini mirror etmek istediğim vserver ayarlarında clone_pool seçeneğinde clone_sniff’i bularak seçtim ve apply ettim.

Böylece, F5 X vserver’ına gelen tüm trafik aynı zamanda clone_sniff pool adı altında yer alan makineye mirrorlanmaya başladı.

Daha sonra makineye giderek tshark ile birlikte ufak bir shellscript yazarak ilerledim.

#!/bin/sh
DAY=$(date +%d);
MONTH=$(date +%m);
YEAR=$(date +%Y);
LOGDIR="/logs/${YEAR}/${MONTH}/${DAY}"
LOGFILE="${LOGDIR}/"
if [ ! -d ${LOGDIR} ]
then
    mkdir -p ${LOGDIR}
fi
/usr/bin/tshark -i eth0 -R "http.request" -T fields -e frame.time -T fields -e "ip.src" -e "http.request.method" -e "http.request.uri" > ${LOGDIR}/httpd.log

http trafiği alıyoruz, frameden zamanları alıyoruz, , source ip leri alıyoruz, request methodu alıyoruz, ve request uri alıyoruz filtrelendikten sonra httpd.log altına yazılmaktadır.

Örnek ;

May 24, 2011 17:34:51.401069000    11.11.11.11    GET    /favicon.ico
May 24, 2011 17:35:22.938430000    12.12.12.12    POST    /login.aspx

Not: Tshark 80k – 100k packet per second gibi değerlerde patlamalar yapıyor. Trafik çok ise başka şekillere bakın ntop,httpry falan gibi.

Aynı yöntem ile ids falanda çalıştırıp monitoring yapabilirsiniz.

clone_pool