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 +7 -0
- data/.standard.yml +2 -0
- data/Gemfile +8 -0
- data/README.md +19 -0
- data/Rakefile +6 -0
- data/lib/metlo/version.rb +5 -0
- data/lib/metlo.rb +152 -0
- data/metlo.gemspec +32 -0
- data/sig/metlo.rbs +4 -0
- metadata +52 -0
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
data/Gemfile
ADDED
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
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
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: []
|