Skip to content

Commit 2dbb98f

Browse files
authored
elastiwatch tweaks (#366)
1 parent d66a4ab commit 2dbb98f

3 files changed

Lines changed: 69 additions & 34 deletions

File tree

‎base/oauth.go‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ func ShouldRetryAuth(err error) bool {
3535
if IsOAuthAccountRestricted(err) {
3636
return true
3737
}
38-
var retr *oauth2.RetrieveError
39-
if errors.As(err, &retr) {
38+
if retr, ok := errors.AsType[*oauth2.RetrieveError](err); ok {
4039
switch strings.ToLower(retr.ErrorCode) {
4140
case "invalid_grant", "invalid_token":
4241
return true
@@ -63,8 +62,7 @@ func IsOAuthAccountRestricted(err error) bool {
6362
return strings.Contains(s, "account restricted") ||
6463
strings.Contains(s, "servicenotallowed")
6564
}
66-
var retr *oauth2.RetrieveError
67-
if errors.As(err, &retr) {
65+
if retr, ok := errors.AsType[*oauth2.RetrieveError](err); ok {
6866
code := strings.ToLower(retr.ErrorCode)
6967
body := strings.ToLower(string(retr.Body))
7068
if code != "access_not_configured" && !strings.Contains(body, "access_not_configured") {

‎elastiwatch/elastiwatch/entry_test.go‎

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,52 @@ import (
66
"github.com/stretchr/testify/require"
77
)
88

9-
func TestNewEntryGregor(t *testing.T) {
10-
e, err := newEntry([]byte(`{"message":"boom","severity":"ERROR","program":"dbcleand","time":"2026-10-22T15:00:00Z"}`))
9+
func TestNewEntryMessageAndSeverity(t *testing.T) {
10+
e, err := newEntry([]byte(`{"message":"boom","severity":"ERROR","program":"svc","time":"2026-10-22T15:00:00Z"}`))
1111
require.NoError(t, err)
1212
require.Equal(t, "boom", e.Message)
1313
require.Equal(t, "ERROR", e.Severity)
14-
require.Equal(t, "dbcleand", e.Program)
14+
require.Equal(t, "svc", e.Program)
1515
}
1616

17-
func TestNewEntryKBFSLogrus(t *testing.T) {
18-
e, err := newEntry([]byte(`{"msg":"block get failed","level":"error","time":"2026-10-22T15:00:00.123456789Z"}`))
17+
func TestNewEntryMsgAndLevelAliases(t *testing.T) {
18+
e, err := newEntry([]byte(`{"msg":"failed","level":"error","time":"2026-10-22T15:00:00.123456789Z"}`))
1919
require.NoError(t, err)
20-
require.Equal(t, "block get failed", e.Message)
20+
require.Equal(t, "failed", e.Message)
2121
require.Equal(t, "ERROR", e.Severity)
2222
}
2323

24-
func TestNewEntryIced(t *testing.T) {
25-
e, err := newEntry([]byte(`{"message":"node version: v22.0.0","level":"info","program":"logdumpd","pid":13,"@timestamp":"2026-10-22T15:00:00.000Z"}`))
24+
func TestNewEntryProgramFallbackAndError(t *testing.T) {
25+
e, err := newEntry([]byte(`{"msg":"op","level":"warning","syslog_program":"worker","error":"not found","time":"2026-10-22T15:00:00Z"}`))
2626
require.NoError(t, err)
27-
require.Equal(t, "node version: v22.0.0", e.Message)
27+
require.Equal(t, "worker", e.Program)
28+
require.Equal(t, "op not found", e.Message)
29+
require.Equal(t, "WARNING", e.Severity)
30+
require.Equal(t, []string{"worker", "op", "not", "found"}, e.words())
31+
}
32+
33+
func TestNewEntryInstanceAndSectionFallback(t *testing.T) {
34+
fromInstance, err := newEntry([]byte(`{"message":"hi","instance":"inst-a"}`))
35+
require.NoError(t, err)
36+
require.Equal(t, "inst-a", fromInstance.Program)
37+
38+
fromSection, err := newEntry([]byte(`{"message":"hi","section":"sec-b"}`))
39+
require.NoError(t, err)
40+
require.Equal(t, "sec-b", fromSection.Program)
41+
}
42+
43+
func TestNewEntrySkipsEmptyProgramUID(t *testing.T) {
44+
e, err := newEntry([]byte(`{"message":"alpha beta","severity":"ERROR"}`))
45+
require.NoError(t, err)
46+
require.Equal(t, []string{"alpha", "beta"}, e.words())
47+
}
48+
49+
func TestNewEntryTimestampAlias(t *testing.T) {
50+
e, err := newEntry([]byte(`{"message":"hello","level":"info","program":"app","@timestamp":"2026-10-22T15:00:00.000Z"}`))
51+
require.NoError(t, err)
52+
require.Equal(t, "hello", e.Message)
2853
require.Equal(t, "INFO", e.Severity)
29-
require.Equal(t, "logdumpd", e.Program)
54+
require.Equal(t, "app", e.Program)
3055
require.Equal(t, "2026-10-22T15:00:00.000Z", e.Time)
3156
}
3257

‎elastiwatch/elastiwatch/grouper.go‎

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package elastiwatch
22

33
import (
4+
"cmp"
45
"encoding/json"
56
"fmt"
67
"sort"
@@ -9,15 +10,19 @@ import (
910
)
1011

1112
type entry struct {
12-
Message string `json:"message"`
13-
Msg string `json:"msg"`
14-
Severity string `json:"severity"`
15-
Level string `json:"level"`
16-
UID string `json:"uid"`
17-
Time string `json:"time"`
18-
Timestamp string `json:"@timestamp"`
19-
Program string `json:"program"`
20-
parts []string
13+
Message string `json:"message"`
14+
Msg string `json:"msg"`
15+
Severity string `json:"severity"`
16+
Level string `json:"level"`
17+
UID string `json:"uid"`
18+
Time string `json:"time"`
19+
Timestamp string `json:"@timestamp"`
20+
Program string `json:"program"`
21+
SyslogProgram string `json:"syslog_program"`
22+
Instance string `json:"instance"`
23+
Section string `json:"section"`
24+
Error any `json:"error"`
25+
parts []string
2126
}
2227

2328
func normalizeSeverity(s string) string {
@@ -37,24 +42,31 @@ func normalizeSeverity(s string) string {
3742
}
3843
}
3944

45+
func stringifyField(v any) string {
46+
if v == nil {
47+
return ""
48+
}
49+
return fmt.Sprint(v)
50+
}
51+
4052
func newEntry(dat []byte) (*entry, error) {
4153
entry := new(entry)
4254
if err := json.Unmarshal(dat, entry); err != nil {
4355
return nil, err
4456
}
45-
if entry.Message == "" {
46-
entry.Message = entry.Msg
57+
entry.Message = cmp.Or(entry.Message, entry.Msg)
58+
entry.Severity = normalizeSeverity(cmp.Or(entry.Severity, entry.Level))
59+
entry.Time = cmp.Or(entry.Time, entry.Timestamp)
60+
entry.Program = cmp.Or(entry.Program, entry.SyslogProgram, entry.Instance, entry.Section)
61+
if errText := stringifyField(entry.Error); errText != "" && !strings.Contains(entry.Message, errText) {
62+
entry.Message = strings.TrimSpace(entry.Message + " " + errText)
4763
}
48-
if entry.Severity == "" {
49-
entry.Severity = entry.Level
50-
}
51-
entry.Severity = normalizeSeverity(entry.Severity)
52-
if entry.Time == "" {
53-
entry.Time = entry.Timestamp
64+
for _, s := range []string{entry.Program, entry.UID} {
65+
if s != "" {
66+
entry.parts = append(entry.parts, s)
67+
}
5468
}
55-
entry.parts = append(entry.parts, entry.Program)
56-
entry.parts = append(entry.parts, entry.UID)
57-
entry.parts = append(entry.parts, strings.Split(entry.Message, " ")...)
69+
entry.parts = append(entry.parts, strings.Fields(entry.Message)...)
5870
return entry, nil
5971
}
6072

0 commit comments

Comments
 (0)