Skip to content

Commit ae37cdb

Browse files
committed
historical_uptime: push precomputed chain height differences
Signed-off-by: bingyuyap <bingyu.yap.21@gmail.com>
1 parent b7d3afd commit ae37cdb

File tree

3 files changed

+80
-1
lines changed

3 files changed

+80
-1
lines changed

fly/cmd/historical_uptime/main.go

+31-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ var (
5959
[]string{"guardian", "chain"},
6060
)
6161

62+
guardianChainHeightDifferences = promauto.NewGaugeVec(
63+
prometheus.GaugeOpts{
64+
Name: "guardian_chain_height_differences",
65+
Help: "Current height difference of each guardian from max height on each chain over time",
66+
},
67+
[]string{"guardian", "chain"},
68+
)
69+
6270
guardianHeartbeats = promauto.NewGaugeVec(
6371
prometheus.GaugeOpts{
6472
Name: "guardian_heartbeats",
@@ -78,6 +86,11 @@ var (
7886

7987
const PYTHNET_CHAIN_ID = int(vaa.ChainIDPythNet)
8088

89+
var (
90+
// guardianChainHeights indexes current chain height by chain id and guardian name
91+
guardianChainHeights = make(common.GuardianChainHeights)
92+
)
93+
8194
func loadEnvVars() {
8295
err := godotenv.Load() // By default loads .env
8396
if err != nil {
@@ -105,6 +118,18 @@ func verifyEnvVar(key string) string {
105118
return value
106119
}
107120

121+
func recordGuardianHeightDifferences() {
122+
guardianHeightDifferencesByChain := historical_uptime.GetGuardianHeightDifferencesByChain(guardianChainHeights)
123+
124+
for chainId, guardianHeightDifferences := range guardianHeightDifferencesByChain {
125+
chainName := vaa.ChainID(chainId).String()
126+
127+
for guardian, heightDifference := range guardianHeightDifferences {
128+
guardianChainHeightDifferences.WithLabelValues(guardian, chainName).Set(float64(heightDifference))
129+
}
130+
}
131+
}
132+
108133
func initPromScraper(promRemoteURL string, logger *zap.Logger, errC chan error) {
109134
usingPromRemoteWrite := promRemoteURL != ""
110135
if usingPromRemoteWrite {
@@ -125,6 +150,7 @@ func initPromScraper(promRemoteURL string, logger *zap.Logger, errC chan error)
125150
case <-ctx.Done():
126151
return nil
127152
case <-t.C:
153+
recordGuardianHeightDifferences()
128154
for i := 1; i < 36; i++ {
129155
if i == PYTHNET_CHAIN_ID {
130156
continue
@@ -324,6 +350,11 @@ func main() {
324350
}
325351

326352
for _, network := range hb.Networks {
353+
if guardianChainHeights[network.Id] == nil {
354+
guardianChainHeights[network.Id] = make(common.GuardianHeight)
355+
}
356+
357+
guardianChainHeights[network.Id][guardianName] = uint64(network.Height)
327358
guardianChainHeight.With(
328359
prometheus.Labels{
329360
"guardian": guardianName,
@@ -338,7 +369,6 @@ func main() {
338369
},
339370
).Set(float64(hb.Counter))
340371

341-
342372
}
343373
}
344374
}()

fly/common/types.go

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package common
2+
3+
type GuardianHeight map[string]uint64 // map of guardian addr to chain height
4+
5+
type GuardianChainHeights map[uint32]GuardianHeight // map of chainIds to guardian heights
6+
7+
type ChainHeights map[uint32]uint64 // map of chainIds to heights

fly/pkg/historical_uptime/helpers.go

+42
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,45 @@ func UpdateMetrics(guardianMissedObservations *prometheus.CounterVec, guardianMi
6969
}
7070
}
7171
}
72+
73+
func computeMaxChainHeights(guardianChainHeights common.GuardianChainHeights) common.ChainHeights {
74+
maxChainHeights := make(common.ChainHeights)
75+
76+
for chainId, guardianHeights := range guardianChainHeights {
77+
highest := uint64(0)
78+
79+
for _, guardianHeight := range guardianHeights {
80+
if highest < guardianHeight {
81+
highest = guardianHeight
82+
}
83+
}
84+
85+
maxChainHeights[chainId] = highest
86+
}
87+
88+
return maxChainHeights
89+
}
90+
91+
func computeGuardianChainHeightDifferences(guardianChainHeights common.GuardianChainHeights, maxChainHeights common.ChainHeights) common.GuardianChainHeights {
92+
heightDifferences := make(common.GuardianChainHeights)
93+
94+
for chainId, guardianHeights := range guardianChainHeights {
95+
for guardian, height := range guardianHeights {
96+
if heightDifferences[chainId] == nil {
97+
heightDifferences[chainId] = make(common.GuardianHeight)
98+
}
99+
100+
// maxChainHeights[chain] always guaranteed to be at least height since it's computed in `computeMaxChainHeights`
101+
heightDifferences[chainId][guardian] = maxChainHeights[chainId] - height
102+
}
103+
}
104+
105+
return heightDifferences
106+
}
107+
108+
func GetGuardianHeightDifferencesByChain(guardianChainHeights common.GuardianChainHeights) common.GuardianChainHeights {
109+
maxChainHeights := computeMaxChainHeights(guardianChainHeights)
110+
return computeGuardianChainHeightDifferences(guardianChainHeights, maxChainHeights)
111+
}
112+
113+

0 commit comments

Comments
 (0)