27 Mayıs 2014 Salı

Web uygulama performansı: IIS / W3C Logları ile hata ayıklama ve iyileştirme

İhtiyaç duyulabilecek ısaltma açıklamarı:
*W3C: World wide web consortium : http://en.wikipedia.org/wiki/World_Wide_Web_Consortium
*UTC : Coordinated universal time: http://en.wikipedia.org/wiki/Coordinated_Universal_Time
*IIS : Internet informatiın services  http://en.wikipedia.org/wiki/Internet_Information_Services

-Son dakika proje kurtartma yazısı değildir.

IIS üzerinde sunulan web/servis uygulamaları için loglamanın faydaları:
-Kullanım (en az/çok ziyaret alan sayfalar, css ve scriptler),
-Performans (yavaş sayfalar [network gecikmeleri dahil]),https://logparserplus.com/examples/
-Hata (Sayfa bulunamadı ve çalışma zamanı hataları gibi)
-Güvenlik (istek bilgilerine göre [query veya header]) hacking girişimleri

Buradaki süreç,
-IIS üzerinde log kaydı tutmak için tanımlar: Konum, içerik formatı, dosya formatı, tarih, büyüklük.
-Log tutulacak alanların yapılacak analiz türüne göre seçimi.
-Standart olmayan durumlar için ekstra geliştirmeler (advanced logging özellikleri)
-Logların analiz edilebilir duruma getirilmesi: Log analizi için kullanılabilecek araç ve yöntemler
-Analiz sürecinde çıkarımlar yapıp icraate dönüştürme.
-Loglardaki http status, win status ve user agent bilgilerini anlamlandırma


IIS üzerinde log kaydı tutmak için tanımlar (configuration)


IIS üzerinden standart log (Logging), Advanced Logging (IIS 7 sonrası extension olarak) ya da Failed Request Tracing Rules ile daha detaylı loglar tutulup analiz edilebilir





Canlı ortamda yüksek trafik varsa web sunuculara yük olmaması açısından loglar Load balancer (Netscaler, F5 vs) üzerinde tanım yapılarak kullanılabilir.
Netscaler üzerindeki ayarlamalar ve hangi bilgilerin tutlabileceği için: http://support.citrix.com/proddocs/topic/ns-system-10-map/ns-ag-wsl-wrapper-con.html
NetScaler makale ve destek sayfası:
http://www.citrix.com/support (NetScaler seçimiyle)
Netscaler log konfigurasyonu
http://support.citrix.com/proddocs/topic/ns-system-10-map/ns-ag-wsl-understand-ncsa-w3c-log-format-con.html

Daha detaylı bir log için (header, server variable bilgisi) geçici olarak IIS log kullanılabilir.


Log tutulacak alanların yapılacak analiz türüne göre seçimi

Standart loglama için kaydı tutulabilecek alanlar;

W3C alanları ve açıklamaları:

Date (date)
Time (time)
Client IP Address (c-ip)
User Name (cs-username)
Service Name (s-sitename)
Server Name (s-computername)
Server IP Address (s-ip)
Server Port (s-port)
Method (cs-method)
URI Stem (cs-uri-stem)
URI Query (cs-uri-query)
Protocol Status (sc-status)
Protocol Sub-status (sc-substatus)
Win32 Status (sc-win32-status)
Bytes Sent (sc-bytes)
Bytes Received (cs-bytes)
Time Taken (time-taken)
Protocol Version (cs-version)
Host (cs-host):
User Agent (cs(UserAgent))
Cookie (cs(Cookie))

Referer (cs(Referer))

Açıklamalar için:
http://technet.microsoft.com/en-us/library/cc754702(v=ws.10).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa814385(v=vs.85).aspx

Netsclaler üzerinde log tutulan alanlar aşağıdaki gibi;

#Version: 1.0
#Software: Netscaler Web Logging(NSWL)
#Date: 2014-03-16 00:00:00
#Fields: date time c-ip cs-username sc-servicename s-ip s-port cs-method cs-uri-stem cs-uri-query sc-status cs-bytes sc-bytes time-taken cs-version cs(User-Agent) cs(Cookie) cs(Referer)

Time değeri UTC ye göredir.

Log başlıklarındaki kısaltmalar:
s-  : Server actions.
c-  : Client actions.
cs- : Client-to-server actions.
sc-:  Server-to-client actions.

IIS 8.5 ile Built-in (standart W3C alanları) haricinde
-Request Header: Örneğin load balancer arkasında olan sunucular için isteği yapanın gerçek IP bilgisi:X-FORWARDED_FOR
-Response Header
-Server Variable : http://msdn.microsoft.com/library/ms524602.aspx
alanları da loglanabilir.

Advanced Logging ile ektra:

-Module (BeginRequestUTC, EndRequestUTC)
-Performance Counter
alanları da loglanabilir.

Time Taken ile ilgili görüşler

-(Netscaler üzerinde) Tame taken kolon olarak bulunmasına rağmen 0 olarak tutuluyor.
-Tame taken, gelen istediğin header bilgileriyle birlikte alınmasından yanıtın istemcide tamamlandığı ana kadar geçen sürenin milisaniye cinsinden süresidir. Dolayısıyle network üzerinde geçen sürede dahildir ve sunucu taraftalı iyileştirmelerde net iyileştirme bilgileri vermez.

Time taken, ip ve response size a bakarak hız tespiti yapılabilir. İlgili ip ne kadarlık bilgiyi ne kadar sürede almış. İp geolocation tespiti ile ISP ve uzaklık bazında hız raporları oluştrulabilir.

Diğer öneriler.
http://rothmanshore.com/2011/04/22/performance-yes-time-taken-in-iis-includes-network-time/
Geolocation tespiti (detay!):
http://rothmanshore.com/2011/02/25/troubleshooting-akamai-how-to-geolocate-an-ip-address/

Time taken hesaplama mantığı
http://support.microsoft.com/kb/944884/en-us
Ek: Her istek için uygulama üzerinden üretilecek çalışma süresi header bilgisine eklenip loglanması sağlanarak sunucu tarafında uzun süren istekler analiz edilebilir. (Detaylar aşağıda)


Standart olmayan durumlar için ekstra geliştirmeler 

IIS 7 ve sonrası yenilikleri, gelişmiş konular

What’s new in IIS 8.5 - Microsoft Internet Information Services 8.5 New Features
http://blogs.msdn.com/b/benjaminperkins/archive/2013/06/25/what-s-new-in-iis-8-5.aspx

Advanced Logging: IIS 7 ve sonrası için gelen extension ile
(kurulum: http://www.iis.net/downloads/microsoft/advanced-logging)

-Custom logging: Uygulama üzerinde üretilecek ek alanların loglanması.
Advanced Logging for IIS - Custom Logging: Uygulama tarafından üretilecek ek alanları loglamak
(Örneğin sayfasın üretilmesi süresi header a eklenerek uavaş sayfaların tespiyi için loglanması sağlanabilir)
http://www.iis.net/learn/extensions/advanced-logging-module/advanced-logging-for-iis-custom-logging

-Request filtering. Loglanacak bilginin üzerinde filtre uygulanması
Advanced Logging for IIS - Log Filtering
http://www.iis.net/learn/extensions/advanced-logging-module/advanced-logging-for-iis-log-filtering

-Real-time logging. Module yazılarak anlık trafik takibi yapılması sağlar
IIS Module yazarak realtime event takip etme. (C++ örneği ile):
Advanced Logging for IIS - Real-Time Logging
http://www.iis.net/learn/extensions/advanced-logging-module/advanced-logging-for-iis-real-time-logging

-Client logging: İstemci üzerindeki kullanıcının davranışlarını loglamak için oluşan veriyi belirli bir formatta HTTTP Posta gönderdip loglanması
İstemci tarafıda üretilmiş bilgileri belirli bir xml formatında HTTP Post ile loglamak için (Silverlight, Flash, Media streaming gibi [istemci performans / kullanm bilgileri]

-Event Tracing : Loglama hedefi olarak dosya / ETW ya da ikisi olarak seçim
http://www.iis.net/learn/get-started/whats-new-in-iis-85/logging-to-etw-in-iis-85


Failed Request Tracing

IIS 7 ve sonrasında IIS kurulumu ile birlikte Failed Trace Logging kurulabilir.
Kurulum için: http://www.iis.net/configreference/system.webserver/tracing/tracefailedrequests

FRT ile her bir loglama kuralı olarak istenen içerik tipine göre (uzantı / url şablonu)
-Http status koduna göre
-İsteğin süresine göre (time-taken)
-Event log seviyesine göre
istenen web istekleri loglanır ve çeşitli kriterlere göre trace bilgileri verir.


Logların analiz edilebilir duruma getirilmesi


Log boyutu büyük değilse işlemci gücüne göre 100 MB altı için direk LogParser kullanılabilir.
Aksi halde log dosyalarının Sql server'a import edilerek sorgu yapılması (duruma göre text index leriyle beraber) daha hızlı olacaktır.

Log analiz aracı: LogParser


Tutulan logları text dosyadan csv yada veritabanına sorgular üzerinden kaydetmek, dönüştürmek için:
Log Parser 2.2
http://www.microsoft.com/en-us/download/details.aspx?id=24659
Log Parser dökümantasyon
http://technet.microsoft.com/en-us/library/bb878032.aspx
Log Parser forum:
http://forums.iis.net/default.aspx/51?Logparser+Forums


Örnek LogParser sorgusu: İstenen alanların seçilip iisnslog20140324 tablosuna yazılması

LogParser "SELECT time, c-ip, s-ip, cs-uri-stem, cs-uri-query, sc-status, cs-bytes, sc-bytes, cs(User-Agent), cs(Cookie), cs(Referer) INTO iisnslog20140324 FROM C:\iislogs\20140324w\*.*" -i:W3C -o:SQL -server:. -database:iislog -driver:"SQL Server" -username:sa -password:Pass -createTable:ON


LogParser çıktısı:

Statistics:
-----------
Elements processed: 25739101
Elements output:    25739101
Execution time:     18218.84 seconds (05:03:38.84)

C:\WINDOWS\system32>

[Yani yakşalık 25 milyon katıt i7 işlemcide 5 saat kadar sürüyor (sql ve logparser aynı makinada)]

LogParser çalıştırılırken kayıtları ekleyeceği tablo -createTable:ON ile otomatik oluşturmasıda sağlanabilir yada index tanımlamak için (çok sayıda kayıt üzerinde hızlı sorgulama için) önceden tablo oluşturulabilir.

Örnek bir tablo ve index oluşturma script'i:
Sql Server, IIS (NetScaler log için tablo oluşturma, user agent, url ve status code indexleri ile beraber)

//****************************************************************
CREATE TABLE [dbo].[iisnslog](
 [id] [int] IDENTITY(1,1) NOT NULL,
 [time] [datetime] NULL,
 [cIp] [varchar](255) NULL,
 [sIp] [varchar](255) NULL,
 [csUriStem] [varchar](255) NULL,
 [csUriQuery] [varchar](255) NULL,
 [scStatus] [int] NULL,
 [csBytes] [int] NULL,
 [scBytes] [int] NULL,
 [csUserAgent] [varchar](255) NULL,
 [csCookie] [varchar](255) NULL,
 [csReferer] [varchar](255) NULL,
 CONSTRAINT [PK_iisnslog] PRIMARY KEY CLUSTERED
(
 [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [IX_iisnslog_uristem] ON [dbo].[iisnslog]
(
[csUriStem] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO


CREATE NONCLUSTERED INDEX [IX_iisnslog_agent] ON [dbo].[iisnslog]
(
[csUserAgent] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [IX_iisnslog_status] ON [dbo].[iisnslog]
(
[scStatus] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

//****************************************************************


Sorgu örnekleri
https://mlichtenberg.wordpress.com/2011/02/03/log-parser-rocks-more-than-50-examples/

Analiz sürecinde çıkarımlar yapıp icraate dönüştürme.


Performans loglarını grafik yardımıyla yorumlamak [detay!!]:
Performance Tuning: Visualize your web log performance data using Excel scatter plots
http://rothmanshore.com/2010/12/07/performance-tuning-visualize-your-web-log-performance-data-using-excel-scatter-plots/

Sql sorguları ile: [detay!!: Kullanım alanları ve örnek sql ler eklenecek]

-Hataya düşen sayfalar (Http 5xx)
-Bulunamayan sayfalr (Http 404)
-Arama motoru (bot) erişim sayıları ve frekansları
-Arama motorlarından tarama yapılmasının istenmeyeceği url tespitleri

Hazır batch sorgu dosyaları ile:
-En çok istek yapılan url'ler
-En çok istek yapan IP(ler)
-En çok istek yapan user-agent (bot)(lar)
-Http Status'e göre gruplanmış istek sayıları
-İstenen Http status'e göre istek yapılan url ve isteği yapan bilgileri
-En uzun süren istekler (ortalama değere göre, istemci hızı ve network dikkate alınarak)
http://www.peterviola.com/automate-log-parser-to-find-your-data-faster/

Log Parser ile alınabilecek örnek kayıtlar
http://blogs.msdn.com/b/carlosag/archive/2010/03/25/analyze-your-iis-log-files-favorite-log-parser-queries.aspx
Log Parser örnekleri - hack vs durumları için şablon raporlar
http://technet.microsoft.com/en-us/library/ee692937.aspx
Kapsamlı bir liste:
http://logparserplus.com/Examples
Time taken özelinde sorgular
http://blogs.msdn.com/b/carloc/archive/2008/07/20/time-taken-and-logparser-for-web-site-statistics.aspx
Baştan sona tüm sürecin anlatıldığı kaynak: IIS log kurulumunda (IIS 6, temelde aynı) örneklerle logların analiz edilmesine:


Ek: Loglardaki http status, win status ve user agent bilgilerini anlamlandırma


User agent bilgisi

User agent içerik detayları ve listesi için:

Google bot ve robots.txt 


Google bot un hangi url leri craw ettiği görülür ve gereksiz olanlar için robots.txt ye Disallow rule eklenebilir.
Örneğin haber olman sayfalar için

User-Agent: Googlebot-News
Disallow: /foto-galeri/
Not : Google'ın kendi dökümanlarında olmasına rağmen işe yaramıyor


Google tarafından bot olarak gelebilecek User agent'lar: (2014-03-19 tarihi itibariyle)
https://support.google.com/webmasters/answer/1061943?hl=en
https://developers.google.com/webmasters/smartphone-sites/googlebot-mobile

Google Web search
-Mozilla/5.0+(compatible;+Googlebot/2.1;++http://www.google.com/bot.html)
-Mozilla/5.0+(compatible;+Googlebot/2.1;+http://www.google.com/bot.html)
-Googlebot/2.1+(http://www.googlebot.com/bot.html)

Smart Phone crawler
-Mozilla/5.0+(iPhone;+CPU+iPhone+OS+6_0+like+Mac+OS+X)+AppleWebKit/536.26+(KHTML,+like+Gecko)+Version/6.0+Mobile/10A5376e+Safari/8536.25+(compatible;+Googlebot/2.1;++http://www.google.com/bot.html)
Feature Phone
-SAMSUNG-SGH-E250/1.0+Profile/MIDP-2.0+Configuration/CLDC-1.1+UP.Browser/6.2.3.3.c.1.101+(GUI)+MMP/2.0+(compatible;+Googlebot-
Mobile/2.1;++http://www.google.com/bot.html)
Feature Phone
-DoCoMo/2.0+N905i(c100;TB;W24H16)+(compatible;+Googlebot-
Mobile/2.1;++http://www.google.com/bot.html)

-Googlebot-Image/1.0


facebook bot: Paylaşılan içeriğin meta bilgilerini almak almak için yada mobil uygulamada uygulama içinde paylaşılan sayfayı açmak için kullanılan user agent bilgisi.
facebookexternalhit/1.0+(+http://www.facebook.com/externalhit_uatext.php)
facebookexternalhit/1.1+(+http://www.facebook.com/externalhit_uatext.php)


Robots.txt şekillendirme
https://developers.google.com/webmasters/control-crawl-index/docs/robots_txt
http://tools.seobook.com/robots-txt/
Http header ile noindex belirtimi (örneğin ajax responselar için [title olmayan durumlarda] )
https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag?csw=1


Http Status Kodları


http://en.wikipedia.org/wiki/HTTP_status_codes

Http 206 Partial Content : The server is delivering only part of the resource due to a range header sent by the client. The range header is used by tools like wget to enable resuming of interrupted downloads, or split a download into multiple simultaneous streams
Http 301 Moved Permanently
Http 304 Not modified

Win32Status: System Error Codes:
http://msdn.microsoft.com/en-us/library/ms681381.aspx



Hata sayfaları için alternatif raporlama geliştirmek:

Hata sayfaları (500+) ve sayfa bulunamadı hatalarını (404) Google Analytics den takip etmek:
Http 200 harici durumlar için gösterilen sayfa başka yere yönlendirmeden kendi hata kodu (404, 501 vs) ile verilip Title olarak ilgili duruma uygun bi açıklama yazılırsa google analytics de ona uygun rapor üretilebilir.
Not: Sadece browser üzerinden görüntülen sayfalar (GA script'in çalıştığı) durumlarda işe yarar. Örneğin herhangi bir Bot un isteyip bulamadığı sayfa için yine IIS logları incelenmeli yada ilgili bot'un, örneğin Google-bot için sağlanan araç kullanılmalı, Google Web masters tools yada Bing web masters tools.

Ürünler / Araçlar

Ücretsiz
http://awstats.sourceforge.net  : Free real-time logfile analyzer to get advanced statistics
http://www.apacheviewer.com : Apache Logs Viewer (ALV) is a free and powerful tool which lets you monitor, view and analyze Apache/IIS logs with more ease
Diğer
http://www.lizard-labs.net/
Log Parser Studio
http://blogs.technet.com/b/exchange/archive/2012/03/07/introducing-log-parser-studio.aspx
http://blogs.technet.com/b/exchange/archive/2013/06/17/log-parser-studio-2-2-is-now-available.aspx
Son versiyon
https://blogs.msdn.microsoft.com/friis/2014/02/06/how-to-analyse-iis-logs-using-logparser-logparser-studio/

Microsoft SQL Server Report Pack for Internet Information Services (IIS) - 12 farklı raporun reporting services üzerinde hazır hali.
http://www.microsoft.com/en-us/download/details.aspx?id=22965

Ücretli
SmarterStats has over 100 different report items that analyze website traffic....
http://www.smartertools.com
IIS Log rapor üretme
http://www.weblogexpert.com/
Log Parser tabanlı yarı ücretsiz GUI
http://www.lizard-labs.net/log_parser_lizard.aspx
Ücretli GUI
http://www.smartertools.com/smarterstats/web-analytics-seo-software.aspx
Ücretli:
http://www.iislogs.com/




Hiç yorum yok: