1
1
# -*- coding: utf-8 -*-
2
2
import unittest
3
+ from datetime import datetime , timedelta
3
4
from localstack .constants import APPLICATION_AMZ_JSON_1_1
4
5
from localstack .utils .aws import aws_stack
5
6
from localstack .utils import testutil
@@ -19,15 +20,11 @@ def test_put_events_multi_bytes_msg(self):
19
20
20
21
groups_before = len (self .logs_client .describe_log_groups ()['logGroups' ])
21
22
22
- response = self .logs_client .create_log_group (logGroupName = group )
23
- self .assertEqual (response ['ResponseMetadata' ]['HTTPStatusCode' ], 200 )
23
+ response = self .create_log_group_and_stream (group , stream )
24
24
25
25
groups_after = len (self .logs_client .describe_log_groups ()['logGroups' ])
26
26
self .assertEqual (groups_after , groups_before + 1 )
27
27
28
- response = self .logs_client .create_log_stream (logGroupName = group , logStreamName = stream )
29
- self .assertEqual (response ['ResponseMetadata' ]['HTTPStatusCode' ], 200 )
30
-
31
28
# send message with non-ASCII (multi-byte) chars
32
29
body_msg = '🙀 - 参よ - 日本語'
33
30
events = [{
@@ -49,8 +46,7 @@ def test_filter_log_events_response_header(self):
49
46
group = 'lg-%s' % short_uid ()
50
47
stream = 'ls-%s' % short_uid ()
51
48
52
- self .logs_client .create_log_group (logGroupName = group )
53
- self .logs_client .create_log_stream (logGroupName = group , logStreamName = stream )
49
+ self .create_log_group_and_stream (group , stream )
54
50
55
51
events = [
56
52
{'timestamp' : 1585902800 , 'message' : 'log message 1' },
@@ -78,7 +74,6 @@ def test_list_tags_log_group(self):
78
74
'env' : 'testing1'
79
75
}
80
76
)
81
-
82
77
rs = self .logs_client .list_tags_log_group (
83
78
logGroupName = group
84
79
)
@@ -150,13 +145,7 @@ def test_put_subscription_filter_firehose(self):
150
145
)
151
146
firehose_arn = response ['DeliveryStreamARN' ]
152
147
153
- self .logs_client .create_log_group (
154
- logGroupName = log_group
155
- )
156
- self .logs_client .create_log_stream (
157
- logGroupName = log_group ,
158
- logStreamName = log_stream
159
- )
148
+ self .create_log_group_and_stream (log_group , log_stream )
160
149
161
150
self .logs_client .put_subscription_filter (
162
151
logGroupName = log_group ,
@@ -208,13 +197,7 @@ def test_put_subscription_filter_kinesis(self):
208
197
209
198
kinesis_client = aws_stack .connect_to_service ('kinesis' )
210
199
211
- self .logs_client .create_log_group (
212
- logGroupName = log_group
213
- )
214
- self .logs_client .create_log_stream (
215
- logGroupName = log_group ,
216
- logStreamName = log_stream
217
- )
200
+ self .create_log_group_and_stream (log_group , log_stream )
218
201
219
202
kinesis_client .create_stream (
220
203
StreamName = kinesis ,
@@ -267,3 +250,59 @@ def put_event():
267
250
StreamName = kinesis ,
268
251
EnforceConsumerDeletion = True
269
252
)
253
+
254
+ def test_metric_filters (self ):
255
+ log_group = 'g-%s' % short_uid ()
256
+ log_stream = 's-%s' % short_uid ()
257
+ filter_name = 'f-%s' % short_uid ()
258
+ metric_ns = 'ns-%s' % short_uid ()
259
+ metric_name = 'metric1'
260
+ transforms = {
261
+ 'metricNamespace' : metric_ns ,
262
+ 'metricName' : metric_name ,
263
+ 'metricValue' : '1' ,
264
+ 'defaultValue' : 123
265
+ }
266
+ result = self .logs_client .put_metric_filter (logGroupName = log_group ,
267
+ filterName = filter_name , filterPattern = '*' , metricTransformations = [transforms ])
268
+ self .assertEqual (result ['ResponseMetadata' ]['HTTPStatusCode' ], 200 )
269
+
270
+ result = self .logs_client .describe_metric_filters (logGroupName = log_group , filterNamePrefix = 'f-' )
271
+ self .assertEqual (result ['ResponseMetadata' ]['HTTPStatusCode' ], 200 )
272
+ result = [mf for mf in result ['metricFilters' ] if mf ['filterName' ] == filter_name ]
273
+ self .assertEqual (len (result ), 1 )
274
+
275
+ # put log events and assert metrics being published
276
+ events = [
277
+ {'timestamp' : 1585902800 , 'message' : 'log message 1' },
278
+ {'timestamp' : 1585902961 , 'message' : 'log message 2' }
279
+ ]
280
+ self .create_log_group_and_stream (log_group , log_stream )
281
+ self .logs_client .put_log_events (logGroupName = log_group , logStreamName = log_stream , logEvents = events )
282
+
283
+ # Get metric data
284
+ cw_client = aws_stack .connect_to_service ('cloudwatch' )
285
+ metric_data = cw_client .get_metric_data (
286
+ MetricDataQueries = [{'Id' : 'q1' , 'MetricStat' : {'Metric' :
287
+ {'Namespace' : metric_ns , 'MetricName' : metric_name }, 'Period' : 60 , 'Stat' : 'Sum' }}],
288
+ StartTime = datetime .utcnow () - timedelta (hours = 1 ),
289
+ EndTime = datetime .utcnow (),
290
+ )['MetricDataResults' ]
291
+ self .assertEquals (len (metric_data ), 1 )
292
+ self .assertEquals (metric_data [0 ]['Values' ], [1 ])
293
+ self .assertEquals (metric_data [0 ]['StatusCode' ], 'Complete' )
294
+
295
+ # delete filters
296
+ result = self .logs_client .delete_metric_filter (logGroupName = log_group , filterName = filter_name )
297
+ self .assertEqual (result ['ResponseMetadata' ]['HTTPStatusCode' ], 200 )
298
+
299
+ result = self .logs_client .describe_metric_filters (logGroupName = log_group , filterNamePrefix = 'f-' )
300
+ self .assertEqual (result ['ResponseMetadata' ]['HTTPStatusCode' ], 200 )
301
+ result = [mf for mf in result ['metricFilters' ] if mf ['filterName' ] == filter_name ]
302
+ self .assertEqual (len (result ), 0 )
303
+
304
+ def create_log_group_and_stream (self , log_group , log_stream ):
305
+ response = self .logs_client .create_log_group (logGroupName = log_group )
306
+ self .assertEqual (response ['ResponseMetadata' ]['HTTPStatusCode' ], 200 )
307
+ response = self .logs_client .create_log_stream (logGroupName = log_group , logStreamName = log_stream )
308
+ self .assertEqual (response ['ResponseMetadata' ]['HTTPStatusCode' ], 200 )
0 commit comments