Asp.net - comment surveiller le process aspnet_wp via une page web

Description

Dans de nombreuses configurations, il peut être utile d'afficher les informations pour la surveillance de son serveur WEB (cas d'hébergement par exemple) afin de voir les montées en charge, l'utilisation du framework, ...

Dans ce but, je vous livre une simple page ASPX, qui contient le nécessaire pour afficher les informations sur les 10 derniers process ASPNET ainsi que l'Uptime, IP, ...

Si une info particulière vous intéresse, n'hésitez pas à me le demander, ou développez le en vous inspirant de ce qui est dans cette page.

Source / Exemple :


<%@ Page Language="VB" ClientTarget="downlevel" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Net.Sockets" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.Diagnostics" %>

<script language="VB" runat="server">

' -----------------------------------------------------
Sub Page_Load(obj As object, e As eventargs)
 ' Chargement au démarrage de la page pour récuperer les informations
 AffProcessInfo()
 LabelMachine.Text = Server.MachineName
 LabelHostname.Text = Request.ServerVariables("SERVER_NAME")
 LabelIP.Text = IP(Server.MachineName)
 LabelUptime.Text = RecupUtime()

End Sub

    ' -----------------------------------------------------
    Private Sub AffProcessInfo()
        ' Lancement de la récupération des informations depuis le Serveur

        ' Déclaration des Objets nécessaires
        Dim mP As New ProcessModelInfo()
        Dim mPITab As ProcessInfo()
        Dim mPi As ProcessInfo
        Dim trET As New TableRow()
        Dim i As Integer = 1

        ' Chargement de l'historique (les 10 derniers lancements) des données sur le process ASP_NET
        mPITab = mP.GetHistory(10)

        ' Mise en forme de la Premiere ligne
        trET.BackColor = System.Drawing.Color.Beige
        trET.Font.Bold = True
        trET.ForeColor = System.Drawing.Color.DarkBlue

        ' Ajout des Noms de Colonne et Ajout de la ligne dans le Tableau
        AddCell(trET, "N°")
        AddCell(trET, "ID")
        AddCell(trET, "Age")
        AddCell(trET, "Mémoire max utilisée")
        AddCell(trET, "Nbr requêtes")
        AddCell(trET, "Date début")
        AddCell(trET, "Statut")
        AddCell(trET, "Raison échec")
        tbProcess.Rows.Add(trET)

        ' Boucle de lecture et d'affichage dans le tableau des Informations sur les Process
        For Each mPi In mPITab
            Dim tr As New TableRow()

            AddCell(tr, i) ' Ajoute le N° de l'historique
            AddCell(tr, mPi.ProcessID.ToString) ' Affiche l'ID du process
            AddCell(tr, AfficheAge(mPi.Age)) 'Affiche l'âge du process en Détail
            AddCell(tr, AfficheTaille(mPi.PeakMemoryUsed)) 'Affiche la mémoire maximale utilisée
            AddCell(tr, mPi.RequestCount.ToString) 'nombre de requête traitées
            AddCell(tr, mPi.StartTime.ToString) 'la date du début du process
            AddCell(tr, mPi.Status.ToString) 'son statut
            AddCell(tr, mPi.ShutdownReason.ToString) 'la raison de son arrêt

            tbProcess.Rows.Add(tr)
            i += 1
        Next
    End Sub

    ' -----------------------------------------------------
    Private Sub AddCell(ByVal tr As TableRow, ByVal sM As String)
        'Ajoute une cellule dans la ligne du tableau
        Dim td As New TableCell()
        td.Text = sM
        tr.Cells.Add(td)
    End Sub

    ' -----------------------------------------------------
    Private Function AfficheAge(ByVal LeTimeSpan As TimeSpan) As String
        ' Affiche le temps en détail de vie du process ASPNET
        Dim Retour As String = ""
        Retour = TestZero(LeTimeSpan.Days, "J", False)
        Retour &= " " & TestZero(LeTimeSpan.Hours, "H", False)
        Retour &= " " & TestZero(LeTimeSpan.Minutes, "M", False)
        Retour &= " " & TestZero(LeTimeSpan.Seconds, "S", False)
        Retour &= " " & TestZero(LeTimeSpan.Milliseconds, "mS", False)

        Return Retour
    End Function

    ' -----------------------------------------------------
    Private Function AfficheTaille(ByVal TailleMemoire As Integer) As String
        ' Crée le détail de la taille des données 
        Dim TailleGO As Double = 0
        Dim TailleMO As Double = 0
        Dim TailleKO As Double = 0
        Dim Retour As String = ""

        TailleGO = (TailleMemoire / 1048576) ' Nombre de Giga Octets
        TailleMO = (TailleGO - Int(TailleGO)) * 1024 ' Nombre de Mega Octets
        TailleKO = (TailleMO - Int(TailleMO)) * 1024 ' Nombre de Kilo Octets

        Retour = TestZero(TailleGO, "Go", False)
        Retour &= " " & TestZero(TailleMO, "Mo", False)
        Retour &= " " & TestZero(TailleKO, "Ko", False)

        Return Retour
    End Function

    ' -----------------------------------------------------
    Private Function TestZero(ByVal Lavaleur As Integer, ByVal LUnite As String, ByVal TestPlur As Boolean) As String
        ' Vérifie la valeur est supérieure à 1 et affiche le pluriel
        If Lavaleur > 1 And TestPlur = True Then
            Return Lavaleur & " " & LUnite & "s"
        ElseIf Lavaleur > 0 Then
            Return Lavaleur & " " & LUnite
        End If
    End Function

    ' -----------------------------------------------------
    Private Function IP(ByVal adIp As String) As String
        ' Recupère l'IP de la machine
        Dim myIP As IPHostEntry = Dns.Resolve(adIp)
        Dim sIP As String
        'sIP = ("HostName :" & myIP.HostName & "<br>")
        sIP += (myIP.AddressList(0).ToString)

        Return sIP
    End Function

    ' -----------------------------------------------------
    Private Function RecupUtime() As String
        ' Recupère l'Uptime de la machine
        Dim retour As String = ""
        Dim pc As New PerformanceCounter("System", "System Up Time")
        pc.NextValue()

        Dim ts As TimeSpan = TimeSpan.FromSeconds(pc.NextValue())
        retour = TestZero(ts.Days, "Jour", True)
        retour &= " " & TestZero(ts.Hours, "Heure", True)
        retour &= " " & TestZero(ts.Minutes, "Minute", True)
        retour &= " " & TestZero(ts.Seconds, "Seconde", True)
        retour &= " " & TestZero(ts.Milliseconds, "MilliSeconde", True)

        Return retour
    End Function
    ' -----------------------------------------------------

</script>
<html>
<head>
<title>Process Info</title>
</head>
<body bgColor="whitesmoke">
 <form id="Form1" method="post" runat="server">
  <P align="center"><asp:label id="Label1" runat="server" Width="100%" ForeColor="Navy" Font-Bold="True" Font-Names="Times New Roman" Font-Size="Medium" Font-Underline="True">Status des Derniers lancements du Process ASPNET</asp:label></P>
  <br>
   <table width="100%">
   <tr>
    <td width="20%"><b>Machine : </b></td>
    <td><asp:Label id="LabelMachine" runat="server" Width="100%">Label</asp:Label></td>
   </tr>
   <tr>
    <td width="20%"><b>Host Header Name : </b></td>
    <td><asp:Label id="LabelHostname" runat="server" Width="100%">Label</asp:Label></td>
   </tr>
   <TR>
    <td width="20%"><b>IP : </b></td>
    <td><asp:Label id="LabelIP" runat="server" Width="100%">Label</asp:Label></td>
   </TR>
   <TR>
    <td width="20%"><b>Uptime : </b></td>
    <td><asp:Label id="LabelUptime" runat="server" Width="100%">Label</asp:Label></td>
   </TR>
  </table>
  <br><p>
  <asp:Table id="tbProcess" runat="server" CellPadding="1" BorderStyle="Double" BorderColor="Gray" BackColor="LightGray" ForeColor="Navy" HorizontalAlign="Center" Width="95%"></asp:Table></p> </form>
</body>
</html>

Conclusion :


Tout est dans le code.

Dans le ZIP, vous avez la version en un seul fichier ASPX a simplement placer sur le serveur, mais aussi le binome ASPX/ASPX.VB avec le code behind à insérer dans un projet existant.

Cette source est basée sur l'article très intéressant de c2i.fr visible ici :
- http://www.c2i.fr/code.aspx?IDCode=361

Bon coding.

Romelard Fabrice (Alias F___)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.