tpt_serverless 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b77f8c69c7659ad042a65c49fd24d10dce69561ad50bb5be5cc1769c10772c04
4
- data.tar.gz: 9183232aa41d8575f48272ac3b9cd98f0e528e25854380eae93ea05d1d3b8b76
3
+ metadata.gz: 4e40167211120d2403b0f6c91770b43384ff2d9781cb0282e2fad5c34f0a1459
4
+ data.tar.gz: 790516d5026b0a26123d929ddab13424e46ce56e27eb7de1dcd05d135cd7dba5
5
5
  SHA512:
6
- metadata.gz: 531e07d718df8e8b6d040e088bfad8798f6c259faf47c9cc77ffafee653376c07263e76f075bb65c4ee70ec9f13c44f95bba45026e9275b4ad0c5e39a9cacbd5
7
- data.tar.gz: 1a08cdd1f3e073bca3517bd617eefb06cf7df36836a3d949f8a4413d794cd55859abd0a7f0032d54d0275b9cf98106eb1439915e3368d8cb00b859e95152e0b7
6
+ metadata.gz: 4731b9cf978c054b73779578280757be12d8e7ecc08305bdf5e87a6b3d272ac3f6101eddd6fdf3f9d60371126b227603a6eb218156d73a05e2856a72fcf83d22
7
+ data.tar.gz: f0f048fb5a0b0f02b34c2a06e5a157b8727ae13cfdb69c8fa2a3ebced4132c939e4a3b833a7d438c800fc00830e58f31279c1b2d75086c1ba6399a5694b51711
@@ -1,4 +1,5 @@
1
1
  require "tpt_serverless/version"
2
+ require 'tpt_serverless/sumo_log_forwarder'
2
3
 
3
4
  module TptServerless
4
5
  class Error < StandardError; end
@@ -6,7 +6,7 @@ Example of how to add this to your `serverless.yml`:
6
6
  forwardLogs:
7
7
  name: ${self:service.name}-forwardLogs-${self:provider.stage}
8
8
  # NOTE: Ensure that you update the path below if you update the tpt_serverless gem
9
- handler: /opt/ruby/2.5.0/gems/tpt_serverless-X.X.X/lib/tpt_serverless/sumo_log_forwarder.rb
9
+ handler: /opt/ruby/2.5.0/gems/tpt_serverless-X.X.X/lib/tpt_serverless/sumo_log_forwarder.SumoLogForwarder.handler
10
10
  timeout: 10 # seconds
11
11
  environment:
12
12
  SUMO_ENDPOINT: ${self:custom.sumoEndpoint}
@@ -22,84 +22,86 @@ require 'base64'
22
22
 
23
23
  TIME_REGEX = /^20\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\.\d\d\dZ/
24
24
 
25
- # This handler receives CloudWatch log events, parses the events and forwards the extracted logs to
26
- # Sumo Logic.
27
- #
28
- # It performs a few helpful cleanup/prep functions as well.
29
- def handler(event: , context:)
30
- sumo_endpoint = ENV['SUMO_ENDPOINT']
31
-
32
- if sumo_endpoint.nil? || sumo_endpoint.strip.empty?
33
- puts 'ERROR: SUMO_ENDPOINT is not set. Skipping log forwarding.'
34
- return
35
- end
36
-
37
- sumo_url = URI.parse(sumo_endpoint)
38
- raw_data = event.fetch('awslogs').fetch('data')
39
- unzipped_data = Zlib::GzipReader.new(StringIO.new(Base64.decode64(raw_data))).read
40
- data = JSON.parse(unzipped_data)
41
-
42
- message_type = data.fetch('messageType')
43
- log_group = data.fetch('logGroup')
44
- log_stream = data.fetch('logStream')
45
- log_events = data.fetch('logEvents')
46
-
47
- if message_type === 'CONTROL_MESSAGE'
48
- puts 'skipping control message'
49
- return
50
- end
51
-
52
- puts "message_count=#{log_events.length}"
53
-
54
- messages_data = extract_messages(log_events).map do |message|
55
- # AWS replaces newlines with carriage returns in Lambda logs
56
- message.gsub(/\r(?!\n)/, "\n")
57
- end.join('')
25
+ class SumoLogForwarder
26
+ class << self
27
+ # This handler receives CloudWatch log events, parses the events and forwards the extracted logs to
28
+ # Sumo Logic.
29
+ #
30
+ # It performs a few helpful cleanup/prep functions as well.
31
+ def handler(event: , context:)
32
+ sumo_endpoint = ENV['SUMO_ENDPOINT']
33
+
34
+ if sumo_endpoint.nil? || sumo_endpoint.strip.empty?
35
+ puts 'ERROR: SUMO_ENDPOINT is not set. Skipping log forwarding.'
36
+ return
37
+ end
38
+
39
+ sumo_url = URI.parse(sumo_endpoint)
40
+ raw_data = event.fetch('awslogs').fetch('data')
41
+ unzipped_data = Zlib.gunzip(Base64.decode64(raw_data))
42
+ data = JSON.parse(unzipped_data)
43
+
44
+ message_type = data.fetch('messageType')
45
+ log_group = data.fetch('logGroup')
46
+ log_stream = data.fetch('logStream')
47
+ log_events = data.fetch('logEvents')
48
+
49
+ if message_type === 'CONTROL_MESSAGE'
50
+ puts 'skipping control message'
51
+ return
52
+ end
53
+
54
+ puts "message_count=#{log_events.length}"
55
+
56
+ messages_data = extract_messages(log_events).map do |message|
57
+ # AWS replaces newlines with carriage returns in Lambda logs
58
+ message.gsub(/\r(?!\n)/, "\n")
59
+ end.join('')
60
+
61
+ send_to_sumo(sumo_url, log_group, log_stream, messages_data)
62
+ end
58
63
 
59
- send_to_sumo(sumo_url, log_group, log_stream, messages_data)
60
- end
64
+ private
61
65
 
62
- private
66
+ def extract_messages(log_events)
67
+ log_events.map do |log_event|
68
+ message = log_event.fetch('message')
69
+ timestamp = Integer(log_event.fetch('timestamp'))
63
70
 
64
- def extract_messages(log_events)
65
- log_events.map do |log_event|
66
- message = log_event.fetch('message')
67
- timestamp = Integer(log_event.fetch('timestamp'))
71
+ # Ensure the message starts with a time.
72
+ # E.g. START/END/REPORT log events don't.
73
+ if TIME_REGEX !~ message
74
+ time_string = Time.at(timestamp/1000.0).utc.strftime('%Y-%m-%dT%H:%M:%S.%LZ')
75
+ message = "#{time_string} #{message}"
76
+ end
68
77
 
69
- # Ensure the message starts with a time.
70
- # E.g. START/END/REPORT log events don't.
71
- if TIME_REGEX !~ message
72
- time_string = Time.at(timestamp/1000.0).utc.strftime('%Y-%m-%dT%H:%M:%S.%LZ')
73
- message = "#{time_string} #{message}"
78
+ message
79
+ end
74
80
  end
75
81
 
76
- message
77
- end
78
- end
79
-
80
- def send_to_sumo(sumo_url, log_group, log_stream, data)
81
- response = Net::HTTP.start(sumo_url.host, sumo_url.port, use_ssl: sumo_url.scheme == 'https') do |http|
82
- http.open_timeout = 3
83
- http.read_timeout = 3
84
-
85
- req = Net::HTTP::Post.new(
86
- sumo_url,
87
- {
88
- 'X-Sumo-Category' => log_group,
89
- 'X-Sumo-Client' => 'cwl-aws-lambda',
90
- 'X-Sumo-Host' => log_group,
91
- 'X-Sumo-Name' => log_stream,
92
- 'Accept' => 'application/json',
93
- 'Content-Type' => 'application/json'
94
- }
95
- )
96
-
97
- req.body = data.to_json
98
-
99
- http.request(req)
100
- end
101
-
102
- if response.code != '200'
103
- response.error!
82
+ def send_to_sumo(sumo_url, log_group, log_stream, data)
83
+ response = Net::HTTP.start(sumo_url.host, sumo_url.port, use_ssl: sumo_url.scheme == 'https') do |http|
84
+ http.open_timeout = 3
85
+ http.read_timeout = 3
86
+
87
+ req = Net::HTTP::Post.new(
88
+ sumo_url,
89
+ {
90
+ 'X-Sumo-Category' => log_group,
91
+ 'X-Sumo-Client' => 'cwl-aws-lambda',
92
+ 'X-Sumo-Host' => log_group,
93
+ 'X-Sumo-Name' => log_stream,
94
+ }
95
+ )
96
+
97
+ req.body = data
98
+
99
+ http.request(req)
100
+ end
101
+
102
+ if response.code != '200'
103
+ response.error!
104
+ end
105
+ end
104
106
  end
105
107
  end
@@ -1,3 +1,3 @@
1
1
  module TptServerless
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tpt_serverless
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - TpT
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-25 00:00:00.000000000 Z
11
+ date: 2020-03-02 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: