Skip to content

Commit 32876a2

Browse files
committed
add the telemetry_items table
1 parent 63246e8 commit 32876a2

File tree

13 files changed

+255
-0
lines changed

13 files changed

+255
-0
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,6 +2103,13 @@ func (q *querier) GetTelemetryHTMLFirstServedAt(ctx context.Context) (string, er
21032103
return q.db.GetTelemetryHTMLFirstServedAt(ctx)
21042104
}
21052105

2106+
func (q *querier) GetTelemetryItem(ctx context.Context, key string) (database.TelemetryItem, error) {
2107+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {
2108+
return database.TelemetryItem{}, err
2109+
}
2110+
return q.db.GetTelemetryItem(ctx, key)
2111+
}
2112+
21062113
func (q *querier) GetTemplateAppInsights(ctx context.Context, arg database.GetTemplateAppInsightsParams) ([]database.GetTemplateAppInsightsRow, error) {
21072114
if err := q.authorizeTemplateInsights(ctx, arg.TemplateIDs); err != nil {
21082115
return nil, err
@@ -3092,6 +3099,13 @@ func (q *querier) InsertReplica(ctx context.Context, arg database.InsertReplicaP
30923099
return q.db.InsertReplica(ctx, arg)
30933100
}
30943101

3102+
func (q *querier) InsertTelemetryItemIfNotExists(ctx context.Context, arg database.InsertTelemetryItemIfNotExistsParams) error {
3103+
if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
3104+
return err
3105+
}
3106+
return q.db.InsertTelemetryItemIfNotExists(ctx, arg)
3107+
}
3108+
30953109
func (q *querier) InsertTemplate(ctx context.Context, arg database.InsertTemplateParams) error {
30963110
obj := rbac.ResourceTemplate.InOrg(arg.OrganizationID)
30973111
if err := q.authorizeContext(ctx, policy.ActionCreate, obj); err != nil {
@@ -4359,6 +4373,13 @@ func (q *querier) UpsertTailnetTunnel(ctx context.Context, arg database.UpsertTa
43594373
return q.db.UpsertTailnetTunnel(ctx, arg)
43604374
}
43614375

4376+
func (q *querier) UpsertTelemetryItem(ctx context.Context, arg database.UpsertTelemetryItemParams) error {
4377+
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceSystem); err != nil {
4378+
return err
4379+
}
4380+
return q.db.UpsertTelemetryItem(ctx, arg)
4381+
}
4382+
43624383
func (q *querier) UpsertTemplateUsageStats(ctx context.Context) error {
43634384
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceSystem); err != nil {
43644385
return err

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4230,6 +4230,21 @@ func (s *MethodTestSuite) TestSystemFunctions() {
42304230
s.Run("SetTelemetryHTMLFirstServedAt", s.Subtest(func(db database.Store, check *expects) {
42314231
check.Args(time.Now().Format(time.RFC3339)).Asserts(rbac.ResourceSystem, policy.ActionUpdate)
42324232
}))
4233+
s.Run("GetTelemetryItem", s.Subtest(func(db database.Store, check *expects) {
4234+
check.Args("test").Asserts(rbac.ResourceSystem, policy.ActionRead).Errors(sql.ErrNoRows)
4235+
}))
4236+
s.Run("InsertTelemetryItemIfNotExists", s.Subtest(func(db database.Store, check *expects) {
4237+
check.Args(database.InsertTelemetryItemIfNotExistsParams{
4238+
Key: "test",
4239+
Value: "value",
4240+
}).Asserts(rbac.ResourceSystem, policy.ActionCreate)
4241+
}))
4242+
s.Run("UpsertTelemetryItem", s.Subtest(func(db database.Store, check *expects) {
4243+
check.Args(database.UpsertTelemetryItemParams{
4244+
Key: "test",
4245+
Value: "value",
4246+
}).Asserts(rbac.ResourceSystem, policy.ActionUpdate)
4247+
}))
42334248
}
42344249

42354250
func (s *MethodTestSuite) TestNotifications() {

coderd/database/dbmem/dbmem.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ func New() database.Store {
8989
locks: map[int64]struct{}{},
9090
runtimeConfig: map[string]string{},
9191
userStatusChanges: make([]database.UserStatusChange, 0),
92+
telemetryItems: make([]database.TelemetryItem, 0),
9293
},
9394
}
9495
// Always start with a default org. Matching migration 198.
@@ -259,6 +260,7 @@ type data struct {
259260
defaultProxyIconURL string
260261
userStatusChanges []database.UserStatusChange
261262
htmlFirstServedAt string
263+
telemetryItems []database.TelemetryItem
262264
}
263265

264266
func tryPercentile(fs []float64, p float64) float64 {
@@ -4341,6 +4343,19 @@ func (q *FakeQuerier) GetTelemetryHTMLFirstServedAt(ctx context.Context) (string
43414343
return q.htmlFirstServedAt, nil
43424344
}
43434345

4346+
func (q *FakeQuerier) GetTelemetryItem(_ context.Context, key string) (database.TelemetryItem, error) {
4347+
q.mutex.RLock()
4348+
defer q.mutex.RUnlock()
4349+
4350+
for _, item := range q.telemetryItems {
4351+
if item.Key == key {
4352+
return item, nil
4353+
}
4354+
}
4355+
4356+
return database.TelemetryItem{}, sql.ErrNoRows
4357+
}
4358+
43444359
func (q *FakeQuerier) GetTemplateAppInsights(ctx context.Context, arg database.GetTemplateAppInsightsParams) ([]database.GetTemplateAppInsightsRow, error) {
43454360
err := validateDatabaseType(arg)
43464361
if err != nil {
@@ -8131,6 +8146,30 @@ func (q *FakeQuerier) InsertReplica(_ context.Context, arg database.InsertReplic
81318146
return replica, nil
81328147
}
81338148

8149+
func (q *FakeQuerier) InsertTelemetryItemIfNotExists(_ context.Context, arg database.InsertTelemetryItemIfNotExistsParams) error {
8150+
err := validateDatabaseType(arg)
8151+
if err != nil {
8152+
return err
8153+
}
8154+
8155+
q.mutex.Lock()
8156+
defer q.mutex.Unlock()
8157+
8158+
for _, item := range q.telemetryItems {
8159+
if item.Key == arg.Key {
8160+
return nil
8161+
}
8162+
}
8163+
8164+
q.telemetryItems = append(q.telemetryItems, database.TelemetryItem{
8165+
Key: arg.Key,
8166+
Value: arg.Value,
8167+
CreatedAt: time.Now(),
8168+
UpdatedAt: time.Now(),
8169+
})
8170+
return nil
8171+
}
8172+
81348173
func (q *FakeQuerier) InsertTemplate(_ context.Context, arg database.InsertTemplateParams) error {
81358174
if err := validateDatabaseType(arg); err != nil {
81368175
return err
@@ -10895,6 +10934,33 @@ func (*FakeQuerier) UpsertTailnetTunnel(_ context.Context, arg database.UpsertTa
1089510934
return database.TailnetTunnel{}, ErrUnimplemented
1089610935
}
1089710936

10937+
func (q *FakeQuerier) UpsertTelemetryItem(_ context.Context, arg database.UpsertTelemetryItemParams) error {
10938+
err := validateDatabaseType(arg)
10939+
if err != nil {
10940+
return err
10941+
}
10942+
10943+
q.mutex.Lock()
10944+
defer q.mutex.Unlock()
10945+
10946+
for i, item := range q.telemetryItems {
10947+
if item.Key == arg.Key {
10948+
q.telemetryItems[i].Value = arg.Value
10949+
q.telemetryItems[i].UpdatedAt = time.Now()
10950+
return nil
10951+
}
10952+
}
10953+
10954+
q.telemetryItems = append(q.telemetryItems, database.TelemetryItem{
10955+
Key: arg.Key,
10956+
Value: arg.Value,
10957+
CreatedAt: time.Now(),
10958+
UpdatedAt: time.Now(),
10959+
})
10960+
10961+
return nil
10962+
}
10963+
1089810964
func (q *FakeQuerier) UpsertTemplateUsageStats(ctx context.Context) error {
1089910965
q.mutex.Lock()
1090010966
defer q.mutex.Unlock()

coderd/database/dbmetrics/querymetrics.go

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmock/dbmock.go

Lines changed: 43 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dump.sql

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP TABLE telemetry_items;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CREATE TABLE telemetry_items (
2+
key TEXT NOT NULL,
3+
value TEXT NOT NULL,
4+
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
5+
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
6+
);
7+
8+
CREATE UNIQUE INDEX telemetry_items_key_idx ON telemetry_items (key);

coderd/database/models.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/querier.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)