Commit b6cae656 authored by Will Cory's avatar Will Cory

feat(indexer): Add metrics to indexer/api

parent 9e055c3b
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
"github.com/ethereum-optimism/optimism/indexer/api/routes" "github.com/ethereum-optimism/optimism/indexer/api/routes"
"github.com/ethereum-optimism/optimism/indexer/database" "github.com/ethereum-optimism/optimism/indexer/database"
"github.com/ethereum-optimism/optimism/op-service/httputil" "github.com/ethereum-optimism/optimism/op-service/httputil"
"github.com/ethereum-optimism/optimism/op-service/metrics"
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware" "github.com/go-chi/chi/v5/middleware"
...@@ -18,17 +19,32 @@ const ethereumAddressRegex = `^0x[a-fA-F0-9]{40}$` ...@@ -18,17 +19,32 @@ const ethereumAddressRegex = `^0x[a-fA-F0-9]{40}$`
type Api struct { type Api struct {
log log.Logger log log.Logger
Router *chi.Mux Router *chi.Mux
MetricsRouter *chi.Mux
} }
const (
MetricsNamespace = "op_indexer"
)
func NewApi(logger log.Logger, bv database.BridgeTransfersView) *Api { func NewApi(logger log.Logger, bv database.BridgeTransfersView) *Api {
r := chi.NewRouter() apiRouter := chi.NewRouter()
h := routes.NewRoutes(logger, bv, r) 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) metricsRouter.Get("/metrics", promHandler.ServeHTTP)
r.Get(fmt.Sprintf("/api/v0/withdrawals/{address:%s}", ethereumAddressRegex), h.L2WithdrawalsHandler)
return &Api{log: logger, Router: r} return &Api{log: logger, Router: apiRouter, MetricsRouter: metricsRouter}
} }
func (a *Api) Listen(ctx context.Context, port int) error { func (a *Api) Listen(ctx context.Context, port int) error {
...@@ -43,3 +59,17 @@ 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 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