awsutils 2.1.2 → 2.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -0
- data/awsutils.gemspec +1 -1
- data/bin/awslogs +1 -2
- data/lib/awsutils/awslogs.rb +71 -8
- data/lib/awsutils/version.rb +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95f34da34fad24fe442ee18a0b59ba3b6785e6b8
|
4
|
+
data.tar.gz: f809b1fdee1e38c522ecfd888da1497e20c01d54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0653f177362210ad4875cc64bb1722bac7f0095041c8e2c219779e6873141eff533bd45af70d0fff93f7d9b405dbdbaf02c7862f86efd346bd6c1e10f3f333ec
|
7
|
+
data.tar.gz: ce754a5256133a11d5a3ca311af86ee4a2c2990af2a88272b06f00ce136b7824b981e67554c4b4d374922795b7bd31c631246fe644c928db03fbe9a92b5e51a3
|
data/.rubocop.yml
ADDED
data/awsutils.gemspec
CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
|
29
29
|
spec.add_dependency 'facets', '~> 2.9'
|
30
30
|
spec.add_dependency 'rainbow', '~> 2.0'
|
31
|
-
spec.add_dependency 'fog-aws', '~> 0.
|
31
|
+
spec.add_dependency 'fog-aws', '~> 0.11.0'
|
32
32
|
spec.add_dependency 'trollop'
|
33
33
|
spec.add_dependency 'aws-sdk'
|
34
34
|
end
|
data/bin/awslogs
CHANGED
data/lib/awsutils/awslogs.rb
CHANGED
@@ -2,23 +2,59 @@ require 'trollop'
|
|
2
2
|
require 'aws-sdk'
|
3
3
|
require 'time'
|
4
4
|
|
5
|
+
class LogGroupNotFoundError < StandardError; end
|
6
|
+
class MultipleGroupsError < StandardError; end
|
7
|
+
class TooManyEventsError < StandardError; end
|
8
|
+
class TooManyStreamsError < StandardError; end
|
9
|
+
class NoStreamsError < StandardError; end
|
10
|
+
|
5
11
|
module AwsUtils
|
6
12
|
class AwsLogs
|
7
13
|
LOG_LEVELS = %w(TRACE DEBUG INFO NOTICE WARNING ERROR FATAL).freeze
|
14
|
+
MAX_EVENTS = 100000.freeze
|
15
|
+
MAX_STREAMS = 100.freeze
|
16
|
+
|
17
|
+
def run
|
18
|
+
print_events
|
19
|
+
rescue TooManyEventsError
|
20
|
+
puts "Too many log events to process (MAX: #{MAX_EVENTS}). " \
|
21
|
+
'Please try filtering the output with -f'
|
22
|
+
exit 3
|
23
|
+
rescue TooManyStreamsError
|
24
|
+
puts "Too many streams to process (MAX: #{MAX_STREAMS}). " \
|
25
|
+
'Please try filtering the output with -s'
|
26
|
+
exit 3
|
27
|
+
rescue LogGroupNotFoundError
|
28
|
+
puts "No log groups found starting with #{opts[:group]}"
|
29
|
+
exit 1
|
30
|
+
rescue NoStreamsError
|
31
|
+
puts 'Streams filter did not return any streams'
|
32
|
+
exit 1
|
33
|
+
rescue MultipleGroupsError => e
|
34
|
+
puts e.message
|
35
|
+
exit 2
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
8
39
|
|
9
40
|
def opts
|
10
41
|
@opts ||= Trollop.options do
|
42
|
+
opt :age,
|
43
|
+
'Max age in seconds',
|
44
|
+
short: 'a',
|
45
|
+
type: Integer
|
11
46
|
opt :group,
|
12
47
|
'Log group (e.g. /aws/lambda/sf-updater)',
|
13
48
|
required: true,
|
14
|
-
type:
|
49
|
+
type: String,
|
15
50
|
short: 'g'
|
16
51
|
opt :filter_pattern,
|
17
52
|
'See: http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/FilterAndPatternSyntax.html',
|
53
|
+
type: String,
|
18
54
|
short: 'f'
|
19
55
|
opt :streams_prefix,
|
20
56
|
'E.g. 2016/08',
|
21
|
-
|
57
|
+
type: String,
|
22
58
|
short: 's'
|
23
59
|
opt :timestamp,
|
24
60
|
'Include the timestamp from the event metadata in the output',
|
@@ -42,16 +78,30 @@ module AwsUtils
|
|
42
78
|
end
|
43
79
|
end
|
44
80
|
|
81
|
+
def log_group_name
|
82
|
+
@log_group ||= begin
|
83
|
+
r = cloudwatchlogs.describe_log_groups log_group_name_prefix: opts[:group]
|
84
|
+
return r.log_groups.first.log_group_name if r.log_groups.count == 1
|
85
|
+
raise LogGroupNotFoundError if r.log_groups.empty?
|
86
|
+
err_msg = "Group filter #{opts[:group]} found multiple groups:\n\n"
|
87
|
+
err_msg += r.log_groups.map(&:log_group_name).join("\n")
|
88
|
+
err_msg += "\nMore than 50 log groups returned. Only showed the first 50." if r.next_token
|
89
|
+
raise MultipleGroupsError, err_msg
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
45
93
|
def chunk_events(streams_chunk, token = nil)
|
46
94
|
parameters = {
|
47
|
-
log_group_name:
|
95
|
+
log_group_name: log_group_name,
|
48
96
|
log_stream_names: streams_chunk,
|
97
|
+
start_time: max_age_ts,
|
49
98
|
next_token: token
|
50
99
|
}
|
51
100
|
parameters[:filter_pattern] = opts[:filter_pattern] if opts[:filter_pattern]
|
52
101
|
response = cloudwatchlogs.filter_log_events parameters
|
53
102
|
collector = response.events
|
54
103
|
collector += chunk_events(streams_chunk, response.next_token) if response.next_token
|
104
|
+
raise TooManyEventsError if collector.count > MAX_EVENTS
|
55
105
|
collector
|
56
106
|
end
|
57
107
|
|
@@ -76,6 +126,7 @@ module AwsUtils
|
|
76
126
|
print "#{ev.log_stream_name}: " if opts[:show_stream_name]
|
77
127
|
print Time.at(ev.timestamp / 1e3).iso8601(3) + ' ' if opts[:timestamp]
|
78
128
|
print ev.message
|
129
|
+
print "\n" if ev.message[-1] != "\n"
|
79
130
|
next
|
80
131
|
end
|
81
132
|
|
@@ -101,16 +152,28 @@ module AwsUtils
|
|
101
152
|
end
|
102
153
|
|
103
154
|
def streams(token = nil)
|
104
|
-
|
105
|
-
log_group_name:
|
106
|
-
log_stream_name_prefix: opts[:streams_prefix],
|
155
|
+
parameters = {
|
156
|
+
log_group_name: log_group_name,
|
107
157
|
next_token: token
|
108
|
-
|
109
|
-
|
158
|
+
}
|
159
|
+
parameters[:log_stream_name_prefix] = opts[:streams_prefix] if opts[:streams_prefix]
|
160
|
+
response = cloudwatchlogs.describe_log_streams parameters
|
161
|
+
collector =
|
162
|
+
response
|
163
|
+
.log_streams
|
164
|
+
.select { |s| s.last_event_timestamp && s.last_event_timestamp > max_age_ts }
|
165
|
+
.map(&:log_stream_name)
|
166
|
+
fail NoStreamsError if token.nil? && collector.count == 0
|
110
167
|
collector += streams(response.next_token) if response.next_token
|
168
|
+
fail TooManyStreamsError if collector.count > MAX_STREAMS
|
111
169
|
collector
|
112
170
|
end
|
113
171
|
|
172
|
+
def max_age_ts
|
173
|
+
return 0 unless opts[:age]
|
174
|
+
(Time.at(Time.now - opts[:age]).to_f * 1_000).to_i
|
175
|
+
end
|
176
|
+
|
114
177
|
def cloudwatchlogs
|
115
178
|
@cloudwatchlogs ||= Aws::CloudWatchLogs::Client.new
|
116
179
|
end
|
data/lib/awsutils/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awsutils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Herot
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -142,14 +142,14 @@ dependencies:
|
|
142
142
|
requirements:
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 0.
|
145
|
+
version: 0.11.0
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 0.
|
152
|
+
version: 0.11.0
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: trollop
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -195,6 +195,7 @@ extensions: []
|
|
195
195
|
extra_rdoc_files: []
|
196
196
|
files:
|
197
197
|
- ".gitignore"
|
198
|
+
- ".rubocop.yml"
|
198
199
|
- Gemfile
|
199
200
|
- LICENSE.txt
|
200
201
|
- README.md
|
@@ -245,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
245
246
|
version: '0'
|
246
247
|
requirements: []
|
247
248
|
rubyforge_project:
|
248
|
-
rubygems_version: 2.
|
249
|
+
rubygems_version: 2.5.1
|
249
250
|
signing_key:
|
250
251
|
specification_version: 4
|
251
252
|
summary: A set of tools for interacting with AWS (summary)
|