Skip to content

Commit be4f7ec

Browse files
authored
Thomas metrics (#101)
* update gitignore * add metrics tracking
1 parent 658333a commit be4f7ec

File tree

11 files changed

+189
-13
lines changed

11 files changed

+189
-13
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/data/
22
/dist/
3+
**/.DS_Store

cmd/cmd_run.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@ import (
1717
"github.com/sagernet/sing/common/json"
1818
"github.com/sagernet/sing/service"
1919
"github.com/spf13/cobra"
20+
"go.opentelemetry.io/otel"
21+
"go.opentelemetry.io/otel/metric/noop"
22+
2023
"gopkg.in/ini.v1"
2124

2225
"github.com/getlantern/lantern-box/adapter"
2326
"github.com/getlantern/lantern-box/tracker/clientcontext"
2427
"github.com/getlantern/lantern-box/tracker/datacap"
28+
"github.com/getlantern/lantern-box/tracker/metrics"
2529
)
2630

2731
func init() {
@@ -114,6 +118,18 @@ func create(configPath string, datacapURL string) (*box.Box, context.CancelFunc,
114118
log.Warn("Datacap URL not provided, datacap tracking disabled")
115119
}
116120

121+
mp := otel.GetMeterProvider()
122+
if _, ok := mp.(noop.MeterProvider); ok {
123+
log.Info("Metrics not enabled, no meter provider configured")
124+
} else {
125+
metricsTracker, err := metrics.NewTracker()
126+
if err != nil {
127+
return nil, nil, fmt.Errorf("create metrics tracker: %w", err)
128+
}
129+
instance.Router().AppendTracker(metricsTracker)
130+
log.Info("Metric Tracking Enabled")
131+
}
132+
117133
osSignals := make(chan os.Signal, 1)
118134
signal.Notify(osSignals, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
119135
defer func() {

cmd/main.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ import (
66
"os"
77
"strings"
88

9-
"github.com/spf13/cobra"
10-
119
box "github.com/getlantern/lantern-box"
12-
"github.com/getlantern/lantern-box/metrics"
1310
"github.com/getlantern/lantern-box/otel"
11+
"github.com/getlantern/lantern-box/tracker/metrics"
12+
"github.com/spf13/cobra"
13+
sdkotel "go.opentelemetry.io/otel"
14+
"go.opentelemetry.io/otel/metric/noop"
1415
)
1516

1617
type ProxyInfo struct {
@@ -40,6 +41,9 @@ var rootCmd = &cobra.Command{
4041
func preRun(cmd *cobra.Command, args []string) {
4142
globalCtx = box.BaseContext()
4243

44+
// Default to not report metrics
45+
sdkotel.SetMeterProvider(noop.NewMeterProvider())
46+
4347
path, err := cmd.Flags().GetString("config")
4448
if err != nil {
4549
return
@@ -61,7 +65,6 @@ func preRun(cmd *cobra.Command, args []string) {
6165
}
6266

6367
proxyInfoPath := strings.Replace(path, ".json", ".ini", 1)
64-
6568
proxyInfo, err := readProxyInfoFile(proxyInfoPath)
6669
if err != nil {
6770
return

go.mod

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,16 @@ require (
3030
github.com/spf13/cobra v1.10.1
3131
github.com/stretchr/testify v1.11.1
3232
github.com/tetratelabs/wazero v1.7.3
33-
go.opentelemetry.io/otel v1.38.0
34-
go.opentelemetry.io/otel/metric v1.38.0
35-
go.opentelemetry.io/otel/trace v1.38.0
33+
go.opentelemetry.io/otel v1.39.0
34+
go.opentelemetry.io/otel/metric v1.39.0
35+
go.opentelemetry.io/otel/trace v1.39.0
3636
gopkg.in/ini.v1 v1.67.0
3737
gopkg.in/yaml.v3 v3.0.1
3838
)
3939

4040
require (
4141
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
42+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
4243
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect
4344
github.com/getlantern/context v0.0.0-20220418194847-3d5e7a086201 // indirect
4445
github.com/getlantern/golog v0.0.0-20230503153817-8e72de7e0a65 // indirect
@@ -50,11 +51,15 @@ require (
5051
github.com/klauspost/pgzip v1.2.5 // indirect
5152
github.com/mholt/archiver/v3 v3.5.1 // indirect
5253
github.com/nwaples/rardecode v1.1.2 // indirect
54+
github.com/ormanli/otel-metric-mocks v0.0.0-20231210142449-f7870276828c // indirect
5355
github.com/oschwald/geoip2-golang v1.9.0 // indirect
5456
github.com/oschwald/maxminddb-golang v1.13.1 // indirect
5557
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect
5658
github.com/ulikunitz/xz v0.5.10 // indirect
5759
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
60+
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0 // indirect
61+
go.opentelemetry.io/otel/log v0.14.0 // indirect
62+
go.opentelemetry.io/otel/sdk/log v0.14.0 // indirect
5863
go.opentelemetry.io/proto/otlp v1.7.1 // indirect
5964
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
6065
google.golang.org/genproto/googleapis/api v0.0.0-20251124214823-79d6a2a48846 // indirect
@@ -215,10 +220,10 @@ require (
215220
github.com/x448/float16 v0.8.4 // indirect
216221
github.com/zeebo/blake3 v0.2.4 // indirect
217222
go.etcd.io/bbolt v1.3.6 // indirect
218-
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
223+
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
219224
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0
220-
go.opentelemetry.io/otel/sdk v1.38.0
221-
go.opentelemetry.io/otel/sdk/metric v1.38.0
225+
go.opentelemetry.io/otel/sdk v1.39.0
226+
go.opentelemetry.io/otel/sdk/metric v1.39.0
222227
go.uber.org/mock v0.5.0 // indirect
223228
go.uber.org/multierr v1.11.0 // indirect
224229
go.uber.org/zap v1.27.0 // indirect
@@ -229,7 +234,7 @@ require (
229234
golang.org/x/mod v0.27.0 // indirect
230235
golang.org/x/net v0.43.0 // indirect
231236
golang.org/x/sync v0.16.0 // indirect
232-
golang.org/x/sys v0.35.0 // indirect
237+
golang.org/x/sys v0.39.0 // indirect
233238
golang.org/x/term v0.34.0 // indirect
234239
golang.org/x/text v0.28.0 // indirect
235240
golang.org/x/time v0.9.0 // indirect

go.sum

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/X
119119
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
120120
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
121121
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
122+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
123+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
122124
github.com/cilium/ebpf v0.15.0 h1:7NxJhNiBT3NG8pZJ3c+yfrVdHY8ScgKD27sScgjLMMk=
123125
github.com/cilium/ebpf v0.15.0/go.mod h1:DHp1WyrLeiBh19Cf/tfiSMhqheEiK8fXFZ4No0P1Hso=
124126
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
@@ -408,6 +410,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J
408410
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
409411
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
410412
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
413+
github.com/ormanli/otel-metric-mocks v0.0.0-20231210142449-f7870276828c h1:R4zAvQ5tyreskBUJACF6pKDFit614OqCn7/N1cCBxhw=
414+
github.com/ormanli/otel-metric-mocks v0.0.0-20231210142449-f7870276828c/go.mod h1:gdSnRpwpEvrBkn5Z/6gFsVYnFwXXOtDpDxY+uo8nQOo=
411415
github.com/oschwald/geoip2-golang v1.9.0 h1:uvD3O6fXAXs+usU+UGExshpdP13GAqp4GBrzN7IgKZc=
412416
github.com/oschwald/geoip2-golang v1.9.0/go.mod h1:BHK6TvDyATVQhKNbQBdrj9eAvuwOMi2zSFXizL3K81Y=
413417
github.com/oschwald/maxminddb-golang v1.13.1 h1:G3wwjdN9JmIK2o/ermkHM+98oX5fS+k5MbwsmL4MRQE=
@@ -637,20 +641,40 @@ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
637641
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
638642
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
639643
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
644+
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
645+
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
640646
go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo=
641647
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
642648
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
649+
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
650+
go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=
643651
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 h1:Oe2z/BCg5q7k4iXC3cqJxKYg0ieRiOqF0cecFYdPTwk=
644652
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0/go.mod h1:ZQM5lAJpOsKnYagGg/zV2krVqTtaVdYdDkhMoX6Oalg=
653+
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.15.0 h1:0BSddrtQqLEylcErkeFrJBmwFzcqfQq9+/uxfTZq+HE=
654+
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.15.0/go.mod h1:87sjYuAPzaRCtdd09GU5gM1U9wQLrrcYrm77mh5EBoc=
655+
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0 h1:5gn2urDL/FBnK8OkCfD1j3/ER79rUuTYmCvlXBKeYL8=
656+
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0/go.mod h1:0fBG6ZJxhqByfFZDwSwpZGzJU671HkwpWaNe2t4VUPI=
657+
go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM=
658+
go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno=
645659
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
646660
go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
661+
go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
662+
go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
647663
go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=
648664
go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=
665+
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
666+
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
667+
go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg=
668+
go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM=
649669
go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
650670
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
671+
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
672+
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
651673
go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo=
652674
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
653675
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
676+
go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=
677+
go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=
654678
go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4=
655679
go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE=
656680
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
@@ -792,6 +816,8 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
792816
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
793817
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
794818
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
819+
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
820+
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
795821
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
796822
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
797823
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=

protocol/algeneva/inbound.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/gobwas/ws"
1111

1212
"github.com/getlantern/lantern-box/constant"
13-
"github.com/getlantern/lantern-box/metrics"
1413
"github.com/getlantern/lantern-box/option"
1514

1615
"github.com/sagernet/sing-box/adapter"
@@ -48,7 +47,6 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo
4847
func (a *Inbound) NewConnectionEx(ctx context.Context, conn net.Conn, metadata adapter.InboundContext, onClose network.CloseHandlerFunc) {
4948
metadata.Inbound = a.Tag()
5049
metadata.InboundType = a.Type()
51-
conn = metrics.NewConn(conn, &metadata)
5250
conn, err := a.newConnectionEx(ctx, conn)
5351
if err != nil {
5452
network.CloseOnHandshakeFailure(conn, onClose, err)
File renamed without changes.

tracker/metrics/tracker.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package metrics
2+
3+
import (
4+
"context"
5+
"net"
6+
7+
"github.com/sagernet/sing-box/adapter"
8+
N "github.com/sagernet/sing/common/network"
9+
)
10+
11+
var _ (adapter.ConnectionTracker) = (*MetricsTracker)(nil)
12+
13+
type MetricsTracker struct{}
14+
15+
func NewTracker() (*MetricsTracker, error) {
16+
return &MetricsTracker{}, nil
17+
}
18+
19+
func (t *MetricsTracker) RoutedConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext, matchedRule adapter.Rule, matchOutbound adapter.Outbound) net.Conn {
20+
return NewConn(conn, &metadata)
21+
}
22+
23+
func (t *MetricsTracker) RoutedPacketConnection(ctx context.Context, conn N.PacketConn, metadata adapter.InboundContext, matchedRule adapter.Rule, matchOutbound adapter.Outbound) N.PacketConn {
24+
return NewPacketConn(conn, &metadata)
25+
}

0 commit comments

Comments
 (0)