tpt_serverless 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: