Skip to content

Commit 90f82da

Browse files
committed
fix: write server config to telemetry (coder#13590)
* fix: add external auth configs to telemetry * Refactor telemetry to send the entire config * gen * Fix linting (cherry picked from commit 3a1fa04)
1 parent 201cb1c commit 90f82da

File tree

10 files changed

+54
-142
lines changed

10 files changed

+54
-142
lines changed

cli/server.go

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -796,31 +796,18 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
796796
cliui.Infof(inv.Stdout, "\n==> Logs will stream in below (press ctrl+c to gracefully exit):")
797797

798798
if vals.Telemetry.Enable {
799-
gitAuth := make([]telemetry.GitAuth, 0)
800-
// TODO:
801-
var gitAuthConfigs []codersdk.ExternalAuthConfig
802-
for _, cfg := range gitAuthConfigs {
803-
gitAuth = append(gitAuth, telemetry.GitAuth{
804-
Type: cfg.Type,
805-
})
799+
vals, err := vals.WithoutSecrets()
800+
if err != nil {
801+
return xerrors.Errorf("remove secrets from deployment values: %w", err)
806802
}
807-
808803
options.Telemetry, err = telemetry.New(telemetry.Options{
809-
BuiltinPostgres: builtinPostgres,
810-
DeploymentID: deploymentID,
811-
Database: options.Database,
812-
Logger: logger.Named("telemetry"),
813-
URL: vals.Telemetry.URL.Value(),
814-
Wildcard: vals.WildcardAccessURL.String() != "",
815-
DERPServerRelayURL: vals.DERP.Server.RelayURL.String(),
816-
GitAuth: gitAuth,
817-
GitHubOAuth: vals.OAuth2.Github.ClientID != "",
818-
OIDCAuth: vals.OIDC.ClientID != "",
819-
OIDCIssuerURL: vals.OIDC.IssuerURL.String(),
820-
Prometheus: vals.Prometheus.Enable.Value(),
821-
STUN: len(vals.DERP.Server.STUNAddresses) != 0,
822-
Tunnel: tunnel != nil,
823-
Experiments: vals.Experiments.Value(),
804+
BuiltinPostgres: builtinPostgres,
805+
DeploymentID: deploymentID,
806+
Database: options.Database,
807+
Logger: logger.Named("telemetry"),
808+
URL: vals.Telemetry.URL.Value(),
809+
Tunnel: tunnel != nil,
810+
DeploymentConfig: vals,
824811
ParseLicenseJWT: func(lic *telemetry.License) error {
825812
// This will be nil when running in AGPL-only mode.
826813
if options.ParseLicenseClaims == nil {

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/telemetry/telemetry.go

Lines changed: 43 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,13 @@ type Options struct {
4141
// URL is an endpoint to direct telemetry towards!
4242
URL *url.URL
4343

44-
BuiltinPostgres bool
45-
DeploymentID string
46-
GitHubOAuth bool
47-
OIDCAuth bool
48-
OIDCIssuerURL string
49-
Wildcard bool
50-
DERPServerRelayURL string
51-
GitAuth []GitAuth
52-
Prometheus bool
53-
STUN bool
54-
SnapshotFrequency time.Duration
55-
Tunnel bool
56-
ParseLicenseJWT func(lic *License) error
57-
Experiments []string
44+
DeploymentID string
45+
DeploymentConfig *codersdk.DeploymentValues
46+
BuiltinPostgres bool
47+
Tunnel bool
48+
49+
SnapshotFrequency time.Duration
50+
ParseLicenseJWT func(lic *License) error
5851
}
5952

6053
// New constructs a reporter for telemetry data.
@@ -247,31 +240,24 @@ func (r *remoteReporter) deployment() error {
247240
}
248241

249242
data, err := json.Marshal(&Deployment{
250-
ID: r.options.DeploymentID,
251-
Architecture: sysInfo.Architecture,
252-
BuiltinPostgres: r.options.BuiltinPostgres,
253-
Containerized: containerized,
254-
Wildcard: r.options.Wildcard,
255-
DERPServerRelayURL: r.options.DERPServerRelayURL,
256-
GitAuth: r.options.GitAuth,
257-
Kubernetes: os.Getenv("KUBERNETES_SERVICE_HOST") != "",
258-
GitHubOAuth: r.options.GitHubOAuth,
259-
OIDCAuth: r.options.OIDCAuth,
260-
OIDCIssuerURL: r.options.OIDCIssuerURL,
261-
Prometheus: r.options.Prometheus,
262-
InstallSource: installSource,
263-
STUN: r.options.STUN,
264-
Tunnel: r.options.Tunnel,
265-
OSType: sysInfo.OS.Type,
266-
OSFamily: sysInfo.OS.Family,
267-
OSPlatform: sysInfo.OS.Platform,
268-
OSName: sysInfo.OS.Name,
269-
OSVersion: sysInfo.OS.Version,
270-
CPUCores: runtime.NumCPU(),
271-
MemoryTotal: mem.Total,
272-
MachineID: sysInfo.UniqueID,
273-
StartedAt: r.startedAt,
274-
ShutdownAt: r.shutdownAt,
243+
ID: r.options.DeploymentID,
244+
Architecture: sysInfo.Architecture,
245+
BuiltinPostgres: r.options.BuiltinPostgres,
246+
Containerized: containerized,
247+
Config: r.options.DeploymentConfig,
248+
Kubernetes: os.Getenv("KUBERNETES_SERVICE_HOST") != "",
249+
InstallSource: installSource,
250+
Tunnel: r.options.Tunnel,
251+
OSType: sysInfo.OS.Type,
252+
OSFamily: sysInfo.OS.Family,
253+
OSPlatform: sysInfo.OS.Platform,
254+
OSName: sysInfo.OS.Name,
255+
OSVersion: sysInfo.OS.Version,
256+
CPUCores: runtime.NumCPU(),
257+
MemoryTotal: mem.Total,
258+
MachineID: sysInfo.UniqueID,
259+
StartedAt: r.startedAt,
260+
ShutdownAt: r.shutdownAt,
275261
})
276262
if err != nil {
277263
return xerrors.Errorf("marshal deployment: %w", err)
@@ -486,10 +472,6 @@ func (r *remoteReporter) createSnapshot() (*Snapshot, error) {
486472
}
487473
return nil
488474
})
489-
eg.Go(func() error {
490-
snapshot.Experiments = ConvertExperiments(r.options.Experiments)
491-
return nil
492-
})
493475

494476
err := eg.Wait()
495477
if err != nil {
@@ -750,16 +732,6 @@ func ConvertExternalProvisioner(id uuid.UUID, tags map[string]string, provisione
750732
}
751733
}
752734

753-
func ConvertExperiments(experiments []string) []Experiment {
754-
var out []Experiment
755-
756-
for _, exp := range experiments {
757-
out = append(out, Experiment{Name: exp})
758-
}
759-
760-
return out
761-
}
762-
763735
// Snapshot represents a point-in-time anonymized database dump.
764736
// Data is aggregated by latest on the server-side, so partial data
765737
// can be sent without issue.
@@ -782,40 +754,28 @@ type Snapshot struct {
782754
WorkspaceResourceMetadata []WorkspaceResourceMetadata `json:"workspace_resource_metadata"`
783755
WorkspaceResources []WorkspaceResource `json:"workspace_resources"`
784756
Workspaces []Workspace `json:"workspaces"`
785-
Experiments []Experiment `json:"experiments"`
786757
}
787758

788759
// Deployment contains information about the host running Coder.
789760
type Deployment struct {
790-
ID string `json:"id"`
791-
Architecture string `json:"architecture"`
792-
BuiltinPostgres bool `json:"builtin_postgres"`
793-
Containerized bool `json:"containerized"`
794-
Kubernetes bool `json:"kubernetes"`
795-
Tunnel bool `json:"tunnel"`
796-
Wildcard bool `json:"wildcard"`
797-
DERPServerRelayURL string `json:"derp_server_relay_url"`
798-
GitAuth []GitAuth `json:"git_auth"`
799-
GitHubOAuth bool `json:"github_oauth"`
800-
OIDCAuth bool `json:"oidc_auth"`
801-
OIDCIssuerURL string `json:"oidc_issuer_url"`
802-
Prometheus bool `json:"prometheus"`
803-
InstallSource string `json:"install_source"`
804-
STUN bool `json:"stun"`
805-
OSType string `json:"os_type"`
806-
OSFamily string `json:"os_family"`
807-
OSPlatform string `json:"os_platform"`
808-
OSName string `json:"os_name"`
809-
OSVersion string `json:"os_version"`
810-
CPUCores int `json:"cpu_cores"`
811-
MemoryTotal uint64 `json:"memory_total"`
812-
MachineID string `json:"machine_id"`
813-
StartedAt time.Time `json:"started_at"`
814-
ShutdownAt *time.Time `json:"shutdown_at"`
815-
}
816-
817-
type GitAuth struct {
818-
Type string `json:"type"`
761+
ID string `json:"id"`
762+
Architecture string `json:"architecture"`
763+
BuiltinPostgres bool `json:"builtin_postgres"`
764+
Containerized bool `json:"containerized"`
765+
Kubernetes bool `json:"kubernetes"`
766+
Config *codersdk.DeploymentValues `json:"config"`
767+
Tunnel bool `json:"tunnel"`
768+
InstallSource string `json:"install_source"`
769+
OSType string `json:"os_type"`
770+
OSFamily string `json:"os_family"`
771+
OSPlatform string `json:"os_platform"`
772+
OSName string `json:"os_name"`
773+
OSVersion string `json:"os_version"`
774+
CPUCores int `json:"cpu_cores"`
775+
MemoryTotal uint64 `json:"memory_total"`
776+
MachineID string `json:"machine_id"`
777+
StartedAt time.Time `json:"started_at"`
778+
ShutdownAt *time.Time `json:"shutdown_at"`
819779
}
820780

821781
type APIKey struct {
@@ -990,10 +950,6 @@ type ExternalProvisioner struct {
990950
ShutdownAt *time.Time `json:"shutdown_at"`
991951
}
992952

993-
type Experiment struct {
994-
Name string `json:"name"`
995-
}
996-
997953
type noopReporter struct{}
998954

999955
func (*noopReporter) Report(_ *Snapshot) {}

coderd/telemetry/telemetry_test.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -114,17 +114,6 @@ func TestTelemetry(t *testing.T) {
114114
require.Len(t, snapshot.Users, 1)
115115
require.Equal(t, snapshot.Users[0].EmailHashed, "bb44bf07cf9a2db0554bba63a03d822c927deae77df101874496df5a6a3e896d@coder.com")
116116
})
117-
t.Run("Experiments", func(t *testing.T) {
118-
t.Parallel()
119-
120-
const expName = "my-experiment"
121-
exps := []string{expName}
122-
_, snapshot := collectSnapshot(t, dbmem.New(), func(opts telemetry.Options) telemetry.Options {
123-
opts.Experiments = exps
124-
return opts
125-
})
126-
require.Equal(t, []telemetry.Experiment{{Name: expName}}, snapshot.Experiments)
127-
})
128117
}
129118

130119
// nolint:paralleltest

codersdk/deployment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ type ExternalAuthConfig struct {
392392
AppInstallationsURL string `json:"app_installations_url" yaml:"app_installations_url"`
393393
NoRefresh bool `json:"no_refresh" yaml:"no_refresh"`
394394
Scopes []string `json:"scopes" yaml:"scopes"`
395-
ExtraTokenKeys []string `json:"extra_token_keys" yaml:"extra_token_keys"`
395+
ExtraTokenKeys []string `json:"-" yaml:"extra_token_keys"`
396396
DeviceFlow bool `json:"device_flow" yaml:"device_flow"`
397397
DeviceCodeURL string `json:"device_code_url" yaml:"device_code_url"`
398398
// Regex allows API requesters to match an auth config by

docs/api/general.md

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

docs/api/schemas.md

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

site/src/api/typesGenerated.ts

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

site/src/pages/DeploySettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPageView.stories.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ const meta: Meta<typeof ExternalAuthSettingsPageView> = {
1919
app_installations_url: "",
2020
no_refresh: false,
2121
scopes: [],
22-
extra_token_keys: [],
2322
device_flow: true,
2423
device_code_url: "",
2524
display_icon: "",

0 commit comments

Comments
 (0)