Skip to content

Commit

Permalink
feat: add query param api to cpu
Browse files Browse the repository at this point in the history
  • Loading branch information
andrasbacsai committed May 9, 2024
1 parent ab9cd58 commit a2d5a1f
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 38 deletions.
133 changes: 99 additions & 34 deletions cmd/sentinel/cpu.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,55 +3,59 @@ package main
import (
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
"time"

"github.com/shirou/gopsutil/cpu"
)

var cpuCsvHeader = "time,cpu,usage,idle,system,user,percent\n"
var cpuCsvHeader = "time,percent\n"

type CpuUsage struct {
Time string `json:"time"`
Cpu string `json:"cpu"`
Usage float64 `json:"usage"`
Idle float64 `json:"idle"`
System float64 `json:"system"`
User float64 `json:"user"`
Percent string `json:"percent"`
Time string `json:"time"`
// Cpu string `json:"cpu"`
// Usage float64 `json:"usage"`
// Idle float64 `json:"idle"`
// System float64 `json:"system"`
// User float64 `json:"user"`
Percent string `json:"percent"`
}

func getCpuUsage(csv bool) (string, error) {
times, err := cpu.Times(true)
if err != nil {
fmt.Println("Failed to get CPU times:", err)
return "", err
}
percentage, err := cpu.Percent(0, true)
if err != nil {
fmt.Println("Failed to get CPU percentage:", err)
return "", err
}
// times, err := cpu.Times(true)
// if err != nil {
// fmt.Println("Failed to get CPU times:", err)
// return "", err
// }
// percentage, err := cpu.Percent(0, true)
// if err != nil {
// fmt.Println("Failed to get CPU percentage:", err)
// return "", err
// }

usages := make([]CpuUsage, len(times))
queryTimeInUnixString := getUnixTimeInNanoUTC()
for i, time := range times {
usages[i] = CpuUsage{
Time: queryTimeInUnixString,
Cpu: fmt.Sprintf("%d", i),
Usage: time.Total(),
Idle: time.Idle,
System: time.System,
User: time.User,
Percent: fmt.Sprintf("%.2f", percentage[i]),
}
}
usages := make([]CpuUsage, 0)
queryTimeInUnixString := getUnixTimeInMilliUTC()
// for i, time := range times {
// usages[i] = CpuUsage{
// Time: queryTimeInUnixString,
// Cpu: fmt.Sprintf("%d", i),
// Usage: time.Total(),
// Idle: time.Idle,
// System: time.System,
// User: time.User,
// Percent: fmt.Sprintf("%.2f", percentage[i]),
// }
// }
overallPercentage, err := cpu.Percent(0, false)
if err != nil {
fmt.Println("Failed to get overall CPU percentage:", err)
return "", err
}
usages = append(usages, CpuUsage{
Time: queryTimeInUnixString,
Cpu: "Overall",
Time: queryTimeInUnixString,
// Cpu: "Overall",
Percent: fmt.Sprintf("%.2f", overallPercentage[0]),
})

Expand All @@ -63,10 +67,71 @@ func getCpuUsage(csv bool) (string, error) {
if csv {
var csvData string
for _, usage := range usages {
csvData += fmt.Sprintf("%s,%s,%f,%f,%f,%f,%s\n", usage.Time, usage.Cpu, usage.Usage, usage.Idle, usage.System, usage.User, usage.Percent)
// csvData += fmt.Sprintf("%s,%s,%f,%f,%f,%f,%s\n", usage.Time, usage.Cpu, usage.Usage, usage.Idle, usage.System, usage.User, usage.Percent)
csvData += fmt.Sprintf("%s,%s\n", usage.Time, usage.Percent)
}
return csvData, nil
}
return string(jsonData), nil

}

func getHistoryCpuUsage(from string, to string) (string, error) {
if from == "" && to == "" {
// return everything
file, err := os.ReadFile(cpuMetricsFile)
if err != nil {
fmt.Println("Failed to read file:", err)
return "", err
}
return string(file), nil
}
if from == "" {
from = "1970-01-01T00:00:00Z"
}
if to == "" {
to = time.Now().UTC().Format(time.RFC3339)
}
fromTime, err := time.Parse(time.RFC3339, from)
if err != nil {
fmt.Println("Failed to parse from time:", err)
return "", err
}
toTime, err := time.Parse(time.RFC3339, to)
if err != nil {
fmt.Println("Failed to parse to time:", err)
return "", err
}

fromTimeUnix := fromTime.UnixMilli()
toTimeUnix := toTime.UnixMilli()
file, err := os.ReadFile(cpuMetricsFile)
if err != nil {
fmt.Println("Failed to read file:", err)
return "", err
}
lines := string(file)
var result string
lines = lines[strings.Index(lines, "\n")+1:]
for _, line := range strings.Split(lines, "\n") {
if line == "" {
continue
}
parts := strings.Split(line, ",")
if len(parts) != 2 {
fmt.Println("Invalid line:", line)
continue
}
time, err := strconv.ParseInt(parts[0], 10, 64)
if err != nil {
fmt.Println("Failed to parse time:", err)
continue
}
if time >= fromTimeUnix && time <= toTimeUnix {
result += line + "\n"
}
}
result = cpuCsvHeader + result
return result, nil

}
18 changes: 16 additions & 2 deletions cmd/sentinel/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
var version string = "0.0.4"
var logsDir string = "/app/logs"
var metricsDir string = "/app/metrics"
var cpuMetricsFile string = metricsDir + "/cpu.csv"

// Arguments
var token string
Expand All @@ -38,11 +39,12 @@ func main() {
if gin.Mode() == gin.DebugMode {
logsDir = "./logs"
metricsDir = "./metrics"
cpuMetricsFile = metricsDir + "/cpu.csv"
}
if err := os.MkdirAll(logsDir, 0600); err != nil {
if err := os.MkdirAll(logsDir, 0700); err != nil {
log.Fatalf("Error creating metrics directory: %v", err)
}
if err := os.MkdirAll(metricsDir, 0600); err != nil {
if err := os.MkdirAll(metricsDir, 0700); err != nil {
log.Fatalf("Error creating metrics directory: %v", err)
}

Expand Down Expand Up @@ -120,6 +122,18 @@ func main() {
usage = cpuCsvHeader + usage
c.String(200, usage)
})
authorized.GET("/cpu/history", func(c *gin.Context) {
from := c.Query("from")
to := c.Query("to")
usage, err := getHistoryCpuUsage(from, to)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
})
return
}
c.String(200, usage)
})
authorized.GET("/memory", func(c *gin.Context) {
usage, err := getMemUsage(false)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion cmd/sentinel/memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func getMemUsage(csv bool) (string, error) {
fmt.Println("Failed to get memory usage:", err)
return "", err
}
queryTimeInUnixString := getUnixTimeInNanoUTC()
queryTimeInUnixString := getUnixTimeInMilliUTC()
usages := MemUsage{
Time: queryTimeInUnixString,
Total: memory.Total,
Expand Down
3 changes: 2 additions & 1 deletion cmd/sentinel/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ func cpuMetrics() {
fmt.Printf("Error getting containers: %s", err)
return
}
filepath := fmt.Sprintf("%s/cpu.csv", metricsDir)
filepath := fmt.Sprintf(cpuMetricsFile)
fmt.Println(filepath)
_, err = os.Stat(filepath)
if err != nil {
err := os.WriteFile(filepath, []byte(cpuCsvHeader), 0644)
Expand Down
6 changes: 6 additions & 0 deletions cmd/sentinel/shared.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,9 @@ func getUnixTimeInNanoUTC() string {
queryTimeInUnixString := fmt.Sprintf("%d", queryTimeInUnix)
return queryTimeInUnixString
}

func getUnixTimeInMilliUTC() string {
queryTimeInUnix := time.Now().UTC().UnixMilli()
queryTimeInUnixString := fmt.Sprintf("%d", queryTimeInUnix)
return queryTimeInUnixString
}

0 comments on commit a2d5a1f

Please sign in to comment.