api.go 1.14 KB
Newer Older
1 2 3 4 5 6 7
package rpc

import (
	"context"
	"fmt"

	oplog "github.com/ethereum-optimism/optimism/op-service/log"
8
	"github.com/ethereum-optimism/optimism/op-service/metrics"
9
	"github.com/ethereum/go-ethereum/log"
10
	"github.com/ethereum/go-ethereum/rpc"
11 12
)

13 14 15 16 17 18 19
func ToGethAdminAPI(api *CommonAdminAPI) rpc.API {
	return rpc.API{
		Namespace: "admin",
		Service:   api,
	}
}

20
type CommonAdminAPI struct {
21
	M   metrics.RPCMetricer
22 23 24
	log log.Logger
}

25
func NewCommonAdminAPI(m metrics.RPCMetricer, log log.Logger) *CommonAdminAPI {
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
	return &CommonAdminAPI{
		M:   m,
		log: log,
	}
}

func (n *CommonAdminAPI) SetLogLevel(ctx context.Context, lvlStr string) error {
	recordDur := n.M.RecordRPCServerRequest("admin_setLogLevel")
	defer recordDur()

	h := n.log.GetHandler()

	lvl, err := log.LvlFromString(lvlStr)
	if err != nil {
		return err
	}

	// We set the log level, and do not wrap the handler with an additional filter handler,
	// as the underlying handler would otherwise also still filter with the previous log level.
	lvlSetter, ok := h.(oplog.LvlSetter)
	if !ok {
		return fmt.Errorf("log handler type %T cannot change log level", h)
	}
	lvlSetter.SetLogLevel(lvl)
	return nil
}