From 4551e3c8f735f5269444fd88e5ec9ab84e51426c Mon Sep 17 00:00:00 2001 From: Esonhugh Date: Sun, 1 Dec 2024 23:55:05 +0800 Subject: [PATCH] update: Resource parse --- pkg/metrics/metrics_test.go | 11 ++++++- pkg/metrics/parser.go | 9 +++-- pkg/metrics/resource.go | 65 +++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 pkg/metrics/resource.go diff --git a/pkg/metrics/metrics_test.go b/pkg/metrics/metrics_test.go index 004c624..e3cf498 100644 --- a/pkg/metrics/metrics_test.go +++ b/pkg/metrics/metrics_test.go @@ -7,7 +7,7 @@ import ( ) func TestMetrics(t *testing.T) { - f, err := os.Open("./metrics") + f, err := os.Open("./metrics_output.txt") if err != nil { t.Fatalf("open file failed: %v", err) t.Fail() @@ -21,6 +21,11 @@ func TestMetrics(t *testing.T) { t.Fail() } + output, err := os.OpenFile("./output.txt", os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + t.Fatalf("open output file failed: %v", err) + } + defer output.Close() for scanner.Scan() { line := scanner.Text() res, err := rule.Match(line) @@ -28,6 +33,10 @@ func TestMetrics(t *testing.T) { continue } else { t.Logf("matched: %s", res.DumpString()) + // _, _ = output.WriteString(res.DumpString() + "\n") } } + var res ResourceList = ConvertToResource(rule) + _, _ = output.WriteString(res.JSON() + "\n") + t.Logf(res.JSON()) } diff --git a/pkg/metrics/parser.go b/pkg/metrics/parser.go index 232f5ca..153482b 100644 --- a/pkg/metrics/parser.go +++ b/pkg/metrics/parser.go @@ -36,9 +36,9 @@ type MetricMatcher struct { ptr any `json:"-"` } -func NewMetricMatcher(label_name string) *MetricMatcher { +func NewMetricMatcher(t string) *MetricMatcher { return &MetricMatcher{ - Name: label_name, + Name: t, grok: grok.New(), Labels: make([]Label, 0), } @@ -75,7 +75,7 @@ func (mt *MetricMatcher) Compile() error { } func (mt *MetricMatcher) Match(target string) (res map[string]string, err error) { - if !strings.HasPrefix(target, mt.Header+"{") { + if !strings.HasPrefix(target, mt.Header) { log.Debugf("not match: %s", target) if COMMON_MATCH_GROK.MatchString(target) { res, err = COMMON_MATCH_GROK.ParseString(target) @@ -93,6 +93,9 @@ func (mt *MetricMatcher) Match(target string) (res map[string]string, err error) return nil, errors.New("can't match") } else { res, err = mt.grok.ParseString(target) + if err != nil || res == nil || len(res) == 0 { + return nil, errors.New("match failed, no result found") + } mt.setResult(res) return res, err } diff --git a/pkg/metrics/resource.go b/pkg/metrics/resource.go new file mode 100644 index 0000000..46474d4 --- /dev/null +++ b/pkg/metrics/resource.go @@ -0,0 +1,65 @@ +package metrics + +import "encoding/json" + +type Resource struct { + Namespace string `json:"namespace"` + Type string `json:"type"` + Name string `json:"name"` + Spec map[string]string `json:"spec"` +} + +func NewResource(t string) *Resource { + return &Resource{ + Type: t, + Spec: make(map[string]string), + } +} + +func (r *Resource) AddLabelSpec(l Label) { + r.Spec[l.Key] = l.Value +} + +func (r *Resource) AddSpec(key string, value string) { + r.Spec[key] = value +} + +type ResourceList []*Resource + +func (rl *ResourceList) JSON() string { + b, _ := json.Marshal(rl) + return string(b) +} + +func ConvertToResource(r []*MetricMatcher) []*Resource { + var res []*Resource + for _, m := range r { + var resource *Resource + if m.Name == "endpoint_address" || m.Name == "endpoint_port" { + for i, c := range res { + if m.FindLabel("namespace") == c.Namespace && m.FindLabel("endpoint") == c.Name { + resource = res[i] + } else { + resource = NewResource("endpoint") + } + } + } else { + resource = NewResource(m.Name) + } + + resource.Namespace = m.FindLabel("namespace") + if m.Name == "endpoint_address" || m.Name == "endpoint_port" { + resource.Name = m.FindLabel("endpoint") + } else { + resource.Name = m.FindLabel(m.Name) + } + // merge endpoint_address and endpoint_port + for _, l := range m.Labels { + if l.Key != "namespace" && l.Key != m.Name { + resource.AddLabelSpec(l) + } + } + res = append(res, resource) + } + return res +}