microservice-harness 0.1.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []