BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

Web aplikacijų veikimo statistikos rinkimas ir analizė

Parašė Sergejus | 2011-07-10 22:22

Daž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 ServicesWorld Wide Web ServicesHealth and Diagnostics bei pažymėkite HTTP Logging ir Logging Tools;
    image
  • 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;
    image
  • atsiradusiame lange Actions skiltyje paspauskite Enable;
  • palikite visus nustatymus pagal nutylėjimą ir paspauskite Apply;
    image
  • 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.
    image

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

IIS 7 diegimo automatizavimas

Parašė Sergejus | 2011-04-03 22:55

Ar kada nors norėjote automatizuoti IIS 7 ir jo modulių diegimą? Žinokite, tai yra be galo paprasta, tereikia pasinaudoti standartne Windows programa Package Manager Command-Line (pkgmgr.exe):

pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing; IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;IIS-FTPPublishingService;IIS-FTPServer;IIS-FTPManagement;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI

Kaip matote, Package Manager pagalba galima sudiegti tik jums reikalingus IIS moduliu. Paprasta ir greita – dar vienas žingsnis pilno automatizavimo link.

Rodyk draugams

Kelios mintys atlikus masinį ASP.NET aplikacijų migravimą iš IIS6 į IIS7.5

Parašė Sergejus | 2011-03-20 23:13

Prieš kelias dienas teko migruoti virš 20 ASP.NET Web aplikacijų į naują serverį. Migracija buvo pakankamai rizikinga nes:

  • keitėsi operacijų sistema iš Windows Server 2003 į Windows Server 2008 R2;
  • keitėsi IIS versija iš 6.0 į 7.5;
  • keitėsi platforma iš 32-bitų į 64-bitų.

Kaip matote, pakeitimai pakankamai dideli, tad nusprendžiau pasidalinti migravimo patirtimi.

Žingsnis #1 – IIS struktūros bei nustatymų migravimas

Šito žingsnis tikslas numigruoti IIS6 metaduomenų bazę į IIS7.5. Tam pasinaudojome nemokamu įrankiu Microsoft Web Deploy 2.0, kurį sudiegėme tiek sename, tiek naujame serveriuose. Vienas pastebėtinas dalykas kurį atradome bandymų metu, pagal nutylėjimą Web Deploy eksportuoja tiek IIS struktūrą su visais nustatymais, tiek ir Web saitų turinį. Tai patogu kai dirbama su viena-dviem aplikacijomis, bet dirbant su daugiau tikimybė, kad kuris nors failas yra „in use“ ir negalės būti nukopijuotas – labai padidėja. Dėl šios priežasties Web Deploy mes naudojome tik IIS metaduomenų bazei numigruoti.

Įdomumo dėlei, pateiksiu eksportui ir importui naudotas Web Deploy komandas:

msdeploy -verb:sync -source:webserver60 -disableLink:contentExtension -dest:package="D:\Sites.zip",encryptPassword=yourpass

msdeploy -verb:sync -source:package=D:\Sites.zip,encryptpassword=yourpass -dest:webserver60

Žingsnis #2 – AppPool sutvarkymas

Kaip jau minėjau, mes ne tik migravome į naujesnę IIS versiją, bet ir į 64-bitų architektūrą. Tam kad minimizuoti galimas pasekmes, aplikacijų AppPool nurodėme:

Nustatymų korektiškumo patikrinimui pasirašiau labai paprastą aplikaciją, kuri nuskaito IIS konfigūraciją ir išveda ją į ekraną (apie ją jau rašiau).

Žingsnis #3 – Web aplikacijų turinio perkėlimas

Kadangi turinys turėjo būti perkeltas iš veikiančio serverio, kur dalis failų buvo „in use“, pasinaudojome paprasčiausiu NTBackup su Shadow Copy galimybe.

Žingsnis #4 – reikalingų teisių nustatymas

Nepaisant teorinio paprastumo, reikalingų teisių nustatymas yra pakankamai subtili užduotis, reikalaujanti gero pasiruošimo. Vertas dėmesio pagalbininkas – Powershell ir jo komanda

get-childitem d:\Site -recurse | get-acl

Žingsnis #5 – testavimas ir rastų problemų sprendimas

Kadangi migruojama buvo labai daug aplikacijų, reikėjo ir nemažai testuotojų (ačiū jiems). Rastos problemos buvo iš karto sutvarkomos ir pertestuojamos.

Kas toliau?

Kurį laiką stebėsime ar viskas gerai veikia. Tada kiekviena aplikacija bus ištestuota Integrated režimu ir 64-bitų procese, po ko galima bus pasinaudoti visais IIS7.5 teikiamais privalumais.

Tiek tos patirties, tikiuosi ši informacija jums pravers darant nuosavas migracijas. Klausimų bei pastabų laukiu komentaruose.

Rodyk draugams

Prieiga prie IIS7 konfigūracijos iš API

Parašė Sergejus | 2011-02-14 20:57

Kaip žinia, pradedant nuo 7 versijos IIS architektūra tapo modulinė, o visas konfigūravimas iš metaduomenų bazės buvo perkeltas į XML konfigūracijos failus. Bet nedaugelis žino, kad kartu atsirado ir .NET API, skirtas darbui su IIS. Minėtas API leidžia pasiekti daugelį IIS ir sudiegtų modulių nustatymus. Norėdami pradėti darbą su IIS7 API, užtenka pridėti nuorodą į biblioteką Microsoft.Web.Administration.dll iš katalogo %windir%\System32\inetsrv. API naudojimosi pavyzdys pateiktas žemiau:

var serverManager = new ServerManager();
foreach (var site in serverManager.Sites)
{
    Console.WriteLine("Site: {0}", site.Name);
    foreach (var app in site.Applications)
    {
        var appPool = serverManager.ApplicationPools[app.ApplicationPoolName];
        var info = new
        {
            Path = app.VirtualDirectories.First().PhysicalPath,
            Identity = appPool.ProcessModel.IdentityType == ProcessModelIdentityType.SpecificUser ?
                       appPool.ProcessModel.UserName :
                       appPool.ProcessModel.IdentityType.ToString(),
            AppPool = app.ApplicationPoolName,
            AppPoolMode = appPool.ManagedPipelineMode,
            Is32Bit = appPool.Enable32BitAppOnWin64,
            Framework = appPool.ManagedRuntimeVersion
        };

        Console.WriteLine(info);
    }
}

Aukščiau pateiktas kodas kiekvienam Web saitui išves:

  • fizinį kelią iki aplikacijos
  • vartotoją, kurio vardu veikia AppPool
  • aplikacijos naudojamą AppPool‘ą
  • požymį, kokiu režimu veikia AppPool (integruotas ar klasikinis)
  • architektūrą, kurioje veikia AppPool (x86 / x64)
  • naudojamo .NET Framework versijos numerį

Svarbu pažymėti, nors pateiktame pavyzdyje vyksta tik skaitymo operacijos, rašymo operacijos irgi yra palaikomas (pavyzdžiui, naujo saito pridėjimas). Apibendrinant, labai šaunu kad vis daugiau pagrindinių Windows Server komponentų įgauna .NET API, kas ypatingai palengvina tam tikrus automatizavimo scenarijus!

Rodyk draugams