metlo 0.0.4

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7dab8a87de75917621db9f5fc7fce2a83f7b091c4313aa8866b7f343a6041614
4
+ data.tar.gz: 12ba86ba722e819bcbaa2d0795cafff2f84d0b936ca001174f0851b1f5ed7858
5
+ SHA512:
6
+ metadata.gz: f509824702a561ae6b30e904ca243ba7cf256153ab5eaedbe8e424522a16cabc87c04d26475f0681033982e75fc2c85090c0d5d1624cb32b792251ed81130b0b
7
+ data.tar.gz: 92911c34cb1b820a508b0fccef945d5444876f80e73f8de2c82eb8b2555cad494194d64839cf4a734853bf65ac69142ce50cb0d7f325c9cbc5f4aec3c0942390
data/.standard.yml ADDED
@@ -0,0 +1,2 @@
1
+ # For available configuration options, see:
2
+ # https://github.com/testdouble/standard
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in metlo.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 12.0"
data/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # Metlo
2
+
3
+ The Metlo agent for ruby frameworks able to utilize rack based middleware
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'metlo'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle install
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install metlo
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "standard/rake"
5
+
6
+ task default: :standard
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metlo
4
+ VERSION = "0.0.4"
5
+ end
data/lib/metlo.rb ADDED
@@ -0,0 +1,152 @@
1
+ require "json"
2
+ require "logger"
3
+ require_relative "metlo/version"
4
+
5
+ module Metlo
6
+
7
+ class Metlo
8
+
9
+ @@MAX_RES_ITER_COUNT = 10
10
+ @@MAX_BODY_LENGTH = 10 * 1024
11
+ @@LOG_LEVELS = ["trace","debug","info","warn","error"]
12
+
13
+ def initialize(app, params = {})
14
+ p "METLO: Ruby OS/ARCHITECTURE (" + RUBY_PLATFORM + ") is not supported by Metlo currently."
15
+ p "METLO: Metlo is running in compatibilty mode. Trace capture and blocking operations are not available in this mode."
16
+
17
+ @app = app
18
+ @disable = false
19
+ @block_fn = method(:metlo_default_block)
20
+ @get_user = nil
21
+
22
+ metlo_url = params[:metlo_url]
23
+ api_key = params[:api_key]
24
+ backend_port = params[:backend_port]
25
+ collector_port = params[:collector_port]
26
+ encryption_key = params[:encryption_key]
27
+ log_level = params[:log_level]
28
+ block_response = params[:block_response]
29
+ get_user = params[:get_user]
30
+
31
+ if not (log_level.nil?)
32
+ if not (log_level.is_a? String)
33
+ log_level = "info"
34
+ @logger = Logger.new($stdout,convert_log_level(log_level))
35
+ @logger.warn("log_level is not a string. log_level is expected to be one of trace, debug, info, warn, error.\nDefaulting log level to info.")
36
+ elsif not (@@LOG_LEVELS.include? log_level)
37
+ log_level = "info"
38
+ @logger = Logger.new($stdout,convert_log_level(log_level))
39
+ @logger.warn("log_level is not one of trace, debug, info, warn, error.\nDefaulting log level to info")
40
+ end
41
+ else
42
+ log_level = "info"
43
+ @logger = Logger.new($stdout,convert_log_level(log_level))
44
+ end
45
+
46
+ setup_log(@logger)
47
+
48
+ # Metlo URL
49
+ if not (metlo_url.is_a? String)
50
+ @logger.warn("metlo_url is not a string")
51
+ @disable = true
52
+ end
53
+
54
+ # Metlo API Key
55
+ if not (api_key.is_a? String)
56
+ @logger.warn("api_key is not a string")
57
+ @disable = true
58
+ end
59
+
60
+ # Backend Port
61
+ if not (backend_port.nil?)
62
+ # Value is present
63
+ if not (backend_port.is_a? Integer)
64
+ @logger.warn("backend_port is not an integer")
65
+ @disable = true
66
+ end
67
+ else
68
+ # Value missing.
69
+ if metlo_url.is_a? String and metlo_url.include? "app.metlo.com"
70
+ backend_port = 443
71
+ else
72
+ backend_port = 8000
73
+ end
74
+ end
75
+
76
+ # Collector Port
77
+ if not (collector_port.nil?)
78
+ if not (collector_port.is_a? Integer)
79
+ @logger.warn("collector_port is not an integer")
80
+ @disable = true
81
+ end
82
+ else
83
+ collector_port = 8081
84
+ end
85
+
86
+ if not (encryption_key.nil?) and not (encryption_key.is_a? String)
87
+ @logger.warn("Encryption key is expected to be a string.")
88
+ encryption_key = nil
89
+ end
90
+
91
+ if not (block_response.nil?)
92
+ if not defined? block_response == "expression"
93
+ @logger.warn("block_response param is expected to be a symbol to a method/function")
94
+ @block_fn = method(:metlo_default_block)
95
+ else
96
+ if not(((defined? method(block_response)) == "method") and (method(block_response).arity == 1))
97
+ @logger.warn("block_response param is expected to be a method that takes a single param")
98
+ @block_fn = method(:metlo_default_block)
99
+ else
100
+ @block_fn = method(block_response)
101
+ end
102
+ end
103
+ else
104
+ @block_fn = method(:metlo_default_block)
105
+ end
106
+
107
+
108
+ if not (get_user.nil?)
109
+ if not (defined? get_user == "expression" and defined? method(get_user) == "method" and method(get_user).arity == 1)
110
+ @logger.warn("get_user param is expected to be a method that takes a single param env")
111
+ @get_user = nil
112
+ else
113
+ @get_user = method(get_user)
114
+ end
115
+ end
116
+ end
117
+
118
+ def call(env)
119
+ @app.call(env)
120
+ end
121
+
122
+ private
123
+
124
+ def metlo_default_block(env)
125
+ return [403,{},["Forbidden"]]
126
+ end
127
+
128
+ def setup_log(logger)
129
+ logger.formatter = proc do |severity, datetime, _progname, msg|
130
+ datefmt = datetime.strftime('%Y-%m-%dT%H:%M:%S.%6N')
131
+ "[timestamp=#{datefmt} level=#{severity.ljust(5)}] Metlo: #{msg}\n"
132
+ end
133
+ end
134
+
135
+ def convert_log_level(level)
136
+ if level == "trace"
137
+ return Logger::DEBUG
138
+ elsif level == "debug"
139
+ return Logger::DEBUG
140
+ elsif level == "info"
141
+ return Logger::INFO
142
+ elsif level == "warn"
143
+ return Logger::WARN
144
+ elsif level == "error"
145
+ return Logger::ERROR
146
+ else
147
+ return Logger::INFO
148
+ end
149
+ end
150
+
151
+ end
152
+ end
data/metlo.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/metlo/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "metlo"
7
+ spec.version = Metlo::VERSION
8
+ spec.authors = ["Metlo"]
9
+ spec.description = "The Ruby Agent for Metlo"
10
+ spec.summary = "The Ruby Agent for Metlo"
11
+ spec.homepage = "https://www.metlo.com"
12
+ spec.license = "MIT"
13
+ spec.required_ruby_version = ">= 2.6.0"
14
+
15
+ spec.metadata["homepage_uri"] = spec.homepage
16
+ spec.metadata["source_code_uri"] = "https://www.github.com/metlo-labs/metlo"
17
+
18
+ spec.platform = Gem::Platform::RUBY
19
+
20
+ spec.files = [
21
+ ".standard.yml",
22
+ "Gemfile",
23
+ "README.md",
24
+ "Rakefile",
25
+ "lib/metlo.rb",
26
+ "lib/metlo/version.rb",
27
+ "metlo.gemspec",
28
+ "sig/metlo.rbs",
29
+ ]
30
+ spec.require_paths = ["lib"]
31
+
32
+ end
data/sig/metlo.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Metlo
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: metlo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Metlo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-07-28 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: The Ruby Agent for Metlo
14
+ email:
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - ".standard.yml"
20
+ - Gemfile
21
+ - README.md
22
+ - Rakefile
23
+ - lib/metlo.rb
24
+ - lib/metlo/version.rb
25
+ - metlo.gemspec
26
+ - sig/metlo.rbs
27
+ homepage: https://www.metlo.com
28
+ licenses:
29
+ - MIT
30
+ metadata:
31
+ homepage_uri: https://www.metlo.com
32
+ source_code_uri: https://www.github.com/metlo-labs/metlo
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 2.6.0
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ requirements: []
48
+ rubygems_version: 3.4.17
49
+ signing_key:
50
+ specification_version: 4
51
+ summary: The Ruby Agent for Metlo
52
+ test_files: []