extract named Pattern result if a group is named
parent
a8270b524c
commit
f2a23e5d8a
12
config.go
12
config.go
|
|
@ -34,6 +34,12 @@ type Config struct {
|
||||||
ai AI
|
ai AI
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
renderAssetPattern = `(dpg|svc|red)-[a-z0-9-]*[a-z0-9]`
|
||||||
|
renderDatacenterPattern = `[a-z]{4}[a-z]*-[0-9]`
|
||||||
|
renderEventNamePattern = `(\[[^\]]*\] *)?(?P<result>.*)`
|
||||||
|
)
|
||||||
|
|
||||||
func newConfig(ctx context.Context) (Config, error) {
|
func newConfig(ctx context.Context) (Config, error) {
|
||||||
return newConfigFromEnv(ctx, os.Getenv)
|
return newConfigFromEnv(ctx, os.Getenv)
|
||||||
}
|
}
|
||||||
|
|
@ -42,9 +48,9 @@ func newConfigFromEnv(ctx context.Context, getEnv func(string) string) (Config,
|
||||||
def := Config{
|
def := Config{
|
||||||
Port: 38080,
|
Port: 38080,
|
||||||
OllamaModel: "gemma:2b",
|
OllamaModel: "gemma:2b",
|
||||||
AssetPattern: `(dpg|svc|red)-[a-z0-9-]*`,
|
AssetPattern: renderAssetPattern,
|
||||||
DatacenterPattern: `[a-z]{4}[a-z]*-[0-9]`,
|
DatacenterPattern: renderDatacenterPattern,
|
||||||
EventNamePattern: `(^\[[^\]]*\] *)?(?P<result>.*)`,
|
EventNamePattern: renderEventNamePattern,
|
||||||
}
|
}
|
||||||
|
|
||||||
var m map[string]any
|
var m map[string]any
|
||||||
|
|
|
||||||
14
main_test.go
14
main_test.go
|
|
@ -39,6 +39,9 @@ func TestRun(t *testing.T) {
|
||||||
u := fmt.Sprintf("http://localhost:%d", port)
|
u := fmt.Sprintf("http://localhost:%d", port)
|
||||||
|
|
||||||
cfg := Config{}
|
cfg := Config{}
|
||||||
|
cfg.DatacenterPattern = renderDatacenterPattern
|
||||||
|
cfg.AssetPattern = renderAssetPattern
|
||||||
|
cfg.EventNamePattern = renderEventNamePattern
|
||||||
cfg.Port = port
|
cfg.Port = port
|
||||||
cfg.driver = NewRAM()
|
cfg.driver = NewRAM()
|
||||||
cfg.storage = NewStorage(cfg.driver)
|
cfg.storage = NewStorage(cfg.driver)
|
||||||
|
|
@ -120,7 +123,7 @@ func TestRun(t *testing.T) {
|
||||||
}
|
}
|
||||||
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
|
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
} else if result.EventNames[0] != "[Oregon-1] Wal Receive Count Alert" {
|
} else if result.EventNames[0] != "Wal Receive Count Alert" {
|
||||||
t.Fatal(result.EventNames)
|
t.Fatal(result.EventNames)
|
||||||
} else {
|
} else {
|
||||||
t.Logf("%+v", result)
|
t.Logf("%+v", result)
|
||||||
|
|
@ -215,14 +218,17 @@ func TestRun(t *testing.T) {
|
||||||
t.Fatalf("(%d) %s", resp.StatusCode, b)
|
t.Fatalf("(%d) %s", resp.StatusCode, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
dec := csv.NewReader(resp.Body)
|
b, _ := io.ReadAll(resp.Body)
|
||||||
|
t.Logf("whole csv: \n%s", b)
|
||||||
|
|
||||||
|
dec := csv.NewReader(bytes.NewReader(b))
|
||||||
var lastLine []string
|
var lastLine []string
|
||||||
for {
|
for {
|
||||||
line, err := dec.Read()
|
line, err := dec.Read()
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
break
|
break
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
t.Error(err)
|
t.Error("unexpected error while reading csv line:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if lastLine == nil {
|
if lastLine == nil {
|
||||||
|
|
@ -230,7 +236,7 @@ func TestRun(t *testing.T) {
|
||||||
t.Errorf("last line had %v elements but this line has %v", len(lastLine), len(line))
|
t.Errorf("last line had %v elements but this line has %v", len(lastLine), len(line))
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Logf("%+v", line)
|
t.Logf("CSV line: %+v", line)
|
||||||
lastLine = line
|
lastLine = line
|
||||||
}
|
}
|
||||||
if lastLine == nil {
|
if lastLine == nil {
|
||||||
|
|
|
||||||
21
message.go
21
message.go
|
|
@ -113,13 +113,20 @@ func ParseSlack(b []byte, assetPattern, datacenterPattern, eventNamePattern stri
|
||||||
return Message{}, err
|
return Message{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
asset := regexp.MustCompile(assetPattern)
|
for pattern, ptr := range map[string]*string{
|
||||||
datacenter := regexp.MustCompile(datacenterPattern)
|
assetPattern: &m.Asset,
|
||||||
eventName := regexp.MustCompile(eventNamePattern)
|
datacenterPattern: &m.Datacenter,
|
||||||
|
eventNamePattern: &m.EventName,
|
||||||
m.Asset = asset.FindString(m.Asset)
|
} {
|
||||||
m.Datacenter = datacenter.FindString(m.Datacenter)
|
r := regexp.MustCompile(pattern)
|
||||||
m.EventName = eventName.FindString(m.EventName)
|
parsed := r.FindString(*ptr)
|
||||||
|
for i, name := range r.SubexpNames() {
|
||||||
|
if i > 0 && name != "" {
|
||||||
|
parsed = r.FindStringSubmatch(*ptr)[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*ptr = parsed
|
||||||
|
}
|
||||||
|
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,6 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
renderAssetPattern = `(dpg|svc|red)-[a-z0-9-]*[a-z0-9]`
|
|
||||||
renderDatacenterPattern = `[a-z]{4}[a-z]*-[0-9]`
|
|
||||||
renderEventNamePattern = `(^\[[^\]]*\] *)?(?P<result>.*)`
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestParseSlackTestdata(t *testing.T) {
|
func TestParseSlackTestdata(t *testing.T) {
|
||||||
cases := map[string]struct {
|
cases := map[string]struct {
|
||||||
slackMessage slackMessage
|
slackMessage slackMessage
|
||||||
|
|
@ -130,8 +124,8 @@ func TestParseSlackTestdata(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("parseSlackJSON", func(t *testing.T) {
|
t.Run("_parseSlackJSON", func(t *testing.T) {
|
||||||
got, err := parseSlackJSON(b)
|
got, err := _parseSlackJSON(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue