From cbeda8daaf76ab2c9c1be203ec03f2e10bbfc459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Sat, 13 Aug 2022 17:51:02 +0100 Subject: [PATCH] feat(api): intern string to save memory --- internal/intern/intern.go | 16 ++++++++++++++++ internal/mapper/v017/api.go | 25 +++++++++++++++---------- 2 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 internal/intern/intern.go diff --git a/internal/intern/intern.go b/internal/intern/intern.go new file mode 100644 index 000000000..34ae48a6b --- /dev/null +++ b/internal/intern/intern.go @@ -0,0 +1,16 @@ +package intern + +type StringInterner map[string]string + +func New() StringInterner { + return StringInterner{} +} + +func (si StringInterner) Intern(s string) string { + interned, ok := si[s] + if ok { + return interned + } + si[s] = s + return s +} diff --git a/internal/mapper/v017/api.go b/internal/mapper/v017/api.go index c4c89f2ce..87781c2ae 100644 --- a/internal/mapper/v017/api.go +++ b/internal/mapper/v017/api.go @@ -9,6 +9,7 @@ import ( httptransport "github.com/go-openapi/runtime/client" + "github.com/prymitive/karma/internal/intern" "github.com/prymitive/karma/internal/mapper" "github.com/prymitive/karma/internal/mapper/v017/client" "github.com/prymitive/karma/internal/mapper/v017/client/alertgroup" @@ -41,6 +42,8 @@ func newClient(uri string, headers map[string]string, httpTransport http.RoundTr // Alerts will fetch all alert groups from the API func groups(c *client.AlertmanagerAPI, timeout time.Duration) ([]models.AlertGroup, error) { + interner := intern.New() + groups, err := c.Alertgroup.GetAlertGroups(alertgroup.NewGetAlertGroupsParamsWithTimeout(timeout)) if err != nil { return []models.AlertGroup{}, err @@ -51,28 +54,28 @@ func groups(c *client.AlertmanagerAPI, timeout time.Duration) ([]models.AlertGro for _, group := range groups.Payload { ls := models.Labels{} for k, v := range group.Labels { - ls = ls.Set(k, v) + ls = ls.Set(interner.Intern(k), interner.Intern(v)) } sort.Sort(ls) g := models.AlertGroup{ - Receiver: *group.Receiver.Name, + Receiver: interner.Intern(*group.Receiver.Name), Labels: ls, Alerts: make(models.AlertList, 0, len(group.Alerts)), } for _, alert := range group.Alerts { ls := models.Labels{} for k, v := range alert.Labels { - ls = ls.Set(k, v) + ls = ls.Set(interner.Intern(k), interner.Intern(v)) } sort.Sort(ls) a := models.Alert{ Fingerprint: *alert.Fingerprint, - Receiver: *group.Receiver.Name, + Receiver: interner.Intern(*group.Receiver.Name), Annotations: models.AnnotationsFromMap(alert.Annotations), Labels: ls, StartsAt: time.Time(*alert.StartsAt), - GeneratorURL: alert.GeneratorURL.String(), - State: *alert.Status.State, + GeneratorURL: interner.Intern(alert.GeneratorURL.String()), + State: interner.Intern(*alert.Status.State), InhibitedBy: alert.Status.InhibitedBy, SilencedBy: alert.Status.SilencedBy, } @@ -88,6 +91,8 @@ func groups(c *client.AlertmanagerAPI, timeout time.Duration) ([]models.AlertGro } func silences(c *client.AlertmanagerAPI, timeout time.Duration) ([]models.Silence, error) { + interner := intern.New() + silences, err := c.Silence.GetSilences(silence.NewGetSilencesParamsWithTimeout(timeout)) if err != nil { return []models.Silence{}, err @@ -100,13 +105,13 @@ func silences(c *client.AlertmanagerAPI, timeout time.Duration) ([]models.Silenc ID: *s.ID, StartsAt: time.Time(*s.StartsAt), EndsAt: time.Time(*s.EndsAt), - CreatedBy: *s.CreatedBy, - Comment: *s.Comment, + CreatedBy: interner.Intern(*s.CreatedBy), + Comment: interner.Intern(*s.Comment), } for _, m := range s.Matchers { sm := models.SilenceMatcher{ - Name: *m.Name, - Value: *m.Value, + Name: interner.Intern(*m.Name), + Value: interner.Intern(*m.Value), IsRegex: *m.IsRegex, IsEqual: *m.IsEqual, }