Skip to content

Commit b8c9dfb

Browse files
committed
add metrics for websocket conns and quic streams
1 parent 198ed81 commit b8c9dfb

File tree

3 files changed

+52
-8
lines changed

3 files changed

+52
-8
lines changed

egress/egress.go

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import (
2323
"github.com/lucas-clemente/quic-go"
2424
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
2525
"go.opentelemetry.io/otel"
26+
"go.opentelemetry.io/otel/metric/global"
27+
"go.opentelemetry.io/otel/metric/instrument"
2628
"go.opentelemetry.io/otel/trace"
2729
"nhooyr.io/websocket"
2830
)
@@ -33,6 +35,12 @@ import (
3335
var nClients uint64
3436
var nQUICStreams uint64
3537

38+
// TODO: it'd be more elegant to use observers rather than counters, such that we could simply
39+
// observe the value of nClients and nQUICStreams instead of duplicating the increment/decrement
40+
// operations. However, the otel observer API seems more complicated than it's worth?
41+
var nClientsCounter instrument.Int64UpDownCounter
42+
var nQUICStreamsCounter instrument.Int64UpDownCounter
43+
3644
// webSocketPacketConn wraps a websocket.Conn as a net.PacketConn
3745
type websocketPacketConn struct {
3846
net.PacketConn
@@ -53,6 +61,7 @@ func (q websocketPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error)
5361

5462
func (q websocketPacketConn) Close() error {
5563
defer log.Printf("Closed a WebSocket connection! (%v total)\n", atomic.AddUint64(&nClients, ^uint64(0)))
64+
defer nClientsCounter.Add(context.Background(), -1)
5665
return q.w.Close(websocket.StatusNormalClosure, "")
5766
}
5867

@@ -76,7 +85,6 @@ func (l proxyListener) Addr() net.Addr {
7685
return common.DebugAddr("DEBUG NELSON WUZ HERE")
7786
}
7887

79-
// TODO: Someone should scrutinize this
8088
func generateTLSConfig() *tls.Config {
8189
key, err := rsa.GenerateKey(rand.Reader, 1024)
8290
if err != nil {
@@ -130,6 +138,7 @@ func (l proxyListener) handleWebsocket(w http.ResponseWriter, r *http.Request) {
130138
}
131139

132140
log.Printf("Accepted a new WebSocket connection! (%v total)\n", atomic.AddUint64(&nClients, 1))
141+
nClientsCounter.Add(r.Context(), 1)
133142

134143
listener, err := quic.Listen(wspconn, l.tlsConfig, &common.QUICCfg)
135144
if err != nil {
@@ -163,9 +172,11 @@ func (l proxyListener) handleWebsocket(w http.ResponseWriter, r *http.Request) {
163172
}
164173

165174
log.Printf("Accepted a new QUIC stream! (%v total)\n", atomic.AddUint64(&nQUICStreams, 1))
175+
nQUICStreamsCounter.Add(r.Context(), 1)
166176

167177
l.connections <- common.QUICStreamNetConn{Stream: stream, OnClose: func() {
168178
defer log.Printf("Closed a QUIC stream! (%v total)\n", atomic.AddUint64(&nQUICStreams, ^uint64(0)))
179+
nQUICStreamsCounter.Add(r.Context(), -1)
169180
}}
170181
}
171182
}()
@@ -174,8 +185,24 @@ func (l proxyListener) handleWebsocket(w http.ResponseWriter, r *http.Request) {
174185

175186
func main() {
176187
ctx := context.Background()
177-
closeFunc := telemetry.EnableOTELTracing(ctx)
178-
defer func() { _ = closeFunc(ctx) }()
188+
closeFuncTrace := telemetry.EnableOTELTracing(ctx)
189+
closeFuncMetric := telemetry.EnableOTELMetrics(ctx)
190+
defer func() {
191+
_ = closeFuncTrace(ctx)
192+
_ = closeFuncMetric(ctx)
193+
}()
194+
195+
m := global.Meter("github.com/getlantern/broflake/egress")
196+
var err error
197+
nClientsCounter, err = m.Int64UpDownCounter("websocket-counter")
198+
if err != nil {
199+
panic(err)
200+
}
201+
202+
nQUICStreamsCounter, err = m.Int64UpDownCounter("quic-stream-counter")
203+
if err != nil {
204+
panic(err)
205+
}
179206

180207
// We use this wrapped listener to enable our local HTTP proxy to listen for WebSocket connections
181208
l := proxyListener{
@@ -229,7 +256,7 @@ func main() {
229256

230257
http.Handle("/ws", otelhttp.NewHandler(http.HandlerFunc(l.handleWebsocket), "/ws"))
231258
log.Printf("Egress server listening for WebSocket connections on %v\n\n", srv.Addr)
232-
err := srv.ListenAndServe()
259+
err = srv.ListenAndServe()
233260
if err != nil {
234261
log.Println(err)
235262
}

egress/go.mod

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,23 @@ require (
1818
github.com/go-logr/stdr v1.2.2 // indirect
1919
github.com/golang/protobuf v1.5.2 // indirect
2020
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
21-
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.12.0 // indirect
21+
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.13.0 // indirect
22+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.36.0 // indirect
23+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.36.0 // indirect
2224
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.12.0 // indirect
2325
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.12.0 // indirect
2426
go.opentelemetry.io/otel/metric v0.36.0 // indirect
25-
go.opentelemetry.io/otel/sdk v1.12.0 // indirect
27+
go.opentelemetry.io/otel/sdk v1.13.0 // indirect
28+
go.opentelemetry.io/otel/sdk/metric v0.36.0 // indirect
2629
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
2730
golang.org/x/text v0.5.0 // indirect
2831
google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6 // indirect
29-
google.golang.org/grpc v1.52.0 // indirect
32+
google.golang.org/grpc v1.52.3 // indirect
3033
google.golang.org/protobuf v1.28.1 // indirect
3134
)
3235

3336
require (
34-
github.com/getlantern/telemetry v0.0.0-20230224201237-8074742fd5c2
37+
github.com/getlantern/telemetry v0.0.0-20230227190802-faa666d3b3d5
3538
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
3639
github.com/golang/mock v1.6.0 // indirect
3740
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect

egress/go.sum

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo
7171
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
7272
github.com/getlantern/telemetry v0.0.0-20230224201237-8074742fd5c2 h1:ysXfPjtk3dbxFRmI3a+DZLTLjhQv0jSzDGUDMvhoCwM=
7373
github.com/getlantern/telemetry v0.0.0-20230224201237-8074742fd5c2/go.mod h1:rkBjEY+PN8yC3pRH5EwP3RomJ2SfnYz8vOuZMRmcRgA=
74+
github.com/getlantern/telemetry v0.0.0-20230227190802-faa666d3b3d5 h1:EdaJj4wmwoGQ/xHAk5EEe1WU8Rr1Ge+DsGs2MBZNKhc=
75+
github.com/getlantern/telemetry v0.0.0-20230227190802-faa666d3b3d5/go.mod h1:XxsxSO8KjFsvteOwK4tw/ug8oAjAA4lcoADUFFFdpiE=
7476
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
7577
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
7678
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
@@ -286,6 +288,12 @@ go.opentelemetry.io/otel v1.13.0 h1:1ZAKnNQKwBBxFtww/GwxNUyTf0AxkZzrukO8MeXqe4Y=
286288
go.opentelemetry.io/otel v1.13.0/go.mod h1:FH3RtdZCzRkJYFTCsAKDy9l/XYjMdNv6QrkFFB8DvVg=
287289
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.12.0 h1:UfDENi+LTcLjQ/JhaXimjlIgn7wWjwbEMmdREm2Gyng=
288290
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.12.0/go.mod h1:rqbht/LlhVBgn5+k3M5QK96K5Xb0DvXpMJ5SFQpY6uw=
291+
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.13.0 h1:pa05sNT/P8OsIQ8mPZKTIyiBuzS/xDGLVx+DCt0y6Vs=
292+
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.13.0/go.mod h1:rqbht/LlhVBgn5+k3M5QK96K5Xb0DvXpMJ5SFQpY6uw=
293+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.36.0 h1:9uzubQUMa9RsQqQZc0Btl51pTLMdHgDHJszg6839rBQ=
294+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.36.0/go.mod h1:N+2vPD0QfUraV0HGpuiAEzM+rxpnH3Q+/+Qs6HQeWac=
295+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.36.0 h1:o1NyoBU8j3tY5Vtff07/dNi2egBfC4R0qSuWI0z+8pA=
296+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.36.0/go.mod h1:OhE6QNMd4yb/mN0LFxiutl2U1HPekpBHv9hN3TzYKmE=
289297
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.12.0 h1:ZVqtSAxrR4+ofzayuww0/EKamCjjnwnXTMRZzMudJoU=
290298
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.12.0/go.mod h1:IlaGLENJkAl9+Xoo3J0unkdOwtL+rmqZ3ryMjUtYA94=
291299
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.12.0 h1:L23MzcHDznr05xOM1Ng1F98L0nVd7hm/S7y2jW9IRB4=
@@ -294,6 +302,10 @@ go.opentelemetry.io/otel/metric v0.36.0 h1:t0lgGI+L68QWt3QtOIlqM9gXoxqxWLhZ3R/e5
294302
go.opentelemetry.io/otel/metric v0.36.0/go.mod h1:wKVw57sd2HdSZAzyfOM9gTqqE8v7CbqWsYL6AyrH9qk=
295303
go.opentelemetry.io/otel/sdk v1.12.0 h1:8npliVYV7qc0t1FKdpU08eMnOjgPFMnriPhn0HH4q3o=
296304
go.opentelemetry.io/otel/sdk v1.12.0/go.mod h1:WYcvtgquYvgODEvxOry5owO2y9MyciW7JqMz6cpXShE=
305+
go.opentelemetry.io/otel/sdk v1.13.0 h1:BHib5g8MvdqS65yo2vV1s6Le42Hm6rrw08qU6yz5JaM=
306+
go.opentelemetry.io/otel/sdk v1.13.0/go.mod h1:YLKPx5+6Vx/o1TCUYYs+bpymtkmazOMT6zoRrC7AQ7I=
307+
go.opentelemetry.io/otel/sdk/metric v0.36.0 h1:dEXpkkOAEcHiRiaZdvd63MouV+3bCtAB/bF3jlNKnr8=
308+
go.opentelemetry.io/otel/sdk/metric v0.36.0/go.mod h1:Lv4HQQPSCSkhyBKzLNtE8YhTSdK4HCwNh3lh7CiR20s=
297309
go.opentelemetry.io/otel/trace v1.13.0 h1:CBgRZ6ntv+Amuj1jDsMhZtlAPT6gbyIRdaIzFhfBSdY=
298310
go.opentelemetry.io/otel/trace v1.13.0/go.mod h1:muCvmmO9KKpvuXSf3KKAXXB2ygNYHQ+ZfI5X08d3tds=
299311
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
@@ -588,6 +600,8 @@ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K
588600
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
589601
google.golang.org/grpc v1.52.0 h1:kd48UiU7EHsV4rnLyOJRuP/Il/UHE7gdDAQ+SZI7nZk=
590602
google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
603+
google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ=
604+
google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
591605
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
592606
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
593607
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=

0 commit comments

Comments
 (0)