Skip to content

Commit ca3caf7

Browse files
committed
[WIP] Prometheus client
1 parent d3d35ae commit ca3caf7

3 files changed

Lines changed: 191 additions & 5 deletions

File tree

go.mod

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ toolchain go1.22.5
77
require (
88
github.com/LK4D4/trylock v0.0.0-20191027065348-ff7e133a5c54
99
github.com/buger/jsonparser v1.1.1
10-
github.com/cornelk/hashmap v1.0.8
1110
github.com/docker/docker v24.0.5+incompatible
1211
github.com/hexablock/vivaldi v0.0.0-20180727225019-07adad3f2b5f
1312
github.com/labstack/echo/v4 v4.6.1
1413
github.com/labstack/gommon v0.3.0
1514
github.com/lithammer/shortuuid v3.0.0+incompatible
1615
github.com/mikoim/go-loadavg v0.0.0-20150917074714-35ece5f6d547
1716
github.com/prometheus/client_golang v1.14.0
17+
github.com/prometheus/common v0.37.0
18+
github.com/spf13/cast v1.3.0
1819
github.com/spf13/cobra v1.9.1
1920
github.com/spf13/viper v1.4.0
2021
go.etcd.io/etcd/client/v3 v3.5.1
@@ -45,24 +46,25 @@ require (
4546
github.com/google/uuid v1.6.0 // indirect
4647
github.com/hashicorp/hcl v1.0.0 // indirect
4748
github.com/inconshreveable/mousetrap v1.1.0 // indirect
49+
github.com/json-iterator/go v1.1.12 // indirect
4850
github.com/kr/pretty v0.3.0 // indirect
4951
github.com/magiconair/properties v1.8.7 // indirect
5052
github.com/mattn/go-colorable v0.1.8 // indirect
5153
github.com/mattn/go-isatty v0.0.14 // indirect
5254
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
5355
github.com/mitchellh/mapstructure v1.1.2 // indirect
5456
github.com/moby/term v0.5.0 // indirect
57+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
58+
github.com/modern-go/reflect2 v1.0.2 // indirect
5559
github.com/morikuni/aec v1.0.0 // indirect
5660
github.com/opencontainers/go-digest v1.0.0 // indirect
5761
github.com/opencontainers/image-spec v1.1.0-rc4 // indirect
5862
github.com/pelletier/go-toml v1.9.5 // indirect
5963
github.com/pkg/errors v0.9.1 // indirect
6064
github.com/prometheus/client_model v0.3.0 // indirect
61-
github.com/prometheus/common v0.37.0 // indirect
6265
github.com/prometheus/procfs v0.8.0 // indirect
6366
github.com/rogpeppe/go-internal v1.8.1 // indirect
6467
github.com/spf13/afero v1.2.2 // indirect
65-
github.com/spf13/cast v1.3.0 // indirect
6668
github.com/spf13/jwalterweatherman v1.0.0 // indirect
6769
github.com/spf13/pflag v1.0.6 // indirect
6870
github.com/valyala/bytebufferpool v1.0.0 // indirect

go.sum

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV
7575
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
7676
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
7777
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
78-
github.com/cornelk/hashmap v1.0.8 h1:nv0AWgw02n+iDcawr5It4CjQIAcdMMKRrs10HOJYlrc=
79-
github.com/cornelk/hashmap v1.0.8/go.mod h1:RfZb7JO3RviW/rT6emczVuC/oxpdz4UsSB2LJSclR1k=
8078
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
8179
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
8280
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -200,10 +198,12 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
200198
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
201199
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
202200
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
201+
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
203202
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
204203
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
205204
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
206205
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
206+
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
207207
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
208208
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
209209
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
@@ -250,13 +250,16 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh
250250
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
251251
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
252252
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
253+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
253254
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
254255
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
255256
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
257+
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
256258
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
257259
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
258260
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
259261
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
262+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
260263
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
261264
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
262265
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
@@ -475,6 +478,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr
475478
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
476479
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
477480
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
481+
golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g=
482+
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
478483
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
479484
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
480485
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -629,6 +634,8 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
629634
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
630635
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
631636
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
637+
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
638+
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
632639
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
633640
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
634641
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=

internal/metrics/query.go

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
package metrics
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"github.com/prometheus/common/model"
7+
"log"
8+
"regexp"
9+
"strings"
10+
"sync"
11+
"time"
12+
13+
promapi "github.com/prometheus/client_golang/api"
14+
v1 "github.com/prometheus/client_golang/api/prometheus/v1"
15+
)
16+
17+
// Struct to represent query with its id
18+
type queryInfos struct {
19+
id string
20+
query string
21+
}
22+
23+
func queryPrometheus(wg *sync.WaitGroup, queryInfos queryInfos, api v1.API, ctx context.Context, byTerm string) {
24+
defer wg.Done()
25+
26+
var outputMap map[string]float64
27+
result, warnings, err := api.Query(ctx, queryInfos.query, time.Now())
28+
if err != nil {
29+
log.Fatalf("Error with the execution of the query: %v\n", err)
30+
}
31+
32+
if len(warnings) > 0 {
33+
log.Printf("Received Advices in the execution of the query: %v\n", warnings)
34+
}
35+
36+
outputMap = parserOutputResult(result, byTerm)
37+
fmt.Println(outputMap)
38+
39+
// TODO
40+
//switch queryInfos.id {
41+
//case "AvgTotalColdStartsTime":
42+
// dataToSend.AvgTotalColdStartsTime = outputMap
43+
// dataFuncToSend.AvgTotalColdStartsTime = outputMap
44+
//case "AvgFunDurationTime":
45+
// dataToSend.AvgFunDurationTime = outputMap
46+
// dataFuncToSend.AvgFunDurationTime = outputMap
47+
//case "AvgOutputFunSize":
48+
// dataToSend.AvgOutputFunSize = outputMap
49+
// dataFuncToSend.AvgOutputFunSize = outputMap
50+
//case "AvgRemoteFunDurationTime":
51+
// dataToSend.AvgFunRemoteDurationTime = outputMap
52+
// dataFuncToSend.AvgFunRemoteDurationTime = outputMap
53+
//case "AvgRemoteOutputFunSize":
54+
// dataToSend.AvgOutputFunRemoteSize = outputMap
55+
// dataFuncToSend.AvgOutputFunRemoteSize = outputMap
56+
//case "AvgFcRespTime":
57+
// dataToSend.AvgFcRespTime = outputMap
58+
//case "AvgFcRemoteRespTime":
59+
// dataToSend.AvgFcRemoteRespTime = outputMap
60+
//case "AvgSavingInfosTime":
61+
// dataToSend.AvgSavingInfosTime = outputMap
62+
//case "AvgFcTTranferTime":
63+
// dataToSend.AvgFcTTransferTime = outputMap
64+
//case "AvgFcTReturnTime":
65+
// dataToSend.AvgFcTReturnTime = outputMap
66+
//case "AvgFuncOffloadLatency":
67+
// dataFuncToSend.AvgFunOffloadLatency = outputMap
68+
//case "NoChoiceNodeInvocations":
69+
// dataToSend.NoChoiceNodeInvocations = outputMap
70+
//case "NoBranchInvocations":
71+
// dataToSend.NoBranchInvocations = outputMap
72+
//}
73+
74+
}
75+
76+
func parserOutputResult(execResult model.Value, byTerm string) map[string]float64 {
77+
functionValues := make(map[string]float64)
78+
if vector, ok := execResult.(model.Vector); ok {
79+
for _, sample := range vector {
80+
if byTerm == "" {
81+
value := float64(sample.Value)
82+
functionValues["result"] = value
83+
} else {
84+
functionName := string(sample.Metric[model.LabelName(byTerm)])
85+
value := float64(sample.Value)
86+
functionValues[functionName] = value
87+
}
88+
89+
}
90+
} else {
91+
log.Fatalf("Unexpected Result %v\n", execResult)
92+
}
93+
94+
return functionValues
95+
}
96+
97+
func parserBy(query string) string {
98+
re := regexp.MustCompile(`by\s*\(([^)]+)\)`)
99+
var concatenated string
100+
matches := re.FindAllStringSubmatch(query, -1)
101+
if matches != nil {
102+
uniqueTerms := make(map[string]bool)
103+
104+
for _, match := range matches {
105+
if len(match) > 1 {
106+
terms := strings.Split(match[1], ",")
107+
for _, term := range terms {
108+
trimmedTerm := strings.TrimSpace(term)
109+
uniqueTerms[trimmedTerm] = true
110+
}
111+
}
112+
}
113+
114+
var byContents []string
115+
for term := range uniqueTerms {
116+
byContents = append(byContents, term)
117+
}
118+
119+
concatenated = strings.Join(byContents, ", ")
120+
} else {
121+
//byTerm not found
122+
concatenated = ""
123+
}
124+
125+
return concatenated
126+
}
127+
128+
func PeriodicalMetricsRetrieveFromPrometheus() {
129+
// Configuration of the Prometheus client
130+
client, err := promapi.NewClient(promapi.Config{
131+
Address: "http://127.0.0.1:9090",
132+
})
133+
if err != nil {
134+
log.Fatalf("Error in client creation: %v\n", err)
135+
}
136+
137+
// API of Prometheus
138+
api := v1.NewAPI(client)
139+
ctx := context.Background()
140+
141+
queries := []queryInfos{
142+
//{"sum(rate(ColdStart_duration_seconds_sum[1m])) / clamp_min(sum(rate(ColdStart_duration_seconds_count[1m])),1)", "AVG Cold Start Duration [1m]"},
143+
{"AvgTotalColdStartsTime", "sum(ColdStart_duration_seconds_sum) by (functColdStartHistogram) / clamp_min(sum(ColdStart_duration_seconds_count) by (functColdStartHistogram), 1)"},
144+
{"AvgFunDurationTime", "sum(Function_duration_seconds_sum) by (functInvocationDuration) / sum(Function_duration_seconds_count) by (functInvocationDuration)"},
145+
{"AvgOutputFunSize", "sum(FunctionOutput_size_seconds_sum) by (functionSizeHistogram) / sum(FunctionOutput_size_seconds_count) by (functionSizeHistogram)"},
146+
{"AvgRemoteFunDurationTime", "sum(Function_RemoteDuration_seconds_sum) by (functInvocationRemoteDuration) / sum(Function_RemoteDuration_seconds_count) by (functInvocationRemoteDuration)"},
147+
{"AvgRemoteOutputFunSize", "sum(FunctionOutput_RemoteSize_seconds_sum) by (functionRemoteSizeHistogram) / sum(FunctionOutput_RemoteSize_seconds_count) by (functionRemoteSizeHistogram)"},
148+
{"AvgFcRespTime", "sum(FunctionComposition_respTime_seconds_sum) by (functionCompositionInvocationRespTime) / clamp_min(sum(FunctionComposition_respTime_seconds_count) by (functionCompositionInvocationRespTime), 1)"},
149+
{"AvgFcRemoteRespTime", "sum(FunctionComposition_remoteRespTime_seconds_sum) by (functionCompositionInvocationRemoteRespTime) / clamp_min(sum(FunctionComposition_remoteRespTime_seconds_count) by (functionCompositionInvocationRemoteRespTime), 1)"},
150+
{"AvgSavingInfosTime", "sum(FunctionComposition_SavingInfosDuration_seconds_sum) by (functionCompositionSavingInfoDuration) / clamp_min(sum(FunctionComposition_SavingInfosDuration_seconds_count) by (functionCompositionSavingInfoDuration), 1)"},
151+
{"AvgFcTTranferTime", "sum(FunctionComposition_TTransferTime_seconds_sum) by (functionCompositionTTransferTime) / clamp_min(sum(FunctionComposition_TTransferTime_seconds_count) by (functionCompositionTTransferTime), 1)"},
152+
{"AvgFcTReturnTime", "sum(FunctionComposition_TReturnTime_seconds_sum) by (functionCompositionTReturnTime) / clamp_min(sum(FunctionComposition_TReturnTime_seconds_count) by (functionCompositionTReturnTime), 1)"},
153+
{"AvgFuncOffloadLatency", "sum(Function_OffloadLatency_seconds_sum) by (functionOffloadLatency) / clamp_min(sum(Function_OffloadLatency_seconds_count) by (functionOffloadLatency), 1)"},
154+
{"NoChoiceNodeInvocations", "sum by (fcChoiceNodeInvocationCounter) (ChoiceNode_InvocationNo_total)"},
155+
{"NoBranchInvocations", "sum by (fcBranchInvocationCounter) (BranchInvocations_total)"},
156+
}
157+
158+
ticker := time.NewTicker(1500 * time.Millisecond)
159+
defer ticker.Stop()
160+
161+
for {
162+
select {
163+
case <-ticker.C:
164+
var wg sync.WaitGroup
165+
166+
for _, query := range queries {
167+
wg.Add(1)
168+
byTerm := parserBy(query.query)
169+
go queryPrometheus(&wg, query, api, ctx, byTerm)
170+
}
171+
172+
wg.Wait()
173+
fmt.Println("All queries completed")
174+
175+
}
176+
}
177+
}

0 commit comments

Comments
 (0)