api/internal/endpoint/handler/metrics/handler.go

56 lines
1.2 KiB
Go
Raw Normal View History

2021-01-13 17:07:04 +00:00
package metrics
import (
"errors"
"net/http"
"github.com/prometheus/client_golang/prometheus/promhttp"
"gitlab.com/inetmock/inetmock/internal/endpoint"
"gitlab.com/inetmock/inetmock/pkg/logging"
"go.uber.org/zap"
)
const (
name = "metrics_exporter"
)
type metricsExporter struct {
logger logging.Logger
server *http.Server
}
func (m *metricsExporter) Start(lifecycle endpoint.Lifecycle) (err error) {
var exporterOptions metricsExporterOptions
if err = lifecycle.UnmarshalOptions(&exporterOptions); err != nil {
return
}
m.logger = m.logger.With(
zap.String("handler_name", lifecycle.Name()),
zap.String("address", lifecycle.Uplink().Addr().String()),
)
mux := http.NewServeMux()
mux.Handle(exporterOptions.Route, promhttp.Handler())
m.server = &http.Server{
Handler: mux,
}
go func() {
if err := m.server.Serve(lifecycle.Uplink().Listener); err != nil && !errors.Is(err, http.ErrServerClosed) {
m.logger.Error(
"Error occurred while serving metrics",
zap.Error(err),
)
}
}()
go func() {
<-lifecycle.Context().Done()
if err := m.server.Close(); err != nil && !errors.Is(err, http.ErrServerClosed) {
m.logger.Error("failed to stop metrics server", zap.Error(err))
}
}()
return
}