diff --git a/config.go b/config.go index e6a23a1..fe16ae6 100644 --- a/config.go +++ b/config.go @@ -26,6 +26,7 @@ type Config struct { LocalCheckpoint string LocalTokenizer string AssetPattern string + DatacenterPattern string storage Storage queue Queue driver Driver @@ -38,9 +39,10 @@ func newConfig(ctx context.Context) (Config, error) { func newConfigFromEnv(ctx context.Context, getEnv func(string) string) (Config, error) { def := Config{ - Port: 38080, - OllamaModel: "gemma:2b", - AssetPattern: `(dpg|svc|red)-[a-z0-9-]*`, + Port: 38080, + OllamaModel: "gemma:2b", + AssetPattern: `(dpg|svc|red)-[a-z0-9-]*`, + DatacenterPattern: `[a-z]{4}[a-z]*-[0-9]`, } var m map[string]any @@ -105,7 +107,7 @@ func newConfigFromEnv(ctx context.Context, getEnv func(string) string) (Config, result.driver = pg } if result.FillWithTestdata { - if err := FillWithTestdata(ctx, result.driver, result.AssetPattern); err != nil { + if err := FillWithTestdata(ctx, result.driver, result.AssetPattern, result.DatacenterPattern); err != nil { return Config{}, err } } diff --git a/driver.go b/driver.go index a6fcf78..c9a3360 100644 --- a/driver.go +++ b/driver.go @@ -23,7 +23,7 @@ type Driver interface { Set(context.Context, string, string, []byte) error } -func FillWithTestdata(ctx context.Context, driver Driver, assetPattern string) error { +func FillWithTestdata(ctx context.Context, driver Driver, assetPattern, datacenterPattern string) error { d := "./testdata/slack_events" entries, err := os.ReadDir(d) if err != nil { @@ -37,7 +37,7 @@ func FillWithTestdata(ctx context.Context, driver Driver, assetPattern string) e if err != nil { return err } - m, err := ParseSlack(b, assetPattern) + m, err := ParseSlack(b, assetPattern, datacenterPattern) if errors.Is(err, ErrIrrelevantMessage) { continue } else if err != nil { diff --git a/driver_test.go b/driver_test.go index fb8f9d6..86bb2fe 100644 --- a/driver_test.go +++ b/driver_test.go @@ -17,7 +17,7 @@ func TestFillTestdata(t *testing.T) { defer can() ram := NewRAM() - if err := FillWithTestdata(ctx, ram, renderAssetPattern); err != nil { + if err := FillWithTestdata(ctx, ram, renderAssetPattern, renderDatacenterPattern); err != nil { t.Fatal(err) } n := 0 diff --git a/main.go b/main.go index 4c4760c..cf98020 100644 --- a/main.go +++ b/main.go @@ -246,7 +246,7 @@ func _newHandlerPostAPIV1EventsSlack(cfg Config) http.HandlerFunc { return } - m, err := ParseSlack(b, cfg.AssetPattern) + m, err := ParseSlack(b, cfg.AssetPattern, cfg.DatacenterPattern) if errors.Is(err, ErrIrrelevantMessage) { return } else if err != nil { diff --git a/message.go b/message.go index b51b98d..edb824f 100644 --- a/message.go +++ b/message.go @@ -14,16 +14,17 @@ var ( ) type Message struct { - ID string - TS uint64 - Source string - Channel string - Thread string - EventName string - Event string - Plaintext string - Asset string - Resolved bool + ID string + TS uint64 + Source string + Channel string + Thread string + EventName string + Event string + Plaintext string + Asset string + Resolved bool + Datacenter string } func (m Message) Empty() bool { @@ -106,8 +107,9 @@ type ( slackAction struct{} ) -func ParseSlack(b []byte, assetPattern string) (Message, error) { +func ParseSlack(b []byte, assetPattern, datacenterPattern string) (Message, error) { asset := regexp.MustCompile(assetPattern) + datacenter := regexp.MustCompile(datacenterPattern) s, err := parseSlack(b) if err != nil { @@ -120,17 +122,24 @@ func ParseSlack(b []byte, assetPattern string) (Message, error) { } else if !strings.Contains(s.Event.Attachments[0].Title, ": Firing: ") { return Message{}, ErrIrrelevantMessage } + var tagsField string + for _, field := range s.Event.Attachments[0].Fields { + if field.Title == "Tags" { + tagsField = field.Value + } + } return Message{ - ID: fmt.Sprintf("%s/%v", s.Event.ID, s.TS), - TS: s.TS, - Source: fmt.Sprintf(`https://renderinc.slack.com/archives/%s/p%s`, s.Event.Channel, strings.ReplaceAll(s.Event.ID, ".", "")), - Channel: s.Event.Channel, - Thread: s.Event.ID, - EventName: strings.Split(s.Event.Attachments[0].Title, ": Firing: ")[1], - Event: strings.TrimPrefix(strings.Split(s.Event.Attachments[0].Title, ":")[0], "#"), - Plaintext: s.Event.Attachments[0].Text, - Asset: asset.FindString(s.Event.Attachments[0].Text), - Resolved: !strings.HasPrefix(s.Event.Attachments[0].Color, "F"), + ID: fmt.Sprintf("%s/%v", s.Event.ID, s.TS), + TS: s.TS, + Source: fmt.Sprintf(`https://renderinc.slack.com/archives/%s/p%s`, s.Event.Channel, strings.ReplaceAll(s.Event.ID, ".", "")), + Channel: s.Event.Channel, + Thread: s.Event.ID, + EventName: strings.Split(s.Event.Attachments[0].Title, ": Firing: ")[1], + Event: strings.TrimPrefix(strings.Split(s.Event.Attachments[0].Title, ":")[0], "#"), + Plaintext: s.Event.Attachments[0].Text, + Asset: asset.FindString(s.Event.Attachments[0].Text), + Resolved: !strings.HasPrefix(s.Event.Attachments[0].Color, "F"), + Datacenter: datacenter.FindString(tagsField), }, nil } @@ -138,15 +147,16 @@ func ParseSlack(b []byte, assetPattern string) (Message, error) { return Message{}, ErrIrrelevantMessage } return Message{ - ID: fmt.Sprintf("%s/%v", s.Event.ParentID, s.TS), - TS: s.TS, - Source: fmt.Sprintf(`https://renderinc.slack.com/archives/%s/p%s`, s.Event.Channel, strings.ReplaceAll(s.Event.ParentID, ".", "")), - Channel: s.Event.Channel, - Thread: s.Event.ParentID, - EventName: "", - Event: "", - Plaintext: s.Event.Text, - Asset: asset.FindString(s.Event.Text), + ID: fmt.Sprintf("%s/%v", s.Event.ParentID, s.TS), + TS: s.TS, + Source: fmt.Sprintf(`https://renderinc.slack.com/archives/%s/p%s`, s.Event.Channel, strings.ReplaceAll(s.Event.ParentID, ".", "")), + Channel: s.Event.Channel, + Thread: s.Event.ParentID, + EventName: "", + Event: "", + Plaintext: s.Event.Text, + Asset: asset.FindString(s.Event.Text), + Datacenter: datacenter.FindString(s.Event.Text), }, nil } diff --git a/message_test.go b/message_test.go index 3f57c95..28ac0b8 100644 --- a/message_test.go +++ b/message_test.go @@ -8,7 +8,8 @@ import ( ) var ( - renderAssetPattern = `(dpg|svc|red)-[a-z0-9-]*[a-z0-9]` + renderAssetPattern = `(dpg|svc|red)-[a-z0-9-]*[a-z0-9]` + renderDatacenterPattern = `[a-z]{4}[a-z]*-[0-9]` ) func TestParseSlackTestdata(t *testing.T) { @@ -139,7 +140,7 @@ func TestParseSlackTestdata(t *testing.T) { }) t.Run("ParseSlack", func(t *testing.T) { - got, err := ParseSlack(b, renderAssetPattern) + got, err := ParseSlack(b, renderAssetPattern, renderDatacenterPattern) if err != nil { t.Fatal(err) }