mirror of
https://github.com/gitpod-io/gitpod.git
synced 2025-12-08 17:36:30 +00:00
61 lines
1.4 KiB
Go
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() {
|
|
|
|
}
|