mirror of
https://github.com/gitpod-io/gitpod.git
synced 2025-12-08 17:36:30 +00:00
86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
// Copyright (c) 2022 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 scheduler
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
namespace = "gitpod"
|
|
subsystem = "usage"
|
|
)
|
|
|
|
var (
|
|
jobStartedSeconds = prometheus.NewCounterVec(prometheus.CounterOpts{
|
|
Namespace: namespace,
|
|
Subsystem: subsystem,
|
|
Name: "scheduler_job_started_total",
|
|
Help: "Number of jobs started",
|
|
}, []string{"job"})
|
|
|
|
jobCompletedSeconds = prometheus.NewHistogramVec(prometheus.HistogramOpts{
|
|
Namespace: namespace,
|
|
Subsystem: subsystem,
|
|
Name: "scheduler_job_completed_seconds",
|
|
Help: "Histogram of job duration",
|
|
Buckets: prometheus.LinearBuckets(30, 30, 10), // every 30 secs, starting at 30secs
|
|
}, []string{"job", "outcome"})
|
|
|
|
ledgerLastCompletedTime = prometheus.NewGaugeVec(prometheus.GaugeOpts{
|
|
Namespace: namespace,
|
|
Subsystem: subsystem,
|
|
Name: "ledger_last_completed_time",
|
|
Help: "The last time the ledger scheduled job completed, by outcome",
|
|
ConstLabels: nil,
|
|
}, []string{"outcome"})
|
|
|
|
stoppedWithoutStoppingTime = prometheus.NewGauge(prometheus.GaugeOpts{
|
|
Namespace: namespace,
|
|
Subsystem: subsystem,
|
|
Name: "job_stopped_instances_without_stopping_time_count",
|
|
Help: "Gauge of usage records where workpsace instance is stopped but doesn't have a stopping time",
|
|
})
|
|
)
|
|
|
|
func RegisterMetrics(reg *prometheus.Registry) error {
|
|
metrics := []prometheus.Collector{
|
|
jobStartedSeconds,
|
|
jobCompletedSeconds,
|
|
stoppedWithoutStoppingTime,
|
|
ledgerLastCompletedTime,
|
|
}
|
|
for _, metric := range metrics {
|
|
err := reg.Register(metric)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to register metric: %w", err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func reportJobStarted(id string) {
|
|
jobStartedSeconds.WithLabelValues(id).Inc()
|
|
}
|
|
|
|
func reportJobCompleted(id string, duration time.Duration, err error) {
|
|
jobCompletedSeconds.WithLabelValues(id, outcomeFromErr(err)).Observe(duration.Seconds())
|
|
}
|
|
|
|
func reportLedgerCompleted(err error) {
|
|
ledgerLastCompletedTime.WithLabelValues(outcomeFromErr(err)).SetToCurrentTime()
|
|
}
|
|
|
|
func outcomeFromErr(err error) string {
|
|
out := "success"
|
|
if err != nil {
|
|
out = "error"
|
|
}
|
|
return out
|
|
}
|