ir: Add health status #87

Merged
fyrchik merged 2 commits from acid-ant/frostfs-node:feature/50-hc-for-ir into master 2023-03-13 11:24:43 +00:00
3 changed files with 21 additions and 4 deletions

View file

@ -925,7 +925,7 @@ func New(ctx context.Context, log *logger.Logger, cfg *viper.Viper, errChan chan
queueSize: cfg.GetUint32("workers.subnet"),
})
if cfg.GetString("metrics.address") != "" {
if cfg.GetString("prometheus.address") != "" {
fyrchik marked this conversation as resolved Outdated

Worth a separate commit.

Worth a separate commit.

Agree, moved in separate commit.

Agree, moved in separate commit.
m := metrics.NewInnerRingMetrics()
server.metrics = &m
}

View file

@ -167,6 +167,9 @@ func (s *Server) ResetEpochTimer(h uint32) error {
func (s *Server) setHealthStatus(hs control.HealthStatus) {
s.healthStatus.Store(hs)
if s.metrics != nil {
s.metrics.SetHealth(int32(hs))

Does the number means the same for other services? Like 0 == HEALTHY?

Does the number means the same for other services? Like 0 == HEALTHY?

We have two enums for HealthStatus - one in control and one in ir. But they have the same numbers for statuses. Can we move HealthStatus in common proto file, one for both packages?

We have two enums for HealthStatus - one in `control` and one in `ir`. But they have the same numbers for statuses. Can we move HealthStatus in `common` proto file, one for both packages?
}
}
// HealthStatus returns the current health status of the IR application.

View file

@ -2,11 +2,12 @@ package metrics
import "github.com/prometheus/client_golang/prometheus"
const innerRingSubsystem = "object"
const innerRingSubsystem = "ir"
// InnerRingServiceMetrics contains metrics collected by inner ring.
type InnerRingServiceMetrics struct {
epoch prometheus.Gauge
epoch prometheus.Gauge
health prometheus.Gauge
}
// NewInnerRingMetrics returns new instance of metrics collectors for inner ring.
@ -18,12 +19,20 @@ func NewInnerRingMetrics() InnerRingServiceMetrics {
Name: "epoch",
Help: "Current epoch as seen by inner-ring node.",
})
health = prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: namespace,
Subsystem: innerRingSubsystem,
Name: "health",
Help: "Current inner-ring node state.",
})
)
prometheus.MustRegister(epoch)
prometheus.MustRegister(health)
return InnerRingServiceMetrics{
epoch: epoch,
epoch: epoch,
health: health,
}
}
@ -31,3 +40,8 @@ func NewInnerRingMetrics() InnerRingServiceMetrics {
func (m InnerRingServiceMetrics) SetEpoch(epoch uint64) {
m.epoch.Set(float64(epoch))
}
// SetHealth updates health metrics.
func (m InnerRingServiceMetrics) SetHealth(s int32) {
m.health.Set(float64(s))
}