Skip to content

Commit 1a98bf1

Browse files
committed
[baseserver] Emit metrics for logs produced by level
1 parent 8dcd0a5 commit 1a98bf1

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

components/common-go/baseserver/server.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"syscall"
1717

1818
common_grpc "github.com/gitpod-io/gitpod/common-go/grpc"
19+
"github.com/gitpod-io/gitpod/common-go/log"
1920
"github.com/gitpod-io/gitpod/common-go/pprof"
2021
"github.com/gitpod-io/gitpod/common-go/tracing"
2122
grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus"
@@ -348,6 +349,10 @@ func (s *Server) initializeMetrics() error {
348349
return fmt.Errorf("failed to register baseserver metrics: %w", err)
349350
}
350351

352+
if err := s.MetricsRegistry().Register(log.DefaultMetrics); err != nil {
353+
return fmt.Errorf("failed to register log metrics: %w", err)
354+
}
355+
351356
reportServerVersion(s.options.version)
352357

353358
return nil

components/common-go/log/log.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ func Init(service, version string, json, verbose bool) {
5454
Log = log.WithFields(ServiceContext(service, version))
5555
log.SetReportCaller(true)
5656

57+
log.AddHook(NewLogHook(DefaultMetrics))
58+
5759
if json {
5860
Log.Logger.SetFormatter(newGcpFormatter(false))
5961
} else {

components/common-go/log/metrics.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright (c) 2023 Gitpod GmbH. All rights reserved.
2+
// Licensed under the GNU Affero General Public License (AGPL).
3+
// See License.AGPL.txt in the project root for license information.
4+
5+
package log
6+
7+
import (
8+
"github.com/prometheus/client_golang/prometheus"
9+
"github.com/sirupsen/logrus"
10+
)
11+
12+
var (
13+
DefaultMetrics = NewMetrics()
14+
)
15+
16+
type Metrics struct {
17+
logEmitedCounter *prometheus.CounterVec
18+
}
19+
20+
func (m *Metrics) ReportLog(level logrus.Level) {
21+
m.logEmitedCounter.WithLabelValues(level.String()).Inc()
22+
}
23+
24+
func NewMetrics() *Metrics {
25+
return &Metrics{
26+
logEmitedCounter: prometheus.NewCounterVec(prometheus.CounterOpts{
27+
Name: "gitpod_logs_total",
28+
Help: "Total number of logs produced by level",
29+
}, []string{"level"}),
30+
}
31+
}
32+
33+
// Describe sends the super-set of all possible descriptors of metrics
34+
// collected by this Collector to the provided channel and returns once
35+
// the last descriptor has been sent.
36+
func (m *Metrics) Describe(ch chan<- *prometheus.Desc) {
37+
m.logEmitedCounter.Describe(ch)
38+
}
39+
40+
// Collect is called by the Prometheus registry when collecting
41+
// metrics. The implementation sends each collected metric via the
42+
// provided channel and returns once the last metric has been sent.
43+
func (m *Metrics) Collect(ch chan<- prometheus.Metric) {
44+
m.logEmitedCounter.Collect(ch)
45+
}
46+
47+
func NewLogHook(metrics *Metrics) *LogHook {
48+
return &LogHook{metrics: metrics}
49+
}
50+
51+
type LogHook struct {
52+
metrics *Metrics
53+
}
54+
55+
func (h *LogHook) Levels() []logrus.Level {
56+
return logrus.AllLevels
57+
}
58+
59+
func (h *LogHook) Fire(entry *logrus.Entry) error {
60+
h.metrics.ReportLog(entry.Level)
61+
return nil
62+
}

0 commit comments

Comments
 (0)