stackify-ruby-apm 1.9.8 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/stackify_apm/config.rb +1 -0
- data/lib/stackify_apm/spies/custom_instrumenter.rb +13 -1
- data/lib/stackify_apm/spies/sidekiq.rb +44 -0
- data/lib/stackify_apm/transport/agent_base.rb +23 -0
- data/lib/stackify_apm/transport/agent_http_client.rb +17 -11
- data/lib/stackify_apm/transport/unix_socket_client.rb +12 -5
- data/lib/stackify_apm/version.rb +1 -1
- data/lib/stackify_ruby_apm.rb +0 -3
- data/stackify-ruby-apm.gemspec +0 -16
- metadata +3 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d62649a9bf57a77665b23b7e42ffe0d19395853a9b0b79e128197691e5bfb62
|
4
|
+
data.tar.gz: '0216963cac56d043591eb797ab64cce012a479de25d9a5fbe202eb6f3d73929a'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c6c501b6eac9dbad6378a03cf1234468c84480fe15b977e44187d331452c39f6a76d19348b9141616791e564ccc436c48f8d27900796ca06104a67863c5a02f
|
7
|
+
data.tar.gz: 89edd6496518ed877c65e87320a8bbf543f60a34b7e9023e0546b011854077d1c31f656bccbf1947229831b21f1fdf4f352c984cf11931dd3dc1b8e15e17e102
|
data/lib/stackify_apm/config.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
# Monkey patch for the custom instrumentation any values from config/stackify.json will be loop and will
|
4
4
|
# register as a spy.
|
5
5
|
#
|
6
|
+
require 'logger'
|
6
7
|
require 'stackify_apm/instrumenter_helper.rb'
|
7
8
|
require 'stackify_apm/config'
|
8
9
|
require 'json'
|
@@ -10,7 +11,8 @@ require 'json'
|
|
10
11
|
# rubocop:disable Metrics/PerceivedComplexity
|
11
12
|
module StackifyRubyAPM
|
12
13
|
# @api private
|
13
|
-
module Spies
|
14
|
+
module Spies extend Log
|
15
|
+
|
14
16
|
def self.run_custom_instrumentation
|
15
17
|
config = Config.new
|
16
18
|
to_instrument = parse_json_config(config.json_config_file)
|
@@ -27,11 +29,21 @@ module StackifyRubyAPM
|
|
27
29
|
tracked_func = custom_spy['trackedFunction']
|
28
30
|
tracked_func_name = defined?(custom_spy['trackedFunctionName']) ? custom_spy['trackedFunctionName'] : ''
|
29
31
|
transaction = defined?(custom_spy['transaction']) ? custom_spy['transaction'] : nil
|
32
|
+
file_path = defined?(custom_spy['file_path']) ? custom_spy['file_path'] : nil
|
30
33
|
|
31
34
|
tracked_function_tpl = tracked_func_name.nil? ? '{{ClassName}}.{{MethodName}}' : tracked_func_name
|
32
35
|
tracked_function_name = tracked_function_tpl.sub '{{ClassName}}', current_class
|
33
36
|
tracked_function_name = tracked_function_name.sub '{{MethodName}}', current_method
|
34
37
|
|
38
|
+
if !class_exists?(current_class) && !file_path.nil?
|
39
|
+
begin
|
40
|
+
require file_path
|
41
|
+
rescue LoadError => e
|
42
|
+
debug "[StackifyRubyAPM] File path doesn't exist."
|
43
|
+
debug e.inspect
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
35
47
|
# rubocop:disable Style/Next
|
36
48
|
if class_exists?(current_class)
|
37
49
|
mod_constant = Module.const_get(current_class.to_s)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Monkey patch for the sidekiq class for running async tasks.
|
4
|
+
#
|
5
|
+
|
6
|
+
module StackifyRubyAPM
|
7
|
+
# @api private
|
8
|
+
module Spies
|
9
|
+
# @api private
|
10
|
+
class SidekiqClientSpy
|
11
|
+
def install
|
12
|
+
Sidekiq::Processor.class_eval do
|
13
|
+
alias_method 'process_without_apm', 'process'
|
14
|
+
|
15
|
+
def process(work, *args, &block)
|
16
|
+
ret = nil
|
17
|
+
begin
|
18
|
+
job = nil
|
19
|
+
if defined? work.message
|
20
|
+
job = work.message
|
21
|
+
else
|
22
|
+
job = work.job
|
23
|
+
end
|
24
|
+
job_hash = JSON.parse job
|
25
|
+
name = job_hash["class"]
|
26
|
+
transaction = StackifyRubyAPM.transaction name, 'TASK'
|
27
|
+
ret = process_without_apm(work, *args, &block)
|
28
|
+
rescue StackifyRubyAPM::InternalError
|
29
|
+
raise # Don't report StackifyRubyAPM errors
|
30
|
+
rescue StandardError => e
|
31
|
+
StackifyRubyAPM.report e
|
32
|
+
raise e
|
33
|
+
ensure
|
34
|
+
transaction.submit()
|
35
|
+
end
|
36
|
+
ret
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
register 'Sidekiq::Processor', 'sidekiq/processor', SidekiqClientSpy.new
|
43
|
+
end
|
44
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'json'
|
1
2
|
require 'stackify_apm/root_info'
|
2
3
|
require 'stackify_apm/serializers'
|
3
4
|
|
@@ -12,6 +13,15 @@ module StackifyRubyAPM
|
|
12
13
|
@transaction_serializers = Serializers::Transactions.new(config)
|
13
14
|
end
|
14
15
|
|
16
|
+
def get_protobuf_message(transactions)
|
17
|
+
protobuf_obj = build_message(transactions)
|
18
|
+
StackifyProtoBuf::Traces.encode(protobuf_obj)
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_json_message(transactions)
|
22
|
+
JSON.generate(build_json_message(transactions))
|
23
|
+
end
|
24
|
+
|
15
25
|
# This method will build a group of Stackify::Traces from the protobuf objects.
|
16
26
|
# It accept Array of transactions.
|
17
27
|
def build_message(transactions = [])
|
@@ -28,6 +38,19 @@ module StackifyRubyAPM
|
|
28
38
|
debug "[AgentBaseTransport] build_message() exception: #{e.inspect}"
|
29
39
|
end
|
30
40
|
|
41
|
+
def build_json_message(transactions = [])
|
42
|
+
traces = []
|
43
|
+
transactions.each do |transaction|
|
44
|
+
# convert transaction to json
|
45
|
+
json_transaction = @transaction_serializers.build_json(@config, transaction)
|
46
|
+
# add to traces array
|
47
|
+
traces << json_transaction
|
48
|
+
end
|
49
|
+
return traces
|
50
|
+
rescue StandardError => e
|
51
|
+
debug "[AgentBaseTransport] build_json_message() exception: #{e.inspect}"
|
52
|
+
end
|
53
|
+
|
31
54
|
def post(_transactions = [])
|
32
55
|
raise NotImplementedError
|
33
56
|
end
|
@@ -5,24 +5,32 @@ require 'faraday'
|
|
5
5
|
require 'ostruct'
|
6
6
|
|
7
7
|
module StackifyRubyAPM
|
8
|
-
# This class will handle the sending of
|
8
|
+
# This class will handle the sending of transaction messages through HTTP.
|
9
9
|
# @api private
|
10
10
|
class AgentHTTPClient < AgentBaseTransport
|
11
11
|
include Log
|
12
12
|
|
13
|
-
HEADERS = {
|
14
|
-
'Content-Type' => 'application/x-protobuf'
|
15
|
-
}.freeze
|
16
|
-
|
17
13
|
def initialize(config)
|
18
14
|
@config = config
|
19
15
|
super(config)
|
20
16
|
end
|
21
17
|
|
18
|
+
def get_protobuf_headers
|
19
|
+
{
|
20
|
+
'Content-Type' => 'application/x-protobuf'
|
21
|
+
}.freeze
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_json_headers
|
25
|
+
{
|
26
|
+
'Content-Type' => 'application/json'
|
27
|
+
}.freeze
|
28
|
+
end
|
29
|
+
|
22
30
|
# rubocop:disable Metrics/CyclomaticComplexity
|
23
31
|
# rubocop:disable Metrics/PerceivedComplexity
|
24
32
|
#
|
25
|
-
# This method will send a
|
33
|
+
# This method will send a transction message to HTTP request.
|
26
34
|
# It will accept Array of transactions.
|
27
35
|
def post(transactions = [])
|
28
36
|
debug '[AgentHTTPClient] post()' if ENV['STACKIFY_TRANSPORT_LOG_LEVEL'] == '0'
|
@@ -31,16 +39,14 @@ module StackifyRubyAPM
|
|
31
39
|
retry_count = 0
|
32
40
|
delay = @config.delay_seconds
|
33
41
|
begin
|
34
|
-
|
35
|
-
message = StackifyProtoBuf::Traces.encode(protobuf_obj)
|
36
|
-
# Convert message into binary and send it to http request
|
42
|
+
message = get_json_message(transactions)
|
37
43
|
conn = Faraday.new(ssl: { verify: false })
|
38
44
|
response = conn.post do |req|
|
39
45
|
req.url URI(@config.transport_http_endpoint + @config.agent_traces_url)
|
40
|
-
req.headers =
|
46
|
+
req.headers = get_json_headers
|
41
47
|
req.body = message
|
42
48
|
end
|
43
|
-
if response.
|
49
|
+
if defined?(response.status) && response.status == 200
|
44
50
|
debug '[AgentHTTPClient] Successfully send message via http request.' if ENV['STACKIFY_TRANSPORT_LOG_LEVEL'] == '0'
|
45
51
|
elsif ENV['STACKIFY_TRANSPORT_LOG_LEVEL'] == '0'
|
46
52
|
debug "[AgentHTTPClient] Failure sending via http request: #{response.inspect}"
|
@@ -4,7 +4,7 @@ require 'net_http_unix'
|
|
4
4
|
require 'ostruct'
|
5
5
|
|
6
6
|
module StackifyRubyAPM
|
7
|
-
# This class will handle the sending of
|
7
|
+
# This class will handle the sending of transaction messages through unix domain socket.
|
8
8
|
# @api private
|
9
9
|
class UnixSocketClient < AgentBaseTransport
|
10
10
|
include Log
|
@@ -14,10 +14,18 @@ module StackifyRubyAPM
|
|
14
14
|
super(config)
|
15
15
|
end
|
16
16
|
|
17
|
+
def get_protobuf_headers
|
18
|
+
'application/x-protobuf'
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_json_headers
|
22
|
+
'application/json'
|
23
|
+
end
|
24
|
+
|
17
25
|
# rubocop:disable Metrics/CyclomaticComplexity
|
18
26
|
# rubocop:disable Metrics/PerceivedComplexity
|
19
27
|
#
|
20
|
-
# This method will send a
|
28
|
+
# This method will send a transaction message to the unix domain socket.
|
21
29
|
# It will accept Array of transactions.
|
22
30
|
def post(transactions = [])
|
23
31
|
debug '[UnixSocketClient] post()' if ENV['STACKIFY_TRANSPORT_LOG_LEVEL'] == '0'
|
@@ -27,11 +35,10 @@ module StackifyRubyAPM
|
|
27
35
|
delay = @config.delay_seconds
|
28
36
|
begin
|
29
37
|
# Convert message into binary and send it to unix domain socket
|
30
|
-
|
31
|
-
message = StackifyProtoBuf::Traces.encode(protobuf_obj)
|
38
|
+
message = get_json_message(transactions)
|
32
39
|
client = NetX::HTTPUnix.new('unix://' + @config.unix_socket_path)
|
33
40
|
req = Net::HTTP::Post.new(@config.agent_traces_url)
|
34
|
-
req.set_content_type(
|
41
|
+
req.set_content_type(get_json_headers)
|
35
42
|
req.body = message
|
36
43
|
response = client.request(req)
|
37
44
|
debug "[UnixSocketClient] status_code = #{response.code}" if ENV['STACKIFY_TRANSPORT_LOG_LEVEL'] == '0'
|
data/lib/stackify_apm/version.rb
CHANGED
data/lib/stackify_ruby_apm.rb
CHANGED
@@ -35,9 +35,6 @@ require 'stackify_apm/transport/unix_socket_client'
|
|
35
35
|
require 'stackify_apm/transport/agent_http_client'
|
36
36
|
require 'stackify_apm/transport/aws_lambda_logging'
|
37
37
|
|
38
|
-
require 'google/protobuf'
|
39
|
-
require 'proto/stackify_trace'
|
40
|
-
|
41
38
|
# Checks if the framework using is Rails
|
42
39
|
require 'stackify_apm/railtie' if defined?(::Rails::Railtie)
|
43
40
|
|
data/stackify-ruby-apm.gemspec
CHANGED
@@ -33,20 +33,6 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_development_dependency 'bigdecimal'
|
34
34
|
end
|
35
35
|
|
36
|
-
# rubocop
|
37
|
-
if RUBY_VERSION >= '2.2.0'
|
38
|
-
spec.add_development_dependency 'rubocop-performance'
|
39
|
-
end
|
40
|
-
|
41
|
-
# protobuf
|
42
|
-
if RUBY_VERSION >= '2.7'
|
43
|
-
spec.add_development_dependency 'google-protobuf', '= 3.5.0'
|
44
|
-
elsif RUBY_VERSION > '2.3'
|
45
|
-
spec.add_development_dependency 'google-protobuf', '>= 3.5.0'
|
46
|
-
else
|
47
|
-
spec.add_development_dependency 'google-protobuf', '= 3.5.0'
|
48
|
-
end
|
49
|
-
|
50
36
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
51
37
|
spec.add_development_dependency 'rake', '~> 10.0'
|
52
38
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
@@ -57,7 +43,6 @@ Gem::Specification.new do |spec|
|
|
57
43
|
spec.add_development_dependency 'httpclient'
|
58
44
|
spec.add_development_dependency 'mongo'
|
59
45
|
spec.add_development_dependency 'mysql2'
|
60
|
-
spec.add_development_dependency 'net_http_unix', '~> 0.2'
|
61
46
|
spec.add_development_dependency 'pg', '~> 0.20'
|
62
47
|
spec.add_development_dependency 'rack-test'
|
63
48
|
spec.add_development_dependency 'rubocop'
|
@@ -73,7 +58,6 @@ Gem::Specification.new do |spec|
|
|
73
58
|
spec.add_dependency('concurrent-ruby', '~> 1.0')
|
74
59
|
spec.add_dependency('delegate_matcher', '~> 0.4')
|
75
60
|
spec.add_dependency('faraday', '~> 0.8')
|
76
|
-
spec.add_dependency('google-protobuf', '>= 3.5.0', '< 4.0')
|
77
61
|
spec.add_dependency('net_http_unix', '~> 0.2')
|
78
62
|
spec.add_dependency('rufus-scheduler', '~> 3.0')
|
79
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stackify-ruby-apm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stackify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -38,34 +38,6 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rubocop-performance
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: google-protobuf
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 3.5.0
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 3.5.0
|
69
41
|
- !ruby/object:Gem::Dependency
|
70
42
|
name: bundler
|
71
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,20 +178,6 @@ dependencies:
|
|
206
178
|
- - ">="
|
207
179
|
- !ruby/object:Gem::Version
|
208
180
|
version: '0'
|
209
|
-
- !ruby/object:Gem::Dependency
|
210
|
-
name: net_http_unix
|
211
|
-
requirement: !ruby/object:Gem::Requirement
|
212
|
-
requirements:
|
213
|
-
- - "~>"
|
214
|
-
- !ruby/object:Gem::Version
|
215
|
-
version: '0.2'
|
216
|
-
type: :development
|
217
|
-
prerelease: false
|
218
|
-
version_requirements: !ruby/object:Gem::Requirement
|
219
|
-
requirements:
|
220
|
-
- - "~>"
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
version: '0.2'
|
223
181
|
- !ruby/object:Gem::Dependency
|
224
182
|
name: pg
|
225
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -416,26 +374,6 @@ dependencies:
|
|
416
374
|
- - "~>"
|
417
375
|
- !ruby/object:Gem::Version
|
418
376
|
version: '0.8'
|
419
|
-
- !ruby/object:Gem::Dependency
|
420
|
-
name: google-protobuf
|
421
|
-
requirement: !ruby/object:Gem::Requirement
|
422
|
-
requirements:
|
423
|
-
- - ">="
|
424
|
-
- !ruby/object:Gem::Version
|
425
|
-
version: 3.5.0
|
426
|
-
- - "<"
|
427
|
-
- !ruby/object:Gem::Version
|
428
|
-
version: '4.0'
|
429
|
-
type: :runtime
|
430
|
-
prerelease: false
|
431
|
-
version_requirements: !ruby/object:Gem::Requirement
|
432
|
-
requirements:
|
433
|
-
- - ">="
|
434
|
-
- !ruby/object:Gem::Version
|
435
|
-
version: 3.5.0
|
436
|
-
- - "<"
|
437
|
-
- !ruby/object:Gem::Version
|
438
|
-
version: '4.0'
|
439
377
|
- !ruby/object:Gem::Dependency
|
440
378
|
name: net_http_unix
|
441
379
|
requirement: !ruby/object:Gem::Requirement
|
@@ -526,6 +464,7 @@ files:
|
|
526
464
|
- lib/stackify_apm/spies/net_http.rb
|
527
465
|
- lib/stackify_apm/spies/redis.rb
|
528
466
|
- lib/stackify_apm/spies/sequel.rb
|
467
|
+
- lib/stackify_apm/spies/sidekiq.rb
|
529
468
|
- lib/stackify_apm/spies/sinatra.rb
|
530
469
|
- lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb
|
531
470
|
- lib/stackify_apm/spies/sinatra_activerecord/postgresql_adapter.rb
|