Skip to content

Commit 24a7bcc

Browse files
committed
Optional metrics JSON dumping/loading
1 parent f4e3ad1 commit 24a7bcc

4 files changed

Lines changed: 51 additions & 3 deletions

File tree

internal/config/keys.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ const METRICS_PROMETHEUS_PUSHGATEWAY_HOST = "metrics.prometheus.pushgateway.host
6868
// Interval (in seconds) for metrics retriever
6969
const METRICS_RETRIEVER_INTERVAL = "metrics.retriever.interval"
7070

71+
// Filename to dump retrieved metrics as JSON
72+
const METRICS_DUMP_JSON_FILE = "metrics.dump.json.file"
73+
74+
// Filename to load metrics from JSON
75+
const METRICS_LOAD_JSON_FILE = "metrics.load.json.file"
76+
7177
// Scheduling policy to use
7278
// Possible values: "qosaware", "default", "cloudonly"
7379
const SCHEDULING_POLICY = "scheduler.policy"

internal/metrics/metrics.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package metrics
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"github.com/prometheus/client_golang/prometheus/push"
67
"log"
8+
"os"
79
"time"
810

911
"net/http"
@@ -134,7 +136,29 @@ func Init() {
134136

135137
}
136138

137-
go MetricsRetriever()
139+
jsonMetricsToLoad := config.GetString(config.METRICS_LOAD_JSON_FILE, "")
140+
if jsonMetricsToLoad == "" {
141+
go MetricsRetriever()
142+
} else {
143+
log.Println("Disabling metrics retriever and loading metrics from:", jsonMetricsToLoad)
144+
err := loadMetricsFromJSON(jsonMetricsToLoad)
145+
if err != nil {
146+
log.Printf("Error loading metrics: %v\n", err)
147+
}
148+
log.Println(retrievedMetrics)
149+
}
150+
}
151+
152+
func loadMetricsFromJSON(filename string) error {
153+
file, err := os.Open(filename)
154+
if err != nil {
155+
return err
156+
}
157+
defer file.Close()
158+
159+
decoder := json.NewDecoder(file)
160+
err = decoder.Decode(&retrievedMetrics)
161+
return err
138162
}
139163

140164
func AddCompletedInvocation(funcName string, coldStart bool) {

internal/metrics/retriever.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package metrics
22

33
import (
44
"context"
5+
"encoding/json"
56
"fmt"
67
"github.com/serverledge-faas/serverledge/internal/registration"
78
"log"
9+
"os"
810
"time"
911

1012
"github.com/prometheus/common/model"
@@ -231,8 +233,24 @@ func MetricsRetriever() {
231233
retrievedMetrics.AvgRemoteInitTime = make(map[string]float64)
232234
}
233235

234-
fmt.Println("All queries completed")
235236
fmt.Println(retrievedMetrics)
237+
238+
// TODO: configuration option
239+
metricsJsonFilename := config.GetString(config.METRICS_DUMP_JSON_FILE, "")
240+
if metricsJsonFilename != "" {
241+
file, err := os.Create(metricsJsonFilename)
242+
if err != nil {
243+
log.Printf("Error in serializing metrics: %v", err)
244+
} else {
245+
encoder := json.NewEncoder(file)
246+
encoder.SetIndent("", " ") // Optional: for pretty printing
247+
err = encoder.Encode(retrievedMetrics)
248+
if err != nil {
249+
log.Printf("Error in writing metrics to file: %v", err)
250+
}
251+
file.Close()
252+
}
253+
}
236254
}
237255
}
238256

scripts/start-pushgateway.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
#!/bin/sh
2-
docker run -d -p 9091:9091 --name pushgateway prom/pushgateway
2+
docker run --rm -d -p 9091:9091 --name pushgateway prom/pushgateway

0 commit comments

Comments
 (0)