summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--metrics.go66
1 files changed, 45 insertions, 21 deletions
diff --git a/metrics.go b/metrics.go
index 74aae15..b6ab6d4 100644
--- a/metrics.go
+++ b/metrics.go
@@ -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{