Skip to content

Commit 7f5fe36

Browse files
csweichelArthurSens
authored andcommitted
[ws-manager] Add metric counting totakl open ports
1 parent 079af3f commit 7f5fe36

File tree

6 files changed

+62
-8
lines changed

6 files changed

+62
-8
lines changed

components/ws-manager/pkg/manager/create.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -664,9 +664,10 @@ func (m *Manager) createPortsService(workspaceID string, metaID string, serviceP
664664
Name: serviceName,
665665
Namespace: m.Config.Namespace,
666666
Labels: map[string]string{
667-
"workspaceID": workspaceID,
668-
wsk8s.MetaIDLabel: metaID,
669-
markerLabel: "true",
667+
"workspaceID": workspaceID,
668+
wsk8s.MetaIDLabel: metaID,
669+
markerLabel: "true",
670+
wsk8s.ServiceTypeLabel: "ports",
670671
},
671672
Annotations: annotations,
672673
},

components/ws-manager/pkg/manager/manager.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ func (m *Manager) StartWorkspace(ctx context.Context, req *api.StartWorkspaceReq
191191
// mandatory Theia service
192192
servicePrefix := getServicePrefix(req)
193193
theiaServiceName := getTheiaServiceName(servicePrefix)
194+
theiaServiceLabels := make(map[string]string, len(startContext.Labels)+1)
195+
for k, v := range startContext.Labels {
196+
theiaServiceLabels[k] = v
197+
}
198+
theiaServiceLabels[wsk8s.ServiceTypeLabel] = "ide"
194199
theiaService := corev1.Service{
195200
ObjectMeta: metav1.ObjectMeta{
196201
Name: theiaServiceName,

components/ws-manager/pkg/manager/metrics.go

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ package manager
66

77
import (
88
"context"
9+
"math"
910
"strings"
1011
"sync"
1112
"time"
1213

1314
"github.com/prometheus/client_golang/prometheus"
1415
corev1 "k8s.io/api/core/v1"
1516

17+
wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes"
1618
"github.com/gitpod-io/gitpod/common-go/log"
1719
"github.com/gitpod-io/gitpod/ws-manager/api"
1820
)
@@ -23,8 +25,8 @@ func (m *Manager) RegisterMetrics(reg prometheus.Registerer) error {
2325
}
2426

2527
const (
26-
metricsNamespace = "gitpod_ws_manager"
27-
metricsWorkspaceSubsystem = "workspace"
28+
metricsNamespace = "gitpod"
29+
metricsWorkspaceSubsystem = "ws_manager"
2830
)
2931

3032
type metrics struct {
@@ -33,6 +35,7 @@ type metrics struct {
3335
startupTimeHistVec *prometheus.HistogramVec
3436
totalStartsCounterVec *prometheus.CounterVec
3537
totalStopsCounterVec *prometheus.CounterVec
38+
totalOpenPortGauge prometheus.GaugeFunc
3639

3740
mu sync.Mutex
3841
phaseState map[string]api.WorkspacePhase
@@ -45,23 +48,64 @@ func newMetrics(m *Manager) *metrics {
4548
startupTimeHistVec: prometheus.NewHistogramVec(prometheus.HistogramOpts{
4649
Namespace: metricsNamespace,
4750
Subsystem: metricsWorkspaceSubsystem,
48-
Name: "startup_seconds",
51+
Name: "workspace_startup_seconds",
4952
Help: "time it took for workspace pods to reach the running phase",
5053
// same as components/ws-manager-bridge/src/prometheus-metrics-exporter.ts#L15
5154
Buckets: prometheus.ExponentialBuckets(2, 2, 10),
5255
}, []string{"type"}),
5356
totalStartsCounterVec: prometheus.NewCounterVec(prometheus.CounterOpts{
5457
Namespace: metricsNamespace,
5558
Subsystem: metricsWorkspaceSubsystem,
56-
Name: "starts_total",
59+
Name: "workspace_starts_total",
5760
Help: "total number of workspaces started",
5861
}, []string{"type"}),
5962
totalStopsCounterVec: prometheus.NewCounterVec(prometheus.CounterOpts{
6063
Namespace: metricsNamespace,
6164
Subsystem: metricsWorkspaceSubsystem,
62-
Name: "stops_total",
65+
Name: "workspace_stops_total",
6366
Help: "total number of workspaces stopped",
6467
}, []string{"reason"}),
68+
totalOpenPortGauge: prometheus.NewGaugeFunc(prometheus.GaugeOpts{
69+
Namespace: metricsNamespace,
70+
Subsystem: metricsWorkspaceSubsystem,
71+
Name: "exposed_ports",
72+
Help: "total number of currently exposed ports",
73+
}, newTotalOpenPortGaugeHandler(m)),
74+
}
75+
}
76+
77+
func newTotalOpenPortGaugeHandler(m *Manager) func() float64 {
78+
countExposedPorts := func(ctx context.Context) (float64, error) {
79+
var l corev1.ServiceList
80+
err := m.Clientset.List(ctx, &l, workspaceObjectListOptions(m.Config.Namespace))
81+
if err != nil {
82+
return 0, err
83+
}
84+
var portCount int
85+
for _, s := range l.Items {
86+
tpe, ok := s.Labels[wsk8s.ServiceTypeLabel]
87+
if !ok {
88+
continue
89+
}
90+
if tpe != "ports" {
91+
continue
92+
}
93+
portCount += len(s.Spec.Ports)
94+
}
95+
return float64(portCount), nil
96+
}
97+
98+
return func() float64 {
99+
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
100+
defer cancel()
101+
102+
r, err := countExposedPorts(ctx)
103+
if err != nil {
104+
log.WithError(err).Warn("cannot compute exposed_ports metric")
105+
return math.NaN()
106+
}
107+
108+
return r
65109
}
66110
}
67111

@@ -75,6 +119,7 @@ func (m *metrics) Register(reg prometheus.Registerer) error {
75119
newSubscriberQueueLevelVec(m.manager),
76120
m.totalStartsCounterVec,
77121
m.totalStopsCounterVec,
122+
m.totalOpenPortGauge,
78123
}
79124
for _, c := range collectors {
80125
err := reg.Register(c)

components/ws-manager/pkg/manager/testdata/controlPort_changeTargetPort.nt.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"labels": {
88
"gpwsman": "true",
99
"metaID": "",
10+
"serviceType": "ports",
1011
"workspaceID": "foobar"
1112
},
1213
"annotations": {

components/ws-manager/pkg/manager/testdata/controlPort_createPrivate.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"labels": {
88
"gpwsman": "true",
99
"metaID": "",
10+
"serviceType": "ports",
1011
"workspaceID": "foobar"
1112
},
1213
"annotations": {

components/ws-manager/pkg/manager/testdata/controlPort_firstOpen_withTargetPort.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"labels": {
88
"gpwsman": "true",
99
"metaID": "",
10+
"serviceType": "ports",
1011
"workspaceID": "foobar"
1112
},
1213
"annotations": {

0 commit comments

Comments
 (0)