Files
2026-07-13 12:31:02 +08:00

74 lines
2.5 KiB
Go

package savers
import (
"fmt"
"time"
"service-operation/pocketbase"
"service-operation/types"
)
func (ms *MetricsSaver) SavePingDataToPocketBase(result *types.OperationResult, serviceID string) {
// Create a short, professional status message
var details string
if result.Success {
// Success message with packet stats
details = fmt.Sprintf("✅ Ping OK - %d/%d packets received",
result.PacketsRecv, result.PacketsSent)
// Add loss percentage if there was any loss
if result.PacketLoss > 0 {
details += fmt.Sprintf(" (%.1f%% loss)", result.PacketLoss)
}
// Add response time info
details += fmt.Sprintf(" | Avg: %.2fms",
float64(result.AvgRTT.Nanoseconds())/1000000)
// Add min/max if different from average (significant variance)
if result.MinRTT != result.MaxRTT {
details += fmt.Sprintf(", Min: %.2fms, Max: %.2fms",
float64(result.MinRTT.Nanoseconds())/1000000,
float64(result.MaxRTT.Nanoseconds())/1000000)
}
} else {
// Error message
if result.PacketLoss >= 100 {
details = fmt.Sprintf("❌ Ping Failed - 100%% packet loss (%s)",
GetShortErrorMessage(result.Error))
} else {
details = fmt.Sprintf("⚠️ Ping Partial - %.1f%% packet loss (%s)",
result.PacketLoss, GetShortErrorMessage(result.Error))
}
}
pingData := pocketbase.PingDataRecord{
ServiceID: serviceID,
Timestamp: time.Now(),
ResponseTime: result.ResponseTime.Milliseconds(),
Status: GetStatusString(result.Success),
PacketsSent: fmt.Sprintf("%d", result.PacketsSent),
PacketsRecv: fmt.Sprintf("%d", result.PacketsRecv),
PacketLoss: fmt.Sprintf("%.1f%%", result.PacketLoss),
MinRTT: fmt.Sprintf("%.2fms", float64(result.MinRTT.Nanoseconds())/1000000),
MaxRTT: fmt.Sprintf("%.2fms", float64(result.MaxRTT.Nanoseconds())/1000000),
AvgRTT: fmt.Sprintf("%.2fms", float64(result.AvgRTT.Nanoseconds())/1000000),
RTTs: "", // Not currently tracked
Latency: fmt.Sprintf("%.2fms", float64(result.AvgRTT.Nanoseconds())/1000000),
ErrorMessage: result.Error,
Details: details, // Short, clean message
RegionName: ms.regionName, // Add regional fields
AgentID: ms.agentID,
}
if err := ms.pbClient.SavePingData(pingData); err != nil {
println("Failed to save ping data to PocketBase:", err.Error())
}
}
// Method for monitoring service usage
func (ms *MetricsSaver) SavePingDataForService(service pocketbase.Service, result *types.OperationResult) {
ms.SavePingDataToPocketBase(result, service.ID)
}