Commit b6cae656 authored by Will Cory's avatar Will Cory

feat(indexer): Add metrics to indexer/api

parent 9e055c3b
......@@ -8,6 +8,7 @@ import (
"github.com/ethereum-optimism/optimism/indexer/api/routes"
"github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/op-service/httputil"
"github.com/ethereum-optimism/optimism/op-service/metrics"
"github.com/ethereum/go-ethereum/log"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
......@@ -16,19 +17,34 @@ import (
const ethereumAddressRegex = `^0x[a-fA-F0-9]{40}$`
type Api struct {
log log.Logger
Router *chi.Mux
log log.Logger
Router *chi.Mux
MetricsRouter *chi.Mux
}
const (
MetricsNamespace = "op_indexer"
)
func NewApi(logger log.Logger, bv database.BridgeTransfersView) *Api {
r := chi.NewRouter()
h := routes.NewRoutes(logger, bv, r)
apiRouter := chi.NewRouter()
h := routes.NewRoutes(logger, bv, apiRouter)
apiRouter.Use(middleware.Heartbeat("/healthz"))
apiRouter.Get(fmt.Sprintf("/api/v0/deposits/{address:%s}", ethereumAddressRegex), h.L1DepositsHandler)
apiRouter.Get(fmt.Sprintf("/api/v0/withdrawals/{address:%s}", ethereumAddressRegex), h.L2WithdrawalsHandler)
metricsRouter := chi.NewRouter()
registry := metrics.NewRegistry()
promRecorder := metrics.NewPromHTTPRecorder(registry, MetricsNamespace)
promHandler := metrics.NewHTTPRecordingMiddleware(promRecorder, apiRouter)
r.Use(middleware.Heartbeat("/healthz"))
metricsRouter.Use(middleware.Heartbeat("/healthz"))
r.Get(fmt.Sprintf("/api/v0/deposits/{address:%s}", ethereumAddressRegex), h.L1DepositsHandler)
r.Get(fmt.Sprintf("/api/v0/withdrawals/{address:%s}", ethereumAddressRegex), h.L2WithdrawalsHandler)
return &Api{log: logger, Router: r}
metricsRouter.Get("/metrics", promHandler.ServeHTTP)
return &Api{log: logger, Router: apiRouter, MetricsRouter: metricsRouter}
}
func (a *Api) Listen(ctx context.Context, port int) error {
......@@ -43,3 +59,17 @@ func (a *Api) Listen(ctx context.Context, port int) error {
return err
}
func (a *Api) ListenMetrics(ctx context.Context, port int) error {
a.log.Info("metrics server listening...", "port", port)
server := http.Server{Addr: fmt.Sprintf(":%d", port), Handler: a.MetricsRouter}
err := httputil.ListenAndServeContext(ctx, &server)
if err != nil {
a.log.Error("api server stopped", "err", err)
} else {
a.log.Info("api server stopped")
}
return err
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment