Translate

четвртак, 28. јануар 2016.

skripta za monitoring web resursa

Dostupnost Web stranice, WebAPI-ja/Servisa ili bilo kog drugog resursa  koji hostujete na Webu-u je izuzetno kritična i važna stavka u administraciji sistema. Zbog Marfijevog zakona, u jednom trenutku će se desiti da Web resursi jednostavno postanu nedostupni iz nepoznatog razloga, a vi nećete ni biti svesni dok telefoni ne počnu da zvone.

U nastavku se nalazi primer skripte koja služi kao monitoring, log i alert sistem koja može da prati dostupnost i vreme odziva bilo kog resursa na webu, šalje email obaveštenje o statusu i upisuje log u bazu. U mom slučaju i ovom primeru skripta nadgleda Web Servise

#U mom slučaju pristup bilo kom Web servisu zahteva Log-In sekvencu koja vraća token za autentifikaciju tako da sam ja na samom početku skripte pozvao LoginServis sa mojim kredencijalima pomoću cmdleta Invoke-RestMethod koji automatski parsira JSON formatirane stringove i njihove vrednosti pakuje u ps objekte

$Login = Invoke-RestMethod -Uri http://mojLoginUrlServis?Username=mojusername"&"Password=mojpass

#Moj username i accsess Token za pozivanje drugih Servisa dobijeni Login sekvencom
$Token = $Login.Token
$Username = $Login.Username

#Dodatni parametri koji zahtevaju WebServisi
$Params = @{username = $Username;token=$Token;page = 0;Delatnost='ninja';Grad="Beograd"}

$datetime = ' '

#Podešavanja email klijenta
$From = "sender@gmail.com" 
$To = "receiver@gmail.com"
$Subject = "Web API is offline"
$SMTPServer = "smtp.gmail.com"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("email-username", "email-password");
$Body = ""
$SendMail = 0

$HTTP_Status = ' '

#.txt fajl u kom se nalaze putanje do resursa koji se nadgledaju 
$content = Get-Content -Path "url.txt"

$conn = New-Object System.Data.SqlClient.SqlConnection
#SQL connecton string 
$conn.ConnectionString = "Data Source=xxx.xxx.xxx.xxx; Initial Catalog = DbName; User ID = DbUser; Password = DbPassword"

$conn.open()

foreach ($url in $content) {
    $datetime = Get-Date 
#Merenje vremena odziva Servisa
    $time =  Measure-Command -Expression {
    try { 

       $HTTP_Request =  Invoke-WebRequest -Uri $url -Body $params -ErrorAction SilentlyContinue
       $HTTP_Status = $HTTP_Request.StatusCode

#U ps-u ako HTTPREQUEST vrati rezultat različit od 200 (200 = Servis je dostupan), rezultat se tretira kao exception i skripta puca ukoliko se na cmdletu koji izaziva grešku ne postavi -ErrorAction SilentlyContinue
    
                 $online = 1       
    }
    catch {

#Blok koji hendluje grešku i kreira tekst email obaveštenja a takodje uzima i ResponseCode koji pomaže prilikom dijagnostikovanja greške

    $HTTP_Status = $_.Exception.Response.StatusCode.Value__
    $Body = $Body + "Webservice: " + $url + " is offline Time:"+ $datetime + " Reason: " +  $_.Exception.Response.StatusCode.Value__ + "r`n"                
                    $online = 0     
         }
     }

 #Upisivanje log-a u Bazu
    $response_time = $time.TotalSeconds
    $cmd = New-Object System.Data.SqlClient.SqlCommand
    $cmd.connection = $conn
    $cmd.CommandText = "INSERT INTO Monitoring (Url,Online,Response_time,Date,Response_code) VALUES('{0}','{1}','{2}','{3}','{4}')" -f $url,$online,$response_time,$datetime,$HTTP_Status
    $cmd.ExecuteNonQueryAsync() | Out-Null 
}
  if($SendMail -eq 1){
 #Slanje email notifikacije
         $SMTPMessage = New-Object System.Net.Mail.MailMessage($From,$To,$Subject,$Body)
         $SMTPClient.Send($SMTPMessage)

        }
  $conn.Close()



Нема коментара:

Постави коментар