Files
go-sdk/performancemetrics/performancemetrics.go
2026-01-06 15:09:21 +01:00

109 lines
1.9 KiB
Go

package performancemetrics
import (
"runtime"
"time"
"git.fancyinnovations.com/fancyanalytics/go-sdk/client"
)
type Service struct {
appStartTime time.Time
lastReset time.Time
}
func NewService() *Service {
s := &Service{
appStartTime: time.Now(),
}
s.resetMetrics()
return s
}
func (s *Service) resetMetrics() {
s.lastReset = time.Now()
}
func (s *Service) collectAndReset() (*PerformanceMetrics, error) {
cpuTime, err := getCpuTime()
if err != nil {
return nil, err
}
cpuUsage := cpuTime / time.Since(s.lastReset).Seconds()
goroutineCount := runtime.NumGoroutine()
allocedMemory := getAllocatedMemory()
usedDisk, freeDisk, totalDisk, err := getDiskUsage("/")
if err != nil {
return nil, err
}
uptimeMs := time.Since(s.appStartTime).Milliseconds()
metrics := &PerformanceMetrics{
Uptime: uptimeMs,
CpuUsage: cpuUsage,
AllocatedMemory: allocedMemory,
GoroutineCount: goroutineCount,
DiskUsage: DiskUsage{
Used: usedDisk,
Free: freeDisk,
Total: totalDisk,
},
}
s.resetMetrics()
return metrics, nil
}
func (s *Service) MetricProvider() ([]client.RecordData, error) {
metrics, err := s.collectAndReset()
if err != nil {
return nil, err
}
records := []client.RecordData{
{
Metric: "uptime",
Label: "",
Value: float64(metrics.Uptime),
},
{
Metric: "cpu_usage",
Label: "",
Value: metrics.CpuUsage,
},
{
Metric: "allocated_memory",
Label: "",
Value: float64(metrics.AllocatedMemory),
},
{
Metric: "goroutine_count",
Label: "",
Value: float64(metrics.GoroutineCount),
},
{
Metric: "disk_usage_total",
Label: "",
Value: float64(metrics.DiskUsage.Total),
},
{
Metric: "disk_usage",
Label: "free",
Value: float64(metrics.DiskUsage.Free),
},
{
Metric: "disk_usage",
Label: "used",
Value: float64(metrics.DiskUsage.Used),
},
}
return records, nil
}