Merge remote-tracking branch 'prometheus/master'

This commit is contained in:
Василий Толстов 2024-11-09 19:33:55 +03:00
commit cfcb00051e
3 changed files with 82 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.idea/

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"io" "io"
"math" "math"
"strings"
"sync" "sync"
"time" "time"
) )
@ -63,6 +64,8 @@ type Histogram struct {
// sum is the sum of all the values put into Histogram // sum is the sum of all the values put into Histogram
sum float64 sum float64
compatible bool
} }
// Reset resets the given histogram. // Reset resets the given histogram.
@ -187,6 +190,9 @@ func (h *Histogram) VisitNonZeroBuckets(f func(vmrange string, count uint64)) {
func NewHistogram(name string) *Histogram { func NewHistogram(name string) *Histogram {
return defaultSet.NewHistogram(name) return defaultSet.NewHistogram(name)
} }
func NewCompatibleHistogram(name string) *Histogram {
return defaultSet.NewCompatibleHistogram(name)
}
// GetOrCreateHistogram returns registered histogram with the given name // GetOrCreateHistogram returns registered histogram with the given name
// or creates new histogram if the registry doesn't contain histogram with // or creates new histogram if the registry doesn't contain histogram with
@ -205,6 +211,9 @@ func NewHistogram(name string) *Histogram {
func GetOrCreateHistogram(name string) *Histogram { func GetOrCreateHistogram(name string) *Histogram {
return defaultSet.GetOrCreateHistogram(name) return defaultSet.GetOrCreateHistogram(name)
} }
func GetOrCreateCompatibleHistogram(name string) *Histogram {
return defaultSet.GetOrCreateCompatibleHistogram(name)
}
// UpdateDuration updates request duration based on the given startTime. // UpdateDuration updates request duration based on the given startTime.
func (h *Histogram) UpdateDuration(startTime time.Time) { func (h *Histogram) UpdateDuration(startTime time.Time) {
@ -237,6 +246,10 @@ var (
) )
func (h *Histogram) marshalTo(prefix string, w io.Writer) { func (h *Histogram) marshalTo(prefix string, w io.Writer) {
if h.compatible {
h.marshalToPrometheus(prefix, w)
return
}
countTotal := uint64(0) countTotal := uint64(0)
h.VisitNonZeroBuckets(func(vmrange string, count uint64) { h.VisitNonZeroBuckets(func(vmrange string, count uint64) {
tag := fmt.Sprintf("vmrange=%q", vmrange) tag := fmt.Sprintf("vmrange=%q", vmrange)
@ -257,6 +270,41 @@ func (h *Histogram) marshalTo(prefix string, w io.Writer) {
} }
fmt.Fprintf(w, "%s_count%s %d\n", name, labels, countTotal) fmt.Fprintf(w, "%s_count%s %d\n", name, labels, countTotal)
} }
func (h *Histogram) marshalToPrometheus(prefix string, w io.Writer) {
countTotal := uint64(0)
inf := false
h.VisitNonZeroBuckets(func(vmrange string, count uint64) {
v := strings.Split(vmrange, "...")
if len(v) != 2 {
return
}
if v[1] == "+Inf" {
inf = true
}
tag := fmt.Sprintf("le=%q", v[1])
metricName := addTag(prefix, tag)
name, labels := splitMetricName(metricName)
countTotal += count
fmt.Fprintf(w, "%s_bucket%s %d\n", name, labels, countTotal)
})
if countTotal == 0 {
return
}
if !inf {
tag := fmt.Sprintf("le=%q", "+Inf")
metricName := addTag(prefix, tag)
name, labels := splitMetricName(metricName)
fmt.Fprintf(w, "%s_bucket%s %d\n", name, labels, countTotal)
}
name, labels := splitMetricName(prefix)
sum := h.getSum()
if float64(int64(sum)) == sum {
fmt.Fprintf(w, "%s_sum%s %d\n", name, labels, int64(sum))
} else {
fmt.Fprintf(w, "%s_sum%s %g\n", name, labels, sum)
}
fmt.Fprintf(w, "%s_count%s %d\n", name, labels, countTotal)
}
func (h *Histogram) getSum() float64 { func (h *Histogram) getSum() float64 {
h.mu.Lock() h.mu.Lock()

33
set.go
View File

@ -85,6 +85,11 @@ func (s *Set) NewHistogram(name string) *Histogram {
s.registerMetric(name, h) s.registerMetric(name, h)
return h return h
} }
func (s *Set) NewCompatibleHistogram(name string) *Histogram {
h := &Histogram{compatible: true}
s.registerMetric(name, h)
return h
}
// GetOrCreateHistogram returns registered histogram in s with the given name // GetOrCreateHistogram returns registered histogram in s with the given name
// or creates new histogram if s doesn't contain histogram with the given name. // or creates new histogram if s doesn't contain histogram with the given name.
@ -127,6 +132,34 @@ func (s *Set) GetOrCreateHistogram(name string) *Histogram {
} }
return h return h
} }
func (s *Set) GetOrCreateCompatibleHistogram(name string) *Histogram {
s.mu.Lock()
nm := s.m[name]
s.mu.Unlock()
if nm == nil {
// Slow path - create and register missing histogram.
if err := validateMetric(name); err != nil {
panic(fmt.Errorf("BUG: invalid metric name %q: %s", name, err))
}
nmNew := &namedMetric{
name: name,
metric: &Histogram{compatible: true},
}
s.mu.Lock()
nm = s.m[name]
if nm == nil {
nm = nmNew
s.m[name] = nm
s.a = append(s.a, nm)
}
s.mu.Unlock()
}
h, ok := nm.metric.(*Histogram)
if !ok {
panic(fmt.Errorf("BUG: metric %q isn't a Histogram. It is %T", name, nm.metric))
}
return h
}
// NewCounter registers and returns new counter with the given name in the s. // NewCounter registers and returns new counter with the given name in the s.
// //