PingPlotter Cheatsheet
- :material-content-copy: **[Copy to Clipboard](#copy-to-clipboard)**
- :material-file-pdf-box: **[Download PDF](#download-pdf)**
Overview
PingPlotter is a powerful network troubleshooting and monitoring tool that combines the functionality of ping and traceroute with advanced visualization capabilities. It provides real-time network performance monitoring, helping identify network issues, bottlenecks, and intermittent problems that traditional tools might miss.
Key Features
- Visual Traceroute: Graphical representation of network paths and performance
- Continuous Monitoring: Long-term network performance tracking
- Packet Loss Detection: Identify intermittent connectivity issues
- Latency Analysis: Detailed round-trip time measurements
- Historical Data: Store and analyze network performance over time
- Alerting System: Notifications for network issues and thresholds
- Multi-Target Monitoring: Monitor multiple destinations simultaneously
- Reporting: Generate detailed network performance reports
Installation
Windows Installation
# Download PingPlotter from official website
# https://www.pingplotter.com/download
# Silent installation (Pro/Professional versions)
PingPlotterSetup.exe /S /v"/qn"
# Standard installation
# 1. Download installer
# 2. Run as administrator
# 3. Follow installation wizard
# 4. Enter license key (for paid versions)
# Verify installation
Get-Process | Where-Object {$_.ProcessName -eq "PingPlotter"}
# Check installation directory
Get-ChildItem "C:\Program Files\PingPlotter Pro"
Command Line Installation
# Using Chocolatey (Windows)
choco install pingplotter
# Using Winget (Windows)
winget install PingPlotter.PingPlotter
# Verify installation
pingplotter --version
License Configuration
# Configure license (Pro/Professional)
# Help → Enter License Key
# Or via command line:
pingplotter.exe -license "YOUR-LICENSE-KEY"
# Check license status
pingplotter.exe -license-info
# Offline activation (air-gapped systems)
# 1. Generate activation request
pingplotter.exe -activation-request > activation_request.txt
# 2. Submit request to PingPlotter support
# 3. Apply activation response
pingplotter.exe -activation-response activation_response.txt
Basic Usage
Starting Network Monitoring
# Launch PingPlotter GUI
pingplotter.exe
# Command line monitoring
pingplotter.exe -target google.com -samples 100
# Monitor specific IP address
pingplotter.exe -target 8.8.8.8 -interval 2.5
# Monitor with custom packet size
pingplotter.exe -target example.com -packetsize 1024
# Save results to file
pingplotter.exe -target google.com -samples 50 -output results.pp2
GUI Basic Operations
# Basic monitoring setup
# 1. Enter target address in "Address to trace" field
# 2. Click "Start" button
# 3. Monitor real-time results in timeline graph
# Configure monitoring parameters
# Edit → Preferences → Trace Options
# - Trace Interval: 2.5 seconds (default)
# - Packet Size: 32 bytes (default)
# - Timeout: 3000ms (default)
# - Max Hops: 30 (default)
# Multiple target monitoring
# File → New Target
# Enter additional target addresses
# Each target gets separate timeline
# Save monitoring session
# File → Save As → session.pp2
# Load previous session
# File → Open → session.pp2
Target Configuration
# DNS name resolution
pingplotter.exe -target www.example.com
# IPv4 address
pingplotter.exe -target 192.168.1.1
# IPv6 address
pingplotter.exe -target 2001:4860:4860::8888
# Custom port (for TCP traces)
pingplotter.exe -target example.com:80 -protocol tcp
# Multiple targets in batch file
echo "google.com" > targets.txt
echo "cloudflare.com" >> targets.txt
echo "8.8.8.8" >> targets.txt
pingplotter.exe -targetfile targets.txt
Advanced Configuration
Trace Options
# Advanced trace configuration
# Edit → Preferences → Trace Options
# Packet settings
$traceConfig = @{
PacketSize = 64 # Bytes (32-1472)
TraceInterval = 1.0 # Seconds (0.5-3600)
Timeout = 5000 # Milliseconds
MaxHops = 25 # Maximum trace hops
Protocol = "ICMP" # ICMP, UDP, TCP
}
# DNS settings
$dnsConfig = @{
ReverseDNS = $true # Resolve IP to hostname
DNSTimeout = 2000 # DNS resolution timeout
PreferIPv4 = $true # IPv4 preference
UseSystemDNS = $true # Use system DNS servers
}
# Performance settings
$perfConfig = @{
HighResolution = $true # High-resolution timing
CPUPriority = "Normal" # Process priority
NetworkBuffer = 8192 # Network buffer size
MaxSamples = 10000 # Maximum samples to store
}
Alerting Configuration
# Configure alerts
# Tools → Alerts
# Latency alert
$latencyAlert = @{
Name = "High Latency Alert"
Condition = "Average latency > 200ms"
Duration = "5 minutes"
Action = "Email notification"
Recipients = "admin@company.com"
}
# Packet loss alert
$packetLossAlert = @{
Name = "Packet Loss Alert"
Condition = "Packet loss > 5%"
Duration = "2 minutes"
Action = "SNMP trap"
Community = "public"
Target = "192.168.1.100"
}
# Outage alert
$outageAlert = @{
Name = "Network Outage"
Condition = "100% packet loss"
Duration = "30 seconds"
Action = "Run script"
Script = "C:\Scripts\network_outage.bat"
}
# Email configuration
$emailConfig = @{
SMTPServer = "smtp.company.com"
Port = 587
Username = "alerts@company.com"
Password = "encrypted_password"
SSL = $true
From = "pingplotter@company.com"
}
Multi-Target Monitoring
# Configure multiple targets
# File → Multi-Target List
# Create target list file
cat > monitoring_targets.txt << EOF
# Critical Infrastructure
google.com,Primary DNS
8.8.8.8,Google DNS
cloudflare.com,CDN Provider
192.168.1.1,Gateway Router
10.0.0.1,Internal Server
EOF
# Load target list
pingplotter.exe -targetfile monitoring_targets.txt
# Automated target management
pingplotter.exe -target-add "new-server.com"
pingplotter.exe -target-remove "old-server.com"
pingplotter.exe -target-list
# Group targets by category
# Infrastructure group
pingplotter.exe -group "Infrastructure" -target-add "router.company.com"
pingplotter.exe -group "Infrastructure" -target-add "switch.company.com"
# External services group
pingplotter.exe -group "External" -target-add "api.service.com"
pingplotter.exe -group "External" -target-add "cdn.provider.com"
Data Analysis and Visualization
Timeline Analysis
# Timeline graph interpretation
# Green bars: Good performance (low latency)
# Yellow bars: Moderate latency
# Red bars: High latency or packet loss
# Black bars: Complete packet loss
# Timeline navigation
# Zoom in: Ctrl + Mouse wheel up
# Zoom out: Ctrl + Mouse wheel down
# Pan: Click and drag timeline
# Reset view: Ctrl + 0
# Time range selection
$timeRanges = @{
"Last Hour" = "1h"
"Last 4 Hours" = "4h"
"Last Day" = "24h"
"Last Week" = "7d"
"Custom Range" = "Select start/end times"
}
# Statistical analysis
# View → Statistics Window
# Shows min/max/average latency per hop
# Packet loss percentage
# Standard deviation
# Jitter measurements
Route Analysis
# Analyze network path
# Focus on specific hops showing issues
# Right-click hop → Properties
# Hop analysis metrics
echo "Hop Analysis Checklist:"
echo "1. Latency consistency"
echo "2. Packet loss patterns"
echo "3. DNS resolution time"
echo "4. Route stability"
echo "5. Geographic location"
# Identify problem areas
# High latency at specific hop = bottleneck
# Packet loss at multiple hops = upstream issue
# Intermittent issues = congestion or hardware problems
# Route changes = routing instability
Performance Metrics
# Key performance indicators
$performanceMetrics = @{
# Latency metrics
MinLatency = "Minimum round-trip time"
MaxLatency = "Maximum round-trip time"
AvgLatency = "Average round-trip time"
Jitter = "Latency variation (standard deviation)"
# Reliability metrics
PacketLoss = "Percentage of lost packets"
Availability = "Percentage of successful pings"
MTBF = "Mean time between failures"
MTTR = "Mean time to recovery"
# Quality metrics
MOS = "Mean Opinion Score (VoIP quality)"
RTT = "Round-trip time consistency"
Throughput = "Effective bandwidth utilization"
Stability = "Route consistency over time"
}
# Generate performance report
# Tools → Summary Report
# Select time range and metrics
# Export to PDF, HTML, or CSV
Automation and Scripting
Command Line Automation
#!/bin/bash
# pingplotter_automation.sh
# Configuration
TARGET_LIST="targets.txt"
OUTPUT_DIR="/var/log/pingplotter"
REPORT_EMAIL="admin@company.com"
ALERT_THRESHOLD=200 # ms
# Create output directory
mkdir -p "$OUTPUT_DIR"
# Function to monitor single target
monitor_target() {
local target=$1
local duration=$2
local output_file="$OUTPUT_DIR/${target}_$(date +%Y%m%d_%H%M%S).pp2"
echo "Starting monitoring for $target..."
# Start PingPlotter monitoring
pingplotter.exe \
-target "$target" \
-samples "$duration" \
-interval 2.5 \
-output "$output_file" \
-autostart \
-minimize
# Wait for completion
while pgrep -f "pingplotter.*$target" > /dev/null; do
sleep 10
done
echo "Monitoring completed for $target"
# Analyze results
analyze_results "$output_file" "$target"
}
# Function to analyze results
analyze_results() {
local file=$1
local target=$2
# Extract statistics (requires PingPlotter Pro)
pingplotter.exe -analyze "$file" -export-csv "$OUTPUT_DIR/${target}_stats.csv"
# Check for alerts
local avg_latency=$(awk -F',' 'NR>1 {sum+=$3; count++} END {print sum/count}' "$OUTPUT_DIR/${target}_stats.csv")
if (( $(echo "$avg_latency > $ALERT_THRESHOLD" | bc -l) )); then
send_alert "$target" "$avg_latency"
fi
}
# Function to send alerts
send_alert() {
local target=$1
local latency=$2
local subject="Network Alert: High latency to $target"
local body="Average latency to $target: ${latency}ms (threshold: ${ALERT_THRESHOLD}ms)"
echo "$body" | mail -s "$subject" "$REPORT_EMAIL"
# Log alert
echo "$(date): ALERT - $target latency: ${latency}ms" >> "$OUTPUT_DIR/alerts.log"
}
# Main monitoring loop
main() {
echo "Starting automated PingPlotter monitoring..."
# Read targets from file
while IFS= read -r target; do
# Skip comments and empty lines
[[ "$target" =~ ^#.*$ ]] && continue
[[ -z "$target" ]] && continue
# Start monitoring in background
monitor_target "$target" 1440 & # 24 hours of monitoring
# Prevent overwhelming the system
sleep 5
done < "$TARGET_LIST"
# Wait for all monitoring to complete
wait
echo "All monitoring tasks completed"
# Generate summary report
generate_summary_report
}
# Function to generate summary report
generate_summary_report() {
local report_file="$OUTPUT_DIR/summary_$(date +%Y%m%d).html"
cat > "$report_file" << EOF
<!DOCTYPE html>
<html>
<head>
<title>PingPlotter Summary Report</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.alert { color: red; font-weight: bold; }
.good { color: green; }
.warning { color: orange; }
</style>
</head>
<body>
<h1>Network Performance Summary</h1>
<p>Generated: $(date)</p>
<h2>Target Performance</h2>
<table>
<tr>
<th>Target</th>
<th>Avg Latency (ms)</th>
<th>Packet Loss (%)</th>
<th>Status</th>
</tr>
EOF
# Process each target's results
for csv_file in "$OUTPUT_DIR"/*_stats.csv; do
if [[ -f "$csv_file" ]]; then
local target=$(basename "$csv_file" _stats.csv)
local avg_latency=$(awk -F',' 'NR>1 {sum+=$3; count++} END {print sum/count}' "$csv_file")
local packet_loss=$(awk -F',' 'NR>1 {sum+=$4; count++} END {print sum/count}' "$csv_file")
local status_class="good"
local status="Good"
if (( $(echo "$avg_latency > $ALERT_THRESHOLD" | bc -l) )); then
status_class="alert"
status="High Latency"
elif (( $(echo "$packet_loss > 1" | bc -l) )); then
status_class="warning"
status="Packet Loss"
fi
cat >> "$report_file" << EOF
<tr>
<td>$target</td>
<td>$(printf "%.2f" "$avg_latency")</td>
<td>$(printf "%.2f" "$packet_loss")</td>
<td class="$status_class">$status</td>
</tr>
EOF
fi
done
cat >> "$report_file" << EOF
</table>
<h2>Recent Alerts</h2>
<pre>$(tail -20 "$OUTPUT_DIR/alerts.log" 2>/dev/null || echo "No recent alerts")</pre>
</body>
</html>
EOF
echo "Summary report generated: $report_file"
# Email the report
if command -v mutt >/dev/null; then
mutt -s "PingPlotter Summary Report" -a "$report_file" -- "$REPORT_EMAIL" < /dev/null
fi
}
# Run main function
main "$@"
PowerShell Integration
# PingPlotter PowerShell automation
# PingPlotter-Automation.ps1
param(
[string[]]$Targets = @("google.com", "cloudflare.com"),
[int]$Duration = 60, # minutes
[string]$OutputPath = "C:\PingPlotter\Reports",
[string]$AlertEmail = "admin@company.com"
)
# Ensure output directory exists
if (!(Test-Path $OutputPath)) {
New-Item -ItemType Directory -Path $OutputPath -Force
}
# Function to start PingPlotter monitoring
function Start-PingPlotterMonitoring {
param(
[string]$Target,
[int]$DurationMinutes,
[string]$OutputFile
)
$arguments = @(
"-target", $Target,
"-samples", ($DurationMinutes * 24), # 2.5s interval = 24 samples/minute
"-interval", "2.5",
"-output", $OutputFile,
"-autostart",
"-minimize"
)
Write-Host "Starting monitoring for $Target..."
$process = Start-Process -FilePath "pingplotter.exe" -ArgumentList $arguments -PassThru
return $process
}
# Function to analyze PingPlotter results
function Analyze-PingPlotterResults {
param(
[string]$ResultFile,
[string]$Target
)
# Export statistics to CSV
$csvFile = $ResultFile -replace "\.pp2$", "_stats.csv"
$arguments = @("-analyze", $ResultFile, "-export-csv", $csvFile)
Start-Process -FilePath "pingplotter.exe" -ArgumentList $arguments -Wait
if (Test-Path $csvFile) {
# Import and analyze CSV data
$data = Import-Csv $csvFile
$stats = @{
Target = $Target
AvgLatency = ($data | Measure-Object -Property Latency -Average).Average
MaxLatency = ($data | Measure-Object -Property Latency -Maximum).Maximum
MinLatency = ($data | Measure-Object -Property Latency -Minimum).Minimum
PacketLoss = ($data | Measure-Object -Property PacketLoss -Average).Average
SampleCount = $data.Count
}
return $stats
}
return $null
}
# Function to send email alerts
function Send-Alert {
param(
[string]$Target,
[hashtable]$Stats,
[string]$ToEmail
)
$subject = "PingPlotter Alert: Issues detected for $Target"
$body = @"
Network performance alert for target: $Target
Statistics:
- Average Latency: $($Stats.AvgLatency) ms
- Maximum Latency: $($Stats.MaxLatency) ms
- Minimum Latency: $($Stats.MinLatency) ms
- Packet Loss: $($Stats.PacketLoss)%
- Sample Count: $($Stats.SampleCount)
Please investigate network connectivity to this target.
Generated by PingPlotter automation script.
"@
try {
Send-MailMessage -To $ToEmail -Subject $subject -Body $body -SmtpServer "smtp.company.com"
Write-Host "Alert sent for $Target"
}
catch {
Write-Error "Failed to send alert: $_"
}
}
# Function to generate HTML report
function Generate-HTMLReport {
param(
[hashtable[]]$AllStats,
[string]$OutputPath
)
$reportFile = Join-Path $OutputPath "PingPlotter_Report_$(Get-Date -Format 'yyyyMMdd_HHmmss').html"
$html = @"
<!DOCTYPE html>
<html>
<head>
<title>PingPlotter Performance Report</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
table { border-collapse: collapse; width: 100%; margin: 20px 0; }
th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }
th { background-color: #f2f2f2; font-weight: bold; }
.good { background-color: #d4edda; }
.warning { background-color: #fff3cd; }
.alert { background-color: #f8d7da; }
.summary { background-color: #e7f3ff; padding: 15px; border-radius: 5px; margin: 20px 0; }
</style>
</head>
<body>
<h1>PingPlotter Performance Report</h1>
<div class="summary">
<h3>Report Summary</h3>
<p><strong>Generated:</strong> $(Get-Date)</p>
<p><strong>Monitoring Duration:</strong> $Duration minutes</p>
<p><strong>Targets Monitored:</strong> $($AllStats.Count)</p>
</div>
<h2>Performance Results</h2>
<table>
<tr>
<th>Target</th>
<th>Avg Latency (ms)</th>
<th>Max Latency (ms)</th>
<th>Min Latency (ms)</th>
<th>Packet Loss (%)</th>
<th>Samples</th>
<th>Status</th>
</tr>
"@
foreach ($stat in $AllStats) {
$statusClass = "good"
$status = "Good"
if ($stat.PacketLoss -gt 1) {
$statusClass = "alert"
$status = "Packet Loss"
}
elseif ($stat.AvgLatency -gt 200) {
$statusClass = "warning"
$status = "High Latency"
}
$html += @"
<tr class="$statusClass">
<td>$($stat.Target)</td>
<td>$([math]::Round($stat.AvgLatency, 2))</td>
<td>$([math]::Round($stat.MaxLatency, 2))</td>
<td>$([math]::Round($stat.MinLatency, 2))</td>
<td>$([math]::Round($stat.PacketLoss, 2))</td>
<td>$($stat.SampleCount)</td>
<td>$status</td>
</tr>
"@
}
$html += @"
</table>
<h2>Performance Recommendations</h2>
<ul>
<li>Latency < 50ms: Excellent performance</li>
<li>Latency 50-150ms: Good performance</li>
<li>Latency 150-300ms: Acceptable performance</li>
<li>Latency > 300ms: Poor performance - investigate</li>
<li>Packet Loss > 1%: Network issues - investigate</li>
</ul>
</body>
</html>
"@
$html | Out-File -FilePath $reportFile -Encoding UTF8
Write-Host "HTML report generated: $reportFile"
return $reportFile
}
# Main execution
Write-Host "Starting PingPlotter automation for $($Targets.Count) targets..."
$processes = @()
$resultFiles = @()
# Start monitoring for each target
foreach ($target in $Targets) {
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$outputFile = Join-Path $OutputPath "${target}_${timestamp}.pp2"
$process = Start-PingPlotterMonitoring -Target $target -DurationMinutes $Duration -OutputFile $outputFile
$processes += @{
Process = $process
Target = $target
OutputFile = $outputFile
}
$resultFiles += $outputFile
# Small delay to prevent overwhelming the system
Start-Sleep -Seconds 2
}
# Wait for all monitoring to complete
Write-Host "Waiting for monitoring to complete..."
foreach ($item in $processes) {
$item.Process.WaitForExit()
Write-Host "Monitoring completed for $($item.Target)"
}
# Analyze results
Write-Host "Analyzing results..."
$allStats = @()
foreach ($item in $processes) {
if (Test-Path $item.OutputFile) {
$stats = Analyze-PingPlotterResults -ResultFile $item.OutputFile -Target $item.Target
if ($stats) {
$allStats += $stats
# Check for alerts
if ($stats.AvgLatency -gt 200 -or $stats.PacketLoss -gt 1) {
Send-Alert -Target $item.Target -Stats $stats -ToEmail $AlertEmail
}
}
}
}
# Generate report
if ($allStats.Count -gt 0) {
$reportFile = Generate-HTMLReport -AllStats $allStats -OutputPath $OutputPath
# Display summary
Write-Host "`nMonitoring Summary:"
Write-Host "==================="
foreach ($stat in $allStats) {
$status = if ($stat.PacketLoss -gt 1) { "ALERT" } elseif ($stat.AvgLatency -gt 200) { "WARNING" } else { "OK" }
Write-Host "$($stat.Target): Avg $([math]::Round($stat.AvgLatency, 2))ms, Loss $([math]::Round($stat.PacketLoss, 2))% - $status"
}
Write-Host "`nReport saved to: $reportFile"
}
else {
Write-Warning "No results to analyze. Check PingPlotter installation and target accessibility."
}
Write-Host "PingPlotter automation completed."
Integration with Other Tools
SNMP Integration
# SNMP monitoring integration
# Requires SNMP tools and PingPlotter Pro
# Configure SNMP alerts
$snmpConfig = @{
Community = "public"
Version = "2c"
Target = "192.168.1.100"
Port = 162
}
# SNMP trap for network alerts
function Send-SNMPTrap {
param(
[string]$Target,
[string]$Message,
[hashtable]$Config
)
$oid = "1.3.6.1.4.1.12345.1.1" # Custom OID for PingPlotter alerts
snmptrap -v $Config.Version -c $Config.Community $Config.Target:$Config.Port $oid s "$Message"
}
# Integration script
$alertMessage = "High latency detected: $Target - $($stats.AvgLatency)ms"
Send-SNMPTrap -Target $target -Message $alertMessage -Config $snmpConfig
Syslog Integration
#!/bin/bash
# Syslog integration for PingPlotter alerts
SYSLOG_SERVER="192.168.1.50"
SYSLOG_PORT=514
FACILITY="local0"
SEVERITY="warning"
# Function to send syslog message
send_syslog() {
local target=$1
local latency=$2
local packet_loss=$3
local message="PingPlotter Alert: Target=$target, Latency=${latency}ms, PacketLoss=${packet_loss}%"
# Send to remote syslog server
logger -n "$SYSLOG_SERVER" -P "$SYSLOG_PORT" -p "${FACILITY}.${SEVERITY}" "$message"
# Also log locally
logger -t "pingplotter" "$message"
}
# Example usage
send_syslog "google.com" "250" "2.5"
Database Integration
#!/usr/bin/env python3
# Database integration for PingPlotter data
import sqlite3
import csv
import datetime
import os
class PingPlotterDB:
def __init__(self, db_path="pingplotter.db"):
self.db_path = db_path
self.init_database()
def init_database(self):
"""Initialize database schema"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS network_performance (
id INTEGER PRIMARY KEY AUTOINCREMENT,
target TEXT NOT NULL,
timestamp DATETIME NOT NULL,
hop_number INTEGER,
hop_ip TEXT,
hop_hostname TEXT,
latency REAL,
packet_loss REAL,
jitter REAL
)
''')
cursor.execute('''
CREATE TABLE IF NOT EXISTS alerts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
target TEXT NOT NULL,
alert_type TEXT NOT NULL,
message TEXT,
timestamp DATETIME NOT NULL,
resolved BOOLEAN DEFAULT FALSE
)
''')
cursor.execute('''
CREATE INDEX IF NOT EXISTS idx_target_timestamp
ON network_performance(target, timestamp)
''')
conn.commit()
conn.close()
def import_csv_data(self, csv_file, target):
"""Import PingPlotter CSV export data"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
with open(csv_file, 'r') as f:
reader = csv.DictReader(f)
for row in reader:
cursor.execute('''
INSERT INTO network_performance
(target, timestamp, hop_number, hop_ip, hop_hostname, latency, packet_loss, jitter)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
''', (
target,
datetime.datetime.now(),
row.get('Hop', 0),
row.get('IP', ''),
row.get('Hostname', ''),
float(row.get('Latency', 0)),
float(row.get('PacketLoss', 0)),
float(row.get('Jitter', 0))
))
conn.commit()
conn.close()
print(f"Imported data from {csv_file} for target {target}")
def log_alert(self, target, alert_type, message):
"""Log network alert"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute('''
INSERT INTO alerts (target, alert_type, message, timestamp)
VALUES (?, ?, ?, ?)
''', (target, alert_type, message, datetime.datetime.now()))
conn.commit()
conn.close()
def get_performance_summary(self, target, hours=24):
"""Get performance summary for target"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
since = datetime.datetime.now() - datetime.timedelta(hours=hours)
cursor.execute('''
SELECT
AVG(latency) as avg_latency,
MIN(latency) as min_latency,
MAX(latency) as max_latency,
AVG(packet_loss) as avg_packet_loss,
COUNT(*) as sample_count
FROM network_performance
WHERE target = ? AND timestamp > ?
''', (target, since))
result = cursor.fetchone()
conn.close()
if result:
return {
'target': target,
'avg_latency': result[0],
'min_latency': result[1],
'max_latency': result[2],
'avg_packet_loss': result[3],
'sample_count': result[4],
'period_hours': hours
}
return None
def generate_report(self, output_file="performance_report.html"):
"""Generate HTML performance report"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
# Get all targets
cursor.execute('SELECT DISTINCT target FROM network_performance')
targets = [row[0] for row in cursor.fetchall()]
html = """
<!DOCTYPE html>
<html>
<head>
<title>Network Performance Report</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.good { background-color: #d4edda; }
.warning { background-color: #fff3cd; }
.alert { background-color: #f8d7da; }
</style>
</head>
<body>
<h1>Network Performance Report</h1>
<p>Generated: {}</p>
<table>
<tr>
<th>Target</th>
<th>Avg Latency (ms)</th>
<th>Min Latency (ms)</th>
<th>Max Latency (ms)</th>
<th>Packet Loss (%)</th>
<th>Samples</th>
<th>Status</th>
</tr>
""".format(datetime.datetime.now())
for target in targets:
summary = self.get_performance_summary(target)
if summary:
status_class = "good"
status = "Good"
if summary['avg_packet_loss'] > 1:
status_class = "alert"
status = "Packet Loss"
elif summary['avg_latency'] > 200:
status_class = "warning"
status = "High Latency"
html += f"""
<tr class="{status_class}">
<td>{target}</td>
<td>{summary['avg_latency']:.2f}</td>
<td>{summary['min_latency']:.2f}</td>
<td>{summary['max_latency']:.2f}</td>
<td>{summary['avg_packet_loss']:.2f}</td>
<td>{summary['sample_count']}</td>
<td>{status}</td>
</tr>
"""
html += """
</table>
</body>
</html>
"""
with open(output_file, 'w') as f:
f.write(html)
conn.close()
print(f"Report generated: {output_file}")
# Example usage
if __name__ == "__main__":
db = PingPlotterDB()
# Import sample data
# db.import_csv_data("google_com_stats.csv", "google.com")
# Log sample alert
db.log_alert("google.com", "high_latency", "Average latency exceeded 200ms")
# Generate report
db.generate_report()
Troubleshooting
Common Issues
# PingPlotter not starting
# 1. Check if already running
Get-Process | Where-Object {$_.ProcessName -eq "PingPlotter"}
# 2. Run as administrator
Start-Process "pingplotter.exe" -Verb RunAs
# 3. Check Windows Firewall
netsh advfirewall firewall show rule name="PingPlotter"
# 4. Verify license (Pro versions)
pingplotter.exe -license-info
# ICMP blocked by firewall
# 1. Allow ICMP in Windows Firewall
netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol=icmpv4:8,any dir=in action=allow
# 2. Check router/firewall settings
# Ensure ICMP echo requests are allowed
# 3. Test with different protocols
# Try UDP or TCP traces if ICMP is blocked
# High CPU usage
# 1. Reduce trace frequency
# Edit → Preferences → Trace Options → Trace Interval: 5 seconds
# 2. Limit number of targets
# Monitor fewer targets simultaneously
# 3. Reduce sample history
# Edit → Preferences → General → Max samples to keep: 1000
# Inaccurate results
# 1. Check system time synchronization
w32tm /query /status
# 2. Verify network adapter settings
# Disable power management on network adapter
# 3. Close bandwidth-intensive applications
# Ensure clean network conditions during testing
Performance Optimization
# Optimize PingPlotter performance
# 1. System optimization
echo "Optimizing system for network monitoring..."
# Disable unnecessary services
sc config "Windows Search" start= disabled
sc config "Superfetch" start= disabled
# Set high performance power plan
powercfg -setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
# Increase network buffer sizes
netsh int tcp set global autotuninglevel=normal
netsh int tcp set global chimney=enabled
netsh int tcp set global rss=enabled
# 2. PingPlotter optimization
# Edit PingPlotter.exe.config
cat > PingPlotter.exe.config << EOF
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<gcServer enabled="true"/>
<gcConcurrent enabled="true"/>
</runtime>
<appSettings>
<add key="MaxSamples" value="5000"/>
<add key="HighResolutionTiming" value="true"/>
<add key="NetworkBufferSize" value="65536"/>
</appSettings>
</configuration>
EOF
# 3. Network adapter optimization
# Disable power management
powershell "Get-NetAdapter | ForEach-Object { Disable-NetAdapterPowerManagement -Name $_.Name }"
# Set interrupt moderation
netsh int tcp set global rsc=disabled
This comprehensive PingPlotter cheatsheet provides everything needed for professional network troubleshooting, performance monitoring, and automated network analysis, from basic ping operations to advanced automation and integration scenarios.