-
Notifications
You must be signed in to change notification settings - Fork 978
feat: add metrics to workspace agent scripts #11132
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
2f978c3
c567eab
5d39495
07fe74a
753f1a6
aafd29e
6c5a560
ad3f47f
19428fa
8bfa9ad
044b942
2db41b6
dd32401
b4a3607
c5da250
eb1d173
e803436
99483fe
2f89b62
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,6 +2,7 @@ package prometheusmetrics_test | |||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
import ( | ||||||||||||||||||||||||||||||
"context" | ||||||||||||||||||||||||||||||
"sort" | ||||||||||||||||||||||||||||||
"sync/atomic" | ||||||||||||||||||||||||||||||
"testing" | ||||||||||||||||||||||||||||||
"time" | ||||||||||||||||||||||||||||||
|
@@ -12,6 +13,7 @@ import ( | |||||||||||||||||||||||||||||
"github.com/stretchr/testify/require" | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
"cdr.dev/slog/sloggers/slogtest" | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
"github.com/coder/coder/v2/coderd/prometheusmetrics" | ||||||||||||||||||||||||||||||
"github.com/coder/coder/v2/codersdk/agentsdk" | ||||||||||||||||||||||||||||||
"github.com/coder/coder/v2/cryptorand" | ||||||||||||||||||||||||||||||
|
@@ -22,6 +24,7 @@ const ( | |||||||||||||||||||||||||||||
testWorkspaceName = "yogi-workspace" | ||||||||||||||||||||||||||||||
testUsername = "yogi-bear" | ||||||||||||||||||||||||||||||
testAgentName = "main-agent" | ||||||||||||||||||||||||||||||
testTemplateName = "main-template" | ||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
func TestUpdateMetrics_MetricsDoNotExpire(t *testing.T) { | ||||||||||||||||||||||||||||||
|
@@ -58,6 +61,7 @@ func TestUpdateMetrics_MetricsDoNotExpire(t *testing.T) { | |||||||||||||||||||||||||||||
{Name: "agent_name", Value: testAgentName}, | ||||||||||||||||||||||||||||||
{Name: "username", Value: testUsername}, | ||||||||||||||||||||||||||||||
{Name: "workspace_name", Value: testWorkspaceName}, | ||||||||||||||||||||||||||||||
{Name: "template_name", Value: testTemplateName}, | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
expected := []agentsdk.AgentMetric{ | ||||||||||||||||||||||||||||||
{Name: "a_counter_one", Type: agentsdk.AgentMetricTypeCounter, Value: 1, Labels: commonLabels}, | ||||||||||||||||||||||||||||||
|
@@ -69,13 +73,14 @@ func TestUpdateMetrics_MetricsDoNotExpire(t *testing.T) { | |||||||||||||||||||||||||||||
{Name: "hello", Value: "world"}, | ||||||||||||||||||||||||||||||
{Name: "username", Value: testUsername}, | ||||||||||||||||||||||||||||||
{Name: "workspace_name", Value: testWorkspaceName}, | ||||||||||||||||||||||||||||||
{Name: "template_name", Value: testTemplateName}, | ||||||||||||||||||||||||||||||
}}, | ||||||||||||||||||||||||||||||
{Name: "d_gauge_four", Type: agentsdk.AgentMetricTypeGauge, Value: 6, Labels: commonLabels}, | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
// when | ||||||||||||||||||||||||||||||
metricsAggregator.Update(ctx, testUsername, testWorkspaceName, testAgentName, given1) | ||||||||||||||||||||||||||||||
metricsAggregator.Update(ctx, testUsername, testWorkspaceName, testAgentName, given2) | ||||||||||||||||||||||||||||||
metricsAggregator.Update(ctx, testUsername, testWorkspaceName, testAgentName, testTemplateName, given1) | ||||||||||||||||||||||||||||||
metricsAggregator.Update(ctx, testUsername, testWorkspaceName, testAgentName, testTemplateName, given2) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
// then | ||||||||||||||||||||||||||||||
require.Eventually(t, func() bool { | ||||||||||||||||||||||||||||||
|
@@ -119,6 +124,10 @@ func verifyCollectedMetrics(t *testing.T, expected []agentsdk.AgentMetric, actua | |||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
dtoLabels := asMetricAgentLabels(d.GetLabel()) | ||||||||||||||||||||||||||||||
// dto labels are sorted in alphabetical order. | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe we should move it this routine to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The expected labels that we pass in have to be sorted. The DTO ones are already sorted. coder/coderd/prometheusmetrics/aggregator_test.go Lines 66 to 79 in 8bfa9ad
But this only needs to be sorted when comparing to dto labels. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see now what you mean. I guess we can leave it as is, there won't be a huge gain if you refactor it 👍 |
||||||||||||||||||||||||||||||
sort.Slice(e.Labels, func(i, j int) bool { | ||||||||||||||||||||||||||||||
return e.Labels[i].Name < e.Labels[j].Name | ||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||
require.Equal(t, e.Labels, dtoLabels, d.String()) | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
return true | ||||||||||||||||||||||||||||||
|
@@ -154,7 +163,7 @@ func TestUpdateMetrics_MetricsExpire(t *testing.T) { | |||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
// when | ||||||||||||||||||||||||||||||
metricsAggregator.Update(ctx, testUsername, testWorkspaceName, testAgentName, given) | ||||||||||||||||||||||||||||||
metricsAggregator.Update(ctx, testUsername, testWorkspaceName, testAgentName, testTemplateName, given) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
time.Sleep(time.Millisecond * 10) // Ensure that metric is expired | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
@@ -220,7 +229,7 @@ func Benchmark_MetricsAggregator_Run(b *testing.B) { | |||||||||||||||||||||||||||||
b.Logf("N=%d sending %d metrics", b.N, numMetrics) | ||||||||||||||||||||||||||||||
var nGot atomic.Int64 | ||||||||||||||||||||||||||||||
b.StartTimer() | ||||||||||||||||||||||||||||||
metricsAggregator.Update(ctx, testUsername, testWorkspaceName, testAgentName, metrics) | ||||||||||||||||||||||||||||||
metricsAggregator.Update(ctx, testUsername, testWorkspaceName, testAgentName, testTemplateName, metrics) | ||||||||||||||||||||||||||||||
for i := 0; i < numMetrics; i++ { | ||||||||||||||||||||||||||||||
select { | ||||||||||||||||||||||||||||||
case <-ctx.Done(): | ||||||||||||||||||||||||||||||
|
Uh oh!
There was an error while loading. Please reload this page.