Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d487a77

Browse files
committed
Test
1 parent f8d6f46 commit d487a77

File tree

2 files changed

+80
-7
lines changed

2 files changed

+80
-7
lines changed

coderd/prometheusmetrics/prometheusmetrics.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package prometheusmetrics
22

33
import (
44
"context"
5+
"database/sql"
6+
"errors"
57
"fmt"
68
"strconv"
79
"strings"
@@ -257,7 +259,7 @@ func Agents(ctx context.Context, logger slog.Logger, registerer prometheus.Regis
257259

258260
// Collect information about registered applications
259261
apps, err := db.GetWorkspaceAppsByAgentID(ctx, agent.ID)
260-
if err != nil {
262+
if err != nil && !errors.Is(err, sql.ErrNoRows) {
261263
logger.Error(ctx, "can't get workspace apps", slog.F("agent_id", agent.ID), slog.Error(err))
262264
continue
263265
}

coderd/prometheusmetrics/prometheusmetrics_test.go

Lines changed: 77 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@ import (
1515

1616
"cdr.dev/slog/sloggers/slogtest"
1717

18+
"github.com/coder/coder/coderd/coderdtest"
1819
"github.com/coder/coder/coderd/database"
1920
"github.com/coder/coder/coderd/database/dbfake"
2021
"github.com/coder/coder/coderd/database/dbgen"
2122
"github.com/coder/coder/coderd/prometheusmetrics"
2223
"github.com/coder/coder/codersdk"
24+
"github.com/coder/coder/provisioner/echo"
25+
"github.com/coder/coder/provisionersdk/proto"
2326
"github.com/coder/coder/tailnet"
2427
"github.com/coder/coder/tailnet/tailnettest"
2528
"github.com/coder/coder/testutil"
@@ -249,14 +252,53 @@ func TestWorkspaces(t *testing.T) {
249252
func TestAgents(t *testing.T) {
250253
t.Parallel()
251254

252-
// given
253-
db := dbfake.New()
255+
// Build a sample workspace with test agent and fake application
256+
client, _, api := coderdtest.NewWithAPI(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
257+
db := api.Database
258+
259+
user := coderdtest.CreateFirstUser(t, client)
260+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
261+
Parse: echo.ParseComplete,
262+
ProvisionPlan: echo.ProvisionComplete,
263+
ProvisionApply: []*proto.Provision_Response{{
264+
Type: &proto.Provision_Response_Complete{
265+
Complete: &proto.Provision_Complete{
266+
Resources: []*proto.Resource{{
267+
Name: "example",
268+
Type: "aws_instance",
269+
Agents: []*proto.Agent{{
270+
Id: uuid.NewString(),
271+
Name: "testagent",
272+
Directory: t.TempDir(),
273+
Auth: &proto.Agent_Token{
274+
Token: uuid.NewString(),
275+
},
276+
Apps: []*proto.App{
277+
{
278+
Slug: "fake-app",
279+
DisplayName: "Fake application",
280+
SharingLevel: proto.AppSharingLevel_OWNER,
281+
// Hopefully this IP and port doesn't exist.
282+
Url: "http://127.1.0.1:65535",
283+
},
284+
},
285+
}},
286+
}},
287+
},
288+
},
289+
}},
290+
})
291+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
292+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
293+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
294+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
254295

296+
// given
255297
coordinator := tailnet.NewCoordinator()
256298
coordinatorPtr := atomic.Pointer[tailnet.Coordinator]{}
257299
coordinatorPtr.Store(&coordinator)
258300
derpMap := tailnettest.RunDERPAndSTUN(t)
259-
agentInactiveDisconnectTimeout := 1 * time.Hour
301+
agentInactiveDisconnectTimeout := 1 * time.Hour // don't need to focus on this value in tests
260302
registry := prometheus.NewRegistry()
261303

262304
// when
@@ -265,6 +307,10 @@ func TestAgents(t *testing.T) {
265307

266308
// then
267309
require.NoError(t, err)
310+
311+
var agentsUp bool
312+
var agentsConnections bool
313+
var agentsApps bool
268314
require.Eventually(t, func() bool {
269315
metrics, err := registry.Gather()
270316
assert.NoError(t, err)
@@ -273,9 +319,34 @@ func TestAgents(t *testing.T) {
273319
return false
274320
}
275321

276-
for _, metric := range metrics[0].Metric {
277-
panic(metric)
322+
for _, metric := range metrics {
323+
switch metric.GetName() {
324+
case "coderd_agents_up":
325+
assert.Equal(t, "testuser", metric.Metric[0].Label[0].GetValue()) // Username
326+
assert.Equal(t, workspace.Name, metric.Metric[0].Label[1].GetValue()) // Workspace name
327+
assert.Equal(t, 1, int(metric.Metric[0].Gauge.GetValue())) // Metric value
328+
agentsUp = true
329+
case "coderd_agents_connections":
330+
assert.Equal(t, "testagent", metric.Metric[0].Label[0].GetValue()) // Agent name
331+
assert.Equal(t, "created", metric.Metric[0].Label[1].GetValue()) // Lifecycle state
332+
assert.Equal(t, "connecting", metric.Metric[0].Label[2].GetValue()) // Status
333+
assert.Equal(t, "unknown", metric.Metric[0].Label[3].GetValue()) // Tailnet node
334+
assert.Equal(t, "testuser", metric.Metric[0].Label[4].GetValue()) // Username
335+
assert.Equal(t, workspace.Name, metric.Metric[0].Label[5].GetValue()) // Workspace name
336+
assert.Equal(t, 1, int(metric.Metric[0].Gauge.GetValue())) // Metric value
337+
agentsConnections = true
338+
case "coderd_agents_apps":
339+
assert.Equal(t, "testagent", metric.Metric[0].Label[0].GetValue()) // Agent name
340+
assert.Equal(t, "Fake application", metric.Metric[0].Label[1].GetValue()) // App name
341+
assert.Equal(t, "disabled", metric.Metric[0].Label[2].GetValue()) // Health
342+
assert.Equal(t, "testuser", metric.Metric[0].Label[3].GetValue()) // Username
343+
assert.Equal(t, workspace.Name, metric.Metric[0].Label[4].GetValue()) // Workspace name
344+
assert.Equal(t, 1, int(metric.Metric[0].Gauge.GetValue())) // Metric value
345+
agentsApps = true
346+
default:
347+
require.FailNowf(t, "unexpected metric collected", "metric: %s", metric.GetName())
348+
}
278349
}
279-
return true
350+
return agentsUp && agentsConnections && agentsApps
280351
}, testutil.WaitShort, testutil.IntervalFast)
281352
}

0 commit comments

Comments
 (0)