pkg/exporter/cmd/metricserver.go (58 lines of code) (raw):
package cmd
import (
"context"
"net/http"
"github.com/alibaba/kubeskoop/pkg/exporter/probe"
"github.com/alibaba/kubeskoop/pkg/exporter/util"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
log "github.com/sirupsen/logrus"
)
func newMetricsServer() (*MetricsServer, error) {
r := prometheus.NewRegistry()
handler := promhttp.HandlerFor(prometheus.Gatherers{
r,
}, promhttp.HandlerOpts{})
probeManager := &MetricsProbeManager{
prometheusRegistry: r,
}
return &MetricsServer{
DynamicProbeServer: NewDynamicProbeServer[probe.MetricsProbe](probeManager),
httpHandler: handler,
}, nil
}
type MetricsProbeManager struct {
prometheusRegistry *prometheus.Registry
}
func (m *MetricsProbeManager) CreateProbe(config ProbeConfig) (probe.MetricsProbe, error) {
log.Infof("create metrics probe %s with args %s", config.Name, util.ToJSONString(config.Args))
return probe.CreateMetricsProbe(config.Name, config.Args)
}
func (m *MetricsProbeManager) StartProbe(ctx context.Context, p probe.MetricsProbe) error {
log.Infof("start metrics probe %s", p.Name())
if err := p.Start(ctx); err != nil {
return err
}
m.prometheusRegistry.MustRegister(p)
return nil
}
func (m *MetricsProbeManager) StopProbe(ctx context.Context, p probe.MetricsProbe) error {
log.Infof("stop metrics probe %s", p.Name())
state := p.State()
if state == probe.ProbeStateStopped || state == probe.ProbeStateStopping || state == probe.ProbeStateFailed {
return nil
}
if err := p.Stop(ctx); err != nil {
return err
}
m.prometheusRegistry.Unregister(p)
return nil
}
var _ ProbeManager[probe.MetricsProbe] = &MetricsProbeManager{}
type MetricsServer struct {
*DynamicProbeServer[probe.MetricsProbe]
httpHandler http.Handler
}
func (s *MetricsServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s.httpHandler.ServeHTTP(w, r)
}