@@ -16,6 +16,7 @@ package main
16
16
17
17
import (
18
18
"container/list"
19
+ "context"
19
20
"flag"
20
21
"fmt"
21
22
"log/slog"
@@ -28,6 +29,7 @@ import (
28
29
"syscall"
29
30
"time"
30
31
32
+ "github.com/Jigsaw-Code/outline-sdk/transport"
31
33
"github.com/Jigsaw-Code/outline-sdk/transport/shadowsocks"
32
34
"github.com/Jigsaw-Code/outline-ss-server/ipinfo"
33
35
"github.com/Jigsaw-Code/outline-ss-server/service"
@@ -60,7 +62,7 @@ type SSServer struct {
60
62
stopConfig func () error
61
63
lnManager service.ListenerManager
62
64
natTimeout time.Duration
63
- m * outlineMetricsCollector
65
+ m * outlineMetrics
64
66
replayCache service.ReplayCache
65
67
}
66
68
@@ -119,13 +121,13 @@ func newCipherListFromConfig(config ServiceConfig) (service.CipherList, error) {
119
121
}
120
122
121
123
func (s * SSServer ) NewShadowsocksStreamHandler (ciphers service.CipherList ) service.StreamHandler {
122
- authFunc := service .NewShadowsocksStreamAuthenticator (ciphers , & s .replayCache , s .m )
124
+ authFunc := service .NewShadowsocksStreamAuthenticator (ciphers , & s .replayCache , s .m . tcpServiceMetrics )
123
125
// TODO: Register initial data metrics at zero.
124
- return service .NewStreamHandler (authFunc , s . m , tcpReadTimeout )
126
+ return service .NewStreamHandler (authFunc , tcpReadTimeout )
125
127
}
126
128
127
129
func (s * SSServer ) NewShadowsocksPacketHandler (ciphers service.CipherList ) service.PacketHandler {
128
- return service .NewPacketHandler (s .natTimeout , ciphers , s .m )
130
+ return service .NewPacketHandler (s .natTimeout , ciphers , s .m , s . m . udpServiceMetrics )
129
131
}
130
132
131
133
func (s * SSServer ) NewShadowsocksStreamHandlerFromConfig (config ServiceConfig ) (service.StreamHandler , error ) {
@@ -247,7 +249,10 @@ func (s *SSServer) runConfig(config Config) (func() error, error) {
247
249
return err
248
250
}
249
251
slog .Info ("TCP service started." , "address" , ln .Addr ().String ())
250
- go service .StreamServe (ln .AcceptStream , sh .Handle )
252
+ go service .StreamServe (ln .AcceptStream , func (ctx context.Context , conn transport.StreamConn ) {
253
+ connMetrics := s .m .AddOpenTCPConnection (conn )
254
+ sh .Handle (ctx , conn , connMetrics )
255
+ })
251
256
252
257
pc , err := lnSet .ListenPacket (addr )
253
258
if err != nil {
@@ -277,7 +282,10 @@ func (s *SSServer) runConfig(config Config) (func() error, error) {
277
282
return err
278
283
}
279
284
}
280
- go service .StreamServe (ln .AcceptStream , sh .Handle )
285
+ go service .StreamServe (ln .AcceptStream , func (ctx context.Context , conn transport.StreamConn ) {
286
+ connMetrics := s .m .AddOpenTCPConnection (conn )
287
+ sh .Handle (ctx , conn , connMetrics )
288
+ })
281
289
case listenerTypeUDP :
282
290
pc , err := lnSet .ListenPacket (lnConfig .Address )
283
291
if err != nil {
@@ -333,7 +341,7 @@ func (s *SSServer) Stop() error {
333
341
}
334
342
335
343
// RunSSServer starts a shadowsocks server running, and returns the server or an error.
336
- func RunSSServer (filename string , natTimeout time.Duration , sm * outlineMetricsCollector , replayHistory int ) (* SSServer , error ) {
344
+ func RunSSServer (filename string , natTimeout time.Duration , sm * outlineMetrics , replayHistory int ) (* SSServer , error ) {
337
345
server := & SSServer {
338
346
lnManager : service .NewListenerManager (),
339
347
natTimeout : natTimeout ,
@@ -416,7 +424,10 @@ func main() {
416
424
}
417
425
defer ip2info .Close ()
418
426
419
- metrics := newPrometheusOutlineMetrics (ip2info )
427
+ metrics , err := newPrometheusOutlineMetrics (ip2info )
428
+ if err != nil {
429
+ slog .Error ("Failed to create Outline Prometheus metrics. Aborting." , "err" , err )
430
+ }
420
431
metrics .SetBuildInfo (version )
421
432
r := prometheus .WrapRegistererWithPrefix ("shadowsocks_" , prometheus .DefaultRegisterer )
422
433
r .MustRegister (metrics )
0 commit comments