Skip to content

Commit 0d0f300

Browse files
committed
Refactored to client_golang/prometheus
1 parent ba4bb4d commit 0d0f300

File tree

2 files changed

+118
-42
lines changed

2 files changed

+118
-42
lines changed

agent/agentssh/metrics.go

Lines changed: 115 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55

66
"github.com/prometheus/client_golang/prometheus"
7-
"tailscale.com/util/clientmetric"
87
)
98

109
type sshServerMetrics struct {
@@ -83,56 +82,133 @@ func newSSHServerMetrics(registerer prometheus.Registerer) *sshServerMetrics {
8382
}
8483
}
8584

86-
var sessionMetrics = map[string]sessionMetricsObject{}
87-
8885
type sessionMetricsObject struct {
8986
// Agent sessions
90-
agentCreateCommandError *clientmetric.Metric
91-
agentListenerError *clientmetric.Metric
92-
startPTYSession *clientmetric.Metric
93-
startNonPTYSession *clientmetric.Metric
94-
sessionError *clientmetric.Metric
87+
agentCreateCommandError prometheus.Counter
88+
agentListenerError prometheus.Counter
89+
startPTYSession prometheus.Counter
90+
startNonPTYSession prometheus.Counter
91+
sessionError prometheus.Counter
9592

9693
// Non-PTY sessions
97-
nonPTYStdinPipeError *clientmetric.Metric
98-
nonPTYStdinIoCopyError *clientmetric.Metric
99-
nonPTYCmdStartError *clientmetric.Metric
94+
nonPTYStdinPipeError prometheus.Counter
95+
nonPTYStdinIoCopyError prometheus.Counter
96+
nonPTYCmdStartError prometheus.Counter
10097

10198
// PTY sessions
102-
ptyMotdError *clientmetric.Metric
103-
ptyCmdStartError *clientmetric.Metric
104-
ptyCloseError *clientmetric.Metric
105-
ptyResizeError *clientmetric.Metric
106-
ptyInputIoCopyError *clientmetric.Metric
107-
ptyOutputIoCopyError *clientmetric.Metric
108-
ptyWaitError *clientmetric.Metric
99+
ptyMotdError prometheus.Counter
100+
ptyCmdStartError prometheus.Counter
101+
ptyCloseError prometheus.Counter
102+
ptyResizeError prometheus.Counter
103+
ptyInputIoCopyError prometheus.Counter
104+
ptyOutputIoCopyError prometheus.Counter
105+
ptyWaitError prometheus.Counter
109106
}
110107

111-
func init() {
108+
type sessionMetrics map[string]sessionMetricsObject
109+
110+
func newSessionMetrics(registerer prometheus.Registerer) sessionMetrics {
111+
sm := sessionMetrics{}
112112
for _, magicType := range []string{MagicSessionTypeVSCode, MagicSessionTypeJetBrains, "ssh", "unknown"} {
113-
sessionMetrics[magicType] = sessionMetricsObject{
114-
agentCreateCommandError: clientmetric.NewCounter(fmt.Sprintf("ssh_agent_%s_create_command_error", magicType)),
115-
agentListenerError: clientmetric.NewCounter(fmt.Sprintf("ssh_agent_%s_listener_error", magicType)),
116-
startPTYSession: clientmetric.NewCounter(fmt.Sprintf("ssh_agent_%s_start_pty_session", magicType)),
117-
startNonPTYSession: clientmetric.NewCounter(fmt.Sprintf("ssh_agent_%s_start_non_pty_session", magicType)),
118-
sessionError: clientmetric.NewCounter(fmt.Sprintf("ssh_agent_%s_session_error", magicType)),
119-
120-
nonPTYStdinPipeError: clientmetric.NewCounter(fmt.Sprintf("ssh_server_%s_non_pty_stdin_pipe_error", magicType)),
121-
nonPTYStdinIoCopyError: clientmetric.NewCounter(fmt.Sprintf("ssh_server_%s_non_pty_stdin_io_copy_error", magicType)),
122-
nonPTYCmdStartError: clientmetric.NewCounter(fmt.Sprintf("ssh_server_%s_non_pty_cmd_start_error", magicType)),
123-
124-
ptyMotdError: clientmetric.NewCounter(fmt.Sprintf("ssh_server_%s_pty_motd_error", magicType)),
125-
ptyCmdStartError: clientmetric.NewCounter(fmt.Sprintf("ssh_server_%s_pty_cmd_start_error", magicType)),
126-
ptyCloseError: clientmetric.NewCounter(fmt.Sprintf("ssh_server_%s_pty_close_error", magicType)),
127-
ptyResizeError: clientmetric.NewCounter(fmt.Sprintf("ssh_server_%s_pty_resize_error", magicType)),
128-
ptyInputIoCopyError: clientmetric.NewCounter(fmt.Sprintf("ssh_server_%s_pty_input_io_copy_error", magicType)),
129-
ptyOutputIoCopyError: clientmetric.NewCounter(fmt.Sprintf("ssh_server_%s_pty_output_io_copy_error", magicType)),
130-
ptyWaitError: clientmetric.NewCounter(fmt.Sprintf("ssh_server_%s_pty_wait_error", magicType)),
113+
agentCreateCommandError := prometheus.NewCounter(prometheus.CounterOpts{
114+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "create_command_error",
115+
})
116+
registerer.MustRegister(agentCreateCommandError)
117+
118+
agentListenerError := prometheus.NewCounter(prometheus.CounterOpts{
119+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "listener_error",
120+
})
121+
registerer.MustRegister(agentListenerError)
122+
123+
startPTYSession := prometheus.NewCounter(prometheus.CounterOpts{
124+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "start_pty_session",
125+
})
126+
registerer.MustRegister(startPTYSession)
127+
128+
startNonPTYSession := prometheus.NewCounter(prometheus.CounterOpts{
129+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "start_non_pty_session",
130+
})
131+
registerer.MustRegister(startNonPTYSession)
132+
133+
sessionError := prometheus.NewCounter(prometheus.CounterOpts{
134+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "session_error",
135+
})
136+
registerer.MustRegister(sessionError)
137+
138+
nonPTYStdinPipeError := prometheus.NewCounter(prometheus.CounterOpts{
139+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "non_pty_stdin_pipe_error",
140+
})
141+
registerer.MustRegister(nonPTYStdinPipeError)
142+
143+
nonPTYStdinIoCopyError := prometheus.NewCounter(prometheus.CounterOpts{
144+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "non_pty_io_copy_error",
145+
})
146+
registerer.MustRegister(nonPTYStdinIoCopyError)
147+
148+
nonPTYCmdStartError := prometheus.NewCounter(prometheus.CounterOpts{
149+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "non_pty_io_start_error",
150+
})
151+
registerer.MustRegister(nonPTYCmdStartError)
152+
153+
ptyMotdError := prometheus.NewCounter(prometheus.CounterOpts{
154+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "pty_motd_error",
155+
})
156+
registerer.MustRegister(ptyMotdError)
157+
158+
ptyCmdStartError := prometheus.NewCounter(prometheus.CounterOpts{
159+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "pty_cmd_start_error",
160+
})
161+
registerer.MustRegister(ptyCmdStartError)
162+
163+
ptyCloseError := prometheus.NewCounter(prometheus.CounterOpts{
164+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "pty_close_error",
165+
})
166+
registerer.MustRegister(ptyCloseError)
167+
168+
ptyResizeError := prometheus.NewCounter(prometheus.CounterOpts{
169+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "pty_resize_error",
170+
})
171+
registerer.MustRegister(ptyResizeError)
172+
173+
ptyInputIoCopyError := prometheus.NewCounter(prometheus.CounterOpts{
174+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "pty_input_io_copy_error",
175+
})
176+
registerer.MustRegister(ptyInputIoCopyError)
177+
178+
ptyOutputIoCopyError := prometheus.NewCounter(prometheus.CounterOpts{
179+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "pty_output_io_copy_error",
180+
})
181+
registerer.MustRegister(ptyOutputIoCopyError)
182+
183+
ptyWaitError := prometheus.NewCounter(prometheus.CounterOpts{
184+
Namespace: "agent", Subsystem: fmt.Sprintf("ssh_session_%s", magicType), Name: "pty_wait_error",
185+
})
186+
registerer.MustRegister(ptyWaitError)
187+
188+
sm[magicType] = sessionMetricsObject{
189+
agentCreateCommandError: agentCreateCommandError,
190+
agentListenerError: agentListenerError,
191+
startPTYSession: startPTYSession,
192+
startNonPTYSession: startNonPTYSession,
193+
sessionError: sessionError,
194+
195+
nonPTYStdinPipeError: nonPTYStdinPipeError,
196+
nonPTYStdinIoCopyError: nonPTYStdinIoCopyError,
197+
nonPTYCmdStartError: nonPTYCmdStartError,
198+
199+
ptyMotdError: ptyMotdError,
200+
ptyCmdStartError: ptyCmdStartError,
201+
ptyCloseError: ptyCloseError,
202+
ptyResizeError: ptyResizeError,
203+
ptyInputIoCopyError: ptyInputIoCopyError,
204+
ptyOutputIoCopyError: ptyOutputIoCopyError,
205+
ptyWaitError: ptyWaitError,
131206
}
132207
}
208+
return sm
133209
}
134210

135-
func metricsForSession(magicType string) sessionMetricsObject {
211+
func metricsForSession(m sessionMetrics, magicType string) sessionMetricsObject {
136212
switch magicType {
137213
case MagicSessionTypeVSCode:
138214
case MagicSessionTypeJetBrains:
@@ -141,5 +217,5 @@ func metricsForSession(magicType string) sessionMetricsObject {
141217
default:
142218
magicType = "unknown"
143219
}
144-
return sessionMetrics[magicType]
220+
return m[magicType]
145221
}

agent/agentssh/x11.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
// x11Callback is called when the client requests X11 forwarding.
2525
// It adds an Xauthority entry to the Xauthority file.
2626
func (s *Server) x11Callback(ctx ssh.Context, x11 ssh.X11) bool {
27-
metricX11Callback.Add(1)
27+
s.metrics.x11Callback.Add(1)
2828

2929
hostname, err := os.Hostname()
3030
if err != nil {
@@ -35,14 +35,14 @@ func (s *Server) x11Callback(ctx ssh.Context, x11 ssh.X11) bool {
3535
err = s.fs.MkdirAll(s.x11SocketDir, 0o700)
3636
if err != nil {
3737
s.logger.Warn(ctx, "failed to make the x11 socket dir", slog.F("dir", s.x11SocketDir), slog.Error(err))
38-
metricX11SocketDirError.Add(1)
38+
s.metrics.x11SocketDirError.Add(1)
3939
return false
4040
}
4141

4242
err = addXauthEntry(ctx, s.fs, hostname, strconv.Itoa(int(x11.ScreenNumber)), x11.AuthProtocol, x11.AuthCookie)
4343
if err != nil {
4444
s.logger.Warn(ctx, "failed to add Xauthority entry", slog.Error(err))
45-
metricX11XauthorityError.Add(1)
45+
s.metrics.x11XauthorityError.Add(1)
4646
return false
4747
}
4848
return true

0 commit comments

Comments
 (0)