2022-12-08 13:05:19 -03:00

61 lines
1.4 KiB
Go

// Copyright (c) 2020 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package tracing
import (
"time"
"github.com/prometheus/client_golang/prometheus"
jaeger "github.com/uber/jaeger-client-go"
)
// PromReporter reports Jaeger span durations to Prometheus
type PromReporter struct {
Operations map[string]SpanMetricMapping
metrics map[string]prometheus.Histogram
}
// SpanMetricMapping defines how a span is to be reported to Prometheus
type SpanMetricMapping struct {
Name string
Help string
Buckets []float64
}
// RegisterMetrics registers all metrics created throug the mapping
func (r *PromReporter) RegisterMetrics() error {
r.metrics = make(map[string]prometheus.Histogram)
for k, m := range r.Operations {
metric := prometheus.NewHistogram(prometheus.HistogramOpts{
Name: m.Name,
Help: m.Help,
Buckets: m.Buckets,
})
err := prometheus.Register(metric)
if err != nil {
return err
}
r.metrics[k] = metric
}
return nil
}
// Report reports a span as Prometheus metric
func (r *PromReporter) Report(span *jaeger.Span) {
metric, ok := r.metrics[span.OperationName()]
if !ok {
return
}
metric.Observe(float64(span.Duration() / time.Millisecond))
}
// Close implements Close() method of Reporter by closing each underlying reporter.
func (r *PromReporter) Close() {
}