Skip to content

Commit c174c62

Browse files
Return log levels from admin.SetLoggerLevel (#2250)
1 parent 20f3580 commit c174c62

File tree

3 files changed

+101
-80
lines changed

3 files changed

+101
-80
lines changed

api/admin/client.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type Client interface {
2525
GetChainAliases(ctx context.Context, chainID string, options ...rpc.Option) ([]string, error)
2626
Stacktrace(context.Context, ...rpc.Option) error
2727
LoadVMs(context.Context, ...rpc.Option) (map[ids.ID][]string, map[ids.ID]string, error)
28-
SetLoggerLevel(ctx context.Context, loggerName, logLevel, displayLevel string, options ...rpc.Option) error
28+
SetLoggerLevel(ctx context.Context, loggerName, logLevel, displayLevel string, options ...rpc.Option) (map[string]LogAndDisplayLevels, error)
2929
GetLoggerLevel(ctx context.Context, loggerName string, options ...rpc.Option) (map[string]LogAndDisplayLevels, error)
3030
GetConfig(ctx context.Context, options ...rpc.Option) (interface{}, error)
3131
}
@@ -96,7 +96,7 @@ func (c *client) SetLoggerLevel(
9696
logLevel,
9797
displayLevel string,
9898
options ...rpc.Option,
99-
) error {
99+
) (map[string]LogAndDisplayLevels, error) {
100100
var (
101101
logLevelArg logging.Level
102102
displayLevelArg logging.Level
@@ -105,28 +105,30 @@ func (c *client) SetLoggerLevel(
105105
if len(logLevel) > 0 {
106106
logLevelArg, err = logging.ToLevel(logLevel)
107107
if err != nil {
108-
return err
108+
return nil, err
109109
}
110110
}
111111
if len(displayLevel) > 0 {
112112
displayLevelArg, err = logging.ToLevel(displayLevel)
113113
if err != nil {
114-
return err
114+
return nil, err
115115
}
116116
}
117-
return c.requester.SendRequest(ctx, "admin.setLoggerLevel", &SetLoggerLevelArgs{
117+
res := &LoggerLevelReply{}
118+
err = c.requester.SendRequest(ctx, "admin.setLoggerLevel", &SetLoggerLevelArgs{
118119
LoggerName: loggerName,
119120
LogLevel: &logLevelArg,
120121
DisplayLevel: &displayLevelArg,
121-
}, &api.EmptyReply{}, options...)
122+
}, res, options...)
123+
return res.LoggerLevels, err
122124
}
123125

124126
func (c *client) GetLoggerLevel(
125127
ctx context.Context,
126128
loggerName string,
127129
options ...rpc.Option,
128130
) (map[string]LogAndDisplayLevels, error) {
129-
res := &GetLoggerLevelReply{}
131+
res := &LoggerLevelReply{}
130132
err := c.requester.SendRequest(ctx, "admin.getLoggerLevel", &GetLoggerLevelArgs{
131133
LoggerName: loggerName,
132134
}, res, options...)

api/admin/client_test.go

+46-28
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ func (mc *mockClient) SendRequest(_ context.Context, _ string, _ interface{}, re
6363
case *LoadVMsReply:
6464
response := mc.response.(*LoadVMsReply)
6565
*p = *response
66-
case *GetLoggerLevelReply:
67-
response := mc.response.(*GetLoggerLevelReply)
66+
case *LoggerLevelReply:
67+
response := mc.response.(*LoggerLevelReply)
6868
*p = *response
6969
case *interface{}:
7070
response := mc.response.(*interface{})
@@ -212,54 +212,72 @@ func TestReloadInstalledVMs(t *testing.T) {
212212

213213
func TestSetLoggerLevel(t *testing.T) {
214214
type test struct {
215-
name string
216-
logLevel string
217-
displayLevel string
218-
serviceErr error
219-
clientErr error
215+
name string
216+
logLevel string
217+
displayLevel string
218+
serviceResponse map[string]LogAndDisplayLevels
219+
serviceErr error
220+
clientErr error
220221
}
221222
tests := []test{
222223
{
223224
name: "Happy path",
224225
logLevel: "INFO",
225226
displayLevel: "INFO",
226-
serviceErr: nil,
227-
clientErr: nil,
227+
serviceResponse: map[string]LogAndDisplayLevels{
228+
"Happy path": {LogLevel: logging.Info, DisplayLevel: logging.Info},
229+
},
230+
serviceErr: nil,
231+
clientErr: nil,
228232
},
229233
{
230-
name: "Service errors",
231-
logLevel: "INFO",
232-
displayLevel: "INFO",
233-
serviceErr: errTest,
234-
clientErr: errTest,
234+
name: "Service errors",
235+
logLevel: "INFO",
236+
displayLevel: "INFO",
237+
serviceResponse: nil,
238+
serviceErr: errTest,
239+
clientErr: errTest,
235240
},
236241
{
237-
name: "Invalid log level",
238-
logLevel: "invalid",
239-
displayLevel: "INFO",
240-
serviceErr: nil,
241-
clientErr: logging.ErrUnknownLevel,
242+
name: "Invalid log level",
243+
logLevel: "invalid",
244+
displayLevel: "INFO",
245+
serviceResponse: nil,
246+
serviceErr: nil,
247+
clientErr: logging.ErrUnknownLevel,
242248
},
243249
{
244-
name: "Invalid display level",
245-
logLevel: "INFO",
246-
displayLevel: "invalid",
247-
serviceErr: nil,
248-
clientErr: logging.ErrUnknownLevel,
250+
name: "Invalid display level",
251+
logLevel: "INFO",
252+
displayLevel: "invalid",
253+
serviceResponse: nil,
254+
serviceErr: nil,
255+
clientErr: logging.ErrUnknownLevel,
249256
},
250257
}
251258
for _, tt := range tests {
252259
t.Run(tt.name, func(t *testing.T) {
260+
require := require.New(t)
261+
253262
c := client{
254-
requester: NewMockClient(&api.EmptyReply{}, tt.serviceErr),
263+
requester: NewMockClient(
264+
&LoggerLevelReply{
265+
LoggerLevels: tt.serviceResponse,
266+
},
267+
tt.serviceErr,
268+
),
255269
}
256-
err := c.SetLoggerLevel(
270+
res, err := c.SetLoggerLevel(
257271
context.Background(),
258272
"",
259273
tt.logLevel,
260274
tt.displayLevel,
261275
)
262-
require.ErrorIs(t, err, tt.clientErr)
276+
require.ErrorIs(err, tt.clientErr)
277+
if tt.clientErr != nil {
278+
return
279+
}
280+
require.Equal(tt.serviceResponse, res)
263281
})
264282
}
265283
}
@@ -296,7 +314,7 @@ func TestGetLoggerLevel(t *testing.T) {
296314

297315
c := client{
298316
requester: NewMockClient(
299-
&GetLoggerLevelReply{
317+
&LoggerLevelReply{
300318
LoggerLevels: tt.serviceResponse,
301319
},
302320
tt.serviceErr,

api/admin/service.go

+46-45
Original file line numberDiff line numberDiff line change
@@ -224,13 +224,21 @@ func (a *Admin) Stacktrace(_ *http.Request, _ *struct{}, _ *api.EmptyReply) erro
224224
return perms.WriteFile(stacktraceFile, stacktrace, perms.ReadWrite)
225225
}
226226

227-
// See SetLoggerLevel
228227
type SetLoggerLevelArgs struct {
229228
LoggerName string `json:"loggerName"`
230229
LogLevel *logging.Level `json:"logLevel"`
231230
DisplayLevel *logging.Level `json:"displayLevel"`
232231
}
233232

233+
type LogAndDisplayLevels struct {
234+
LogLevel logging.Level `json:"logLevel"`
235+
DisplayLevel logging.Level `json:"displayLevel"`
236+
}
237+
238+
type LoggerLevelReply struct {
239+
LoggerLevels map[string]LogAndDisplayLevels `json:"loggerLevels"`
240+
}
241+
234242
// SetLoggerLevel sets the log level and/or display level for loggers.
235243
// If len([args.LoggerName]) == 0, sets the log/display level of all loggers.
236244
// Otherwise, sets the log/display level of the loggers named in that argument.
@@ -240,7 +248,7 @@ type SetLoggerLevelArgs struct {
240248
// Sets the display level of these loggers to args.LogLevel.
241249
// If args.DisplayLevel == nil, doesn't set the display level of these loggers.
242250
// If args.DisplayLevel != nil, must be a valid string representation of a log level.
243-
func (a *Admin) SetLoggerLevel(_ *http.Request, args *SetLoggerLevelArgs, _ *api.EmptyReply) error {
251+
func (a *Admin) SetLoggerLevel(_ *http.Request, args *SetLoggerLevelArgs, reply *LoggerLevelReply) error {
244252
a.Log.Debug("API called",
245253
zap.String("service", "admin"),
246254
zap.String("method", "setLoggerLevel"),
@@ -256,14 +264,7 @@ func (a *Admin) SetLoggerLevel(_ *http.Request, args *SetLoggerLevelArgs, _ *api
256264
a.lock.Lock()
257265
defer a.lock.Unlock()
258266

259-
var loggerNames []string
260-
if len(args.LoggerName) > 0 {
261-
loggerNames = []string{args.LoggerName}
262-
} else {
263-
// Empty name means all loggers
264-
loggerNames = a.LogFactory.GetLoggerNames()
265-
}
266-
267+
loggerNames := a.getLoggerNames(args.LoggerName)
267268
for _, name := range loggerNames {
268269
if args.LogLevel != nil {
269270
if err := a.LogFactory.SetLogLevel(name, *args.LogLevel); err != nil {
@@ -276,26 +277,18 @@ func (a *Admin) SetLoggerLevel(_ *http.Request, args *SetLoggerLevelArgs, _ *api
276277
}
277278
}
278279
}
279-
return nil
280-
}
281280

282-
type LogAndDisplayLevels struct {
283-
LogLevel logging.Level `json:"logLevel"`
284-
DisplayLevel logging.Level `json:"displayLevel"`
281+
var err error
282+
reply.LoggerLevels, err = a.getLogLevels(loggerNames)
283+
return err
285284
}
286285

287-
// See GetLoggerLevel
288286
type GetLoggerLevelArgs struct {
289287
LoggerName string `json:"loggerName"`
290288
}
291289

292-
// See GetLoggerLevel
293-
type GetLoggerLevelReply struct {
294-
LoggerLevels map[string]LogAndDisplayLevels `json:"loggerLevels"`
295-
}
296-
297290
// GetLogLevel returns the log level and display level of all loggers.
298-
func (a *Admin) GetLoggerLevel(_ *http.Request, args *GetLoggerLevelArgs, reply *GetLoggerLevelReply) error {
291+
func (a *Admin) GetLoggerLevel(_ *http.Request, args *GetLoggerLevelArgs, reply *LoggerLevelReply) error {
299292
a.Log.Debug("API called",
300293
zap.String("service", "admin"),
301294
zap.String("method", "getLoggerLevels"),
@@ -305,30 +298,11 @@ func (a *Admin) GetLoggerLevel(_ *http.Request, args *GetLoggerLevelArgs, reply
305298
a.lock.RLock()
306299
defer a.lock.RUnlock()
307300

308-
reply.LoggerLevels = make(map[string]LogAndDisplayLevels)
309-
var loggerNames []string
310-
// Empty name means all loggers
311-
if len(args.LoggerName) > 0 {
312-
loggerNames = []string{args.LoggerName}
313-
} else {
314-
loggerNames = a.LogFactory.GetLoggerNames()
315-
}
301+
loggerNames := a.getLoggerNames(args.LoggerName)
316302

317-
for _, name := range loggerNames {
318-
logLevel, err := a.LogFactory.GetLogLevel(name)
319-
if err != nil {
320-
return err
321-
}
322-
displayLevel, err := a.LogFactory.GetDisplayLevel(name)
323-
if err != nil {
324-
return err
325-
}
326-
reply.LoggerLevels[name] = LogAndDisplayLevels{
327-
LogLevel: logLevel,
328-
DisplayLevel: displayLevel,
329-
}
330-
}
331-
return nil
303+
var err error
304+
reply.LoggerLevels, err = a.getLogLevels(loggerNames)
305+
return err
332306
}
333307

334308
// GetConfig returns the config that the node was started with.
@@ -375,3 +349,30 @@ func (a *Admin) LoadVMs(r *http.Request, _ *struct{}, reply *LoadVMsReply) error
375349
reply.NewVMs, err = ids.GetRelevantAliases(a.VMManager, loadedVMs)
376350
return err
377351
}
352+
353+
func (a *Admin) getLoggerNames(loggerName string) []string {
354+
if len(loggerName) == 0 {
355+
// Empty name means all loggers
356+
return a.LogFactory.GetLoggerNames()
357+
}
358+
return []string{loggerName}
359+
}
360+
361+
func (a *Admin) getLogLevels(loggerNames []string) (map[string]LogAndDisplayLevels, error) {
362+
loggerLevels := make(map[string]LogAndDisplayLevels)
363+
for _, name := range loggerNames {
364+
logLevel, err := a.LogFactory.GetLogLevel(name)
365+
if err != nil {
366+
return nil, err
367+
}
368+
displayLevel, err := a.LogFactory.GetDisplayLevel(name)
369+
if err != nil {
370+
return nil, err
371+
}
372+
loggerLevels[name] = LogAndDisplayLevels{
373+
LogLevel: logLevel,
374+
DisplayLevel: displayLevel,
375+
}
376+
}
377+
return loggerLevels, nil
378+
}

0 commit comments

Comments
 (0)