Skip to content

Commit 209aff4

Browse files
authored
Support log level setting from policy (#3090)
* migrate mockery config * loglevel setting * define logLevelSetter interface * make coordinator implement logLevelSetter interface * Add externalLogLevel to SettingsHandler * correctly wire policy_change and settings handler for log level handling * remove default log level from AgentInfo in case of fleet managed agent * Set initial log level from config
1 parent fdba118 commit 209aff4

27 files changed

+1630
-145
lines changed

.mockery.yaml

+24-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
1-
inpackage: False
2-
testonly: False
31
with-expecter: True
4-
keeptree: True
5-
case: underscore
2+
inpackage: false
3+
dir: testing/mocks/{{ replaceAll .InterfaceDirRelative "internal" "internal_" }}
4+
mockname: "{{.InterfaceName}}"
5+
outpkg: "{{.PackageName}}"
6+
filename: "{{ snakecase .InterfaceName}}_mock.go"
7+
packages:
8+
github.com/elastic/elastic-agent/pkg/control/v2/client:
9+
interfaces:
10+
Client:
11+
github.com/elastic/elastic-agent/internal/pkg/agent/application/actions/handlers:
12+
interfaces:
13+
Uploader:
14+
diagnosticsProvider:
15+
config:
16+
mockname: "DiagnosticsProvider"
17+
logLevelSetter:
18+
config:
19+
mockname: "LogLevelSetter"
20+
github.com/elastic/elastic-agent/internal/pkg/fleetapi/acker:
21+
interfaces:
22+
Acker:
23+
github.com/elastic/elastic-agent/internal/pkg/agent/application/info:
24+
interfaces:
25+
Agent:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Kind can be one of:
2+
# - breaking-change: a change to previously-documented behavior
3+
# - deprecation: functionality that is being removed in a later release
4+
# - bug-fix: fixes a problem in a previous version
5+
# - enhancement: extends functionality but does not break or fix existing behavior
6+
# - feature: new functionality
7+
# - known-issue: problems that we are aware of in a given version
8+
# - security: impacts on the security of a product or a user’s deployment.
9+
# - upgrade: important information for someone upgrading from a prior version
10+
# - other: does not fit into any of the other categories
11+
kind: enhancement
12+
13+
# Change summary; a 80ish characters long description of the change.
14+
summary: Set log level from fleet policy
15+
16+
# Long description; in case the summary is not enough to describe the change
17+
# this field accommodate a description without length limits.
18+
# NOTE: This field will be rendered only for breaking-change and known-issue kinds at the moment.
19+
description: >
20+
Enables setting agent logging level in policy. Setting a valid
21+
log level (same values allowed for setting log level on the specific agent)
22+
in fleet policy under `agent.logging.level` key will cause the agent to
23+
change its logging level, unless an override is set for the specific
24+
elastic-agent using a `settings` action.
25+
26+
The order of priority of log level for a fleet managed agent is:
27+
28+
1. log level set specifically to the agent via settings action, if any
29+
30+
2. log level specified in fleet policy, if any
31+
32+
3. default hard-coded log level for elastic-agent
33+
34+
# Affected component; a word indicating the component this changeset affects.
35+
component: elastic-agent
36+
37+
# PR URL; optional; the PR number that added the changeset.
38+
# If not present is automatically filled by the tooling finding the PR where this changelog fragment has been added.
39+
# NOTE: the tooling supports backports, so it's able to fill the original PR number instead of the backport PR number.
40+
# Please provide it if you are adding a fragment for a different PR.
41+
pr: https://github.com/elastic/elastic-agent/pull/3090
42+
43+
# Issue URL; optional; the GitHub issue related to this changeset (either closes or is part of).
44+
# If not present is automatically filled by the tooling with the issue linked to the PR number.
45+
issue: https://github.com/elastic/elastic-agent/issues/2851

internal/pkg/agent/application/actions/handlers/handler_action_application.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (h *AppAction) Handle(ctx context.Context, a fleetapi.Action, acker acker.A
5555
// https://github.com/elastic/security-team/issues/6501
5656
//
5757
// h.log.Debugf("handlerAppAction: validate action '%+v', for agentID %s", a, h.agentID)
58-
// validated, err := protection.ValidateAction(*action, h.coord.Protection().SignatureValidationKey, h.agentID)
58+
// validated, err := protection.ValidateAction(*action, h.logLevelSetter.Protection().SignatureValidationKey, h.agentID)
5959
// if err != nil {
6060
// action.StartedAt = time.Now().UTC().Format(time.RFC3339Nano)
6161
// action.CompletedAt = action.StartedAt

internal/pkg/agent/application/actions/handlers/handler_action_diagnostics_test.go

+23-26
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"github.com/elastic/elastic-agent-client/v7/pkg/proto"
2121
"github.com/elastic/elastic-agent/pkg/control/v2/cproto"
2222

23-
"github.com/elastic/elastic-agent/internal/pkg/agent/application/actions/handlers/mocks"
2423
"github.com/elastic/elastic-agent/internal/pkg/agent/application/paths"
2524
"github.com/elastic/elastic-agent/internal/pkg/agent/errors"
2625
"github.com/elastic/elastic-agent/internal/pkg/core/monitoring/config"
@@ -29,12 +28,10 @@ import (
2928
"github.com/elastic/elastic-agent/pkg/component"
3029
"github.com/elastic/elastic-agent/pkg/component/runtime"
3130
"github.com/elastic/elastic-agent/pkg/core/logger"
31+
mockhandlers "github.com/elastic/elastic-agent/testing/mocks/internal_/pkg/agent/application/actions/handlers"
32+
mockackers "github.com/elastic/elastic-agent/testing/mocks/internal_/pkg/fleetapi/acker"
3233
)
3334

34-
//go:generate mockery --name Uploader
35-
//go:generate mockery --name diagnosticsProvider --exported
36-
//go:generate mockery --dir ../../../../fleetapi/acker --name Acker
37-
3835
var defaultRateLimit config.Limit = config.Limit{
3936
Interval: 1 * time.Millisecond,
4037
Burst: 10,
@@ -84,16 +81,16 @@ func TestDiagnosticHandlerHappyPathWithLogs(t *testing.T) {
8481
err := os.MkdirAll(path.Join(tempAgentRoot, "data"), 0755)
8582
require.NoError(t, err)
8683

87-
mockDiagProvider := mocks.NewDiagnosticsProvider(t)
88-
mockUploader := mocks.NewUploader(t)
84+
mockDiagProvider := mockhandlers.NewDiagnosticsProvider(t)
85+
mockUploader := mockhandlers.NewUploader(t)
8986
testLogger, observedLogs := logger.NewTesting("diagnostic-handler-test")
9087
handler := NewDiagnostics(testLogger, mockDiagProvider, defaultRateLimit, mockUploader)
9188

9289
mockDiagProvider.EXPECT().DiagnosticHooks().Return([]diagnostics.Hook{hook1})
9390
mockDiagProvider.EXPECT().PerformDiagnostics(mock.Anything, mock.Anything).Return([]runtime.ComponentUnitDiagnostic{mockUnitDiagnostic})
9491
mockDiagProvider.EXPECT().PerformComponentDiagnostics(mock.Anything, mock.Anything).Return([]runtime.ComponentDiagnostic{}, nil)
9592

96-
mockAcker := mocks.NewAcker(t)
93+
mockAcker := mockackers.NewAcker(t)
9794
mockAcker.EXPECT().Ack(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, a fleetapi.Action) error {
9895
require.IsType(t, new(fleetapi.ActionDiagnostics), a)
9996
assert.NoError(t, a.(*fleetapi.ActionDiagnostics).Err)
@@ -165,8 +162,8 @@ func TestDiagnosticHandlerUploaderErrorWithLogs(t *testing.T) {
165162
err := os.MkdirAll(path.Join(tempAgentRoot, "data"), 0755)
166163
require.NoError(t, err)
167164

168-
mockDiagProvider := mocks.NewDiagnosticsProvider(t)
169-
mockUploader := mocks.NewUploader(t)
165+
mockDiagProvider := mockhandlers.NewDiagnosticsProvider(t)
166+
mockUploader := mockhandlers.NewUploader(t)
170167
testLogger, observedLogs := logger.NewTesting("diagnostic-handler-test")
171168
handler := NewDiagnostics(testLogger, mockDiagProvider, defaultRateLimit, mockUploader)
172169

@@ -178,7 +175,7 @@ func TestDiagnosticHandlerUploaderErrorWithLogs(t *testing.T) {
178175
uploaderError := errors.New("upload went wrong!")
179176
mockUploader.EXPECT().UploadDiagnostics(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return("", uploaderError)
180177

181-
mockAcker := mocks.NewAcker(t)
178+
mockAcker := mockackers.NewAcker(t)
182179
mockAcker.EXPECT().Ack(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, a fleetapi.Action) error {
183180
require.IsType(t, new(fleetapi.ActionDiagnostics), a)
184181
// verify that we are acking the action with the correct error set
@@ -206,16 +203,16 @@ func TestDiagnosticHandlerZipArchiveErrorWithLogs(t *testing.T) {
206203
// we don't set a 'data' subdirectory in order to make the zip process return an error
207204
// this is the only way/trick to do it with the current implementation, sadly :(
208205

209-
mockDiagProvider := mocks.NewDiagnosticsProvider(t)
210-
mockUploader := mocks.NewUploader(t)
206+
mockDiagProvider := mockhandlers.NewDiagnosticsProvider(t)
207+
mockUploader := mockhandlers.NewUploader(t)
211208
testLogger, observedLogs := logger.NewTesting("diagnostic-handler-test")
212209
handler := NewDiagnostics(testLogger, mockDiagProvider, defaultRateLimit, mockUploader)
213210

214211
mockDiagProvider.EXPECT().DiagnosticHooks().Return([]diagnostics.Hook{})
215212
mockDiagProvider.EXPECT().PerformDiagnostics(mock.Anything, mock.Anything).Return([]runtime.ComponentUnitDiagnostic{})
216213
mockDiagProvider.EXPECT().PerformComponentDiagnostics(mock.Anything, mock.Anything).Return([]runtime.ComponentDiagnostic{}, nil)
217214

218-
mockAcker := mocks.NewAcker(t)
215+
mockAcker := mockackers.NewAcker(t)
219216
mockAcker.EXPECT().Ack(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, a fleetapi.Action) error {
220217
require.IsType(t, new(fleetapi.ActionDiagnostics), a)
221218
assert.Error(t, a.(*fleetapi.ActionDiagnostics).Err)
@@ -242,16 +239,16 @@ func TestDiagnosticHandlerAckErrorWithLogs(t *testing.T) {
242239
err := os.MkdirAll(path.Join(tempAgentRoot, "data"), 0755)
243240
require.NoError(t, err)
244241

245-
mockDiagProvider := mocks.NewDiagnosticsProvider(t)
246-
mockUploader := mocks.NewUploader(t)
242+
mockDiagProvider := mockhandlers.NewDiagnosticsProvider(t)
243+
mockUploader := mockhandlers.NewUploader(t)
247244
testLogger, observedLogs := logger.NewTesting("diagnostic-handler-test")
248245
handler := NewDiagnostics(testLogger, mockDiagProvider, defaultRateLimit, mockUploader)
249246

250247
mockDiagProvider.EXPECT().DiagnosticHooks().Return([]diagnostics.Hook{})
251248
mockDiagProvider.EXPECT().PerformDiagnostics(mock.Anything, mock.Anything).Return([]runtime.ComponentUnitDiagnostic{})
252249
mockDiagProvider.EXPECT().PerformComponentDiagnostics(mock.Anything, mock.Anything).Return([]runtime.ComponentDiagnostic{}, nil)
253250

254-
mockAcker := mocks.NewAcker(t)
251+
mockAcker := mockackers.NewAcker(t)
255252
ackError := errors.New("acking went wrong")
256253
mockAcker.EXPECT().Ack(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, a fleetapi.Action) error {
257254
require.IsType(t, new(fleetapi.ActionDiagnostics), a)
@@ -281,16 +278,16 @@ func TestDiagnosticHandlerCommitErrorWithLogs(t *testing.T) {
281278
err := os.MkdirAll(path.Join(tempAgentRoot, "data"), 0755)
282279
require.NoError(t, err)
283280

284-
mockDiagProvider := mocks.NewDiagnosticsProvider(t)
285-
mockUploader := mocks.NewUploader(t)
281+
mockDiagProvider := mockhandlers.NewDiagnosticsProvider(t)
282+
mockUploader := mockhandlers.NewUploader(t)
286283
testLogger, observedLogs := logger.NewTesting("diagnostic-handler-test")
287284
handler := NewDiagnostics(testLogger, mockDiagProvider, defaultRateLimit, mockUploader)
288285

289286
mockDiagProvider.EXPECT().DiagnosticHooks().Return([]diagnostics.Hook{})
290287
mockDiagProvider.EXPECT().PerformDiagnostics(mock.Anything, mock.Anything).Return([]runtime.ComponentUnitDiagnostic{})
291288
mockDiagProvider.EXPECT().PerformComponentDiagnostics(mock.Anything, mock.Anything).Return([]runtime.ComponentDiagnostic{}, nil)
292289

293-
mockAcker := mocks.NewAcker(t)
290+
mockAcker := mockackers.NewAcker(t)
294291
mockAcker.EXPECT().Ack(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, a fleetapi.Action) error {
295292
require.IsType(t, new(fleetapi.ActionDiagnostics), a)
296293
assert.NoError(t, a.(*fleetapi.ActionDiagnostics).Err)
@@ -321,14 +318,14 @@ func TestDiagnosticHandlerContexteExpiredErrorWithLogs(t *testing.T) {
321318
err := os.MkdirAll(path.Join(tempAgentRoot, "data"), 0755)
322319
require.NoError(t, err)
323320

324-
mockDiagProvider := mocks.NewDiagnosticsProvider(t)
325-
mockUploader := mocks.NewUploader(t)
321+
mockDiagProvider := mockhandlers.NewDiagnosticsProvider(t)
322+
mockUploader := mockhandlers.NewUploader(t)
326323
testLogger, observedLogs := logger.NewTesting("diagnostic-handler-test")
327324
handler := NewDiagnostics(testLogger, mockDiagProvider, defaultRateLimit, mockUploader)
328325

329326
mockDiagProvider.EXPECT().DiagnosticHooks().Return([]diagnostics.Hook{})
330327

331-
mockAcker := mocks.NewAcker(t)
328+
mockAcker := mockackers.NewAcker(t)
332329
mockAcker.EXPECT().Ack(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, a fleetapi.Action) error {
333330
require.IsType(t, new(fleetapi.ActionDiagnostics), a)
334331
assert.ErrorIs(t, a.(*fleetapi.ActionDiagnostics).Err, context.Canceled)
@@ -365,8 +362,8 @@ func TestDiagnosticHandlerWithCPUProfile(t *testing.T) {
365362
return []byte(`hello, world!`), nil
366363
}
367364

368-
mockDiagProvider := mocks.NewDiagnosticsProvider(t)
369-
mockUploader := mocks.NewUploader(t)
365+
mockDiagProvider := mockhandlers.NewDiagnosticsProvider(t)
366+
mockUploader := mockhandlers.NewUploader(t)
370367
testLogger, _ := logger.NewTesting("diagnostic-handler-test")
371368
handler := NewDiagnostics(testLogger, mockDiagProvider, defaultRateLimit, mockUploader)
372369

@@ -383,7 +380,7 @@ func TestDiagnosticHandlerWithCPUProfile(t *testing.T) {
383380
return false
384381
})).Return([]runtime.ComponentDiagnostic{}, nil)
385382

386-
mockAcker := mocks.NewAcker(t)
383+
mockAcker := mockackers.NewAcker(t)
387384
mockAcker.EXPECT().Ack(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, a fleetapi.Action) error {
388385
require.IsType(t, new(fleetapi.ActionDiagnostics), a)
389386
assert.NoError(t, a.(*fleetapi.ActionDiagnostics).Err)

0 commit comments

Comments
 (0)