Skip to content

Commit 097c665

Browse files
committed
Merge branch 'main' into feature/windows-eventId-filtering
2 parents 2276ab2 + de987cd commit 097c665

File tree

16 files changed

+190
-239
lines changed

16 files changed

+190
-239
lines changed

cmd/config-translator/translator_test.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -212,13 +212,7 @@ func TestSampleConfigSchema(t *testing.T) {
212212
if re.MatchString(file.Name()) {
213213
t.Logf("Validating ../../translator/tocwconfig/sampleConfig/%s\n", file.Name())
214214

215-
// Special case for windows_eventids.json which has both event_ids and event_levels
216-
if file.Name() == "windows_eventids.json" {
217-
expectedErrorMap := map[string]int{"number_one_of": 1}
218-
checkIfSchemaValidateAsExpected(t, "../../translator/tocwconfig/sampleConfig/"+file.Name(), true, expectedErrorMap)
219-
} else {
220-
checkIfSchemaValidateAsExpected(t, "../../translator/tocwconfig/sampleConfig/"+file.Name(), true, map[string]int{})
221-
}
215+
checkIfSchemaValidateAsExpected(t, "../../translator/tocwconfig/sampleConfig/"+file.Name(), true, map[string]int{})
222216

223217
t.Logf("Validated ../../translator/tocwconfig/sampleConfig/%s\n", file.Name())
224218
}

plugins/inputs/logfile/tailersrc.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ func (le LogEvent) Time() time.Time {
4747
}
4848

4949
func (le LogEvent) Done() {
50+
le.RangeQueue().Enqueue(le.Range())
5051
}
5152

5253
func (le LogEvent) Range() state.Range {

plugins/inputs/logfile/tailersrc_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ func TestTailerSrc(t *testing.T) {
156156
assert.Eventually(t, func() bool { return tail.OpenFileCount.Load() <= beforeCount }, 3*time.Second, time.Second)
157157
}
158158

159-
func TestStatefulLogEvent(t *testing.T) {
159+
func TestEventDoneCallback(t *testing.T) {
160160
original := multilineWaitPeriod
161161
defer resetState(original)
162162

@@ -217,7 +217,7 @@ func TestStatefulLogEvent(t *testing.T) {
217217
}
218218
sle, ok := evt.(logs.StatefulLogEvent)
219219
assert.True(t, ok)
220-
sle.RangeQueue().Enqueue(sle.Range())
220+
sle.Done()
221221
i++
222222
switch i {
223223
case 10:

plugins/inputs/windows_event_log/windows_event_log.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ var startOnlyOnce sync.Once
3131
type EventConfig struct {
3232
Name string `toml:"event_name"`
3333
Levels []string `toml:"event_levels"`
34-
EventID []int `toml:"event_ids"`
34+
EventIDs []int `toml:"event_ids"`
3535
RenderFormat string `toml:"event_format"`
3636
BatchReadSize int `toml:"batch_read_size"`
3737
LogGroupName string `toml:"log_group_name"`
@@ -107,7 +107,7 @@ func (s *Plugin) Start(acc telegraf.Accumulator) error {
107107
eventLog := wineventlog.NewEventLog(
108108
eventConfig.Name,
109109
eventConfig.Levels,
110-
eventConfig.EventID,
110+
eventConfig.EventIDs,
111111
eventConfig.LogGroupName,
112112
eventConfig.LogStreamName,
113113
eventConfig.RenderFormat,

plugins/inputs/windows_event_log/wineventlog/utils.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,23 +36,23 @@ func createFilterQuery(levels []string, eventIDs []int) string {
3636
}
3737

3838
//EventID filtering
39-
var filterEventID string
39+
var filterEventIDs string
4040
for i, eventID := range eventIDs {
4141
if i == 0 {
42-
filterEventID = fmt.Sprintf(eventLogeventIDFilter, eventID)
42+
filterEventIDs = fmt.Sprintf(eventLogeventIDFilter, eventID)
4343
} else {
44-
filterEventID = filterEventID + " or " + fmt.Sprintf(eventLogeventIDFilter, eventID)
44+
filterEventIDs = filterEventIDs + " or " + fmt.Sprintf(eventLogeventIDFilter, eventID)
4545
}
4646
}
4747

4848
//query results
4949
var query string
50-
if filterLevels != "" && filterEventID != "" {
51-
query = "(" + filterLevels + ") and (" + filterEventID + ")"
52-
} else if filterLevels != "" && filterEventID == "" {
50+
if filterLevels != "" && filterEventIDs != "" {
51+
query = "(" + filterLevels + ") and (" + filterEventIDs + ")"
52+
} else if filterLevels != "" && filterEventIDs == "" {
5353
query = "(" + filterLevels + ")"
54-
} else if filterLevels == "" && filterEventID != "" {
55-
query = "(" + filterEventID + ")"
54+
} else if filterLevels == "" && filterEventIDs != "" {
55+
query = "(" + filterEventIDs + ")"
5656
}
5757

5858
//Ignore events older than 2 weeks

plugins/inputs/windows_event_log/wineventlog/wineventlog.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func (e *wevtAPIError) Error() string {
4949
type windowsEventLog struct {
5050
name string
5151
levels []string
52-
eventID []int
52+
eventIDs []int
5353
logGroupName string
5454
logStreamName string
5555
logGroupClass string
@@ -67,11 +67,11 @@ type windowsEventLog struct {
6767
resubscribeCh chan struct{}
6868
}
6969

70-
func NewEventLog(name string, levels []string, eventID []int, logGroupName, logStreamName, renderFormat, destination string, stateManager state.FileRangeManager, maximumToRead int, retention int, logGroupClass string) *windowsEventLog {
70+
func NewEventLog(name string, levels []string, eventIDs []int, logGroupName, logStreamName, renderFormat, destination string, stateManager state.FileRangeManager, maximumToRead int, retention int, logGroupClass string) *windowsEventLog {
7171
eventLog := &windowsEventLog{
7272
name: name,
7373
levels: levels,
74-
eventID: eventID,
74+
eventIDs: eventIDs,
7575
logGroupName: logGroupName,
7676
logStreamName: logStreamName,
7777
logGroupClass: logGroupClass,
@@ -212,7 +212,7 @@ func (w *windowsEventLog) open() error {
212212
if err != nil {
213213
return err
214214
}
215-
query, err := CreateQuery(w.name, w.levels, w.eventID)
215+
query, err := CreateQuery(w.name, w.levels, w.eventIDs)
216216
if err != nil {
217217
return err
218218
}
@@ -256,10 +256,6 @@ func (w *windowsEventLog) SetEventOffset(eventOffset uint64) {
256256
w.eventOffset = eventOffset
257257
}
258258

259-
func (w *windowsEventLog) Done(offset state.Range) {
260-
w.stateManager.Enqueue(offset)
261-
}
262-
263259
func (w *windowsEventLog) ResubscribeCh() chan struct{} {
264260
return w.resubscribeCh
265261
}
@@ -315,6 +311,7 @@ func (le LogEvent) Time() time.Time {
315311
}
316312

317313
func (le LogEvent) Done() {
314+
le.RangeQueue().Enqueue(le.Range())
318315
}
319316

320317
func (le LogEvent) Range() state.Range {

plugins/inputs/windows_event_log/wineventlog/wineventlog_test.go

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ var (
2424
NAME = "Application"
2525
// 2 is ERROR
2626
LEVELS = []string{"2"}
27-
EVENTID = []int{777}
27+
EVENTIDS = []int{777}
2828
GROUP_NAME = "fake"
2929
STREAM_NAME = "fake"
3030
RENDER_FMT = FormatPlainText
@@ -37,7 +37,7 @@ var (
3737

3838
// TestNewEventLog verifies constructor's default values.
3939
func TestNewEventLog(t *testing.T) {
40-
elog := newTestEventLog(t, NAME, LEVELS, EVENTID)
40+
elog := newTestEventLog(t, NAME, LEVELS, EVENTIDS)
4141
assert.Equal(t, NAME, elog.name)
4242
assert.Equal(t, uint64(0), elog.eventOffset)
4343
assert.Zero(t, elog.eventHandle)
@@ -47,18 +47,18 @@ func TestNewEventLog(t *testing.T) {
4747
// And fails with invalid inputs.
4848
func TestOpen(t *testing.T) {
4949
// Happy path.
50-
elog := newTestEventLog(t, NAME, LEVELS, EVENTID)
50+
elog := newTestEventLog(t, NAME, LEVELS, EVENTIDS)
5151
assert.NoError(t, elog.Open())
5252
assert.NotZero(t, elog.eventHandle)
5353
assert.NoError(t, elog.Close())
5454
// Bad event log source name does not cause Open() to fail.
5555
// But eventHandle will be 0 and Close() will fail because of it.
56-
elog = newTestEventLog(t, "FakeBadElogName", LEVELS, EVENTID)
56+
elog = newTestEventLog(t, "FakeBadElogName", LEVELS, EVENTIDS)
5757
assert.NoError(t, elog.Open())
5858
assert.Zero(t, elog.eventHandle)
5959
assert.Error(t, elog.Close())
6060
// bad LEVELS does not cause Open() to fail.
61-
elog = newTestEventLog(t, NAME, []string{"498"}, EVENTID)
61+
elog = newTestEventLog(t, NAME, []string{"498"}, EVENTIDS)
6262
assert.NoError(t, elog.Open())
6363
assert.NotZero(t, elog.eventHandle)
6464
assert.NoError(t, elog.Close())
@@ -67,7 +67,7 @@ func TestOpen(t *testing.T) {
6767
assert.NotZero(t, elog.eventHandle)
6868
assert.NoError(t, elog.Close())
6969
// bad wlog.eventOffset does not cause Open() to fail.
70-
elog = newTestEventLog(t, NAME, []string{"498"}, EVENTID)
70+
elog = newTestEventLog(t, NAME, []string{"498"}, EVENTIDS)
7171
elog.eventOffset = 9987
7272
assert.NoError(t, elog.Open())
7373
assert.NotZero(t, elog.eventHandle)
@@ -77,7 +77,7 @@ func TestOpen(t *testing.T) {
7777
// TestReadGoodSource will verify we can read events written by a registered
7878
// event log source.
7979
func TestReadGoodSource(t *testing.T) {
80-
elog := newTestEventLog(t, NAME, LEVELS, EVENTID)
80+
elog := newTestEventLog(t, NAME, LEVELS, EVENTIDS)
8181
assert.NoError(t, elog.Open())
8282
seekToEnd(t, elog)
8383
writeEvents(t, 10, true, "CWA_UnitTest111", 777)
@@ -89,7 +89,7 @@ func TestReadGoodSource(t *testing.T) {
8989
// TestReadBadSource will verify that we cannot read events written by an
9090
// unregistered event log source.
9191
func TestReadBadSource(t *testing.T) {
92-
elog := newTestEventLog(t, NAME, LEVELS, EVENTID)
92+
elog := newTestEventLog(t, NAME, LEVELS, EVENTIDS)
9393
assert.NoError(t, elog.Open())
9494
seekToEnd(t, elog)
9595
writeEvents(t, 10, false, "CWA_UnitTest222", 888)
@@ -102,7 +102,7 @@ func TestReadBadSource(t *testing.T) {
102102
// registered event log source, even if the batch contains events from an
103103
// unregistered source too.
104104
func TestReadWithBothSources(t *testing.T) {
105-
elog := newTestEventLog(t, NAME, LEVELS, EVENTID)
105+
elog := newTestEventLog(t, NAME, LEVELS, EVENTIDS)
106106
assert.NoError(t, elog.Open())
107107
seekToEnd(t, elog)
108108
writeEvents(t, 10, true, "CWA_UnitTest111", 777)
@@ -134,11 +134,8 @@ func seekToEnd(t *testing.T, elog *windowsEventLog) {
134134
// Fail the test if an error occurs.
135135
func writeEvents(t *testing.T, msgCount int, doRegister bool, logSrc string, eventId uint32) {
136136
if doRegister {
137-
err := eventlog.InstallAsEventCreate(logSrc, eventlog.Info|eventlog.Warning|eventlog.Error)
138-
if err != nil {
139-
t.Logf("Warning: Failed to install event source %s: %v (may need admin privileges)", logSrc, err)
140-
// Continue anyway as it might already be registered
141-
}
137+
// Expected to fail if unit test previously ran and installed the event src.
138+
_ = eventlog.InstallAsEventCreate(logSrc, eventlog.Info|eventlog.Warning|eventlog.Error)
142139
}
143140
wlog, err := eventlog.Open(logSrc)
144141
assert.NoError(t, err)
@@ -180,13 +177,13 @@ func checkEvents(t *testing.T, records []*windowsEventLogRecord, substring strin
180177
assert.Equal(t, count, found, "expected %v, %v, actual %v", substring, count, found)
181178
}
182179

183-
func newTestEventLog(t *testing.T, name string, levels []string, eventid []int) *windowsEventLog {
180+
func newTestEventLog(t *testing.T, name string, levels []string, eventids []int) *windowsEventLog {
184181
t.Helper()
185182
manager := state.NewFileRangeManager(state.ManagerConfig{
186183
StateFileDir: t.TempDir(),
187184
StateFilePrefix: logscommon.WindowsEventLogPrefix,
188185
Name: GROUP_NAME + "_" + STREAM_NAME + "_" + name,
189186
})
190-
return NewEventLog(name, levels, eventid, GROUP_NAME, STREAM_NAME, RENDER_FMT, DEST,
187+
return NewEventLog(name, levels, eventids, GROUP_NAME, STREAM_NAME, RENDER_FMT, DEST,
191188
manager, BATCH_SIZE, RETENTION, LOG_GROUP_CLASS)
192189
}

plugins/outputs/cloudwatchlogs/internal/pusher/batch_test.go

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ func newMockEntityProvider(entity *cloudwatchlogs.Entity) *mockEntityProvider {
3333
return ep
3434
}
3535

36+
type mockDoneCallback struct {
37+
mock.Mock
38+
}
39+
40+
func (m *mockDoneCallback) Done() {
41+
m.Called()
42+
}
43+
3644
func TestLogEvent(t *testing.T) {
3745
now := time.Now()
3846
e := newLogEvent(now, "test message", nil)
@@ -165,10 +173,8 @@ func TestLogEventBatch(t *testing.T) {
165173
t.Run("WithStatefulLogEvents", func(t *testing.T) {
166174
batch := newLogEventBatch(Target{Group: "G", Stream: "S"}, nil)
167175

168-
callbackCalled := false
169-
callback := func() {
170-
callbackCalled = true
171-
}
176+
mdc1 := &mockDoneCallback{}
177+
mdc1.On("Done").Panic("should not be called")
172178

173179
mrq1 := &mockRangeQueue{}
174180
mrq1.On("ID").Return("test")
@@ -178,25 +184,31 @@ func TestLogEventBatch(t *testing.T) {
178184
mrq2.On("ID").Return("test2")
179185
mrq2.On("Enqueue", state.NewRange(5, 20)).Once()
180186

181-
event1 := newStatefulLogEvent(time.Now(), "Test", callback, &logEventState{
187+
event1 := newStatefulLogEvent(time.Now(), "Test", mdc1.Done, &logEventState{
182188
r: state.NewRange(20, 40),
183189
queue: mrq1,
184190
})
185-
event2 := newStatefulLogEvent(time.Now(), "Test2", callback, &logEventState{
191+
event2 := newStatefulLogEvent(time.Now(), "Test2", mdc1.Done, &logEventState{
186192
r: state.NewRange(5, 20),
187193
queue: mrq2,
188194
})
189-
event3 := newStatefulLogEvent(time.Now(), "Test3", callback, &logEventState{
195+
event3 := newStatefulLogEvent(time.Now(), "Test3", mdc1.Done, &logEventState{
190196
r: state.NewRange(40, 50),
191197
queue: mrq1,
192198
})
199+
200+
mdc2 := &mockDoneCallback{}
201+
mdc2.On("Done").Return().Once()
202+
event4 := newLogEvent(time.Now(), "Test2", mdc2.Done)
193203
batch.append(event1)
194204
batch.append(event2)
195205
batch.append(event3)
206+
batch.append(event4)
196207
batch.done()
197208

198-
mrq1.AssertNumberOfCalls(t, "Enqueue", 1)
199-
mrq2.AssertNumberOfCalls(t, "Enqueue", 1)
200-
assert.False(t, callbackCalled, "Done callback should not have been called")
209+
mrq1.AssertExpectations(t)
210+
mrq2.AssertExpectations(t)
211+
mdc1.AssertNotCalled(t, "Done")
212+
mdc2.AssertExpectations(t)
201213
})
202214
}

translator/defaultKeyCase.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,26 @@ func DefaultStringArrayCase(key string, defaultVal, input interface{}) (returnKe
7474
return
7575
}
7676

77+
func DefaultIntegralArrayCase(key string, defaultVal, input interface{}) (string, interface{}) {
78+
returnKey, returnVal := DefaultCase(key, defaultVal, input)
79+
if arrayVal, ok := returnVal.([]interface{}); ok {
80+
intArrayVal := []int{}
81+
for _, v := range arrayVal {
82+
if floatVal, ok := v.(float64); ok {
83+
intVal := int(floatVal)
84+
intArrayVal = append(intArrayVal, intVal)
85+
86+
}
87+
}
88+
returnVal = intArrayVal
89+
} else {
90+
AddErrorMessages(
91+
fmt.Sprintf("int array key: %s", key),
92+
fmt.Sprintf("%s value (%v) in json is not valid as an array of integers.", key, returnVal))
93+
}
94+
return returnKey, returnVal
95+
}
96+
7797
func DefaultRetentionInDaysCase(key string, defaultVal, input interface{}) (returnKey string, returnVal interface{}) {
7898
returnKey, returnVal = DefaultIntegralCase(key, defaultVal, input)
7999
if intVal, ok := returnVal.(int); ok && IsValidRetentionDays(intVal) {

translator/isValid.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,4 @@ func IsValidRetentionDays(days int) bool {
9696
func IsValidLogGroupClass(class string) bool {
9797
return slices.Contains(ValidLogGroupClasses, class) || class == ""
9898
}
99+

0 commit comments

Comments
 (0)