plain_apm 0.9.0 → 0.9.2
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/plain_apm/agent.rb +38 -18
- data/lib/plain_apm/config.rb +5 -3
- data/lib/plain_apm/transport.rb +14 -11
- data/lib/plain_apm/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22fd1fe0f960151ee14b8a6bfc21c960533baf3f6a6eb86666f0f10253213c74
|
4
|
+
data.tar.gz: 2ec36a0a3d381563f6b7d48dfb54ea01d42f1a06576436c7613665c934167221
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e75c9b55fa3a4b3bbde453fef90239f0ed2daea79917115fb41a470fd387bfd7ecf15d6cab45bdc8f1f4fa7c162ea9f5e65ba7455b4414073e5ab106f13d32a4
|
7
|
+
data.tar.gz: e86597538c045928dff96133dba5dfff9d8db15f0caa568d4a3c4db15a21874943e0e0fd567aa57e32735dde121e9314d0883e929a106bd29c7ade6ba7ec1144
|
data/lib/plain_apm/agent.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "singleton"
|
4
|
-
require "json"
|
5
4
|
|
6
5
|
module PlainApm
|
7
6
|
class Agent
|
@@ -15,48 +14,67 @@ module PlainApm
|
|
15
14
|
instance.start
|
16
15
|
end
|
17
16
|
|
18
|
-
def self.stop
|
19
|
-
instance.stop
|
20
|
-
end
|
21
|
-
|
22
17
|
def collect(event)
|
23
18
|
return unless @config.enabled
|
24
19
|
|
20
|
+
publisher_start if @pid != $$
|
21
|
+
|
25
22
|
@events << event
|
26
23
|
end
|
27
24
|
|
28
25
|
def start
|
29
|
-
|
30
|
-
|
26
|
+
if !defined?(@started)
|
27
|
+
@started = true
|
28
|
+
else
|
29
|
+
return
|
30
|
+
end
|
31
31
|
|
32
32
|
configure
|
33
33
|
|
34
34
|
return unless @config.enabled
|
35
35
|
|
36
|
+
warn("PlainAPM agent enabled.")
|
37
|
+
|
38
|
+
setup_at_exit_hooks
|
39
|
+
publisher_start
|
40
|
+
install_hooks
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def stop
|
46
|
+
uninstall_hooks
|
47
|
+
publisher_shutdown
|
48
|
+
end
|
49
|
+
|
50
|
+
def publisher_start
|
51
|
+
# Store PID for fork detection
|
52
|
+
@pid = $$
|
53
|
+
|
54
|
+
# Already running
|
55
|
+
return if @publisher&.alive?
|
56
|
+
|
36
57
|
# TODO: sized queue w/ a timeout.
|
37
58
|
@events = Thread::Queue.new
|
38
59
|
|
39
60
|
# TODO: Multiple threads
|
40
61
|
@publisher = Thread.new { publisher_loop }
|
62
|
+
end
|
41
63
|
|
42
|
-
|
43
|
-
|
44
|
-
# TODO: add a cleaner shutdown.
|
64
|
+
def setup_at_exit_hooks
|
45
65
|
at_exit { stop }
|
46
66
|
end
|
47
67
|
|
48
|
-
def
|
68
|
+
def publisher_shutdown
|
49
69
|
return if @publisher.nil?
|
50
70
|
|
51
|
-
|
52
|
-
|
71
|
+
# FIXME: raise in / kill the threads after a pre-determined timeout not
|
72
|
+
# to block
|
53
73
|
@events << nil
|
54
74
|
@publisher.join
|
55
75
|
@publisher = nil
|
56
76
|
end
|
57
77
|
|
58
|
-
private
|
59
|
-
|
60
78
|
def configure
|
61
79
|
@config = Config.new
|
62
80
|
end
|
@@ -95,10 +113,12 @@ module PlainApm
|
|
95
113
|
loop do
|
96
114
|
event = @events.pop
|
97
115
|
|
98
|
-
|
116
|
+
Thread.exit if event.nil?
|
117
|
+
|
118
|
+
meta = { queue: @events.size, pid: $$, thread: Thread.current.object_id }
|
99
119
|
|
100
|
-
# TODO: event serialization
|
101
|
-
_response, _error, _retriable = transport.deliver(
|
120
|
+
# TODO: event serialization, batching
|
121
|
+
_response, _error, _retriable = transport.deliver(event, meta)
|
102
122
|
|
103
123
|
# TODO: retries / drops
|
104
124
|
end
|
data/lib/plain_apm/config.rb
CHANGED
@@ -10,14 +10,12 @@ module PlainApm
|
|
10
10
|
@enabled = enabled? && key_present?
|
11
11
|
@endpoint = ENV["PLAIN_APM_ENDPOINT"] || DEFAULT_EVENT_ENDPOINT
|
12
12
|
@app_key = ENV["PLAIN_APM_APP_KEY"]
|
13
|
-
|
14
|
-
warn("PlainAPM agent enabled.") if enabled
|
15
13
|
end
|
16
14
|
|
17
15
|
private
|
18
16
|
|
19
17
|
def enabled?
|
20
|
-
(production? || force_enabled?) && !force_disabled?
|
18
|
+
((production? && !interactive?) || force_enabled?) && !force_disabled?
|
21
19
|
end
|
22
20
|
|
23
21
|
def key_present?
|
@@ -28,6 +26,10 @@ module PlainApm
|
|
28
26
|
(ENV["RAILS_ENV"] || ENV["RACK_ENV"]) == "production"
|
29
27
|
end
|
30
28
|
|
29
|
+
def interactive?
|
30
|
+
$stdout.tty?
|
31
|
+
end
|
32
|
+
|
31
33
|
# Allow to start in e.g. development.
|
32
34
|
def force_enabled?
|
33
35
|
ENV["PLAIN_APM_ENABLED"] == "1"
|
data/lib/plain_apm/transport.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require "net/http"
|
4
4
|
require "json"
|
5
|
+
require "zlib"
|
5
6
|
|
6
7
|
module PlainApm
|
7
8
|
class Transport
|
@@ -47,10 +48,7 @@ module PlainApm
|
|
47
48
|
|
48
49
|
http.open_timeout = HTTP_OPEN_TIMEOUT_SECONDS
|
49
50
|
http.read_timeout = HTTP_READ_TIMEOUT_SECONDS
|
50
|
-
|
51
|
-
if RUBY_VERSION >= "2.6.0"
|
52
|
-
http.write_timeout = HTTP_WRITE_TIMEOUT_SECONDS
|
53
|
-
end
|
51
|
+
http.write_timeout = HTTP_WRITE_TIMEOUT_SECONDS
|
54
52
|
|
55
53
|
at_exit { shutdown }
|
56
54
|
end
|
@@ -60,9 +58,9 @@ module PlainApm
|
|
60
58
|
#
|
61
59
|
# @param data [String] serialized payload to POST
|
62
60
|
# @return [Array] [response, error, retriable]
|
63
|
-
def deliver(data)
|
61
|
+
def deliver(data, meta = {})
|
64
62
|
http_response do
|
65
|
-
http_request(http, uri.path, data)
|
63
|
+
http_request(http, uri.path, data, meta)
|
66
64
|
end
|
67
65
|
end
|
68
66
|
|
@@ -82,16 +80,21 @@ module PlainApm
|
|
82
80
|
http.finish if http.started?
|
83
81
|
end
|
84
82
|
|
85
|
-
def http_request(http, path, body)
|
86
|
-
request = Net::HTTP::Post.new(path, http_headers)
|
87
|
-
http.request(request, body)
|
83
|
+
def http_request(http, path, body, meta)
|
84
|
+
request = Net::HTTP::Post.new(path, http_headers(meta))
|
85
|
+
http.request(request, Zlib::Deflate.deflate(JSON.generate(body)))
|
88
86
|
end
|
89
87
|
|
90
|
-
def http_headers
|
88
|
+
def http_headers(meta)
|
89
|
+
meta_headers = meta.map do |k, v|
|
90
|
+
["X-PlainApm-#{k.to_s.split("_").map(&:capitalize).join("-")}", v.to_s]
|
91
|
+
end.to_h
|
92
|
+
|
91
93
|
{
|
92
94
|
"Content-Type" => "application/json, charset=UTF-8",
|
95
|
+
"Content-Encoding" => "gzip",
|
93
96
|
"X-PlainApm-Key" => app_key
|
94
|
-
}
|
97
|
+
}.merge(meta_headers)
|
95
98
|
end
|
96
99
|
|
97
100
|
def http_response
|
data/lib/plain_apm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plain_apm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- PlainAPM Team
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|