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()
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()
Нема коментара:
Постави коментар