2023-11-08 09:22:34 -08:00
|
|
|
package ccq
|
|
|
|
|
|
|
|
import (
|
2023-11-03 11:06:18 -07:00
|
|
|
"context"
|
2023-11-08 09:22:34 -08:00
|
|
|
"fmt"
|
|
|
|
"net/http"
|
2023-12-11 14:00:46 -08:00
|
|
|
"sync/atomic"
|
2023-11-08 09:22:34 -08:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/certusone/wormhole/node/pkg/common"
|
2023-11-03 11:06:18 -07:00
|
|
|
promremotew "github.com/certusone/wormhole/node/pkg/telemetry/prom_remote_write"
|
2023-11-08 09:22:34 -08:00
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
)
|
|
|
|
|
|
|
|
type statusServer struct {
|
2023-12-11 14:00:46 -08:00
|
|
|
logger *zap.Logger
|
|
|
|
env common.Environment
|
|
|
|
httpServer *http.Server
|
|
|
|
healthEnabled atomic.Bool
|
2023-11-08 09:22:34 -08:00
|
|
|
}
|
|
|
|
|
2023-12-11 14:00:46 -08:00
|
|
|
func NewStatusServer(addr string, logger *zap.Logger, env common.Environment) *statusServer {
|
2023-11-08 09:22:34 -08:00
|
|
|
s := &statusServer{
|
|
|
|
logger: logger,
|
|
|
|
env: env,
|
|
|
|
}
|
2023-12-11 14:00:46 -08:00
|
|
|
s.healthEnabled.Store(true)
|
2023-11-08 09:22:34 -08:00
|
|
|
r := mux.NewRouter()
|
|
|
|
r.HandleFunc("/health", s.handleHealth).Methods("GET")
|
|
|
|
r.Handle("/metrics", promhttp.Handler())
|
2023-12-11 14:00:46 -08:00
|
|
|
s.httpServer = &http.Server{
|
2023-11-08 09:22:34 -08:00
|
|
|
Addr: addr,
|
|
|
|
Handler: r,
|
|
|
|
ReadHeaderTimeout: 5 * time.Second,
|
|
|
|
}
|
2023-12-11 14:00:46 -08:00
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *statusServer) disableHealth() {
|
|
|
|
s.healthEnabled.Store(false)
|
2023-11-08 09:22:34 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *statusServer) handleHealth(w http.ResponseWriter, r *http.Request) {
|
2023-12-11 14:00:46 -08:00
|
|
|
if !s.healthEnabled.Load() {
|
|
|
|
s.logger.Info("ignoring health check")
|
|
|
|
http.Error(w, "shutting down", http.StatusServiceUnavailable)
|
|
|
|
return
|
|
|
|
}
|
2023-11-08 09:22:34 -08:00
|
|
|
s.logger.Debug("health check")
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
|
|
fmt.Fprintf(w, "ok")
|
|
|
|
}
|
2023-11-03 11:06:18 -07:00
|
|
|
|
|
|
|
func RunPrometheusScraper(ctx context.Context, logger *zap.Logger, info promremotew.PromTelemetryInfo) error {
|
|
|
|
promLogger := logger.With(zap.String("component", "prometheus_scraper"))
|
|
|
|
errC := make(chan error)
|
|
|
|
common.StartRunnable(ctx, errC, false, "prometheus_scraper", func(ctx context.Context) error {
|
|
|
|
t := time.NewTicker(15 * time.Second)
|
|
|
|
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case <-ctx.Done():
|
|
|
|
return nil
|
|
|
|
case <-t.C:
|
|
|
|
err := promremotew.ScrapeAndSendLocalMetrics(ctx, info, promLogger)
|
|
|
|
if err != nil {
|
|
|
|
promLogger.Error("ScrapeAndSendLocalMetrics error", zap.Error(err))
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
return nil
|
|
|
|
}
|