From a32951c46aabaea55a7ded1951254cb215992ab7 Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Wed, 5 Apr 2023 20:58:54 -0500 Subject: [PATCH] fix: reduce idle workspace queries (#7022) --- coderd/apidoc/docs.go | 3 ++ coderd/apidoc/swagger.json | 3 ++ coderd/coderd.go | 2 +- coderd/workspaceagents.go | 15 +++++----- docs/api/agents.md | 59 -------------------------------------- 5 files changed, 14 insertions(+), 68 deletions(-) diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 21465fa3f6..8a7001ac9f 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -4391,6 +4391,9 @@ const docTemplate = `{ "$ref": "#/definitions/agentsdk.StatsResponse" } } + }, + "x-apidocgen": { + "skip": true } } }, diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 87072ad322..df9e2cf608 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -3857,6 +3857,9 @@ "$ref": "#/definitions/agentsdk.StatsResponse" } } + }, + "x-apidocgen": { + "skip": true } } }, diff --git a/coderd/coderd.go b/coderd/coderd.go index 5e95360c70..afc87b20bd 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -186,7 +186,7 @@ func New(options *Options) *API { panic("coderd: both AppHostname and AppHostnameRegex must be set or unset") } if options.AgentConnectionUpdateFrequency == 0 { - options.AgentConnectionUpdateFrequency = 3 * time.Second + options.AgentConnectionUpdateFrequency = 15 * time.Second } if options.AgentInactiveDisconnectTimeout == 0 { // Multiply the update by two to allow for some lag-time. diff --git a/coderd/workspaceagents.go b/coderd/workspaceagents.go index be7a93d511..555020b152 100644 --- a/coderd/workspaceagents.go +++ b/coderd/workspaceagents.go @@ -37,6 +37,7 @@ import ( "github.com/coder/coder/coderd/httpmw" "github.com/coder/coder/coderd/rbac" "github.com/coder/coder/coderd/tracing" + "github.com/coder/coder/coderd/util/ptr" "github.com/coder/coder/codersdk" "github.com/coder/coder/codersdk/agentsdk" "github.com/coder/coder/tailnet" @@ -818,8 +819,9 @@ func (api *API) workspaceAgentCoordinate(rw http.ResponseWriter, r *http.Request // We use a custom heartbeat routine here instead of `httpapi.Heartbeat` // because we want to log the agent's last ping time. - lastPing := time.Now() // Since the agent initiated the request, assume it's alive. - var pingMu sync.Mutex + var lastPing atomic.Pointer[time.Time] + lastPing.Store(ptr.Ref(time.Now())) // Since the agent initiated the request, assume it's alive. + go pprof.Do(ctx, pprof.Labels("agent", workspaceAgent.ID.String()), func(ctx context.Context) { // TODO(mafredri): Is this too frequent? Use separate ping disconnect timeout? t := time.NewTicker(api.AgentConnectionUpdateFrequency) @@ -840,9 +842,7 @@ func (api *API) workspaceAgentCoordinate(rw http.ResponseWriter, r *http.Request if err != nil { return } - pingMu.Lock() - lastPing = time.Now() - pingMu.Unlock() + lastPing.Store(ptr.Ref(time.Now())) } }) @@ -950,9 +950,7 @@ func (api *API) workspaceAgentCoordinate(rw http.ResponseWriter, r *http.Request case <-ticker.C: } - pingMu.Lock() - lastPing := lastPing - pingMu.Unlock() + lastPing := *lastPing.Load() var connectionStatusChanged bool if time.Since(lastPing) > api.AgentInactiveDisconnectTimeout { @@ -1163,6 +1161,7 @@ func convertWorkspaceAgent(derpMap *tailcfg.DERPMap, coordinator tailnet.Coordin // @Param request body agentsdk.Stats true "Stats request" // @Success 200 {object} agentsdk.StatsResponse // @Router /workspaceagents/me/report-stats [post] +// @x-apidocgen {"skip": true} func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Request) { ctx := r.Context() diff --git a/docs/api/agents.md b/docs/api/agents.md index 79ad8a5029..e4c548568d 100644 --- a/docs/api/agents.md +++ b/docs/api/agents.md @@ -394,65 +394,6 @@ curl -X GET http://coder-server:8080/api/v2/workspaceagents/me/manifest \ To perform this operation, you must be authenticated. [Learn more](authentication.md). -## Submit workspace agent stats - -### Code samples - -```shell -# Example request using curl -curl -X POST http://coder-server:8080/api/v2/workspaceagents/me/report-stats \ - -H 'Content-Type: application/json' \ - -H 'Accept: application/json' \ - -H 'Coder-Session-Token: API_KEY' -``` - -`POST /workspaceagents/me/report-stats` - -> Body parameter - -```json -{ - "connection_count": 0, - "connection_median_latency_ms": 0, - "connections_by_proto": { - "property1": 0, - "property2": 0 - }, - "rx_bytes": 0, - "rx_packets": 0, - "session_count_jetbrains": 0, - "session_count_reconnecting_pty": 0, - "session_count_ssh": 0, - "session_count_vscode": 0, - "tx_bytes": 0, - "tx_packets": 0 -} -``` - -### Parameters - -| Name | In | Type | Required | Description | -| ------ | ---- | ------------------------------------------ | -------- | ------------- | -| `body` | body | [agentsdk.Stats](schemas.md#agentsdkstats) | true | Stats request | - -### Example responses - -> 200 Response - -```json -{ - "report_interval": 0 -} -``` - -### Responses - -| Status | Meaning | Description | Schema | -| ------ | ------------------------------------------------------- | ----------- | ---------------------------------------------------------- | -| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | [agentsdk.StatsResponse](schemas.md#agentsdkstatsresponse) | - -To perform this operation, you must be authenticated. [Learn more](authentication.md). - ## Get workspace agent by ID ### Code samples