Skip to content

Commit 6c4f859

Browse files
committed
chore: Add memory history endpoint to API
1 parent 27cd37f commit 6c4f859

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

cmd/sentinel/main.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ var version string = "0.0.5"
1515
var logsDir string = "/app/logs"
1616
var metricsDir string = "/app/metrics"
1717
var cpuMetricsFile string = metricsDir + "/cpu.csv"
18+
var memoryMetricsFile string = metricsDir + "/memory.csv"
1819

1920
// Arguments
2021
var token string
@@ -41,6 +42,7 @@ func main() {
4142
logsDir = "./logs"
4243
metricsDir = "./metrics"
4344
cpuMetricsFile = metricsDir + "/cpu.csv"
45+
memoryMetricsFile = metricsDir + "/memory.csv"
4446
}
4547
if err := os.MkdirAll(logsDir, 0700); err != nil {
4648
log.Fatalf("Error creating metrics directory: %v", err)
@@ -173,6 +175,18 @@ func main() {
173175
usage = memoryCsvHeader + usage
174176
c.String(200, usage)
175177
})
178+
authorized.GET("/memory/history", func(c *gin.Context) {
179+
from := c.Query("from")
180+
to := c.Query("to")
181+
usage, err := getHistoryMemoryUsage(from, to)
182+
if err != nil {
183+
c.JSON(500, gin.H{
184+
"error": err.Error(),
185+
})
186+
return
187+
}
188+
c.String(200, usage)
189+
})
176190
authorized.GET("/disk", func(c *gin.Context) {
177191
usage, err := getDiskUsage()
178192
if err != nil {

cmd/sentinel/memory.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ package main
33
import (
44
"encoding/json"
55
"fmt"
6+
"os"
7+
"strconv"
8+
"strings"
9+
"time"
610

711
"github.com/shirou/gopsutil/mem"
812
)
@@ -44,3 +48,63 @@ func getMemUsage(csv bool) (string, error) {
4448
return string(jsonData), nil
4549

4650
}
51+
52+
func getHistoryMemoryUsage(from string, to string) (string, error) {
53+
if from == "" && to == "" {
54+
// return everything
55+
file, err := os.ReadFile(memoryMetricsFile)
56+
if err != nil {
57+
fmt.Println("Failed to read file:", err)
58+
return "", err
59+
}
60+
return string(file), nil
61+
}
62+
if from == "" {
63+
from = "1970-01-01T00:00:00Z"
64+
}
65+
if to == "" {
66+
to = time.Now().UTC().Format(time.RFC3339)
67+
}
68+
fromTime, err := time.Parse(time.RFC3339, from)
69+
if err != nil {
70+
fmt.Println("Failed to parse from time:", err)
71+
return "", err
72+
}
73+
toTime, err := time.Parse(time.RFC3339, to)
74+
if err != nil {
75+
fmt.Println("Failed to parse to time:", err)
76+
return "", err
77+
}
78+
79+
fromTimeUnix := fromTime.UnixMilli()
80+
toTimeUnix := toTime.UnixMilli()
81+
file, err := os.ReadFile(memoryMetricsFile)
82+
if err != nil {
83+
fmt.Println("Failed to read file:", err)
84+
return "", err
85+
}
86+
lines := string(file)
87+
var result string
88+
lines = lines[strings.Index(lines, "\n")+1:]
89+
for _, line := range strings.Split(lines, "\n") {
90+
if line == "" {
91+
continue
92+
}
93+
parts := strings.Split(line, ",")
94+
if len(parts) != 4 {
95+
fmt.Println("Invalid line:", line)
96+
continue
97+
}
98+
time, err := strconv.ParseInt(parts[0], 10, 64)
99+
if err != nil {
100+
fmt.Println("Failed to parse time:", err)
101+
continue
102+
}
103+
if time >= fromTimeUnix && time <= toTimeUnix {
104+
result += line + "\n"
105+
}
106+
}
107+
result = memoryCsvHeader + result
108+
return result, nil
109+
110+
}

0 commit comments

Comments
 (0)