Procházet zdrojové kódy

Add iplist_size metric

tags/v2.1.5^2
9seconds před 4 roky
rodič
revize
30170b9413

+ 2
- 0
README.md Zobrazit soubor

383
 | client_connections          | gauge   | `ip_family`                      | Count of processing client connections.                                                    |
383
 | client_connections          | gauge   | `ip_family`                      | Count of processing client connections.                                                    |
384
 | telegram_connections        | gauge   | `telegram_ip`, `dc`              | Count of connections to Telegram servers.                                                  |
384
 | telegram_connections        | gauge   | `telegram_ip`, `dc`              | Count of connections to Telegram servers.                                                  |
385
 | domain_fronting_connections | gauge   | `ip_family`                      | Count of connections to fronting domain.                                                   |
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
 | telegram_traffic            | counter | `telegram_ip`, `dc`, `direction` | Count of bytes, transmitted to/from Telegram.                                              |
387
 | telegram_traffic            | counter | `telegram_ip`, `dc`, `direction` | Count of bytes, transmitted to/from Telegram.                                              |
387
 | domain_fronting_traffic     | counter | `direction`                      | Count of bytes, transmitted to/from fronting domain.                                       |
388
 | domain_fronting_traffic     | counter | `direction`                      | Count of bytes, transmitted to/from fronting domain.                                       |
388
 | domain_fronting             | counter | –                                | Count of domain fronting events.                                                           |
389
 | domain_fronting             | counter | –                                | Count of domain fronting events.                                                           |
398
 | dc          |                            | A number of the Telegram DC for a connection. |
399
 | dc          |                            | A number of the Telegram DC for a connection. |
399
 | telegram_ip |                            | IP address of the Telegram server.            |
400
 | telegram_ip |                            | IP address of the Telegram server.            |
400
 | direction   | `to_client`, `from_client` | A direction of the traffic flow.              |
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 Zobrazit soubor

102
 				observer.EventConcurrencyLimited(typedEvt)
102
 				observer.EventConcurrencyLimited(typedEvt)
103
 			case mtglib.EventReplayAttack:
103
 			case mtglib.EventReplayAttack:
104
 				observer.EventReplayAttack(typedEvt)
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 Zobrazit soubor

204
 	time.Sleep(100 * time.Millisecond)
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
 func (suite *EventStreamTestSuite) TearDownTest() {
228
 func (suite *EventStreamTestSuite) TearDownTest() {
208
 	suite.stream.Shutdown()
229
 	suite.stream.Shutdown()
209
 	suite.ctxCancel()
230
 	suite.ctxCancel()

+ 3
- 0
events/init.go Zobrazit soubor

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

+ 4
- 0
events/init_test.go Zobrazit soubor

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

+ 15
- 0
events/multi_observer.go Zobrazit soubor

130
 	wg.Wait()
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
 func (m multiObserver) Shutdown() {
148
 func (m multiObserver) Shutdown() {
134
 	for _, v := range m.observers {
149
 	for _, v := range m.observers {
135
 		v.Shutdown()
150
 		v.Shutdown()

+ 1
- 0
events/noop.go Zobrazit soubor

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

+ 3
- 0
events/noop_test.go Zobrazit soubor

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

+ 1
- 1
example.config.toml Zobrazit soubor

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

+ 26
- 9
internal/cli/run_proxy.go Zobrazit soubor

1
 package cli
1
 package cli
2
 
2
 
3
 import (
3
 import (
4
+	"context"
4
 	"fmt"
5
 	"fmt"
5
 	"net"
6
 	"net"
6
 	"net/url"
7
 	"net/url"
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
 	if !conf.Enabled.Get(false) {
93
 	if !conf.Enabled.Get(false) {
90
 		return ipblocklist.NewNoop(), nil
94
 		return ipblocklist.NewNoop(), nil
91
 	}
95
 	}
105
 		ntw,
109
 		ntw,
106
 		conf.DownloadConcurrency.Get(1),
110
 		conf.DownloadConcurrency.Get(1),
107
 		remoteURLs,
111
 		remoteURLs,
108
-		localFiles)
112
+		localFiles,
113
+		updateCallback)
109
 	if err != nil {
114
 	if err != nil {
110
 		return nil, fmt.Errorf("incorrect parameters for firehol: %w", err)
115
 		return nil, fmt.Errorf("incorrect parameters for firehol: %w", err)
111
 	}
116
 	}
159
 
164
 
160
 	logger.BindJSON("configuration", conf.String()).Debug("configuration")
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
 	ntw, err := makeNetwork(conf, version)
172
 	ntw, err := makeNetwork(conf, version)
163
 	if err != nil {
173
 	if err != nil {
164
 		return fmt.Errorf("cannot build network: %w", err)
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
 	if err != nil {
184
 	if err != nil {
169
 		return fmt.Errorf("cannot build ip blocklist: %w", err)
185
 		return fmt.Errorf("cannot build ip blocklist: %w", err)
170
 	}
186
 	}
172
 	var whitelist mtglib.IPBlocklist
188
 	var whitelist mtglib.IPBlocklist
173
 
189
 
174
 	if conf.Defense.Allowlist.Enabled.Get(false) {
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
 		if err != nil {
198
 		if err != nil {
177
 			return fmt.Errorf("cannot build ip allowlist: %w", err)
199
 			return fmt.Errorf("cannot build ip allowlist: %w", err)
178
 		}
200
 		}
180
 		whitelist = whlist
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
 	opts := mtglib.ProxyOpts{
205
 	opts := mtglib.ProxyOpts{
189
 		Logger:          logger,
206
 		Logger:          logger,
190
 		Network:         ntw,
207
 		Network:         ntw,

+ 24
- 12
ipblocklist/firehol.go Zobrazit soubor

23
 	fireholIPv6DefaultCIDR = net.CIDRMask(128, 128) // nolint: gomnd
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
 // Firehol is IPBlocklist which uses lists from FireHOL:
30
 // Firehol is IPBlocklist which uses lists from FireHOL:
27
 // https://iplists.firehol.org/
31
 // https://iplists.firehol.org/
28
 //
32
 //
42
 	logger      mtglib.Logger
46
 	logger      mtglib.Logger
43
 	updateMutex sync.RWMutex
47
 	updateMutex sync.RWMutex
44
 
48
 
45
-	ranger cidranger.Ranger
49
+	updateCallback FireholUpdateCallback
50
+	ranger         cidranger.Ranger
46
 
51
 
47
 	blocklists []files.File
52
 	blocklists []files.File
48
 
53
 
110
 	wg := &sync.WaitGroup{}
115
 	wg := &sync.WaitGroup{}
111
 	wg.Add(len(f.blocklists))
116
 	wg.Add(len(f.blocklists))
112
 
117
 
113
-	treeMutex := &sync.Mutex{}
118
+	mutex := &sync.Mutex{}
114
 	ranger := cidranger.NewPCTrieRanger()
119
 	ranger := cidranger.NewPCTrieRanger()
115
 
120
 
116
 	for _, v := range f.blocklists {
121
 	for _, v := range f.blocklists {
128
 
133
 
129
 			defer fileContent.Close()
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
 				logger.WarningError("update has failed", err)
137
 				logger.WarningError("update has failed", err)
133
 			}
138
 			}
134
 		}(v)
139
 		}(v)
141
 
146
 
142
 	f.ranger = ranger
147
 	f.ranger = ranger
143
 
148
 
149
+	if f.updateCallback != nil {
150
+		f.updateCallback(ctx, ranger.Len())
151
+	}
152
+
144
 	f.logger.Info("ip list was updated")
153
 	f.logger.Info("ip list was updated")
145
 }
154
 }
146
 
155
 
206
 func NewFirehol(logger mtglib.Logger, network mtglib.Network,
215
 func NewFirehol(logger mtglib.Logger, network mtglib.Network,
207
 	downloadConcurrency uint,
216
 	downloadConcurrency uint,
208
 	urls []string,
217
 	urls []string,
209
-	localFiles []string) (*Firehol, error) {
218
+	localFiles []string,
219
+	updateCallback FireholUpdateCallback) (*Firehol, error) {
210
 	blocklists := []files.File{}
220
 	blocklists := []files.File{}
211
 
221
 
212
 	for _, v := range localFiles {
222
 	for _, v := range localFiles {
229
 		blocklists = append(blocklists, file)
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
 func NewFireholFromFiles(logger mtglib.Logger,
245
 func NewFireholFromFiles(logger mtglib.Logger,
236
 	downloadConcurrency uint,
246
 	downloadConcurrency uint,
237
-	blocklists []files.File) (*Firehol, error) {
247
+	blocklists []files.File,
248
+	updateCallback FireholUpdateCallback) (*Firehol, error) {
238
 	if downloadConcurrency == 0 {
249
 	if downloadConcurrency == 0 {
239
 		downloadConcurrency = DefaultFireholDownloadConcurrency
250
 		downloadConcurrency = DefaultFireholDownloadConcurrency
240
 	}
251
 	}
243
 	ctx, cancel := context.WithCancel(context.Background())
254
 	ctx, cancel := context.WithCancel(context.Background())
244
 
255
 
245
 	return &Firehol{
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
 	}, nil
264
 	}, nil
253
 }
265
 }

+ 6
- 4
ipblocklist/firehol_test.go Zobrazit soubor

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

+ 20
- 0
mtglib/events.go Zobrazit soubor

92
 	eventBase
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
 // NewEventStart creates a new EventStart event.
104
 // NewEventStart creates a new EventStart event.
96
 func NewEventStart(streamID string, remoteIP net.IP) EventStart {
105
 func NewEventStart(streamID string, remoteIP net.IP) EventStart {
97
 	return EventStart{
106
 	return EventStart{
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 Zobrazit soubor

69
 	suite.WithinDuration(time.Now(), evt.Timestamp(), 10*time.Millisecond)
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
 func TestEvents(t *testing.T) {
81
 func TestEvents(t *testing.T) {
73
 	t.Parallel()
82
 	t.Parallel()
74
 	suite.Run(t, &EventsTestSuite{})
83
 	suite.Run(t, &EventsTestSuite{})

+ 16
- 0
stats/init.go Zobrazit soubor

89
 	//     Type: counter
89
 	//     Type: counter
90
 	MetricReplayAttacks = "replay_attacks"
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
 	// TagIPFamily defines a name of the 'ip_family' tag and all values.
99
 	// TagIPFamily defines a name of the 'ip_family' tag and all values.
93
 	TagIPFamily = "ip_family"
100
 	TagIPFamily = "ip_family"
94
 
101
 
114
 	// TagDirectionFromClient defines that traffic is sent from a client to
121
 	// TagDirectionFromClient defines that traffic is sent from a client to
115
 	// Telegram.
122
 	// Telegram.
116
 	TagDirectionFromClient = "from_client"
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 Zobrazit soubor

118
 	p.factory.metricReplayAttacks.Inc()
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
 func (p prometheusProcessor) Shutdown() {
130
 func (p prometheusProcessor) Shutdown() {
122
 	for k, v := range p.streams {
131
 	for k, v := range p.streams {
123
 		releaseStreamInfo(v)
132
 		releaseStreamInfo(v)
137
 	metricClientConnections         *prometheus.GaugeVec
146
 	metricClientConnections         *prometheus.GaugeVec
138
 	metricTelegramConnections       *prometheus.GaugeVec
147
 	metricTelegramConnections       *prometheus.GaugeVec
139
 	metricDomainFrontingConnections *prometheus.GaugeVec
148
 	metricDomainFrontingConnections *prometheus.GaugeVec
149
+	metricIPListSize                *prometheus.GaugeVec
140
 
150
 
141
 	metricTelegramTraffic       *prometheus.CounterVec
151
 	metricTelegramTraffic       *prometheus.CounterVec
142
 	metricDomainFrontingTraffic *prometheus.CounterVec
152
 	metricDomainFrontingTraffic *prometheus.CounterVec
197
 			Name:      MetricDomainFrontingConnections,
207
 			Name:      MetricDomainFrontingConnections,
198
 			Help:      "A number of connections which talk to front domain.",
208
 			Help:      "A number of connections which talk to front domain.",
199
 		}, []string{TagIPFamily}),
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
 		metricTelegramTraffic: prometheus.NewCounterVec(prometheus.CounterOpts{
216
 		metricTelegramTraffic: prometheus.NewCounterVec(prometheus.CounterOpts{
202
 			Namespace: metricPrefix,
217
 			Namespace: metricPrefix,
234
 	registry.MustRegister(factory.metricClientConnections)
249
 	registry.MustRegister(factory.metricClientConnections)
235
 	registry.MustRegister(factory.metricTelegramConnections)
250
 	registry.MustRegister(factory.metricTelegramConnections)
236
 	registry.MustRegister(factory.metricDomainFrontingConnections)
251
 	registry.MustRegister(factory.metricDomainFrontingConnections)
252
+	registry.MustRegister(factory.metricIPListSize)
237
 
253
 
238
 	registry.MustRegister(factory.metricTelegramTraffic)
254
 	registry.MustRegister(factory.metricTelegramTraffic)
239
 	registry.MustRegister(factory.metricDomainFrontingTraffic)
255
 	registry.MustRegister(factory.metricDomainFrontingTraffic)

+ 12
- 0
stats/prometheus_test.go Zobrazit soubor

169
 	suite.Contains(data, `mtg_replay_attacks 1`)
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
 func TestPrometheus(t *testing.T) {
184
 func TestPrometheus(t *testing.T) {
173
 	t.Parallel()
185
 	t.Parallel()
174
 	suite.Run(t, &PrometheusTestSuite{})
186
 	suite.Run(t, &PrometheusTestSuite{})

+ 9
- 0
stats/statsd.go Zobrazit soubor

121
 	s.client.Incr(MetricReplayAttacks, 1)
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
 func (s statsdProcessor) Shutdown() {
133
 func (s statsdProcessor) Shutdown() {
125
 	events := make([]mtglib.EventFinish, 0, len(s.streams))
134
 	events := make([]mtglib.EventFinish, 0, len(s.streams))
126
 
135
 

+ 16
- 0
stats/statsd_test.go Zobrazit soubor

196
 	suite.Equal("mtg.replay_attacks:1|c", suite.statsdServer.String())
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
 func TestStatsd(t *testing.T) {
215
 func TestStatsd(t *testing.T) {
200
 	t.Parallel()
216
 	t.Parallel()
201
 	suite.Run(t, &StatsdTestSuite{})
217
 	suite.Run(t, &StatsdTestSuite{})

Načítá se…
Zrušit
Uložit