Add TCP_Ping_Monitor.ps1

Working script
This commit is contained in:
JBg
2025-02-11 08:18:59 +01:00
parent 7b15815317
commit 217bc96773

252
TCP_Ping_Monitor.ps1 Normal file
View File

@@ -0,0 +1,252 @@
# Define the IP addresses to monitor
$addresses = @(
"1.1.1.1",
"1.0.0.1"
)
# Initialize runspace pool
$RunspacePool = [runspacefactory]::CreateRunspacePool(1, 20)
$RunspacePool.Open()
# Initialize statistics
$stats = @{}
foreach ($addr in $addresses) {
$stats[$addr] = @{
MinTime = [int]::MaxValue
MaxTime = 0
TotalTime = 0
SuccessCount = 0
FailCount = 0
HighTrafficFailCount = 0
Samples = @()
LastStatus = $null
LastResponseTime = 0
}
}
# Initialize network traffic statistics
$trafficStats = @{
HighUploadInstances = 0
HighDownloadInstances = 0
LastBytesReceived = 0
LastBytesSent = 0
LastMeasurement = Get-Date
HighTrafficStartTime = $null
IsHighTraffic = $false
}
$TestPort80ScriptBlock = {
param($ComputerName)
$tcpClient = New-Object System.Net.Sockets.TcpClient
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
try {
$result = $tcpClient.BeginConnect($ComputerName, 80, $null, $null)
$success = $result.AsyncWaitHandle.WaitOne(1000)
$stopwatch.Stop()
if ($success) {
$tcpClient.EndConnect($result)
return @{
Success = $true
ResponseTime = $stopwatch.ElapsedMilliseconds
Address = $ComputerName
}
}
return @{
Success = $false
ResponseTime = 0
Address = $ComputerName
}
}
catch {
$stopwatch.Stop()
return @{
Success = $false
ResponseTime = 0
Address = $ComputerName
}
}
finally {
$tcpClient.Close()
}
}
function Get-NetworkTraffic {
$stats = Get-WmiObject Win32_PerfFormattedData_Tcpip_NetworkInterface |
Where-Object {$_.Name -eq "Intel[R] I210 Gigabit Network Connection _2"}
if ($stats) {
return @{
BytesReceivedPerSec = [double]$stats.BytesReceivedPerSec
BytesSentPerSec = [double]$stats.BytesSentPerSec
}
}
return $null
}
function Get-Mean {
param([array]$Numbers)
if ($Numbers.Count -eq 0) { return 0 }
return ($Numbers | Measure-Object -Average).Average
}
function Reset-Display {
Clear-Host
$host.UI.RawUI.CursorPosition = @{X=0; Y=0}
}
function Format-Number {
param(
[Parameter(Mandatory=$true)]
[double]$Number,
[int]$Width = 6,
[int]$Decimals = 1
)
return $Number.ToString("F$Decimals").PadLeft($Width)
}
# Create log file
$logFile = "network_traffic.log"
"Timestamp,BytesReceived,BytesSent,HighUploadAlert,HighDownloadAlert" | Out-File $logFile
while ($true) {
Reset-Display
$currentTime = Get-Date
$currentTimeString = $currentTime.ToString("HH:mm:ss")
# Start parallel ping jobs
$Jobs = @()
foreach ($addr in $addresses) {
$PowerShell = [powershell]::Create().AddScript($TestPort80ScriptBlock).AddArgument($addr)
$PowerShell.RunspacePool = $RunspacePool
$Jobs += @{
PowerShell = $PowerShell
Handle = $PowerShell.BeginInvoke()
Address = $addr
}
}
# Monitor network traffic while waiting for pings
$traffic = Get-NetworkTraffic
if ($traffic) {
$downloadMbps = ($traffic.BytesReceivedPerSec * 8) / (1024 * 1024)
$uploadMbps = ($traffic.BytesSentPerSec * 8) / (1024 * 1024)
$uploadAlert = ""
$downloadAlert = ""
$previousHighTrafficState = $trafficStats.IsHighTraffic
# Check for high traffic condition
$isHighTrafficNow = ($uploadMbps -gt 80) -or ($downloadMbps -gt 80)
if ($isHighTrafficNow -and -not $previousHighTrafficState) {
$trafficStats.HighTrafficStartTime = $currentTime
$trafficStats.IsHighTraffic = $true
}
elseif (-not $isHighTrafficNow -and $previousHighTrafficState) {
$trafficStats.IsHighTraffic = $false
}
if ($uploadMbps -gt 80) {
$trafficStats.HighUploadInstances++
$uploadAlert = "HIGH UPLOAD ALERT: $([math]::Round($uploadMbps, 2)) Mbps"
}
if ($downloadMbps -gt 80) {
$trafficStats.HighDownloadInstances++
$downloadAlert = "HIGH DOWNLOAD ALERT: $([math]::Round($downloadMbps, 2)) Mbps"
}
"$currentTimeString,$($traffic.BytesReceivedPerSec),$($traffic.BytesSentPerSec),$($downloadMbps -gt 80),$($uploadMbps -gt 80)" |
Out-File $logFile -Append
}
# Display header
Write-Host "Port 80 Monitor - Last Updated: $currentTimeString" -ForegroundColor Cyan
Write-Host "Network Traffic:" -ForegroundColor Yellow
Write-Host " Download: $([math]::Round($downloadMbps, 2)) Mbps" -ForegroundColor Yellow
Write-Host " Upload: $([math]::Round($uploadMbps, 2)) Mbps" -ForegroundColor Yellow
Write-Host "High Traffic Instances:" -ForegroundColor Yellow
Write-Host " Download: $($trafficStats.HighDownloadInstances)" -ForegroundColor Yellow
Write-Host " Upload: $($trafficStats.HighUploadInstances)" -ForegroundColor Yellow
if ($downloadAlert) { Write-Host $downloadAlert -ForegroundColor Red }
if ($uploadAlert) { Write-Host $uploadAlert -ForegroundColor Red }
Write-Host "`nIP Address Status Min Max Mean Success% Fails HTFails" -ForegroundColor Yellow
Write-Host "--------------- -------- ----- ----- ----- -------- ----- --------" -ForegroundColor Yellow
# Collect results from parallel jobs
foreach ($job in $Jobs) {
$result = $job.PowerShell.EndInvoke($job.Handle)
$addr = $job.Address
# Clean up runspace
$job.PowerShell.Dispose()
$isInHighTrafficWindow = $false
if ($trafficStats.IsHighTraffic -or
($trafficStats.HighTrafficStartTime -and
$currentTime -le $trafficStats.HighTrafficStartTime.AddSeconds(1))) {
$isInHighTrafficWindow = $true
}
if ($result.Success) {
$responseTime = $result.ResponseTime
$stats[$addr].TotalTime += $responseTime
$stats[$addr].SuccessCount++
$stats[$addr].Samples += $responseTime
$stats[$addr].LastStatus = "UP"
$stats[$addr].LastResponseTime = $responseTime
if ($stats[$addr].Samples.Count -gt 60) {
$stats[$addr].Samples = $stats[$addr].Samples[-60..-1]
}
if ($responseTime -lt $stats[$addr].MinTime) {
$stats[$addr].MinTime = $responseTime
}
if ($responseTime -gt $stats[$addr].MaxTime) {
$stats[$addr].MaxTime = $responseTime
}
$status = "UP"
$color = "Green"
} else {
$stats[$addr].FailCount++
if ($isInHighTrafficWindow) {
$stats[$addr].HighTrafficFailCount++
}
$stats[$addr].LastStatus = "DOWN"
$status = "DOWN"
$color = "Red"
}
$totalRequests = $stats[$addr].SuccessCount + $stats[$addr].FailCount
$successRate = [math]::Round(($stats[$addr].SuccessCount / $totalRequests) * 100, 1)
$meanTime = [math]::Round((Get-Mean $stats[$addr].Samples), 1)
$ipField = $addr.PadRight(15)
$statusField = $status.PadRight(8)
$minField = Format-Number -Number $stats[$addr].MinTime -Width 5 -Decimals 0
$maxField = Format-Number -Number $stats[$addr].MaxTime -Width 5 -Decimals 0
$meanField = Format-Number -Number $meanTime -Width 5 -Decimals 1
$successField = Format-Number -Number $successRate -Width 8 -Decimals 1
$failsField = $stats[$addr].FailCount.ToString().PadLeft(5)
$htFailsField = $stats[$addr].HighTrafficFailCount.ToString().PadLeft(8)
Write-Host $ipField -NoNewline
Write-Host $statusField -NoNewline -ForegroundColor $color
Write-Host "$minField $maxField $meanField $successField $failsField $htFailsField"
}
Start-Sleep -Milliseconds 500
}
# Cleanup
$RunspacePool.Close()
$RunspacePool.Dispose()