status.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package ccq
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "sync/atomic"
  7. "time"
  8. "github.com/certusone/wormhole/node/pkg/common"
  9. promremotew "github.com/certusone/wormhole/node/pkg/telemetry/prom_remote_write"
  10. "github.com/gorilla/mux"
  11. "github.com/prometheus/client_golang/prometheus/promhttp"
  12. "go.uber.org/zap"
  13. )
  14. type statusServer struct {
  15. logger *zap.Logger
  16. env common.Environment
  17. httpServer *http.Server
  18. healthEnabled atomic.Bool
  19. }
  20. func NewStatusServer(addr string, logger *zap.Logger, env common.Environment) *statusServer {
  21. s := &statusServer{
  22. logger: logger,
  23. env: env,
  24. }
  25. s.healthEnabled.Store(true)
  26. r := mux.NewRouter()
  27. r.HandleFunc("/health", s.handleHealth).Methods("GET")
  28. r.Handle("/metrics", promhttp.Handler())
  29. s.httpServer = &http.Server{
  30. Addr: addr,
  31. Handler: r,
  32. ReadHeaderTimeout: 5 * time.Second,
  33. }
  34. return s
  35. }
  36. func (s *statusServer) disableHealth() {
  37. s.healthEnabled.Store(false)
  38. }
  39. func (s *statusServer) handleHealth(w http.ResponseWriter, r *http.Request) {
  40. if !s.healthEnabled.Load() {
  41. s.logger.Info("ignoring health check")
  42. http.Error(w, "shutting down", http.StatusServiceUnavailable)
  43. return
  44. }
  45. s.logger.Debug("health check")
  46. w.WriteHeader(http.StatusOK)
  47. fmt.Fprintf(w, "ok")
  48. }
  49. func RunPrometheusScraper(ctx context.Context, logger *zap.Logger, info promremotew.PromTelemetryInfo) error {
  50. promLogger := logger.With(zap.String("component", "prometheus_scraper"))
  51. errC := make(chan error)
  52. common.StartRunnable(ctx, errC, false, "prometheus_scraper", func(ctx context.Context) error {
  53. t := time.NewTicker(15 * time.Second)
  54. for {
  55. select {
  56. case <-ctx.Done():
  57. return nil
  58. case <-t.C:
  59. err := promremotew.ScrapeAndSendLocalMetrics(ctx, info, promLogger)
  60. if err != nil {
  61. promLogger.Error("ScrapeAndSendLocalMetrics encountered an error, will try again next interval", zap.Error(err))
  62. }
  63. }
  64. }
  65. })
  66. return nil
  67. }