Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ddf9841

Browse files
committed
Add databasefake query for getting agent stats
1 parent 8f1f141 commit ddf9841

File tree

7 files changed

+137
-12
lines changed

7 files changed

+137
-12
lines changed

agent/agent.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ const (
6060

6161
// MagicSSHSessionTypeEnvironmentVariable is used to track the purpose behind an SSH connection.
6262
// This is stripped from any commands being executed, and is counted towards connection stats.
63-
MagicSSHSessionTypeEnvironmentVariable = "__CODER_SSH_SESSION_TYPE"
63+
MagicSSHSessionTypeEnvironmentVariable = "CODER_SSH_SESSION_TYPE"
6464
// MagicSSHSessionTypeVSCode is set in the SSH config by the VS Code extension to identify itself.
6565
MagicSSHSessionTypeVSCode = "vscode"
6666
// MagicSSHSessionTypeJetBrains is set in the SSH config by the JetBrains extension to identify itself.
@@ -156,10 +156,6 @@ type agent struct {
156156
network *tailnet.Conn
157157
connStatsChan chan *agentsdk.Stats
158158

159-
statRxPackets atomic.Int64
160-
statRxBytes atomic.Int64
161-
statTxPackets atomic.Int64
162-
statTxBytes atomic.Int64
163159
connCountVSCode atomic.Int64
164160
connCountJetBrains atomic.Int64
165161
connCountReconnectingPTY atomic.Int64
@@ -1188,14 +1184,12 @@ func (a *agent) startReportingConnectionStats(ctx context.Context) {
11881184
ConnectionCount: int64(len(networkStats)),
11891185
ConnectionsByProto: map[string]int64{},
11901186
}
1191-
// Tailscale resets counts on every report!
1192-
// We'd rather have these compound, like Linux does!
11931187
for conn, counts := range networkStats {
11941188
stats.ConnectionsByProto[conn.Proto.String()]++
1195-
stats.RxBytes = a.statRxBytes.Add(int64(counts.RxBytes))
1196-
stats.RxPackets = a.statRxPackets.Add(int64(counts.RxPackets))
1197-
stats.TxBytes = a.statTxBytes.Add(int64(counts.TxBytes))
1198-
stats.TxPackets = a.statTxPackets.Add(int64(counts.TxPackets))
1189+
stats.RxBytes += int64(counts.RxBytes)
1190+
stats.RxPackets += int64(counts.RxPackets)
1191+
stats.TxBytes += int64(counts.TxBytes)
1192+
stats.TxPackets += int64(counts.TxPackets)
11991193
}
12001194

12011195
// The count of active sessions.

coderd/database/dbfake/databasefake.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,51 @@ func (*fakeQuerier) DeleteOldWorkspaceAgentStats(_ context.Context) error {
263263
return nil
264264
}
265265

266+
func (q *fakeQuerier) GetDeploymentWorkspaceAgentStats(_ context.Context, createdAfter time.Time) (database.GetDeploymentWorkspaceAgentStatsRow, error) {
267+
q.mutex.RLock()
268+
defer q.mutex.RUnlock()
269+
270+
agentStatsCreatedAfter := make([]database.WorkspaceAgentStat, 0)
271+
for _, agentStat := range q.workspaceAgentStats {
272+
if agentStat.CreatedAt.After(createdAfter) {
273+
agentStatsCreatedAfter = append(agentStatsCreatedAfter, agentStat)
274+
}
275+
}
276+
277+
latestAgentStats := map[uuid.UUID]database.WorkspaceAgentStat{}
278+
for _, agentStat := range q.workspaceAgentStats {
279+
latestAgentStats[agentStat.AgentID] = agentStat
280+
}
281+
282+
stat := database.GetDeploymentWorkspaceAgentStatsRow{}
283+
for _, agentStat := range latestAgentStats {
284+
stat.SessionCountVSCode += agentStat.SessionCountVSCode
285+
stat.SessionCountJetBrains += agentStat.SessionCountJetBrains
286+
stat.SessionCountReconnectingPTY += agentStat.SessionCountReconnectingPTY
287+
stat.SessionCountSSH += agentStat.SessionCountSSH
288+
}
289+
290+
latencies := make([]float64, 0)
291+
for _, agentStat := range agentStatsCreatedAfter {
292+
stat.WorkspaceRxBytes += agentStat.RxBytes
293+
stat.WorkspaceTxBytes += agentStat.TxBytes
294+
latencies = append(latencies, float64(agentStat.ConnectionMedianLatencyMS))
295+
}
296+
297+
tryPercentile := func(fs []float64, p float64) float64 {
298+
if len(fs) == 0 {
299+
return -1
300+
}
301+
sort.Float64s(fs)
302+
return fs[int(float64(len(fs))*p/100)]
303+
}
304+
305+
stat.WorkspaceConnectionLatency50 = tryPercentile(latencies, 50)
306+
stat.WorkspaceConnectionLatency95 = tryPercentile(latencies, 95)
307+
308+
return stat, nil
309+
}
310+
266311
func (q *fakeQuerier) InsertWorkspaceAgentStat(_ context.Context, p database.InsertWorkspaceAgentStatParams) (database.WorkspaceAgentStat, error) {
267312
if err := validateDatabaseType(p); err != nil {
268313
return database.WorkspaceAgentStat{}, err

coderd/database/generate.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}")
1818
# Dump the updated schema (use make to utilize caching).
1919
make -C ../.. --no-print-directory coderd/database/dump.sql
2020
# The logic below depends on the exact version being correct :(
21-
go run github.com/kyleconroy/sqlc/cmd/[email protected] generate
21+
sqlc generate
2222

2323
first=true
2424
for fi in queries/*.sql.go; do

coderd/database/querier.go

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

coderd/database/queries.sql.go

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

coderd/database/queries/workspaceagentstats.sql

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,21 @@ ORDER BY
4848

4949
-- name: DeleteOldWorkspaceAgentStats :exec
5050
DELETE FROM workspace_agent_stats WHERE created_at < NOW() - INTERVAL '30 days';
51+
52+
-- name: GetDeploymentWorkspaceAgentStats :one
53+
WITH agent_stats AS (
54+
SELECT * FROM workspace_agent_stats
55+
WHERE created_at > $1
56+
), latest_agent_stats AS (
57+
SELECT * FROM agent_stats GROUP BY agent_id ORDER BY created_at
58+
)
59+
SELECT
60+
SUM(latest_agent_stats.session_count_vscode) AS session_count_vscode,
61+
SUM(latest_agent_stats.session_count_ssh) AS session_count_ssh,
62+
SUM(latest_agent_stats.session_count_jetbrains) AS session_count_jetbrains,
63+
SUM(latest_agent_stats.session_count_reconnecting_pty) AS session_count_reconnecting_pty,
64+
SUM(agent_stats.rx_bytes) AS workspace_rx_bytes,
65+
SUM(agent_stats.tx_bytes) AS workspace_tx_bytes,
66+
coalesce((PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY agent_stats.connection_median_latency_ms)), -1)::FLOAT AS workspace_connection_latency_50,
67+
coalesce((PERCENTILE_DISC(0.95) WITHIN GROUP(ORDER BY agent_stats.connection_median_latency_ms)), -1)::FLOAT AS workspace_connection_latency_95
68+
FROM agent_stats JOIN latest_agent_stats ON agent_stats.agent_id = latest_agent_stats.agent_id;

codersdk/deployment.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,3 +528,24 @@ func (c *Client) AppHost(ctx context.Context) (AppHostResponse, error) {
528528
var host AppHostResponse
529529
return host, json.NewDecoder(res.Body).Decode(&host)
530530
}
531+
532+
type WorkspaceConnectionLatency struct {
533+
P50 *int64
534+
P95 *int64
535+
}
536+
537+
type DeploymentStats struct {
538+
WorkspacesByTransition map[WorkspaceTransition]int
539+
WorkspaceConnectionLatencyMS WorkspaceConnectionLatency
540+
541+
SessionCountVSCode int
542+
SessionCountSSH int
543+
SessionCountJetBrains int
544+
SessionCountReconnectingPTY int
545+
546+
WorkspaceRxBytes int
547+
WorkspaceTxBytes int
548+
549+
// X downloaded in the past 10 minutes
550+
// X uploaded in the past 10 minutes
551+
}

0 commit comments

Comments
 (0)