microservice-harness 0.1.14

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ab1cbbc130840039145fd672e25f2908fc2efadc858244100fda97f6e7aefa84
4
+ data.tar.gz: ab8e3355a4fdd944851859b68065015108ad4dac8cd070ac281fd912fda0fbc0
5
+ SHA512:
6
+ metadata.gz: c8c0200cad6fe0d18d54f4554b6aad1c0ea5e26cb0f89194fae0a945c0f0350421bf4dfcb1665109f634e9fbde6e23a5476ff7900e65a0ad3f9493be1938c9fc
7
+ data.tar.gz: df4330fe2ece28178a3290d9366d628cd50a0828f911a1d602e7acd0dad0ec56c6afb7ca18295251ce737432a1d99e8ef0b6be08fdb2b363528797752043b088
@@ -0,0 +1,29 @@
1
+ module MicroserviceHarness
2
+
3
+ class << self
4
+ attr_accessor :configuration
5
+ end
6
+
7
+ def self.configure
8
+ self.configuration ||= Configuration.new
9
+ yield(configuration)
10
+ raise "ConsumerGroupIDNotSet" unless self.configuration.consumer_group_id
11
+ raise "ServiceNameNotSet" unless self.configuration.service_name
12
+ end
13
+
14
+ class Configuration
15
+ attr_accessor :kafka_hosts
16
+ attr_accessor :topic
17
+ attr_accessor :consumer_group_id
18
+ attr_accessor :log_level
19
+ attr_accessor :service_name
20
+
21
+ def initialize
22
+ @kafka_hosts = ENV.fetch('KAFKA_ADDRESSES', "192.168.235.136").split(",").first
23
+ @topic = "sofadog"
24
+ @consumer_group_id = nil
25
+ @log_level = :info
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,54 @@
1
+ module MicroserviceHarness
2
+
3
+ class Listener
4
+
5
+ def initialize(event_processor:)
6
+ @topic = MicroserviceHarness.configuration.topic
7
+
8
+ config = {
9
+ :"bootstrap.servers" => MicroserviceHarness.configuration.kafka_hosts,
10
+ :"group.id" => MicroserviceHarness.configuration.consumer_group_id
11
+ }
12
+
13
+ @consumer = Rdkafka::Config.new(config).consumer
14
+ @event_processor = event_processor
15
+ @log_level = MicroserviceHarness.configuration.log_level
16
+ end
17
+
18
+ def listen
19
+ @consumer.subscribe(@topic)
20
+
21
+ @consumer.each do |msg|
22
+ begin
23
+ message = JSON.parse(msg.payload)
24
+ rescue Exception => e
25
+ Logger.log(level: "ERROR", message: "Error Parsing Message #{msg.payload}", error_class: e.class, error_message: e.message, error_backtrace: e.backtrace.join("\n"))
26
+ next
27
+ end
28
+
29
+ Logger.log(ttid: message['ttid'], level: "DEBUG", message: "Received message of type #{message}") if @log_level == :debug
30
+
31
+ begin
32
+ if @event_processor.respond_to?(message['event_type'].gsub(".", "_").to_sym)
33
+ start = Time.now
34
+ Logger.log(ttid: message['ttid'], level: "INFO", message: "Processing #{message['event_type']}") if @log_level == :info
35
+ @event_processor.send(message['event_type'].gsub(".", "_").to_sym, message)
36
+ Logger.log(ttid: message['ttid'], level: "INFO", message: "Finished Processing #{message['event_type']} in #{Time.now - start}") if @log_level == :info
37
+ end
38
+ rescue StandardError => e
39
+ event_data = {
40
+ message: "Error #{e.class} #{e.message}",
41
+ error_class: e.class,
42
+ error_message: e.message,
43
+ error_backtrace: e.backtrace.join("\n")
44
+ }
45
+
46
+ MicroserviceHarness::Producer.instance.send_message(ttid: message['ttid'], event_type: "request.failed", event_data: event_data)
47
+
48
+ Logger.log(ttid: message['ttid'], level: "ERROR", message: "Error #{e.class} #{e.message} #{e.backtrace.join("\n")}", error_class: e.class, error_message: e.message, error_backtrace: e.backtrace.join("\n"))
49
+ end
50
+ end
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,23 @@
1
+ module MicroserviceHarness
2
+
3
+ class Logger
4
+
5
+ def self.log(ttid: nil, level:, message:, error_class: nil, error_message: nil, error_backtrace: nil)
6
+ puts "[#{MicroserviceHarness.configuration.service_name}] [#{Time.now}] [#{level}] [#{ttid}] #{message} #{error_class} #{error_message} #{error_backtrace}"
7
+
8
+ event_type = "#{MicroserviceHarness.configuration.service_name}.log"
9
+
10
+ event_data = {
11
+ logged_ttid: ttid, # We cant log the ttid to the main event otherwise it will interfere with request handler
12
+ level: level,
13
+ message: message,
14
+ error_class: error_class,
15
+ error_message: error_message,
16
+ error_backtrace: error_backtrace
17
+ }
18
+
19
+ MicroserviceHarness::Producer.instance.send_message(ttid: SecureRandom.uuid, event_type: event_type, event_data: event_data)
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,25 @@
1
+ require 'singleton'
2
+
3
+ module MicroserviceHarness
4
+
5
+ class Producer
6
+ include Singleton
7
+
8
+ def initialize
9
+ config = {:"bootstrap.servers" => MicroserviceHarness.configuration.kafka_hosts, :"message.max.bytes" => 100000000 }
10
+ @producer = Rdkafka::Config.new(config).producer
11
+ @topic = MicroserviceHarness.configuration.topic
12
+ end
13
+
14
+ def send_message(ttid:, event_type:, event_data:)
15
+ message = {
16
+ ttid: ttid,
17
+ event_type: event_type,
18
+ service_name: MicroserviceHarness.configuration.service_name,
19
+ event_data: event_data
20
+ }
21
+
22
+ @producer.produce(topic: @topic, payload: message.to_json)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,2 @@
1
+ STDOUT.sync = true
2
+ STDERR.sync = true
@@ -0,0 +1,8 @@
1
+ require 'rdkafka'
2
+ require 'json'
3
+
4
+ require 'harness/stdout_sync.rb'
5
+ require 'harness/configuration.rb'
6
+ require 'harness/listener.rb'
7
+ require 'harness/logger.rb'
8
+ require 'harness/producer.rb'
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: microservice-harness
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.14
5
+ platform: ruby
6
+ authors:
7
+ - Sofadog OU
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-12-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rdkafka
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'
27
+ description:
28
+ email:
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/harness/configuration.rb
34
+ - lib/harness/listener.rb
35
+ - lib/harness/logger.rb
36
+ - lib/harness/producer.rb
37
+ - lib/harness/stdout_sync.rb
38
+ - lib/microservice-harness.rb
39
+ homepage:
40
+ licenses: []
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubygems_version: 3.0.3
58
+ signing_key:
59
+ specification_version: 4
60
+ summary: Microservice Harness Framework
61
+ test_files: []