stackify-ruby-apm 1.0.1 → 1.1.0
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/.rubocop.yml +38 -0
- data/.ruby-version +1 -0
- data/Gemfile +17 -11
- data/Gemfile.lock +98 -95
- data/Rakefile +7 -5
- data/docker/stackify-ruby +8 -0
- data/docker/stackify-ruby-rvm +10 -0
- data/docker/stackify-ruby-test +28 -0
- data/lib/{stackify → stackify_apm}/agent.rb +42 -33
- data/lib/{stackify → stackify_apm}/config.rb +56 -39
- data/lib/{stackify → stackify_apm}/context.rb +5 -6
- data/lib/{stackify → stackify_apm}/context/request.rb +0 -0
- data/lib/{stackify → stackify_apm}/context/request/socket.rb +0 -0
- data/lib/{stackify → stackify_apm}/context/request/url.rb +2 -6
- data/lib/stackify_apm/context/response.rb +33 -0
- data/lib/{stackify → stackify_apm}/context_builder.rb +2 -5
- data/lib/{stackify → stackify_apm}/error.rb +7 -6
- data/lib/stackify_apm/error/exception.rb +37 -0
- data/lib/stackify_apm/error/log.rb +24 -0
- data/lib/stackify_apm/error_builder.rb +61 -0
- data/lib/stackify_apm/helper/database_helper.rb +27 -0
- data/lib/{stackify → stackify_apm}/instrumenter.rb +12 -19
- data/lib/{stackify → stackify_apm}/internal_error.rb +0 -0
- data/lib/{stackify → stackify_apm}/log.rb +0 -0
- data/lib/{stackify → stackify_apm}/logger/log_device.rb +22 -11
- data/lib/{stackify → stackify_apm}/logger/logger_high_version.rb +1 -6
- data/lib/{stackify → stackify_apm}/logger/logger_lower_version.rb +2 -1
- data/lib/stackify_apm/middleware.rb +70 -0
- data/lib/{stackify → stackify_apm}/naively_hashable.rb +1 -3
- data/lib/{stackify → stackify_apm}/normalizers.rb +3 -2
- data/lib/{stackify → stackify_apm}/normalizers/action_controller.rb +0 -0
- data/lib/{stackify → stackify_apm}/normalizers/action_mailer.rb +0 -0
- data/lib/{stackify → stackify_apm}/normalizers/action_view.rb +0 -0
- data/lib/{stackify → stackify_apm}/normalizers/active_record.rb +3 -25
- data/lib/{stackify → stackify_apm}/railtie.rb +5 -7
- data/lib/{stackify → stackify_apm}/root_info.rb +2 -6
- data/lib/{stackify → stackify_apm}/serializers.rb +3 -2
- data/lib/{stackify → stackify_apm}/serializers/errors.rb +7 -10
- data/lib/{stackify → stackify_apm}/serializers/transactions.rb +11 -18
- data/lib/{stackify → stackify_apm}/span.rb +8 -9
- data/lib/{stackify → stackify_apm}/span/context.rb +3 -1
- data/lib/{stackify → stackify_apm}/spies.rb +3 -2
- data/lib/{stackify → stackify_apm}/spies/action_dispatch.rb +3 -4
- data/lib/stackify_apm/spies/curb.rb +49 -0
- data/lib/stackify_apm/spies/curb/easy.rb +157 -0
- data/lib/stackify_apm/spies/curb/multi.rb +43 -0
- data/lib/{stackify → stackify_apm}/spies/httpclient.rb +10 -8
- data/lib/{stackify → stackify_apm}/spies/httprb.rb +7 -9
- data/lib/{stackify → stackify_apm}/spies/mongo.rb +5 -3
- data/lib/{stackify → stackify_apm}/spies/net_http.rb +4 -5
- data/lib/{stackify → stackify_apm}/spies/redis.rb +19 -18
- data/lib/stackify_apm/spies/sequel.rb +65 -0
- data/lib/{stackify → stackify_apm}/spies/sinatra.rb +7 -10
- data/lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb +201 -0
- data/lib/stackify_apm/spies/sinatra_activerecord/postgresql_adapter.rb +94 -0
- data/lib/stackify_apm/spies/sinatra_activerecord/sqlite_adapter.rb +46 -0
- data/lib/stackify_apm/spies/stackify_logger.rb +60 -0
- data/lib/{stackify → stackify_apm}/spies/tilt.rb +3 -3
- data/lib/stackify_apm/stacktrace.rb +18 -0
- data/lib/stackify_apm/stacktrace/frame.rb +47 -0
- data/lib/{stackify → stackify_apm}/stacktrace_builder.rb +10 -11
- data/lib/{stackify → stackify_apm}/subscriber.rb +20 -14
- data/lib/{stackify → stackify_apm}/trace_logger.rb +10 -16
- data/lib/stackify_apm/transaction.rb +127 -0
- data/lib/{stackify → stackify_apm}/util.rb +3 -1
- data/lib/{stackify → stackify_apm}/util/dig.rb +1 -1
- data/lib/{stackify → stackify_apm}/util/inflector.rb +0 -0
- data/lib/{stackify → stackify_apm}/util/inspector.rb +1 -3
- data/lib/stackify_apm/util/lru_cache.rb +49 -0
- data/lib/stackify_apm/util/trace_log_watcher.rb +37 -0
- data/lib/stackify_apm/version.rb +6 -0
- data/lib/{stackify → stackify_apm}/worker.rb +8 -7
- data/lib/stackify_ruby_apm.rb +18 -15
- data/run-test-docker.sh +50 -0
- data/run-test.sh +1 -3
- data/stackify-ruby-apm.gemspec +14 -11
- metadata +86 -59
- data/lib/stackify/context/response.rb +0 -37
- data/lib/stackify/error/exception.rb +0 -36
- data/lib/stackify/error/log.rb +0 -25
- data/lib/stackify/error_builder.rb +0 -65
- data/lib/stackify/middleware.rb +0 -74
- data/lib/stackify/spies/sinatra_activerecord/mysql_adapter.rb +0 -177
- data/lib/stackify/spies/sinatra_activerecord/postgresql_adapter.rb +0 -96
- data/lib/stackify/spies/sinatra_activerecord/sqlite_adapter.rb +0 -48
- data/lib/stackify/stacktrace.rb +0 -19
- data/lib/stackify/stacktrace/frame.rb +0 -50
- data/lib/stackify/transaction.rb +0 -132
- data/lib/stackify/util/lru_cache.rb +0 -49
- data/lib/stackify/version.rb +0 -4
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module StackifyRubyAPM
|
|
4
|
-
class Context
|
|
5
|
-
# @api private
|
|
6
|
-
class Response
|
|
7
|
-
include NaivelyHashable
|
|
8
|
-
|
|
9
|
-
def initialize(
|
|
10
|
-
status_code,
|
|
11
|
-
headers: {},
|
|
12
|
-
headers_sent: true,
|
|
13
|
-
finished: true
|
|
14
|
-
)
|
|
15
|
-
@status_code = status_code
|
|
16
|
-
headers = self.make_xstackifyId_header(headers)
|
|
17
|
-
@headers = headers
|
|
18
|
-
@headers_sent = headers_sent
|
|
19
|
-
@finished = finished
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
attr_accessor :status_code, :headers, :headers_sent, :finished
|
|
23
|
-
|
|
24
|
-
def make_xstackifyId_header(headers)
|
|
25
|
-
if (StackifyRubyAPM.agent.current_transaction &&
|
|
26
|
-
StackifyRubyAPM.agent.current_transaction.id)
|
|
27
|
-
transaction_id = StackifyRubyAPM.agent.current_transaction.id
|
|
28
|
-
clientId = StackifyRubyAPM.agent.config.clientId
|
|
29
|
-
deviceId = StackifyRubyAPM.agent.config.deviceId
|
|
30
|
-
if clientId && deviceId
|
|
31
|
-
headers['X-StackifyID'] = "V1|#{transaction_id}|C#{clientId}|CD#{deviceId}"
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
module StackifyRubyAPM
|
|
3
|
-
class Error
|
|
4
|
-
# @api private
|
|
5
|
-
class Exception
|
|
6
|
-
MOD_SPLIT = '::'.freeze
|
|
7
|
-
|
|
8
|
-
def initialize(exception, **attrs)
|
|
9
|
-
@message =
|
|
10
|
-
"#{exception.class}: #{exception.message}"
|
|
11
|
-
@type = exception.class.to_s
|
|
12
|
-
@module = format_module exception
|
|
13
|
-
|
|
14
|
-
attrs.each do |key, val|
|
|
15
|
-
send(:"#{key}=", val)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
attr_accessor(
|
|
20
|
-
:attributes,
|
|
21
|
-
:code,
|
|
22
|
-
:handled,
|
|
23
|
-
:message,
|
|
24
|
-
:module,
|
|
25
|
-
:stacktrace,
|
|
26
|
-
:type
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
def format_module(exception)
|
|
32
|
-
exception.class.to_s.split(MOD_SPLIT)[0...-1].join(MOD_SPLIT)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
data/lib/stackify/error/log.rb
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module StackifyRubyAPM
|
|
4
|
-
class Error
|
|
5
|
-
# @api private
|
|
6
|
-
class Log
|
|
7
|
-
def initialize(message, attrs = {})
|
|
8
|
-
@message = message
|
|
9
|
-
|
|
10
|
-
attrs.each do |key, val|
|
|
11
|
-
send(:"#{key}=", val)
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
attr_accessor(
|
|
16
|
-
:level,
|
|
17
|
-
:logger_name,
|
|
18
|
-
:message,
|
|
19
|
-
:param_message,
|
|
20
|
-
:stacktrace
|
|
21
|
-
)
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
#
|
|
3
|
-
# This module build errors/exceptions and the Frames/stacktraces affected/related to the error
|
|
4
|
-
#
|
|
5
|
-
module StackifyRubyAPM
|
|
6
|
-
# @api private
|
|
7
|
-
class ErrorBuilder
|
|
8
|
-
def initialize(agent)
|
|
9
|
-
@agent = agent
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def build_exception(exception, handled: true)
|
|
13
|
-
error = Error.new
|
|
14
|
-
error.exception = Error::Exception.new(exception, handled: handled)
|
|
15
|
-
|
|
16
|
-
if exception.backtrace
|
|
17
|
-
add_stacktrace error, :exception, exception.backtrace
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
add_transaction_id error
|
|
21
|
-
|
|
22
|
-
if (transaction = StackifyRubyAPM.current_transaction)
|
|
23
|
-
error.context = transaction.context.dup
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
error
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def build_log(message, backtrace: nil, **attrs)
|
|
30
|
-
error = Error.new
|
|
31
|
-
error.log = Error::Log.new(message, **attrs)
|
|
32
|
-
|
|
33
|
-
if backtrace
|
|
34
|
-
add_stacktrace error, :log, backtrace
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
add_transaction_id error
|
|
38
|
-
|
|
39
|
-
error
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
private
|
|
43
|
-
|
|
44
|
-
def add_stacktrace(error, kind, backtrace)
|
|
45
|
-
stacktrace =
|
|
46
|
-
@agent.stacktrace_builder.build(backtrace, :error)
|
|
47
|
-
return unless stacktrace
|
|
48
|
-
|
|
49
|
-
case kind
|
|
50
|
-
when :exception
|
|
51
|
-
error.exception.stacktrace = stacktrace
|
|
52
|
-
when :log
|
|
53
|
-
error.log.stacktrace = stacktrace
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
error.culprit = stacktrace.frames.first.function
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def add_transaction_id(error)
|
|
60
|
-
return unless (transaction = StackifyRubyAPM.current_transaction)
|
|
61
|
-
error.transaction_id = transaction.id
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
data/lib/stackify/middleware.rb
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
#
|
|
3
|
-
# This class monkey patches the Rack Middleware method: e.g., call(env)
|
|
4
|
-
# It also handles the submission of transactions to Agent.
|
|
5
|
-
#
|
|
6
|
-
# If Agent is running, build_transaction(env) is called:
|
|
7
|
-
#
|
|
8
|
-
# -> BUILDS transaction: /stackify_ruby_apm.rb (#self.transaction)
|
|
9
|
-
# -> builds a [Context] from a Rack `env`: /stackify_ruby_apm.rb (#self.build_context)
|
|
10
|
-
# -> context may include information about the request,
|
|
11
|
-
# response, current user and more
|
|
12
|
-
#
|
|
13
|
-
# -> SUBMITS transaction: stackify/transaction.rb (#submit)
|
|
14
|
-
# -> instrumenter submits transaction
|
|
15
|
-
# -> worker will run (if != running), responsible for sending transactions to APM
|
|
16
|
-
# for every 10 secs (based on config.flush_interval)
|
|
17
|
-
# -> transaction will be stored in queue by Agent
|
|
18
|
-
# -> worker will constantly execute transaction sending to APM
|
|
19
|
-
#
|
|
20
|
-
|
|
21
|
-
module StackifyRubyAPM
|
|
22
|
-
|
|
23
|
-
class Middleware
|
|
24
|
-
def initialize(app)
|
|
25
|
-
@app = app
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
|
29
|
-
# This is where the requests are received, built into a transaction, and then submitted
|
|
30
|
-
#
|
|
31
|
-
def call(env)
|
|
32
|
-
begin
|
|
33
|
-
|
|
34
|
-
#if running? && !path_ignored?(env)
|
|
35
|
-
if running?
|
|
36
|
-
transaction = build_transaction(env)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
resp = @app.call env
|
|
40
|
-
|
|
41
|
-
submit_transaction(transaction, *resp) if transaction
|
|
42
|
-
rescue InternalError
|
|
43
|
-
raise # Don't report StackifyRubyAPM errors
|
|
44
|
-
rescue ::Exception => e
|
|
45
|
-
transaction.submit('500', status: 500) if transaction
|
|
46
|
-
raise
|
|
47
|
-
ensure
|
|
48
|
-
transaction.release if transaction
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
resp
|
|
52
|
-
end
|
|
53
|
-
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
|
54
|
-
|
|
55
|
-
def submit_transaction(transaction, status, headers, _body)
|
|
56
|
-
result = status.to_i
|
|
57
|
-
transaction.submit(result, status: status, headers: headers)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# Start of transaction building with params: name, type, context
|
|
61
|
-
#
|
|
62
|
-
def build_transaction(env)
|
|
63
|
-
StackifyRubyAPM.transaction 'Rack', 'request', context: StackifyRubyAPM.build_context(env)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def running?
|
|
67
|
-
StackifyRubyAPM.running?
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def config
|
|
71
|
-
StackifyRubyAPM.agent.config
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
# Spies for active record when sinatra framework is used and active_record is being extended. (mysql adapter)
|
|
3
|
-
#
|
|
4
|
-
module StackifyRubyAPM
|
|
5
|
-
# @api private
|
|
6
|
-
module Spies
|
|
7
|
-
# @api private
|
|
8
|
-
class MysqlAdapterSpy
|
|
9
|
-
TYPE = 'db.sinatra_active_record.sql'.freeze
|
|
10
|
-
if ActiveRecord::VERSION::MAJOR.to_i >= 5
|
|
11
|
-
# rubocop:disable Metrics/MethodLength
|
|
12
|
-
def install
|
|
13
|
-
ActiveRecord::ConnectionAdapters::MySQL::DatabaseStatements.class_eval do
|
|
14
|
-
alias exec_query_without_apm exec_query
|
|
15
|
-
alias exec_delete_without_apm exec_delete
|
|
16
|
-
alias exec_update_without_apm exec_update
|
|
17
|
-
|
|
18
|
-
def exec_update(sql, name = nil, binds = [])
|
|
19
|
-
result = nil
|
|
20
|
-
unless StackifyRubyAPM.current_transaction
|
|
21
|
-
exec_update_without_apm(sql, name, binds)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
ctx = Span::Context.new(
|
|
25
|
-
CATEGORY: 'Database',
|
|
26
|
-
SUBCATEGORY: 'Execute',
|
|
27
|
-
COMPONENT_CATEGORY: 'DB Query',
|
|
28
|
-
COMPONENT_DETAIL: 'Execute SQL Query',
|
|
29
|
-
SQL: sql,
|
|
30
|
-
PROVIDER: "mysql"
|
|
31
|
-
)
|
|
32
|
-
result = exec_update_without_apm(sql, name, binds)
|
|
33
|
-
StackifyRubyAPM.span name, TYPE, context: ctx do
|
|
34
|
-
return result
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def exec_delete(sql, name = nil, binds = [])
|
|
39
|
-
result = nil
|
|
40
|
-
unless StackifyRubyAPM.current_transaction
|
|
41
|
-
exec_delete_without_apm(sql, name, binds)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
ctx = Span::Context.new(
|
|
45
|
-
CATEGORY: 'Database',
|
|
46
|
-
SUBCATEGORY: 'Execute',
|
|
47
|
-
COMPONENT_CATEGORY: 'DB Query',
|
|
48
|
-
COMPONENT_DETAIL: 'Execute SQL Query',
|
|
49
|
-
SQL: sql,
|
|
50
|
-
PROVIDER: "mysql"
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
result = exec_delete_without_apm(sql, name, binds)
|
|
54
|
-
StackifyRubyAPM.span name, TYPE, context: ctx do
|
|
55
|
-
return result
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def exec_query(sql, name = "SQL", binds = [], prepare: false)
|
|
60
|
-
result = nil
|
|
61
|
-
unless StackifyRubyAPM.current_transaction
|
|
62
|
-
exec_query_without_apm(sql, name, binds)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
ctx = Span::Context.new(
|
|
66
|
-
CATEGORY: 'Database',
|
|
67
|
-
SUBCATEGORY: 'Execute',
|
|
68
|
-
COMPONENT_CATEGORY: 'DB Query',
|
|
69
|
-
COMPONENT_DETAIL: 'Execute SQL Query',
|
|
70
|
-
SQL: sql,
|
|
71
|
-
PROVIDER: "mysql"
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
result = exec_query_without_apm(sql, name, binds)
|
|
75
|
-
StackifyRubyAPM.span name, TYPE, context: ctx do
|
|
76
|
-
return result
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
# rubocop:enable Metrics/MethodLength
|
|
82
|
-
else
|
|
83
|
-
# rubocop:disable Metrics/MethodLength
|
|
84
|
-
def install
|
|
85
|
-
ActiveRecord::ConnectionAdapters::Mysql2Adapter.class_eval do
|
|
86
|
-
alias exec_query_without_apm exec_query
|
|
87
|
-
alias exec_delete_without_apm exec_delete
|
|
88
|
-
alias exec_update_without_apm exec_update
|
|
89
|
-
alias exec_insert_without_apm exec_insert
|
|
90
|
-
|
|
91
|
-
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
|
|
92
|
-
result = nil
|
|
93
|
-
unless StackifyRubyAPM.current_transaction
|
|
94
|
-
exec_insert_without_apm(sql, name, binds, pk = nil, sequence_name = nil)
|
|
95
|
-
end
|
|
96
|
-
ctx = Span::Context.new(
|
|
97
|
-
CATEGORY: 'Database',
|
|
98
|
-
SUBCATEGORY: 'Execute',
|
|
99
|
-
COMPONENT_CATEGORY: 'DB Query',
|
|
100
|
-
COMPONENT_DETAIL: 'Execute SQL Query',
|
|
101
|
-
SQL: sql,
|
|
102
|
-
PROVIDER: "mysql"
|
|
103
|
-
)
|
|
104
|
-
result = exec_insert_without_apm(sql, name, binds, pk = nil, sequence_name = nil)
|
|
105
|
-
StackifyRubyAPM.span name, TYPE, context: ctx do
|
|
106
|
-
return result
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def exec_update(sql, name, binds)
|
|
111
|
-
result = nil
|
|
112
|
-
unless StackifyRubyAPM.current_transaction
|
|
113
|
-
exec_update_without_apm(sql, name, binds)
|
|
114
|
-
end
|
|
115
|
-
ctx = Span::Context.new(
|
|
116
|
-
CATEGORY: 'Database',
|
|
117
|
-
SUBCATEGORY: 'Execute',
|
|
118
|
-
COMPONENT_CATEGORY: 'DB Query',
|
|
119
|
-
COMPONENT_DETAIL: 'Execute SQL Query',
|
|
120
|
-
SQL: sql,
|
|
121
|
-
PROVIDER: "mysql"
|
|
122
|
-
)
|
|
123
|
-
result = exec_update_without_apm(sql, name, binds)
|
|
124
|
-
StackifyRubyAPM.span name, TYPE, context: ctx do
|
|
125
|
-
return result
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
def exec_delete(sql, name, binds)
|
|
130
|
-
result = nil
|
|
131
|
-
unless StackifyRubyAPM.current_transaction
|
|
132
|
-
exec_delete_without_apm(sql, name, binds)
|
|
133
|
-
end
|
|
134
|
-
ctx = Span::Context.new(
|
|
135
|
-
CATEGORY: 'Database',
|
|
136
|
-
SUBCATEGORY: 'Execute',
|
|
137
|
-
COMPONENT_CATEGORY: 'DB Query',
|
|
138
|
-
COMPONENT_DETAIL: 'Execute SQL Query',
|
|
139
|
-
SQL: sql,
|
|
140
|
-
PROVIDER: "mysql"
|
|
141
|
-
)
|
|
142
|
-
result = exec_delete_without_apm(sql, name, binds)
|
|
143
|
-
StackifyRubyAPM.span name, TYPE, context: ctx do
|
|
144
|
-
return result
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
def exec_query(sql, name = "SQL", binds = [], prepare: false)
|
|
149
|
-
result = nil
|
|
150
|
-
unless StackifyRubyAPM.current_transaction
|
|
151
|
-
exec_query_without_apm(sql, name, binds)
|
|
152
|
-
end
|
|
153
|
-
ctx = Span::Context.new(
|
|
154
|
-
CATEGORY: 'Database',
|
|
155
|
-
SUBCATEGORY: 'Execute',
|
|
156
|
-
COMPONENT_CATEGORY: 'DB Query',
|
|
157
|
-
COMPONENT_DETAIL: 'Execute SQL Query',
|
|
158
|
-
SQL: sql,
|
|
159
|
-
PROVIDER: "mysql"
|
|
160
|
-
)
|
|
161
|
-
result = exec_query_without_apm(sql, name, binds)
|
|
162
|
-
StackifyRubyAPM.span name, TYPE, context: ctx do
|
|
163
|
-
return result
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
# rubocop:enable Metrics/MethodLength
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
if ActiveRecord::VERSION::MAJOR.to_i >= 5
|
|
172
|
-
register 'ActiveRecord::ConnectionAdapters::MySQL::DatabaseStatements', 'active_record/connection_adapters/mysql/database_statements', MysqlAdapterSpy.new
|
|
173
|
-
else
|
|
174
|
-
register 'ActiveRecord::ConnectionAdapters::Mysql2Adapter', 'active_record/connection_adapters/mysql2_adapter', MysqlAdapterSpy.new
|
|
175
|
-
end
|
|
176
|
-
end
|
|
177
|
-
end
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
# Spies for active record when sinatra framework is used and active_record is being extended. (mysql adapter)
|
|
3
|
-
#
|
|
4
|
-
module StackifyRubyAPM
|
|
5
|
-
# @api private
|
|
6
|
-
module Spies
|
|
7
|
-
# @api private
|
|
8
|
-
class PostgresqlAdapterSpy
|
|
9
|
-
TYPE = 'db.sinatra_active_record.sql'.freeze
|
|
10
|
-
|
|
11
|
-
# rubocop:disable Metrics/MethodLength
|
|
12
|
-
def install
|
|
13
|
-
ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements.class_eval do
|
|
14
|
-
alias exec_query_without_apm exec_query
|
|
15
|
-
alias exec_delete_without_apm exec_delete
|
|
16
|
-
alias exec_update_without_apm exec_update
|
|
17
|
-
|
|
18
|
-
def exec_update(sql, name = nil, binds = [])
|
|
19
|
-
result = nil
|
|
20
|
-
|
|
21
|
-
unless StackifyRubyAPM.current_transaction
|
|
22
|
-
exec_update_without_apm(sql, name, binds)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
ctx = Span::Context.new(
|
|
26
|
-
CATEGORY: 'Database',
|
|
27
|
-
SUBCATEGORY: 'Execute',
|
|
28
|
-
COMPONENT_CATEGORY: 'DB Query',
|
|
29
|
-
COMPONENT_DETAIL: 'Execute SQL Query',
|
|
30
|
-
SQL: sql,
|
|
31
|
-
PROVIDER: "mysql"
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
result = exec_update_without_apm(sql, name, binds)
|
|
35
|
-
|
|
36
|
-
StackifyRubyAPM.span name, TYPE, context: ctx do
|
|
37
|
-
return result
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def exec_delete(sql, name = nil, binds = [])
|
|
42
|
-
result = nil
|
|
43
|
-
|
|
44
|
-
unless StackifyRubyAPM.current_transaction
|
|
45
|
-
exec_delete_without_apm(sql, name, binds)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
ctx = Span::Context.new(
|
|
49
|
-
CATEGORY: 'Database',
|
|
50
|
-
SUBCATEGORY: 'Execute',
|
|
51
|
-
COMPONENT_CATEGORY: 'DB Query',
|
|
52
|
-
COMPONENT_DETAIL: 'Execute SQL Query',
|
|
53
|
-
SQL: sql,
|
|
54
|
-
PROVIDER: "postgresql"
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
result = exec_delete_without_apm(sql, name, binds)
|
|
58
|
-
|
|
59
|
-
StackifyRubyAPM.span name, TYPE, context: ctx do
|
|
60
|
-
return result
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def exec_query(sql, name = "SQL", binds = [], prepare: false)
|
|
66
|
-
result = nil
|
|
67
|
-
|
|
68
|
-
unless StackifyRubyAPM.current_transaction
|
|
69
|
-
exec_query_without_apm(sql, name, binds)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
ctx = Span::Context.new(
|
|
73
|
-
CATEGORY: 'Database',
|
|
74
|
-
SUBCATEGORY: 'Execute',
|
|
75
|
-
COMPONENT_CATEGORY: 'DB Query',
|
|
76
|
-
COMPONENT_DETAIL: 'Execute SQL Query',
|
|
77
|
-
SQL: sql,
|
|
78
|
-
PROVIDER: "postgresql"
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
result = exec_query_without_apm(sql, name, binds)
|
|
82
|
-
|
|
83
|
-
StackifyRubyAPM.span name, TYPE, context: ctx do
|
|
84
|
-
return result
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
# rubocop:enable Metrics/MethodLength
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
register 'ActiveRecord::ConnectionAdapters::PostgreSQL::DatabaseStatements', 'active_record/connection_adapters/postgresql/database_statements', PostgresqlAdapterSpy.new
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|