Skip to content

Commit 4b02bd6

Browse files
authored
Agent Health Metric for Windows Events Filtering (#1787)
1 parent 06ff831 commit 4b02bd6

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

extension/agenthealth/handler/useragent/useragent.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ const (
3333
flagEnhancedContainerInsights = "enhanced_container_insights"
3434
flagSELinux = "selinux"
3535
flagROSA = "rosa"
36+
FlagWindowsEventIDs = "win_event_ids"
37+
FlagWindowsEventFilters = "win_event_filters"
38+
FlagWindowsEventLevels = "win_event_levels"
3639
separator = " "
3740

3841
typeInputs = "inputs"
@@ -79,9 +82,11 @@ var _ UserAgent = (*userAgent)(nil)
7982
func (ua *userAgent) SetComponents(otelCfg *otelcol.Config, telegrafCfg *telegraf.Config) {
8083
ua.dataLock.Lock()
8184
defer ua.dataLock.Unlock()
85+
8286
for _, input := range telegrafCfg.Inputs {
8387
ua.inputs.Add(input.Config.Name)
8488
}
89+
8590
for _, output := range telegrafCfg.Outputs {
8691
ua.outputs.Add(output.Config.Name)
8792
}

plugins/inputs/windows_event_log/windows_event_log.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/influxdata/telegraf"
1616
"github.com/influxdata/telegraf/plugins/inputs"
1717

18+
"github.com/aws/amazon-cloudwatch-agent/extension/agenthealth/handler/useragent"
1819
"github.com/aws/amazon-cloudwatch-agent/internal/logscommon"
1920
"github.com/aws/amazon-cloudwatch-agent/internal/state"
2021
"github.com/aws/amazon-cloudwatch-agent/logs"
@@ -92,6 +93,7 @@ func (s *Plugin) Start(acc telegraf.Accumulator) error {
9293
return nil
9394
}
9495

96+
s.detectFeatures()
9597
monitor := newServiceMonitor()
9698
for _, eventConfig := range s.Events {
9799
// Assume no 2 EventConfigs have the same combination of:
@@ -156,3 +158,18 @@ func (s *Plugin) Stop() {
156158
func init() {
157159
inputs.Add("windows_event_log", func() telegraf.Input { return &Plugin{} })
158160
}
161+
func (s *Plugin) detectFeatures() {
162+
if ua := useragent.Get(); ua != nil {
163+
for _, eventConfig := range s.Events {
164+
if len(eventConfig.EventIDs) > 0 {
165+
ua.AddFeatureFlags(useragent.FlagWindowsEventIDs)
166+
}
167+
if len(eventConfig.Filters) > 0 {
168+
ua.AddFeatureFlags(useragent.FlagWindowsEventFilters)
169+
}
170+
if len(eventConfig.Levels) > 0 {
171+
ua.AddFeatureFlags(useragent.FlagWindowsEventLevels)
172+
}
173+
}
174+
}
175+
}

plugins/inputs/windows_event_log/windows_event_log_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import (
1313

1414
"github.com/stretchr/testify/assert"
1515
"github.com/stretchr/testify/require"
16+
17+
"github.com/aws/amazon-cloudwatch-agent/extension/agenthealth/handler/useragent"
18+
"github.com/aws/amazon-cloudwatch-agent/plugins/inputs/windows_event_log/wineventlog"
1619
)
1720

1821
// TestGetStateFilePathGood tests getStateFilePath with good input.
@@ -105,3 +108,40 @@ func TestWindowsDuplicateStart(t *testing.T) {
105108
plugin.Start(nil)
106109
require.Equal(t, 1, len(plugin.newEvents), "Start should be ran only once so there should be only 1 new event")
107110
}
111+
112+
func TestDetectFeatures(t *testing.T) {
113+
plugin := &Plugin{
114+
Events: []EventConfig{
115+
{
116+
EventIDs: []int{1000, 1001},
117+
},
118+
{
119+
Filters: []*wineventlog.EventFilter{{Expression: "test"}},
120+
Levels: []string{"ERROR"},
121+
},
122+
},
123+
}
124+
125+
ua := useragent.Get()
126+
plugin.detectFeatures()
127+
128+
header := ua.Header(true)
129+
assert.Contains(t, header, useragent.FlagWindowsEventIDs)
130+
assert.Contains(t, header, useragent.FlagWindowsEventFilters)
131+
assert.Contains(t, header, useragent.FlagWindowsEventLevels)
132+
133+
// Test that only configured features are detected
134+
plugin = &Plugin{
135+
Events: []EventConfig{{
136+
EventIDs: []int{1000},
137+
}},
138+
}
139+
ua = useragent.Get()
140+
ua.Reset()
141+
plugin.detectFeatures()
142+
143+
header = ua.Header(true)
144+
assert.Contains(t, header, useragent.FlagWindowsEventIDs)
145+
assert.NotContains(t, header, useragent.FlagWindowsEventFilters)
146+
assert.NotContains(t, header, useragent.FlagWindowsEventLevels)
147+
}

0 commit comments

Comments
 (0)