Ver código fonte

Add iplist_size metric

tags/v2.1.5^2
9seconds 4 anos atrás
pai
commit
30170b9413

+ 2
- 0
README.md Ver arquivo

@@ -383,6 +383,7 @@ Here goes a list of metrics with their types but without a prefix.
383 383
 | client_connections          | gauge   | `ip_family`                      | Count of processing client connections.                                                    |
384 384
 | telegram_connections        | gauge   | `telegram_ip`, `dc`              | Count of connections to Telegram servers.                                                  |
385 385
 | domain_fronting_connections | gauge   | `ip_family`                      | Count of connections to fronting domain.                                                   |
386
+| iplist_size                 | gauge   | `ip_list`                        | A size of either allowlist or blocklist in use.                                            |
386 387
 | telegram_traffic            | counter | `telegram_ip`, `dc`, `direction` | Count of bytes, transmitted to/from Telegram.                                              |
387 388
 | domain_fronting_traffic     | counter | `direction`                      | Count of bytes, transmitted to/from fronting domain.                                       |
388 389
 | domain_fronting             | counter | –                                | Count of domain fronting events.                                                           |
@@ -398,3 +399,4 @@ Tag meaning:
398 399
 | dc          |                            | A number of the Telegram DC for a connection. |
399 400
 | telegram_ip |                            | IP address of the Telegram server.            |
400 401
 | direction   | `to_client`, `from_client` | A direction of the traffic flow.              |
402
+| ip_list     | `allowlist`, `blocklist`   | A type of the IP list.                        |

+ 2
- 0
events/event_stream.go Ver arquivo

@@ -102,6 +102,8 @@ func eventStreamProcessor(ctx context.Context, eventChan <-chan mtglib.Event, ob
102 102
 				observer.EventConcurrencyLimited(typedEvt)
103 103
 			case mtglib.EventReplayAttack:
104 104
 				observer.EventReplayAttack(typedEvt)
105
+			case mtglib.EventIPListSize:
106
+				observer.EventIPListSize(typedEvt)
105 107
 			}
106 108
 		}
107 109
 	}

+ 21
- 0
events/event_stream_test.go Ver arquivo

@@ -204,6 +204,27 @@ func (suite *EventStreamTestSuite) TestEventReplayAttack() {
204 204
 	time.Sleep(100 * time.Millisecond)
205 205
 }
206 206
 
207
+func (suite *EventStreamTestSuite) TestEventIPListSize() {
208
+	evt := mtglib.NewEventIPListSize(10, true)
209
+
210
+	for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
211
+		v.
212
+			On("EventIPListSize", mock.Anything).
213
+			Once().
214
+			Run(func(args mock.Arguments) {
215
+				caught, ok := args.Get(0).(mtglib.EventIPListSize)
216
+
217
+				suite.True(ok)
218
+				suite.Equal(evt.Timestamp(), caught.Timestamp())
219
+				suite.Equal(evt.Size, caught.Size)
220
+				suite.Equal(evt.IsBlockList, caught.IsBlockList)
221
+			})
222
+	}
223
+
224
+	suite.stream.Send(suite.ctx, evt)
225
+	time.Sleep(100 * time.Millisecond)
226
+}
227
+
207 228
 func (suite *EventStreamTestSuite) TearDownTest() {
208 229
 	suite.stream.Shutdown()
209 230
 	suite.ctxCancel()

+ 3
- 0
events/init.go Ver arquivo

@@ -53,6 +53,9 @@ type Observer interface {
53 53
 	// EventReplayAttack reacts on incoming mtglib.EventReplayAttack event.
54 54
 	EventReplayAttack(mtglib.EventReplayAttack)
55 55
 
56
+	// EventIPListSize reacts on incoming mtglib.EventIPListSize
57
+	EventIPListSize(mtglib.EventIPListSize)
58
+
56 59
 	// Shutdown stop observer. Default event stream guarantees:
57 60
 	//   1. If shutdown is executed, it is executed only once
58 61
 	//   2. Observer won't receieve any new message after this

+ 4
- 0
events/init_test.go Ver arquivo

@@ -41,6 +41,10 @@ func (o *ObserverMock) EventReplayAttack(evt mtglib.EventReplayAttack) {
41 41
 	o.Called(evt)
42 42
 }
43 43
 
44
+func (o *ObserverMock) EventIPListSize(evt mtglib.EventIPListSize) {
45
+	o.Called(evt)
46
+}
47
+
44 48
 func (o *ObserverMock) Shutdown() {
45 49
 	o.Called()
46 50
 }

+ 15
- 0
events/multi_observer.go Ver arquivo

@@ -130,6 +130,21 @@ func (m multiObserver) EventReplayAttack(evt mtglib.EventReplayAttack) {
130 130
 	wg.Wait()
131 131
 }
132 132
 
133
+func (m multiObserver) EventIPListSize(evt mtglib.EventIPListSize) {
134
+	wg := &sync.WaitGroup{}
135
+	wg.Add(len(m.observers))
136
+
137
+	for _, v := range m.observers {
138
+		go func(obs Observer) {
139
+			defer wg.Done()
140
+
141
+			obs.EventIPListSize(evt)
142
+		}(v)
143
+	}
144
+
145
+	wg.Wait()
146
+}
147
+
133 148
 func (m multiObserver) Shutdown() {
134 149
 	for _, v := range m.observers {
135 150
 		v.Shutdown()

+ 1
- 0
events/noop.go Ver arquivo

@@ -25,6 +25,7 @@ func (n noopObserver) EventFinish(_ mtglib.EventFinish)
25 25
 func (n noopObserver) EventConcurrencyLimited(_ mtglib.EventConcurrencyLimited) {}
26 26
 func (n noopObserver) EventIPBlocklisted(_ mtglib.EventIPBlocklisted)           {}
27 27
 func (n noopObserver) EventReplayAttack(_ mtglib.EventReplayAttack)             {}
28
+func (n noopObserver) EventIPListSize(_ mtglib.EventIPListSize)                 {}
28 29
 func (n noopObserver) Shutdown()                                                {}
29 30
 
30 31
 // NewNoopObserver creates an observer which discards each message.

+ 3
- 0
events/noop_test.go Ver arquivo

@@ -27,6 +27,7 @@ func (suite *NoopTestSuite) SetupSuite() {
27 27
 		"concurrency-limited": mtglib.NewEventConcurrencyLimited(),
28 28
 		"ip-blacklisted":      mtglib.NewEventIPBlocklisted(net.ParseIP("10.0.0.10")),
29 29
 		"replay-attack":       mtglib.NewEventReplayAttack("connID"),
30
+		"ip-list-size":        mtglib.NewEventIPListSize(10, true),
30 31
 	}
31 32
 	suite.ctx = context.Background()
32 33
 }
@@ -65,6 +66,8 @@ func (suite *NoopTestSuite) TestObserver() {
65 66
 				observer.EventIPBlocklisted(typedEvt)
66 67
 			case mtglib.EventReplayAttack:
67 68
 				observer.EventReplayAttack(typedEvt)
69
+			case mtglib.EventIPListSize:
70
+				observer.EventIPListSize(typedEvt)
68 71
 			}
69 72
 		})
70 73
 	}

+ 1
- 1
example.config.toml Ver arquivo

@@ -170,7 +170,7 @@ download-concurrency = 2
170 170
 # You can provider links here (starts with https:// or http://) or
171 171
 # path to a local file, but in this case it should be absolute.
172 172
 urls = [
173
-    # "https://iplists.firehol.org/files/firehol_level1.netset",
173
+    "https://iplists.firehol.org/files/firehol_level1.netset",
174 174
     # "/local.file"
175 175
 ]
176 176
 # How often do we need to update a blocklist set.

+ 26
- 9
internal/cli/run_proxy.go Ver arquivo

@@ -1,6 +1,7 @@
1 1
 package cli
2 2
 
3 3
 import (
4
+	"context"
4 5
 	"fmt"
5 6
 	"net"
6 7
 	"net/url"
@@ -85,7 +86,10 @@ func makeAntiReplayCache(conf *config.Config) mtglib.AntiReplayCache {
85 86
 	)
86 87
 }
87 88
 
88
-func makeIPBlocklist(conf config.ListConfig, logger mtglib.Logger, ntw mtglib.Network) (mtglib.IPBlocklist, error) {
89
+func makeIPBlocklist(conf config.ListConfig,
90
+	logger mtglib.Logger,
91
+	ntw mtglib.Network,
92
+	updateCallback ipblocklist.FireholUpdateCallback) (mtglib.IPBlocklist, error) {
89 93
 	if !conf.Enabled.Get(false) {
90 94
 		return ipblocklist.NewNoop(), nil
91 95
 	}
@@ -105,7 +109,8 @@ func makeIPBlocklist(conf config.ListConfig, logger mtglib.Logger, ntw mtglib.Ne
105 109
 		ntw,
106 110
 		conf.DownloadConcurrency.Get(1),
107 111
 		remoteURLs,
108
-		localFiles)
112
+		localFiles,
113
+		updateCallback)
109 114
 	if err != nil {
110 115
 		return nil, fmt.Errorf("incorrect parameters for firehol: %w", err)
111 116
 	}
@@ -159,12 +164,23 @@ func runProxy(conf *config.Config, version string) error { // nolint: funlen
159 164
 
160 165
 	logger.BindJSON("configuration", conf.String()).Debug("configuration")
161 166
 
167
+	eventStream, err := makeEventStream(conf, logger)
168
+	if err != nil {
169
+		return fmt.Errorf("cannot build event stream: %w", err)
170
+	}
171
+
162 172
 	ntw, err := makeNetwork(conf, version)
163 173
 	if err != nil {
164 174
 		return fmt.Errorf("cannot build network: %w", err)
165 175
 	}
166 176
 
167
-	blocklist, err := makeIPBlocklist(conf.Defense.Blocklist, logger.Named("blocklist"), ntw)
177
+	blocklist, err := makeIPBlocklist(
178
+		conf.Defense.Blocklist,
179
+		logger.Named("blocklist"),
180
+		ntw,
181
+		func(ctx context.Context, size int) {
182
+			eventStream.Send(ctx, mtglib.NewEventIPListSize(size, true))
183
+		})
168 184
 	if err != nil {
169 185
 		return fmt.Errorf("cannot build ip blocklist: %w", err)
170 186
 	}
@@ -172,7 +188,13 @@ func runProxy(conf *config.Config, version string) error { // nolint: funlen
172 188
 	var whitelist mtglib.IPBlocklist
173 189
 
174 190
 	if conf.Defense.Allowlist.Enabled.Get(false) {
175
-		whlist, err := makeIPBlocklist(conf.Defense.Allowlist, logger.Named("allowlist"), ntw)
191
+		whlist, err := makeIPBlocklist(
192
+			conf.Defense.Allowlist,
193
+			logger.Named("allowlist"),
194
+			ntw,
195
+			func(ctx context.Context, size int) {
196
+				eventStream.Send(ctx, mtglib.NewEventIPListSize(size, false))
197
+			})
176 198
 		if err != nil {
177 199
 			return fmt.Errorf("cannot build ip allowlist: %w", err)
178 200
 		}
@@ -180,11 +202,6 @@ func runProxy(conf *config.Config, version string) error { // nolint: funlen
180 202
 		whitelist = whlist
181 203
 	}
182 204
 
183
-	eventStream, err := makeEventStream(conf, logger)
184
-	if err != nil {
185
-		return fmt.Errorf("cannot build event stream: %w", err)
186
-	}
187
-
188 205
 	opts := mtglib.ProxyOpts{
189 206
 		Logger:          logger,
190 207
 		Network:         ntw,

+ 24
- 12
ipblocklist/firehol.go Ver arquivo

@@ -23,6 +23,10 @@ var (
23 23
 	fireholIPv6DefaultCIDR = net.CIDRMask(128, 128) // nolint: gomnd
24 24
 )
25 25
 
26
+// FireholUpdateCallback defines a signature of the callback that has to be
27
+// execute when ip list is updated.
28
+type FireholUpdateCallback func(context.Context, int)
29
+
26 30
 // Firehol is IPBlocklist which uses lists from FireHOL:
27 31
 // https://iplists.firehol.org/
28 32
 //
@@ -42,7 +46,8 @@ type Firehol struct {
42 46
 	logger      mtglib.Logger
43 47
 	updateMutex sync.RWMutex
44 48
 
45
-	ranger cidranger.Ranger
49
+	updateCallback FireholUpdateCallback
50
+	ranger         cidranger.Ranger
46 51
 
47 52
 	blocklists []files.File
48 53
 
@@ -110,7 +115,7 @@ func (f *Firehol) update() {
110 115
 	wg := &sync.WaitGroup{}
111 116
 	wg.Add(len(f.blocklists))
112 117
 
113
-	treeMutex := &sync.Mutex{}
118
+	mutex := &sync.Mutex{}
114 119
 	ranger := cidranger.NewPCTrieRanger()
115 120
 
116 121
 	for _, v := range f.blocklists {
@@ -128,7 +133,7 @@ func (f *Firehol) update() {
128 133
 
129 134
 			defer fileContent.Close()
130 135
 
131
-			if err := f.updateFromFile(treeMutex, ranger, bufio.NewScanner(fileContent)); err != nil {
136
+			if err := f.updateFromFile(mutex, ranger, bufio.NewScanner(fileContent)); err != nil {
132 137
 				logger.WarningError("update has failed", err)
133 138
 			}
134 139
 		}(v)
@@ -141,6 +146,10 @@ func (f *Firehol) update() {
141 146
 
142 147
 	f.ranger = ranger
143 148
 
149
+	if f.updateCallback != nil {
150
+		f.updateCallback(ctx, ranger.Len())
151
+	}
152
+
144 153
 	f.logger.Info("ip list was updated")
145 154
 }
146 155
 
@@ -206,7 +215,8 @@ func (f *Firehol) updateParseLine(text string) (*net.IPNet, error) {
206 215
 func NewFirehol(logger mtglib.Logger, network mtglib.Network,
207 216
 	downloadConcurrency uint,
208 217
 	urls []string,
209
-	localFiles []string) (*Firehol, error) {
218
+	localFiles []string,
219
+	updateCallback FireholUpdateCallback) (*Firehol, error) {
210 220
 	blocklists := []files.File{}
211 221
 
212 222
 	for _, v := range localFiles {
@@ -229,12 +239,13 @@ func NewFirehol(logger mtglib.Logger, network mtglib.Network,
229 239
 		blocklists = append(blocklists, file)
230 240
 	}
231 241
 
232
-	return NewFireholFromFiles(logger, downloadConcurrency, blocklists)
242
+	return NewFireholFromFiles(logger, downloadConcurrency, blocklists, updateCallback)
233 243
 }
234 244
 
235 245
 func NewFireholFromFiles(logger mtglib.Logger,
236 246
 	downloadConcurrency uint,
237
-	blocklists []files.File) (*Firehol, error) {
247
+	blocklists []files.File,
248
+	updateCallback FireholUpdateCallback) (*Firehol, error) {
238 249
 	if downloadConcurrency == 0 {
239 250
 		downloadConcurrency = DefaultFireholDownloadConcurrency
240 251
 	}
@@ -243,11 +254,12 @@ func NewFireholFromFiles(logger mtglib.Logger,
243 254
 	ctx, cancel := context.WithCancel(context.Background())
244 255
 
245 256
 	return &Firehol{
246
-		ctx:        ctx,
247
-		ctxCancel:  cancel,
248
-		logger:     logger.Named("firehol"),
249
-		ranger:     cidranger.NewPCTrieRanger(),
250
-		workerPool: workerPool,
251
-		blocklists: blocklists,
257
+		ctx:            ctx,
258
+		ctxCancel:      cancel,
259
+		logger:         logger.Named("firehol"),
260
+		ranger:         cidranger.NewPCTrieRanger(),
261
+		workerPool:     workerPool,
262
+		blocklists:     blocklists,
263
+		updateCallback: updateCallback,
252 264
 	}, nil
253 265
 }

+ 6
- 4
ipblocklist/firehol_test.go Ver arquivo

@@ -67,7 +67,8 @@ func (suite *FireholTestSuite) TearDownSuite() {
67 67
 func (suite *FireholTestSuite) TestLocalFail() {
68 68
 	blocklist, err := ipblocklist.NewFirehol(logger.NewNoopLogger(),
69 69
 		suite.networkMock, 2,
70
-		nil, []string{filepath.Join("testdata", "broken_ipset.ipset")})
70
+		nil, []string{filepath.Join("testdata", "broken_ipset.ipset")},
71
+		nil)
71 72
 
72 73
 	suite.NoError(err)
73 74
 
@@ -85,7 +86,8 @@ func (suite *FireholTestSuite) TestLocalFail() {
85 86
 func (suite *FireholTestSuite) TestLocalOk() {
86 87
 	blocklist, err := ipblocklist.NewFirehol(logger.NewNoopLogger(),
87 88
 		suite.networkMock, 2,
88
-		nil, []string{filepath.Join("testdata", "good_ipset.ipset")})
89
+		nil, []string{filepath.Join("testdata", "good_ipset.ipset")},
90
+		nil)
89 91
 
90 92
 	suite.NoError(err)
91 93
 
@@ -103,7 +105,7 @@ func (suite *FireholTestSuite) TestLocalOk() {
103 105
 func (suite *FireholTestSuite) TestRemoteFail() {
104 106
 	blocklist, err := ipblocklist.NewFirehol(logger.NewNoopLogger(),
105 107
 		suite.networkMock, 2,
106
-		[]string{"https://google.com"}, nil)
108
+		[]string{"https://google.com"}, nil, nil)
107 109
 
108 110
 	suite.NoError(err)
109 111
 
@@ -127,7 +129,7 @@ func (suite *FireholTestSuite) TestMixed() {
127 129
 			suite.httpServer.URL,
128 130
 		}, []string{
129 131
 			filepath.Join("testdata", "good_ipset.ipset"),
130
-		})
132
+		}, nil)
131 133
 
132 134
 	suite.NoError(err)
133 135
 

+ 20
- 0
mtglib/events.go Ver arquivo

@@ -92,6 +92,15 @@ type EventReplayAttack struct {
92 92
 	eventBase
93 93
 }
94 94
 
95
+// EventIPListSize is emitted when mtg updates a contents of the ip lists:
96
+// allowlist or blocklist.
97
+type EventIPListSize struct {
98
+	eventBase
99
+
100
+	Size        int
101
+	IsBlockList bool
102
+}
103
+
95 104
 // NewEventStart creates a new EventStart event.
96 105
 func NewEventStart(streamID string, remoteIP net.IP) EventStart {
97 106
 	return EventStart{
@@ -176,3 +185,14 @@ func NewEventReplayAttack(streamID string) EventReplayAttack {
176 185
 		},
177 186
 	}
178 187
 }
188
+
189
+// NewEventIPListSize creates a new EventIPListSize event.
190
+func NewEventIPListSize(size int, isBlockList bool) EventIPListSize {
191
+	return EventIPListSize{
192
+		eventBase: eventBase{
193
+			timestamp: time.Now(),
194
+		},
195
+		Size:        size,
196
+		IsBlockList: isBlockList,
197
+	}
198
+}

+ 9
- 0
mtglib/events_test.go Ver arquivo

@@ -69,6 +69,15 @@ func (suite *EventsTestSuite) TestEventReplayAttack() {
69 69
 	suite.WithinDuration(time.Now(), evt.Timestamp(), 10*time.Millisecond)
70 70
 }
71 71
 
72
+func (suite *EventsTestSuite) TestEventIPListSize() {
73
+	evt := mtglib.NewEventIPListSize(10, false)
74
+
75
+	suite.Empty(evt.StreamID())
76
+	suite.WithinDuration(time.Now(), evt.Timestamp(), 10*time.Millisecond)
77
+	suite.Equal(10, evt.Size)
78
+	suite.False(evt.IsBlockList)
79
+}
80
+
72 81
 func TestEvents(t *testing.T) {
73 82
 	t.Parallel()
74 83
 	suite.Run(t, &EventsTestSuite{})

+ 16
- 0
stats/init.go Ver arquivo

@@ -89,6 +89,13 @@ const (
89 89
 	//     Type: counter
90 90
 	MetricReplayAttacks = "replay_attacks"
91 91
 
92
+	// MetricIPListSize defines a metric for the size of the the ip list.
93
+	//
94
+	//     Type: gauge
95
+	//     Tags:
96
+	//       ip_list | 'allowlist' or 'blocklist'
97
+	MetricIPListSize = "iplist_size"
98
+
92 99
 	// TagIPFamily defines a name of the 'ip_family' tag and all values.
93 100
 	TagIPFamily = "ip_family"
94 101
 
@@ -114,4 +121,13 @@ const (
114 121
 	// TagDirectionFromClient defines that traffic is sent from a client to
115 122
 	// Telegram.
116 123
 	TagDirectionFromClient = "from_client"
124
+
125
+	// TagIPList defines a name of the 'ip_list' and all values.
126
+	TagIPList = "ip_list"
127
+
128
+	// TagIPListAllow defines a value of 'ip_list' of allowlist.
129
+	TagIPListAllow = "allowlist"
130
+
131
+	// TagIPListBlock defines a value of 'ip_list' of blocklist.
132
+	TagIPListBlock = "blocklist"
117 133
 )

+ 16
- 0
stats/prometheus.go Ver arquivo

@@ -118,6 +118,15 @@ func (p prometheusProcessor) EventReplayAttack(_ mtglib.EventReplayAttack) {
118 118
 	p.factory.metricReplayAttacks.Inc()
119 119
 }
120 120
 
121
+func (p prometheusProcessor) EventIPListSize(evt mtglib.EventIPListSize) {
122
+	tag := TagIPListBlock
123
+	if !evt.IsBlockList {
124
+		tag = TagIPListAllow
125
+	}
126
+
127
+	p.factory.metricIPListSize.WithLabelValues(tag).Set(float64(evt.Size))
128
+}
129
+
121 130
 func (p prometheusProcessor) Shutdown() {
122 131
 	for k, v := range p.streams {
123 132
 		releaseStreamInfo(v)
@@ -137,6 +146,7 @@ type PrometheusFactory struct {
137 146
 	metricClientConnections         *prometheus.GaugeVec
138 147
 	metricTelegramConnections       *prometheus.GaugeVec
139 148
 	metricDomainFrontingConnections *prometheus.GaugeVec
149
+	metricIPListSize                *prometheus.GaugeVec
140 150
 
141 151
 	metricTelegramTraffic       *prometheus.CounterVec
142 152
 	metricDomainFrontingTraffic *prometheus.CounterVec
@@ -197,6 +207,11 @@ func NewPrometheus(metricPrefix, httpPath string) *PrometheusFactory { // nolint
197 207
 			Name:      MetricDomainFrontingConnections,
198 208
 			Help:      "A number of connections which talk to front domain.",
199 209
 		}, []string{TagIPFamily}),
210
+		metricIPListSize: prometheus.NewGaugeVec(prometheus.GaugeOpts{
211
+			Namespace: metricPrefix,
212
+			Name:      MetricIPListSize,
213
+			Help:      "A size of the ip list (blocklist or allowlist)",
214
+		}, []string{TagIPList}),
200 215
 
201 216
 		metricTelegramTraffic: prometheus.NewCounterVec(prometheus.CounterOpts{
202 217
 			Namespace: metricPrefix,
@@ -234,6 +249,7 @@ func NewPrometheus(metricPrefix, httpPath string) *PrometheusFactory { // nolint
234 249
 	registry.MustRegister(factory.metricClientConnections)
235 250
 	registry.MustRegister(factory.metricTelegramConnections)
236 251
 	registry.MustRegister(factory.metricDomainFrontingConnections)
252
+	registry.MustRegister(factory.metricIPListSize)
237 253
 
238 254
 	registry.MustRegister(factory.metricTelegramTraffic)
239 255
 	registry.MustRegister(factory.metricDomainFrontingTraffic)

+ 12
- 0
stats/prometheus_test.go Ver arquivo

@@ -169,6 +169,18 @@ func (suite *PrometheusTestSuite) TestEventReplayAttack() {
169 169
 	suite.Contains(data, `mtg_replay_attacks 1`)
170 170
 }
171 171
 
172
+func (suite *PrometheusTestSuite) TestEventIPListSize() {
173
+	suite.prometheus.EventIPListSize(mtglib.NewEventIPListSize(10, false))
174
+	suite.prometheus.EventIPListSize(mtglib.NewEventIPListSize(3, true))
175
+
176
+	time.Sleep(100 * time.Millisecond)
177
+
178
+	data, err := suite.Get()
179
+	suite.NoError(err)
180
+	suite.Contains(data, `mtg_iplist_size{ip_list="allowlist"} 10`)
181
+	suite.Contains(data, `mtg_iplist_size{ip_list="blocklist"} 3`)
182
+}
183
+
172 184
 func TestPrometheus(t *testing.T) {
173 185
 	t.Parallel()
174 186
 	suite.Run(t, &PrometheusTestSuite{})

+ 9
- 0
stats/statsd.go Ver arquivo

@@ -121,6 +121,15 @@ func (s statsdProcessor) EventReplayAttack(_ mtglib.EventReplayAttack) {
121 121
 	s.client.Incr(MetricReplayAttacks, 1)
122 122
 }
123 123
 
124
+func (s statsdProcessor) EventIPListSize(evt mtglib.EventIPListSize) {
125
+	tag := TagIPListBlock
126
+	if !evt.IsBlockList {
127
+		tag = TagIPListAllow
128
+	}
129
+
130
+	s.client.Gauge(MetricIPListSize, int64(evt.Size), statsd.StringTag(TagIPList, tag))
131
+}
132
+
124 133
 func (s statsdProcessor) Shutdown() {
125 134
 	events := make([]mtglib.EventFinish, 0, len(s.streams))
126 135
 

+ 16
- 0
stats/statsd_test.go Ver arquivo

@@ -196,6 +196,22 @@ func (suite *StatsdTestSuite) TestEventReplayAttack() {
196 196
 	suite.Equal("mtg.replay_attacks:1|c", suite.statsdServer.String())
197 197
 }
198 198
 
199
+func (suite *StatsdTestSuite) TestEventIPListSizeAllowlist() {
200
+	suite.statsd.EventIPListSize(mtglib.NewEventIPListSize(10, false))
201
+
202
+	time.Sleep(statsdSleepTime)
203
+	suite.Contains(suite.statsdServer.String(), "mtg.iplist_size:10|g")
204
+	suite.Contains(suite.statsdServer.String(), "allowlist")
205
+}
206
+
207
+func (suite *StatsdTestSuite) TestEventIPListSizeBlocklist() {
208
+	suite.statsd.EventIPListSize(mtglib.NewEventIPListSize(10, true))
209
+
210
+	time.Sleep(statsdSleepTime)
211
+	suite.Contains(suite.statsdServer.String(), "mtg.iplist_size:10|g")
212
+	suite.Contains(suite.statsdServer.String(), "blocklist")
213
+}
214
+
199 215
 func TestStatsd(t *testing.T) {
200 216
 	t.Parallel()
201 217
 	suite.Run(t, &StatsdTestSuite{})

Carregando…
Cancelar
Salvar