Skip to content

Commit 2250729

Browse files
Laurie T. Malauroboquat
Laurie T. Malau
authored andcommitted
Add request duration metric
1 parent b58fc5a commit 2250729

File tree

5 files changed

+84
-4
lines changed

5 files changed

+84
-4
lines changed

components/public-api-server/pkg/proxy/conn.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
gitpod "github.com/gitpod-io/gitpod/gitpod-protocol"
1111
"github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus"
1212
"net/url"
13+
"time"
1314
)
1415

1516
type ServerConnectionPool interface {
@@ -26,6 +27,10 @@ type NoConnectionPool struct {
2627
func (p *NoConnectionPool) Get(ctx context.Context, token string) (gitpod.APIInterface, error) {
2728
logger := ctxlogrus.Extract(ctx)
2829

30+
start := time.Now()
31+
defer func() {
32+
reportConnectionDuration(time.Since(start))
33+
}()
2934
server, err := gitpod.ConnectToServer(p.ServerAPI.String(), gitpod.ConnectToServerOpts{
3035
Context: ctx,
3136
Token: token,
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright (c) 2022 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 proxy
6+
7+
import (
8+
"github.com/prometheus/client_golang/prometheus"
9+
"time"
10+
)
11+
12+
func reportConnectionDuration(d time.Duration) {
13+
proxyConnectionCreateDurationSeconds.Observe(d.Seconds())
14+
}
15+
16+
var proxyConnectionCreateDurationSeconds = prometheus.NewHistogram(prometheus.HistogramOpts{
17+
Namespace: "gitpod",
18+
Name: "public_api_proxy_connection_create_duration_seconds",
19+
Help: "Histogram of connection time in seconds",
20+
})
21+
22+
func RegisterMetrics(registry *prometheus.Registry) {
23+
registry.MustRegister(proxyConnectionCreateDurationSeconds)
24+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright (c) 2022 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 proxy
6+
7+
import (
8+
"context"
9+
"github.com/gitpod-io/gitpod/common-go/baseserver"
10+
v1 "github.com/gitpod-io/gitpod/public-api/v1"
11+
"github.com/prometheus/client_golang/prometheus"
12+
"github.com/prometheus/client_golang/prometheus/testutil"
13+
"github.com/stretchr/testify/assert"
14+
"google.golang.org/grpc"
15+
"google.golang.org/grpc/credentials/insecure"
16+
"google.golang.org/grpc/metadata"
17+
"testing"
18+
)
19+
20+
func TestConnectionCreationWasTracked(t *testing.T) {
21+
// Set up server
22+
srv := baseserver.NewForTests(t)
23+
baseserver.StartServerForTests(t, srv)
24+
25+
// Set up Prometheus registry
26+
registry := prometheus.NewRegistry()
27+
registry.MustRegister(proxyConnectionCreateDurationSeconds)
28+
29+
// Set up Workspace client
30+
ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "some-token")
31+
conn, _ := grpc.Dial(srv.GRPCAddress(), grpc.WithTransportCredentials(insecure.NewCredentials()))
32+
client := v1.NewWorkspacesServiceClient(conn)
33+
34+
// Call GetWorkspace
35+
client.GetWorkspace(ctx, &v1.GetWorkspaceRequest{
36+
WorkspaceId: "some-ID",
37+
})
38+
39+
count, err := testutil.GatherAndCount(registry)
40+
assert.NoError(t, err)
41+
assert.Equal(t, 1, count)
42+
}

components/public-api-server/pkg/server/integration_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"context"
99
"github.com/gitpod-io/gitpod/common-go/baseserver"
1010
v1 "github.com/gitpod-io/gitpod/public-api/v1"
11+
"github.com/prometheus/client_golang/prometheus"
1112
"github.com/stretchr/testify/require"
1213
"google.golang.org/grpc"
1314
"google.golang.org/grpc/codes"
@@ -21,11 +22,12 @@ import (
2122
func TestPublicAPIServer_v1_WorkspaceService(t *testing.T) {
2223
ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "some-token")
2324
srv := baseserver.NewForTests(t)
25+
registry := prometheus.NewRegistry()
2426

2527
gitpodAPI, err := url.Parse("wss://main.preview.gitpod-dev.com/api/v1")
2628
require.NoError(t, err)
2729

28-
require.NoError(t, register(srv, Config{GitpodAPI: gitpodAPI}))
30+
require.NoError(t, register(srv, Config{GitpodAPI: gitpodAPI}, registry))
2931
baseserver.StartServerForTests(t, srv)
3032

3133
conn, err := grpc.Dial(srv.GRPCAddress(), grpc.WithTransportCredentials(insecure.NewCredentials()))
@@ -67,11 +69,12 @@ func TestPublicAPIServer_v1_WorkspaceService(t *testing.T) {
6769
func TestPublicAPIServer_v1_PrebuildService(t *testing.T) {
6870
ctx := context.Background()
6971
srv := baseserver.NewForTests(t)
72+
registry := prometheus.NewRegistry()
7073

7174
gitpodAPI, err := url.Parse("wss://main.preview.gitpod-dev.com/api/v1")
7275
require.NoError(t, err)
7376

74-
require.NoError(t, register(srv, Config{GitpodAPI: gitpodAPI}))
77+
require.NoError(t, register(srv, Config{GitpodAPI: gitpodAPI}, registry))
7578

7679
baseserver.StartServerForTests(t, srv)
7780

components/public-api-server/pkg/server/server.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,25 @@ import (
1212
"github.com/gitpod-io/gitpod/public-api-server/pkg/apiv1"
1313
"github.com/gitpod-io/gitpod/public-api-server/pkg/proxy"
1414
v1 "github.com/gitpod-io/gitpod/public-api/v1"
15+
"github.com/prometheus/client_golang/prometheus"
1516
"github.com/sirupsen/logrus"
1617
"net/http"
1718
)
1819

1920
func Start(logger *logrus.Entry, cfg Config) error {
21+
registry := prometheus.NewRegistry()
22+
2023
srv, err := baseserver.New("public_api_server",
2124
baseserver.WithLogger(logger),
2225
baseserver.WithHTTPPort(cfg.HTTPPort),
2326
baseserver.WithGRPCPort(cfg.GRPCPort),
27+
baseserver.WithMetricsRegistry(registry),
2428
)
2529
if err != nil {
2630
return fmt.Errorf("failed to initialize public api server: %w", err)
2731
}
2832

29-
if registerErr := register(srv, cfg); registerErr != nil {
33+
if registerErr := register(srv, cfg, registry); registerErr != nil {
3034
return fmt.Errorf("failed to register services: %w", registerErr)
3135
}
3236

@@ -37,7 +41,9 @@ func Start(logger *logrus.Entry, cfg Config) error {
3741
return nil
3842
}
3943

40-
func register(srv *baseserver.Server, cfg Config) error {
44+
func register(srv *baseserver.Server, cfg Config, registry *prometheus.Registry) error {
45+
proxy.RegisterMetrics(registry)
46+
4147
logger := log.New()
4248
m := middleware.NewLoggingMiddleware(logger)
4349
srv.HTTPMux().Handle("/", m(http.HandlerFunc(HelloWorldHandler)))

0 commit comments

Comments
 (0)