conrad 1.0.0 → 2.0.0
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 +4 -4
- data/lib/conrad/emitters/sqs.rb +28 -0
- data/lib/conrad/emitters/stdout.rb +11 -0
- data/lib/conrad/formatters/json.rb +20 -0
- data/lib/conrad/processors/add_timestamp.rb +54 -0
- data/lib/conrad/processors/add_uuid.rb +27 -0
- data/lib/conrad/processors/envelope.rb +45 -0
- data/lib/conrad/processors.rb +1 -0
- data/lib/conrad/recorder.rb +11 -7
- data/lib/conrad/version.rb +1 -1
- data/lib/conrad.rb +4 -1
- metadata +23 -6
- data/lib/conrad/add_timestamp.rb +0 -52
- data/lib/conrad/add_uuid.rb +0 -24
- data/lib/conrad/json_formatter.rb +0 -17
- data/lib/conrad/stdout_emitter.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd153974202827badd3ab0b1e74ac823ac9ad67d7ac17ae627afcd0c9c9c5f93
|
4
|
+
data.tar.gz: b549b8ac875f6b0654f693c751946192158538ba3d56fc29b3e4bb896e665467
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e304189667f80f0e6e7e8a206881d9cfa17d4289d1737ce0c7f96b655a97da5c266f8e3435586bfe9e2b3d3e8b88a112485d27bc53bf3ee5c29a72525a69d896
|
7
|
+
data.tar.gz: 3c95e0f400d386782d8dd00f1ff8203e67f46799b8fa93a538c4419ca5b58fe326d1fcbb6672939a6c12b1fc7e9358e42ddb737247dfa2cb60c725770fc4b9d8
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Conrad
|
2
|
+
# A module containing all of conrad's built in event emitters for outputting events
|
3
|
+
module Emitters
|
4
|
+
# Basic emitter for sending events to AWS's sqs.
|
5
|
+
class Sqs
|
6
|
+
attr_reader :queue_url, :region, :access_key_id, :secret_access_key
|
7
|
+
|
8
|
+
# Takes in and stores SQS region, url and creds for accessing a queue.
|
9
|
+
def initialize(queue_url:, region:, access_key_id:, secret_access_key:)
|
10
|
+
@queue_url = queue_url
|
11
|
+
@region = region
|
12
|
+
@access_key_id = access_key_id
|
13
|
+
@secret_access_key = secret_access_key
|
14
|
+
|
15
|
+
@client ||= Aws::SQS::Client.new(
|
16
|
+
region: region,
|
17
|
+
access_key_id: access_key_id,
|
18
|
+
secret_access_key: secret_access_key
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Sends an event up to SQS
|
23
|
+
def call(event)
|
24
|
+
@client.send_message(queue_url: queue_url, message_body: event)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Conrad
|
6
|
+
# A module containing all of conrad's event formatters.
|
7
|
+
module Formatters
|
8
|
+
# Formats a given Hash into a presentable JSON format.
|
9
|
+
class JSON
|
10
|
+
# Formats a given Hash into a presentable JSON format.
|
11
|
+
#
|
12
|
+
# @param event [Hash] event to be formatted
|
13
|
+
#
|
14
|
+
# @return [String] JSON formatted string
|
15
|
+
def call(event)
|
16
|
+
event.to_json
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'conrad/errors'
|
2
|
+
|
3
|
+
module Conrad
|
4
|
+
module Processors
|
5
|
+
# Used to add timestamps to an audit event in seconds or milliseconds.
|
6
|
+
#
|
7
|
+
# @!attribute [r] generator
|
8
|
+
# object used to generate the timestamp
|
9
|
+
class AddTimestamp
|
10
|
+
# :nodoc:
|
11
|
+
class Error < Conrad::Error; end
|
12
|
+
|
13
|
+
# Types of units supported for generation.
|
14
|
+
ALLOWED_TIME_UNITS = %i[milliseconds seconds].freeze
|
15
|
+
|
16
|
+
attr_reader :generator, :timestamp_key
|
17
|
+
|
18
|
+
# Creates a new instance of AddTimestmap processor
|
19
|
+
#
|
20
|
+
# @param units [Symbol] type of time units for the timestamp generated.
|
21
|
+
# Allows :seconds or :milliseconds.
|
22
|
+
# @param timestamp_key [Symbol] key to add to the event hash.
|
23
|
+
# @raise [ArgumentError] if the given units value is not one of
|
24
|
+
# ALLOWED_TIME_UNITS
|
25
|
+
def initialize(units: :milliseconds, timestamp_key: :timestamp)
|
26
|
+
unless ALLOWED_TIME_UNITS.include? units
|
27
|
+
raise ArgumentError, "Provided units of `#{units}` must be one of #{ALLOWED_TIME_UNITS}"
|
28
|
+
end
|
29
|
+
|
30
|
+
@generator = generator_from_units(units)
|
31
|
+
@timestamp_key = timestamp_key
|
32
|
+
end
|
33
|
+
|
34
|
+
# Generates and adds a timestamp to the provided Hash.
|
35
|
+
#
|
36
|
+
# @param event [Hash]
|
37
|
+
# @return [Hash]
|
38
|
+
def call(event)
|
39
|
+
event.merge(timestamp_key => generator.call)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def generator_from_units(units)
|
45
|
+
case units
|
46
|
+
when :milliseconds then -> { (Time.now.to_f * 1000).to_i }
|
47
|
+
when :seconds then -> { Time.now.to_i }
|
48
|
+
else
|
49
|
+
raise UnrecognizedTimeUnit, units
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
3
|
+
module Conrad
|
4
|
+
# A module containing conrad's processors. They're used to modify events or add metadata before being output.
|
5
|
+
module Processors
|
6
|
+
# Generalized processor for inserting a UUID into the event. Allows
|
7
|
+
# configuring the key used for insertion.
|
8
|
+
#
|
9
|
+
# @!attribute [r] uuid_key
|
10
|
+
# The key inserted into the event hash for the generated UUID.
|
11
|
+
class AddUUID
|
12
|
+
attr_reader :uuid_key
|
13
|
+
|
14
|
+
# @param uuid_key [Symbol] key to use for the generated UUID
|
15
|
+
def initialize(uuid_key = :event_uuid)
|
16
|
+
@uuid_key = uuid_key
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param event [Hash] the current event
|
20
|
+
#
|
21
|
+
# @return [Hash] the hash with the UUID inserted
|
22
|
+
def call(event)
|
23
|
+
event.merge(uuid_key => SecureRandom.uuid)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Conrad
|
2
|
+
module Processors
|
3
|
+
# Processor class used to take a given event, extract a set of attributes from
|
4
|
+
# it, then wrap the remaining attributes into a payload attribute. This allows
|
5
|
+
# downstream consumers to know about the outermost structure (the envelope)
|
6
|
+
# without needing to account for all possible permutations of the event. This
|
7
|
+
# also allows routing through various systems on a small number of values. If
|
8
|
+
# a given envelope key does not exist in the original event, then it will be
|
9
|
+
# set to nil in the resulting event.
|
10
|
+
#
|
11
|
+
# When using this processor, it is highly recommended that this be the last
|
12
|
+
# processor unless you need to act on the wrapped event.
|
13
|
+
#
|
14
|
+
# @attribute envelope_keys [r]
|
15
|
+
# @attribute payload_key [r]
|
16
|
+
class Envelope
|
17
|
+
attr_reader :envelope_keys, :payload_key
|
18
|
+
|
19
|
+
# @param envelope_keys [Array<Symbol>] the keys to extract from the event.
|
20
|
+
# NOTE: These must be exact matches of both value and type (i.e. Strings
|
21
|
+
# and Symbols should not be considered interchangeable, and the event
|
22
|
+
# must be created with the attribute keys matching the types given here)
|
23
|
+
# @param payload_key [Symbol] key to wrap the remainder of the event inside
|
24
|
+
#
|
25
|
+
# @raise [TypeError] if the envelope_keys argument is not an Array
|
26
|
+
def initialize(envelope_keys, payload_key: :payload)
|
27
|
+
raise TypeError, 'envelope_keys must be an Array' unless envelope_keys.is_a? Array
|
28
|
+
|
29
|
+
@envelope_keys = envelope_keys
|
30
|
+
@payload_key = payload_key
|
31
|
+
end
|
32
|
+
|
33
|
+
# @param event [Hash] event to be wrapped in the configured envelope
|
34
|
+
#
|
35
|
+
# @return [Hash] the wrapped event
|
36
|
+
def call(event)
|
37
|
+
envelope = envelope_keys.each_with_object({}) do |key, obj|
|
38
|
+
obj[key] = event.delete(key)
|
39
|
+
end
|
40
|
+
|
41
|
+
envelope.merge(payload_key => event)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Dir['conrad/processors/*.rb'].each { |file| require file }
|
data/lib/conrad/recorder.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'conrad/errors'
|
2
|
-
require 'conrad/
|
3
|
-
require 'conrad/
|
2
|
+
require 'conrad/emitters/stdout'
|
3
|
+
require 'conrad/formatters/json'
|
4
4
|
|
5
5
|
module Conrad
|
6
6
|
# Provides the ability to record an event took place.
|
@@ -10,12 +10,12 @@ module Conrad
|
|
10
10
|
#
|
11
11
|
# @!attribute [r] formatter
|
12
12
|
# Configured formatter for creating the final event. Defaults to
|
13
|
-
#
|
14
|
-
# @see Conrad::
|
13
|
+
# JSON.
|
14
|
+
# @see Conrad::JSON
|
15
15
|
# @!attribute [r] emitter
|
16
16
|
# Configured emitter for sending the final event. Defaults to
|
17
|
-
#
|
18
|
-
# @see Conrad::
|
17
|
+
# Stdout.
|
18
|
+
# @see Conrad::Stdout
|
19
19
|
# @!attribute [r] processors
|
20
20
|
# Configured processors for processing the event pre-formatting and
|
21
21
|
# emission. Defaults to an empty array.
|
@@ -31,7 +31,11 @@ module Conrad
|
|
31
31
|
#
|
32
32
|
# @raise [ArgumentError] if the formatter, emitter, or any of the
|
33
33
|
# processors do not respond_to? `call` with a truthy value.
|
34
|
-
def initialize(
|
34
|
+
def initialize(
|
35
|
+
formatter: Conrad::Formatters::JSON.new,
|
36
|
+
emitter: Conrad::Emitters::Stdout.new,
|
37
|
+
processors: []
|
38
|
+
)
|
35
39
|
check_callability(formatter: formatter, emitter: emitter, processors: processors)
|
36
40
|
|
37
41
|
@formatter = formatter
|
data/lib/conrad/version.rb
CHANGED
data/lib/conrad.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
Gem.find_files('conrad/processors/*.rb').each { |file| require file }
|
2
|
+
Gem.find_files('conrad/formatters/*.rb').each { |file| require file }
|
3
|
+
Gem.find_files('conrad/emitters/*.rb').each { |file| require file }
|
4
|
+
Gem.find_files('conrad/*.rb').each { |file| require file }
|
2
5
|
|
3
6
|
# :nodoc:
|
4
7
|
module Conrad
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: conrad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathon Anderson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aws-sdk
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: minitest
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -60,12 +74,15 @@ extensions: []
|
|
60
74
|
extra_rdoc_files: []
|
61
75
|
files:
|
62
76
|
- lib/conrad.rb
|
63
|
-
- lib/conrad/
|
64
|
-
- lib/conrad/
|
77
|
+
- lib/conrad/emitters/sqs.rb
|
78
|
+
- lib/conrad/emitters/stdout.rb
|
65
79
|
- lib/conrad/errors.rb
|
66
|
-
- lib/conrad/
|
80
|
+
- lib/conrad/formatters/json.rb
|
81
|
+
- lib/conrad/processors.rb
|
82
|
+
- lib/conrad/processors/add_timestamp.rb
|
83
|
+
- lib/conrad/processors/add_uuid.rb
|
84
|
+
- lib/conrad/processors/envelope.rb
|
67
85
|
- lib/conrad/recorder.rb
|
68
|
-
- lib/conrad/stdout_emitter.rb
|
69
86
|
- lib/conrad/version.rb
|
70
87
|
homepage: https://github.com/getoutreach/conrad
|
71
88
|
licenses:
|
data/lib/conrad/add_timestamp.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'conrad/errors'
|
2
|
-
|
3
|
-
module Conrad
|
4
|
-
# Used to add timestamps to an audit event in seconds or milliseconds.
|
5
|
-
#
|
6
|
-
# @!attribute [r] generator
|
7
|
-
# object used to generate the timestamp
|
8
|
-
class AddTimestamp
|
9
|
-
# :nodoc:
|
10
|
-
class Error < Conrad::Error; end
|
11
|
-
|
12
|
-
# Types of units supported for generation.
|
13
|
-
ALLOWED_TIME_UNITS = %i[milliseconds seconds].freeze
|
14
|
-
|
15
|
-
attr_reader :generator, :timestamp_key
|
16
|
-
|
17
|
-
# Creates a new instance of AddTimestmap processor
|
18
|
-
#
|
19
|
-
# @param units [Symbol] type of time units for the timestamp generated.
|
20
|
-
# Allows :seconds or :milliseconds.
|
21
|
-
# @param timestamp_key [Symbol] key to add to the event hash.
|
22
|
-
# @raise [ArgumentError] if the given units value is not one of
|
23
|
-
# ALLOWED_TIME_UNITS
|
24
|
-
def initialize(units: :milliseconds, timestamp_key: :timestamp)
|
25
|
-
unless ALLOWED_TIME_UNITS.include? units
|
26
|
-
raise ArgumentError, "Provided units of `#{units}` must be one of #{ALLOWED_TIME_UNITS}"
|
27
|
-
end
|
28
|
-
|
29
|
-
@generator = generator_from_units(units)
|
30
|
-
@timestamp_key = timestamp_key
|
31
|
-
end
|
32
|
-
|
33
|
-
# Generates and adds a timestamp to the provided Hash.
|
34
|
-
#
|
35
|
-
# @param event [Hash]
|
36
|
-
# @return [Hash]
|
37
|
-
def call(event)
|
38
|
-
event.merge(timestamp_key => generator.call)
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def generator_from_units(units)
|
44
|
-
case units
|
45
|
-
when :milliseconds then -> { (Time.now.to_f * 1000).to_i }
|
46
|
-
when :seconds then -> { Time.now.to_i }
|
47
|
-
else
|
48
|
-
raise UnrecognizedTimeUnit, units
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
data/lib/conrad/add_uuid.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'securerandom'
|
2
|
-
|
3
|
-
module Conrad
|
4
|
-
# Generalized processor for inserting a UUID into the event. Allows
|
5
|
-
# configuring the key used for insertion.
|
6
|
-
#
|
7
|
-
# @!attribute [r] uuid_key
|
8
|
-
# The key inserted into the event hash for the generated UUID.
|
9
|
-
class AddUUID
|
10
|
-
attr_reader :uuid_key
|
11
|
-
|
12
|
-
# @param uuid_key [Symbol] key to use for the generated UUID
|
13
|
-
def initialize(uuid_key = :event_uuid)
|
14
|
-
@uuid_key = uuid_key
|
15
|
-
end
|
16
|
-
|
17
|
-
# @param event [Hash] the current event
|
18
|
-
#
|
19
|
-
# @return [Hash] the hash with the UUID inserted
|
20
|
-
def call(event)
|
21
|
-
event.merge(uuid_key => SecureRandom.uuid)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'json'
|
4
|
-
|
5
|
-
module Conrad
|
6
|
-
# Formats a given Hash into a presentable JSON format.
|
7
|
-
class JSONFormatter
|
8
|
-
# Formats a given Hash into a presentable JSON format.
|
9
|
-
#
|
10
|
-
# @param event [Hash] event to be formatted
|
11
|
-
#
|
12
|
-
# @return [String] JSON formatted string
|
13
|
-
def call(event)
|
14
|
-
event.to_json
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|