Files
SpotiFLAC-Mobile/go_backend/runtime_metrics.go
T

55 lines
1.8 KiB
Go

package gobackend
import (
"encoding/json"
"runtime"
"time"
)
type goRuntimeMetrics struct {
CapturedAtUnixMS int64 `json:"captured_at_unix_ms"`
HeapAllocBytes uint64 `json:"heap_alloc_bytes"`
HeapInuseBytes uint64 `json:"heap_inuse_bytes"`
HeapIdleBytes uint64 `json:"heap_idle_bytes"`
HeapReleasedBytes uint64 `json:"heap_released_bytes"`
HeapObjects uint64 `json:"heap_objects"`
StackInuseBytes uint64 `json:"stack_inuse_bytes"`
SysBytes uint64 `json:"sys_bytes"`
NextGCBytes uint64 `json:"next_gc_bytes"`
LastGCUnixMS int64 `json:"last_gc_unix_ms"`
NumGC uint32 `json:"num_gc"`
PauseTotalNS uint64 `json:"pause_total_ns"`
Goroutines int `json:"goroutines"`
GOMAXPROCS int `json:"gomaxprocs"`
CgoCalls int64 `json:"cgo_calls"`
}
// GetRuntimeMetricsJSON reports Go-owned runtime memory. Native allocations
// from Flutter, FFmpeg, SQLite, and the OS are intentionally outside it.
func GetRuntimeMetricsJSON() string {
var stats runtime.MemStats
runtime.ReadMemStats(&stats)
metrics := goRuntimeMetrics{
CapturedAtUnixMS: time.Now().UnixMilli(),
HeapAllocBytes: stats.HeapAlloc,
HeapInuseBytes: stats.HeapInuse,
HeapIdleBytes: stats.HeapIdle,
HeapReleasedBytes: stats.HeapReleased,
HeapObjects: stats.HeapObjects,
StackInuseBytes: stats.StackInuse,
SysBytes: stats.Sys,
NextGCBytes: stats.NextGC,
LastGCUnixMS: int64(stats.LastGC / uint64(time.Millisecond)),
NumGC: stats.NumGC,
PauseTotalNS: stats.PauseTotalNs,
Goroutines: runtime.NumGoroutine(),
GOMAXPROCS: runtime.GOMAXPROCS(0),
CgoCalls: runtime.NumCgoCall(),
}
payload, err := json.Marshal(metrics)
if err != nil {
return "{}"
}
return string(payload)
}