diff options
-rw-r--r-- | metrics.go | 66 |
1 files changed, 45 insertions, 21 deletions
@@ -35,25 +35,28 @@ type Sample struct{ func (self Sample) cmpString() string{ return SortLabels(self.labels).String() } -func (self Sample) String() string{ - ret := "" +func (self Sample) WriteString(b *strings.Builder){ firstLabel := 0 if self.labels.Len() != 0 && self.labels[0].Name == labels.MetricName{ firstLabel = 1 - ret += self.labels[0].Value + b.WriteString(self.labels[0].Value) } if len(self.labels[firstLabel:]) > 0{ - ret += "{" + b.WriteString("{") for i, l := range self.labels[firstLabel:]{ if i != 0{ - ret += "," + b.WriteString(",") } - ret += l.Name + "=" + `"` + Escape(l.Value) + `"` + b.WriteString(l.Name + "=" + `"` + Escape(l.Value) + `"`) } - ret += "}" + b.WriteString("}") } - ret += fmt.Sprintf(" %g%s", self.value, self.suffix) - return ret + b.WriteString(fmt.Sprintf(" %g%s", self.value, self.suffix)) +} +func (self Sample) String() string{ + b := strings.Builder{} + self.WriteString(&b) + return b.String() } type MetricFamily struct{ @@ -76,16 +79,31 @@ type MetricSampleSet struct{ Name string Labels []MetricSampleLabel } -func (self MetricFamily) Header() string{ - ret := "" - ret += fmt.Sprintf("# TYPE %s %s\n", self.name, self.ty) +func (self MetricFamily) WriteHeader(b *strings.Builder){ + b.WriteString("# TYPE ") + b.WriteString(self.name) + b.WriteString(" ") + b.WriteString(string(self.ty)) + b.WriteString("\n") if self.unit != ""{ - ret += fmt.Sprintf("# UNIT %s %s\n", self.name, self.unit) + b.WriteString("# UNIT ") + b.WriteString(self.name) + b.WriteString(" ") + b.WriteString(self.unit) + b.WriteString("\n") } if self.help != ""{ - ret += fmt.Sprintf("# HELP %s %s\n", self.name, Escape(self.help)) + b.WriteString("# HELP ") + b.WriteString(self.name) + b.WriteString(" ") + b.WriteString(Escape(self.help)) + b.WriteString("\n") } - return ret +} +func (self MetricFamily) Header() string{ + b := strings.Builder{} + self.WriteHeader(&b) + return b.String() } func (self MetricFamily) MetricNamesLabels() []MetricSampleSet{ switch self.ty{ @@ -203,9 +221,8 @@ func (self MetricFamilies) Clone() MetricFamilies{ } return ret } -func (self MetricFamilies) String() string{ +func (self MetricFamilies) WriteString(b *strings.Builder){ samples := maps.Clone(self.samples) - ret := "" for _, mf := range self.metas{ // labels, __name__ ms := map[string]map[string]*[]Sample{} @@ -238,7 +255,7 @@ func (self MetricFamilies) String() string{ if len(ms) == 0{ continue } - ret += mf.Header() + mf.WriteHeader(b) for _, s := range ms{ for _, mss := range mf.MetricNamesLabels(){ if s[mss.Name] == nil{ @@ -276,17 +293,24 @@ func (self MetricFamilies) String() string{ return 0 }) for _, m := range *s[mss.Name]{ - ret += m.String() + "\n" + m.WriteString(b) + b.WriteString("\n") } } } } for _, mn := range samples{ for _, m := range mn{ - ret += m.String() + "\n" + m.WriteString(b) + b.WriteString("\n") } } - return ret + "# EOF\n" + b.WriteString("# EOF\n") +} +func (self MetricFamilies) String() string{ + b := strings.Builder{} + self.WriteString(&b) + return b.String() } func (self *MetricFamilies) addSampleWithKeys(s Sample, mn string, sk string){ if self.samples[mn] == nil{ |