Web aplikacijų veikimo statistikos rinkimas ir analizė
Parašė Sergejus | 2011-07-10 22:22Dažnai Web aplikacijų stebėjimas susiveda vien į pranešimų apie klaidas analizę. Dar geriau būtų turėti ir tam tikrą statistinę informaciją apie Web aplikacijos veikimą, pavyzdžiui, lėčiausiai besikraunančius puslapius, puslapius su daugiausia klaidų, populiariausius puslapius ir panašiai. Tokia informacija leidžia kur kas geriau įsivaizduoti realią situaciją ir kartais padeda net užbėgti problemoms už akių.
Norėdami pradėti kaupti ir analizuoti Web aplikacijų veikimo statistiką, reikia:
- suinstaliuoti IIS modulius HTTP Logging ir Logging Tools;
- įjungti žurnalizavimą (angl. logging) norimai Web aplikacijai;
- pasinaudoti programa Log Parser duomenų gavimui bei statistikos paruošimui.
IIS modulių instaliavimas
Norėdami suinstaliuoti naujus IIS modulius:
- Control Panel pasirinkite Programs and Features bei paspauskite Turn Windows features on or off;
- nueikite į Internet Information Services → World Wide Web Services → Health and Diagnostics bei pažymėkite HTTP Logging ir Logging Tools;
- paspauskite OK ir sulaukite modulio instaliavimo pabaigos.
Žurnalizavimo įjungimas
Norėdami įjungti ir sukonfigūruoti IIS žurnalizavimą:
- nueikite į Internet Information Services Manager (intmgr) ir pasirinkite norimą Web aplikaciją;
- paspauskite du kartus ant Logging;
- atsiradusiame lange Actions skiltyje paspauskite Enable;
- palikite visus nustatymus pagal nutylėjimą ir paspauskite Apply;
- atkreipkite dėmesį kur bus saugoma informacija (%SystemDrive%\inetpub\logs\LogFiles), patogumo dėlei rekomenduoju pakeisti katalogą (pvz., D:\Logs);
- norėdami pamatyti kokia informacija bus renkama, paspauskite mygtuką Select Fields.
Duomenų gavimas ir statistikos paruošimas
Darbui su IIS žurnalu bus reikalinga nemokama programa iš Microsoft – Log Parser 2.2. Log Parser darbui su duomenimis naudoja į SQL panašią sintaksę, žemiau pateiksiu keletą pavyzdžių.
Top 10 puslapių su klaida HTTP500
logparser -i iisw3c "select top 10 cs-uri-stem as url, count(cs-uri-stem) as count from D:\Logs\ex110624.log where sc-status >= 500 group by url order by count(url) desc"
Top 10 puslapių kurie kraunasi ilgiau nei 2 sekundes
logparser -i iisw3c "select top 10 cs-uri-stem as url, avg(time-taken) as responsetime from D:\Logs\ex110624.log where extract_extension(cs-uri-stem) in (’asp’;'aspx’) group by url having responsetime > 2000 order by responsetime desc"
Top 10 populiariausių Web aplikacijų
logparser -i iisw3c "select top 10 substr(extract_prefix(cs-uri-stem, 1, ‘/’),1) as application, count(application) as count from D:\Logs\ex110624.log where extract_extension(cs-uri-stem) in (’asp’;'aspx’;’svc’;”) group by application, application order by count(application) desc"
Bonusas – statistikos rinkimo automatizavimas
Kaip matote, Web aplikacijų statistikos gavimas yra pakankamai paprasta užduotis, tereikia aprašyti tinkamas užklausas. Sekantis žingsnis galėtų būti aplikacijos sukūrimas, kuri Log Parser pagalba surinktų visą reikalingą statistiką ir pateiktų patogiu formatu. Šiuo tikslu aš sukūriau labai paprastą IisLogParser klasę:
public class IisLogParser { private readonly string _logParserPath; public IisLogParser() : this("logparser.exe") { } public IisLogParser(string logParserPath) { _logParserPath = logParserPath; } public IEnumerable<string> ParseLog(string query) { var tmpFilePath = Path.GetTempFileName(); try { query = query.Replace(" from ", " into " + tmpFilePath + " from "); var processInfo = new ProcessStartInfo { FileName = _logParserPath, Arguments = "-i iisw3c -o csv \"" + query + "\" -tabs:on -headers:off", CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, }; var proc = new Process { StartInfo = processInfo }; proc.Start(); proc.WaitForExit(); if (new FileInfo(tmpFilePath).Length == 0) { throw new Exception("Output file is empty. Check query for correctness."); } return File.ReadAllLines(tmpFilePath); } finally { if (File.Exists(tmpFilePath)) { File.Delete(tmpFilePath); } } } }
Kaip matote, aš pasinaudojau Log Parser galimybe eksportuoti duomenis CSV formatu ir grąžinu eilučių sąrašą. Šios klasės panaudojimas galėtų atrodyti taip (naudojama prieš tai aprašyta užklausa Top 10 puslapių su klaida HTTP500):
class Program { private const string LogPath = @"D:\Logs\ex110624.log"; static void Main() { var logParser = new IisLogParser(@"c:\Program Files (x86)\Log Parser 2.2\LogParser.exe"); var query = String.Format( "select top {0} cs-uri-stem as url, count(cs-uri-stem) as count " + "from {1} where sc-status >= 500 " + "group by url " + "order by count(url) desc", 10, LogPath); var result = from item in logParser.ParseLog(query) let values = SplitValues(item) select new { Url = values[0], Count = Int32.Parse(values[1]) }; } private static string[] SplitValues(string item) { return item.Split(new[] { ",\t" }, StringSplitOptions.None); } }
Pabaigai…
Kaip tinkamai pasinaudoti šia informacija? Aš, pavyzdžiui, sukūriau Web aplikaciją kuri paeiliui rodo įvairiausią mūsų Web serverio statistiką. Kitą savaitę planuoju paleisti ją darbe ant televizoriaus ekrano ir taip vizualizuoti mūsų potencialias problemas. O kaip jus panaudotume tokius duomenis?
Rodyk draugams





Naujausi komentarai