Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit24b1f2a

Browse files
committed
track the first time html is served in telemetry
1 parent760a70d commit24b1f2a

File tree

12 files changed

+220
-20
lines changed

12 files changed

+220
-20
lines changed

‎coderd/coderd.go‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,8 @@ func New(options *Options) *API {
585585
AppearanceFetcher:&api.AppearanceFetcher,
586586
BuildInfo:buildInfo,
587587
Entitlements:options.Entitlements,
588+
Telemetry:options.Telemetry,
589+
Logger:options.Logger.Named("site"),
588590
})
589591
api.SiteHandler.Experiments.Store(&experiments)
590592

‎coderd/database/dbauthz/dbauthz.go‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,6 +2096,13 @@ func (q *querier) GetTailnetTunnelPeerIDs(ctx context.Context, srcID uuid.UUID)
20962096
returnq.db.GetTailnetTunnelPeerIDs(ctx,srcID)
20972097
}
20982098

2099+
func (q*querier)GetTelemetryHTMLFirstServedAt(ctx context.Context) (string,error) {
2100+
iferr:=q.authorizeContext(ctx,policy.ActionRead,rbac.ResourceSystem);err!=nil {
2101+
return"",err
2102+
}
2103+
returnq.db.GetTelemetryHTMLFirstServedAt(ctx)
2104+
}
2105+
20992106
func (q*querier)GetTemplateAppInsights(ctx context.Context,arg database.GetTemplateAppInsightsParams) ([]database.GetTemplateAppInsightsRow,error) {
21002107
iferr:=q.authorizeTemplateInsights(ctx,arg.TemplateIDs);err!=nil {
21012108
returnnil,err
@@ -3428,6 +3435,13 @@ func (q *querier) RevokeDBCryptKey(ctx context.Context, activeKeyDigest string)
34283435
returnq.db.RevokeDBCryptKey(ctx,activeKeyDigest)
34293436
}
34303437

3438+
func (q*querier)SetTelemetryHTMLFirstServedAt(ctx context.Context,valuestring)error {
3439+
iferr:=q.authorizeContext(ctx,policy.ActionUpdate,rbac.ResourceSystem);err!=nil {
3440+
returnerr
3441+
}
3442+
returnq.db.SetTelemetryHTMLFirstServedAt(ctx,value)
3443+
}
3444+
34313445
func (q*querier)TryAcquireLock(ctx context.Context,idint64) (bool,error) {
34323446
returnq.db.TryAcquireLock(ctx,id)
34333447
}

‎coderd/database/dbauthz/dbauthz_test.go‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4224,6 +4224,12 @@ func (s *MethodTestSuite) TestSystemFunctions() {
42244224
s.Run("GetWorkspaceModulesCreatedAfter",s.Subtest(func(db database.Store,check*expects) {
42254225
check.Args(dbtime.Now()).Asserts(rbac.ResourceSystem,policy.ActionRead)
42264226
}))
4227+
s.Run("GetTelemetryHTMLFirstServedAt",s.Subtest(func(db database.Store,check*expects) {
4228+
check.Args().Asserts(rbac.ResourceSystem,policy.ActionRead).Errors(sql.ErrNoRows)
4229+
}))
4230+
s.Run("SetTelemetryHTMLFirstServedAt",s.Subtest(func(db database.Store,check*expects) {
4231+
check.Args(time.Now().Format(time.RFC3339)).Asserts(rbac.ResourceSystem,policy.ActionUpdate)
4232+
}))
42274233
}
42284234

42294235
func (s*MethodTestSuite)TestNotifications() {

‎coderd/database/dbmem/dbmem.go‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ type data struct {
258258
defaultProxyDisplayNamestring
259259
defaultProxyIconURLstring
260260
userStatusChanges []database.UserStatusChange
261+
htmlFirstServedAtstring
261262
}
262263

263264
functryPercentile(fs []float64,pfloat64)float64 {
@@ -4330,6 +4331,16 @@ func (*FakeQuerier) GetTailnetTunnelPeerIDs(context.Context, uuid.UUID) ([]datab
43304331
returnnil,ErrUnimplemented
43314332
}
43324333

4334+
func (q*FakeQuerier)GetTelemetryHTMLFirstServedAt(ctx context.Context) (string,error) {
4335+
q.mutex.RLock()
4336+
deferq.mutex.RUnlock()
4337+
ifq.htmlFirstServedAt=="" {
4338+
return"",sql.ErrNoRows
4339+
}
4340+
4341+
returnq.htmlFirstServedAt,nil
4342+
}
4343+
43334344
func (q*FakeQuerier)GetTemplateAppInsights(ctx context.Context,arg database.GetTemplateAppInsightsParams) ([]database.GetTemplateAppInsightsRow,error) {
43344345
err:=validateDatabaseType(arg)
43354346
iferr!=nil {
@@ -9123,6 +9134,16 @@ func (q *FakeQuerier) RevokeDBCryptKey(_ context.Context, activeKeyDigest string
91239134
returnsql.ErrNoRows
91249135
}
91259136

9137+
func (q*FakeQuerier)SetTelemetryHTMLFirstServedAt(ctx context.Context,valuestring)error {
9138+
q.mutex.Lock()
9139+
deferq.mutex.Unlock()
9140+
ifq.htmlFirstServedAt!="" {
9141+
returnnil
9142+
}
9143+
q.htmlFirstServedAt=value
9144+
returnnil
9145+
}
9146+
91269147
func (*FakeQuerier)TryAcquireLock(_ context.Context,_int64) (bool,error) {
91279148
returnfalse,xerrors.New("TryAcquireLock must only be called within a transaction")
91289149
}

‎coderd/database/dbmetrics/querymetrics.go‎

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

‎coderd/database/dbmock/dbmock.go‎

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

‎coderd/database/querier.go‎

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

‎coderd/database/queries.sql.go‎

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

‎coderd/database/queries/siteconfig.sql‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,10 @@ ON CONFLICT (key) DO UPDATE SET value = $2 WHERE site_configs.key = $1;
107107
DELETEFROM site_configs
108108
WHEREsite_configs.key= $1;
109109

110+
-- name: SetTelemetryHTMLFirstServedAt :exec
111+
INSERT INTO site_configs (key, value)
112+
VALUES ('telemetry_html_first_served_at', $1)
113+
ON CONFLICT (key) DO NOTHING;
114+
115+
-- name: GetTelemetryHTMLFirstServedAt :one
116+
SELECT valueFROM site_configsWHERE key='telemetry_html_first_served_at';

‎coderd/telemetry/telemetry.go‎

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ type Reporter interface {
9999
// database. For example, if a new user is added, a snapshot can
100100
// contain just that user entry.
101101
Report(snapshot*Snapshot)
102+
// ReportDeployment sends deployment information to the telemetry server.
103+
ReportDeployment()
102104
Enabled()bool
103105
Close()
104106
}
@@ -222,6 +224,12 @@ func (r *remoteReporter) reportWithDeployment() {
222224
r.reportSync(snapshot)
223225
}
224226

227+
func (r*remoteReporter)ReportDeployment() {
228+
iferr:=r.deployment();err!=nil {
229+
r.options.Logger.Debug(r.ctx,"failed to report deployment",slog.Error(err))
230+
}
231+
}
232+
225233
// deployment collects host information and reports it to the telemetry server.
226234
func (r*remoteReporter)deployment()error {
227235
sysInfoHost,err:=sysinfo.Host()
@@ -250,26 +258,32 @@ func (r *remoteReporter) deployment() error {
250258
r.options.Logger.Debug(r.ctx,"check IDP org sync",slog.Error(err))
251259
}
252260

261+
htmlFirstServedAt,err:=getHTMLFirstServedAt(r.ctx,r.options.Database)
262+
iferr!=nil&&!errors.Is(err,sql.ErrNoRows) {
263+
r.options.Logger.Debug(r.ctx,"get telemetry html first served at",slog.Error(err))
264+
}
265+
253266
data,err:=json.Marshal(&Deployment{
254-
ID:r.options.DeploymentID,
255-
Architecture:sysInfo.Architecture,
256-
BuiltinPostgres:r.options.BuiltinPostgres,
257-
Containerized:containerized,
258-
Config:r.options.DeploymentConfig,
259-
Kubernetes:os.Getenv("KUBERNETES_SERVICE_HOST")!="",
260-
InstallSource:installSource,
261-
Tunnel:r.options.Tunnel,
262-
OSType:sysInfo.OS.Type,
263-
OSFamily:sysInfo.OS.Family,
264-
OSPlatform:sysInfo.OS.Platform,
265-
OSName:sysInfo.OS.Name,
266-
OSVersion:sysInfo.OS.Version,
267-
CPUCores:runtime.NumCPU(),
268-
MemoryTotal:mem.Total,
269-
MachineID:sysInfo.UniqueID,
270-
StartedAt:r.startedAt,
271-
ShutdownAt:r.shutdownAt,
272-
IDPOrgSync:&idpOrgSync,
267+
ID:r.options.DeploymentID,
268+
Architecture:sysInfo.Architecture,
269+
BuiltinPostgres:r.options.BuiltinPostgres,
270+
Containerized:containerized,
271+
Config:r.options.DeploymentConfig,
272+
Kubernetes:os.Getenv("KUBERNETES_SERVICE_HOST")!="",
273+
InstallSource:installSource,
274+
Tunnel:r.options.Tunnel,
275+
OSType:sysInfo.OS.Type,
276+
OSFamily:sysInfo.OS.Family,
277+
OSPlatform:sysInfo.OS.Platform,
278+
OSName:sysInfo.OS.Name,
279+
OSVersion:sysInfo.OS.Version,
280+
CPUCores:runtime.NumCPU(),
281+
MemoryTotal:mem.Total,
282+
MachineID:sysInfo.UniqueID,
283+
StartedAt:r.startedAt,
284+
ShutdownAt:r.shutdownAt,
285+
IDPOrgSync:&idpOrgSync,
286+
HTMLFirstServedAt:htmlFirstServedAt,
273287
})
274288
iferr!=nil {
275289
returnxerrors.Errorf("marshal deployment: %w",err)
@@ -330,6 +344,18 @@ func checkIDPOrgSync(ctx context.Context, db database.Store, values *codersdk.De
330344
returnsyncConfig.Field!="",nil
331345
}
332346

347+
funcgetHTMLFirstServedAt(ctx context.Context,db database.Store) (*time.Time,error) {
348+
htmlFirstServedAtStr,err:=db.GetTelemetryHTMLFirstServedAt(ctx)
349+
iferr!=nil {
350+
returnnil,xerrors.Errorf("get telemetry html first served at: %w",err)
351+
}
352+
t,err:=time.Parse(time.RFC3339,htmlFirstServedAtStr)
353+
iferr!=nil {
354+
returnnil,xerrors.Errorf("parse telemetry html first served at: %w",err)
355+
}
356+
return&t,nil
357+
}
358+
333359
// createSnapshot collects a full snapshot from the database.
334360
func (r*remoteReporter)createSnapshot() (*Snapshot,error) {
335361
var (
@@ -1036,7 +1062,8 @@ type Deployment struct {
10361062
ShutdownAt*time.Time`json:"shutdown_at"`
10371063
// While IDPOrgSync will always be set, it's nullable to make
10381064
// the struct backwards compatible with older coder versions.
1039-
IDPOrgSync*bool`json:"idp_org_sync"`
1065+
IDPOrgSync*bool`json:"idp_org_sync"`
1066+
HTMLFirstServedAt*time.Time`json:"html_first_served_at"`
10401067
}
10411068

10421069
typeAPIKeystruct {
@@ -1541,3 +1568,4 @@ type noopReporter struct{}
15411568
func (*noopReporter)Report(_*Snapshot) {}
15421569
func (*noopReporter)Enabled()bool {returnfalse }
15431570
func (*noopReporter)Close() {}
1571+
func (*noopReporter)ReportDeployment() {}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp