appoptics_apm-zearn 4.13.1
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/.dockerignore +5 -0
- data/.github/ISSUE_TEMPLATE/bug-or-feature-request.md +16 -0
- data/.github/workflows/build_and_release_gem.yml +103 -0
- data/.github/workflows/build_for_packagecloud.yml +70 -0
- data/.github/workflows/docker-images.yml +47 -0
- data/.github/workflows/run_cpluplus_tests.yml +73 -0
- data/.github/workflows/run_tests.yml +168 -0
- data/.github/workflows/scripts/test_install.rb +23 -0
- data/.github/workflows/swig/swig-v4.0.2.tar.gz +0 -0
- data/.github/workflows/test_on_4_linux.yml +159 -0
- data/.gitignore +36 -0
- data/.rubocop.yml +29 -0
- data/.travis.yml +130 -0
- data/.yardopts +6 -0
- data/CHANGELOG.md +769 -0
- data/CONFIG.md +33 -0
- data/Gemfile +14 -0
- data/LICENSE +202 -0
- data/README.md +393 -0
- data/appoptics_apm.gemspec +70 -0
- data/bin/appoptics_apm_config +15 -0
- data/examples/prepend.rb +13 -0
- data/examples/sdk_examples.rb +158 -0
- data/ext/oboe_metal/README.md +69 -0
- data/ext/oboe_metal/extconf.rb +151 -0
- data/ext/oboe_metal/lib/.keep +0 -0
- data/ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.0.0.0.sha256 +1 -0
- data/ext/oboe_metal/lib/liboboe-1.0-x86_64.so.0.0.0.sha256 +1 -0
- data/ext/oboe_metal/noop/noop.c +8 -0
- data/ext/oboe_metal/src/README.md +6 -0
- data/ext/oboe_metal/src/VERSION +2 -0
- data/ext/oboe_metal/src/bson/bson.h +220 -0
- data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
- data/ext/oboe_metal/src/frames.cc +246 -0
- data/ext/oboe_metal/src/frames.h +40 -0
- data/ext/oboe_metal/src/init_appoptics_apm.cc +21 -0
- data/ext/oboe_metal/src/logging.cc +95 -0
- data/ext/oboe_metal/src/logging.h +35 -0
- data/ext/oboe_metal/src/oboe.h +1156 -0
- data/ext/oboe_metal/src/oboe_api.cpp +652 -0
- data/ext/oboe_metal/src/oboe_api.hpp +431 -0
- data/ext/oboe_metal/src/oboe_debug.h +59 -0
- data/ext/oboe_metal/src/oboe_swig_wrap.cc +7329 -0
- data/ext/oboe_metal/src/profiling.cc +435 -0
- data/ext/oboe_metal/src/profiling.h +78 -0
- data/ext/oboe_metal/test/CMakeLists.txt +53 -0
- data/ext/oboe_metal/test/FindGMock.cmake +43 -0
- data/ext/oboe_metal/test/README.md +56 -0
- data/ext/oboe_metal/test/frames_test.cc +164 -0
- data/ext/oboe_metal/test/profiling_test.cc +93 -0
- data/ext/oboe_metal/test/ruby_inc_dir.rb +8 -0
- data/ext/oboe_metal/test/ruby_prefix.rb +8 -0
- data/ext/oboe_metal/test/ruby_test_helper.rb +67 -0
- data/ext/oboe_metal/test/test.h +11 -0
- data/ext/oboe_metal/test/test_main.cc +32 -0
- data/init.rb +4 -0
- data/lib/appoptics_apm/api/layerinit.rb +41 -0
- data/lib/appoptics_apm/api/logging.rb +381 -0
- data/lib/appoptics_apm/api/memcache.rb +37 -0
- data/lib/appoptics_apm/api/metrics.rb +63 -0
- data/lib/appoptics_apm/api/tracing.rb +57 -0
- data/lib/appoptics_apm/api/util.rb +120 -0
- data/lib/appoptics_apm/api.rb +21 -0
- data/lib/appoptics_apm/base.rb +231 -0
- data/lib/appoptics_apm/config.rb +299 -0
- data/lib/appoptics_apm/frameworks/grape.rb +98 -0
- data/lib/appoptics_apm/frameworks/padrino.rb +78 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller.rb +104 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller4.rb +48 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller5.rb +50 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller6.rb +50 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller_api.rb +50 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_view.rb +88 -0
- data/lib/appoptics_apm/frameworks/rails/inst/active_record.rb +27 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +29 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +31 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils.rb +119 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +114 -0
- data/lib/appoptics_apm/frameworks/rails/inst/logger_formatters.rb +27 -0
- data/lib/appoptics_apm/frameworks/rails.rb +100 -0
- data/lib/appoptics_apm/frameworks/sinatra.rb +96 -0
- data/lib/appoptics_apm/inst/bunny-client.rb +148 -0
- data/lib/appoptics_apm/inst/bunny-consumer.rb +89 -0
- data/lib/appoptics_apm/inst/curb.rb +332 -0
- data/lib/appoptics_apm/inst/dalli.rb +85 -0
- data/lib/appoptics_apm/inst/delayed_job.rb +92 -0
- data/lib/appoptics_apm/inst/em-http-request.rb +101 -0
- data/lib/appoptics_apm/inst/excon.rb +125 -0
- data/lib/appoptics_apm/inst/faraday.rb +106 -0
- data/lib/appoptics_apm/inst/graphql.rb +240 -0
- data/lib/appoptics_apm/inst/grpc_client.rb +159 -0
- data/lib/appoptics_apm/inst/grpc_server.rb +120 -0
- data/lib/appoptics_apm/inst/http.rb +81 -0
- data/lib/appoptics_apm/inst/httpclient.rb +174 -0
- data/lib/appoptics_apm/inst/logger_formatter.rb +50 -0
- data/lib/appoptics_apm/inst/logging_log_event.rb +28 -0
- data/lib/appoptics_apm/inst/lumberjack_formatter.rb +13 -0
- data/lib/appoptics_apm/inst/memcached.rb +86 -0
- data/lib/appoptics_apm/inst/mongo.rb +246 -0
- data/lib/appoptics_apm/inst/mongo2.rb +225 -0
- data/lib/appoptics_apm/inst/moped.rb +466 -0
- data/lib/appoptics_apm/inst/rack.rb +182 -0
- data/lib/appoptics_apm/inst/rack_cache.rb +35 -0
- data/lib/appoptics_apm/inst/redis.rb +274 -0
- data/lib/appoptics_apm/inst/resque.rb +151 -0
- data/lib/appoptics_apm/inst/rest-client.rb +48 -0
- data/lib/appoptics_apm/inst/sequel.rb +178 -0
- data/lib/appoptics_apm/inst/sidekiq-client.rb +55 -0
- data/lib/appoptics_apm/inst/sidekiq-worker.rb +66 -0
- data/lib/appoptics_apm/inst/twitter-cassandra.rb +294 -0
- data/lib/appoptics_apm/inst/typhoeus.rb +108 -0
- data/lib/appoptics_apm/instrumentation.rb +22 -0
- data/lib/appoptics_apm/loading.rb +65 -0
- data/lib/appoptics_apm/logger.rb +14 -0
- data/lib/appoptics_apm/noop/README.md +9 -0
- data/lib/appoptics_apm/noop/context.rb +27 -0
- data/lib/appoptics_apm/noop/metadata.rb +25 -0
- data/lib/appoptics_apm/noop/profiling.rb +21 -0
- data/lib/appoptics_apm/oboe_init_options.rb +211 -0
- data/lib/appoptics_apm/ruby.rb +35 -0
- data/lib/appoptics_apm/sdk/current_trace.rb +77 -0
- data/lib/appoptics_apm/sdk/custom_metrics.rb +94 -0
- data/lib/appoptics_apm/sdk/logging.rb +37 -0
- data/lib/appoptics_apm/sdk/tracing.rb +434 -0
- data/lib/appoptics_apm/support/profiling.rb +18 -0
- data/lib/appoptics_apm/support/transaction_metrics.rb +67 -0
- data/lib/appoptics_apm/support/transaction_settings.rb +219 -0
- data/lib/appoptics_apm/support/x_trace_options.rb +110 -0
- data/lib/appoptics_apm/support_report.rb +119 -0
- data/lib/appoptics_apm/test.rb +95 -0
- data/lib/appoptics_apm/thread_local.rb +26 -0
- data/lib/appoptics_apm/util.rb +326 -0
- data/lib/appoptics_apm/version.rb +16 -0
- data/lib/appoptics_apm/xtrace.rb +115 -0
- data/lib/appoptics_apm.rb +77 -0
- data/lib/joboe_metal.rb +212 -0
- data/lib/oboe.rb +7 -0
- data/lib/oboe_metal.rb +172 -0
- data/lib/rails/generators/appoptics_apm/install_generator.rb +47 -0
- data/lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb +425 -0
- data/log/.keep +0 -0
- data/yardoc_frontpage.md +26 -0
- metadata +231 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
require "appoptics_apm/version"
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = %q{appoptics_apm-zearn}
|
6
|
+
s.version = AppOpticsAPM::Version::STRING
|
7
|
+
s.date = Time.now.strftime('%Y-%m-%d')
|
8
|
+
|
9
|
+
s.license = "Apache-2.0"
|
10
|
+
|
11
|
+
s.authors = ["Maia Engeli", "Peter Giacomo Lombardo", "Spiros Eliopoulos"]
|
12
|
+
s.email = %q{technicalsupport@solarwinds.com}
|
13
|
+
s.homepage = %q{https://www.appoptics.com/}
|
14
|
+
s.summary = %q{AppOptics APM performance instrumentation gem for Ruby}
|
15
|
+
s.description = <<-EOF
|
16
|
+
Automatic tracing and metrics for Ruby applications. Get started at appoptics.com. @AppOptics
|
17
|
+
EOF
|
18
|
+
|
19
|
+
s.metadata = {
|
20
|
+
'changelog_uri' => 'https://github.com/appoptics/appoptics-apm-ruby/releases',
|
21
|
+
'documentation_uri' => 'https://docs.appoptics.com/kb/apm_tracing/ruby/',
|
22
|
+
'homepage_uri' => 'https://www.appoptics.com/',
|
23
|
+
'source_code_uri' => 'https://github.com/appoptics/appoptics-apm-ruby',
|
24
|
+
}
|
25
|
+
|
26
|
+
s.extra_rdoc_files = ['LICENSE']
|
27
|
+
s.files = `git ls-files`.split("\n").reject { |f| f.match(%r{^(test|gemfiles)/}) }
|
28
|
+
s.files += ['ext/oboe_metal/src/oboe.h',
|
29
|
+
'ext/oboe_metal/src/oboe_api.cpp',
|
30
|
+
'ext/oboe_metal/src/oboe_api.hpp',
|
31
|
+
'ext/oboe_metal/src/oboe_debug.h',
|
32
|
+
'ext/oboe_metal/src/oboe_swig_wrap.cc',
|
33
|
+
'ext/oboe_metal/src/bson/bson.h',
|
34
|
+
'ext/oboe_metal/src/bson/platform_hacks.h',
|
35
|
+
'ext/oboe_metal/src/VERSION',
|
36
|
+
'ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.0.0.0.sha256',
|
37
|
+
'ext/oboe_metal/lib/liboboe-1.0-x86_64.so.0.0.0.sha256'
|
38
|
+
]
|
39
|
+
s.files -= ['build_gem.sh',
|
40
|
+
'build_gem_upload_to_packagecloud.sh',
|
41
|
+
'Rakefile']
|
42
|
+
|
43
|
+
# TODO this is commented out util we can actually provide gems for different platforms
|
44
|
+
# it will create a gem that goes into noop on Darwin and other unsupported platforms
|
45
|
+
# s.platform = defined?(JRUBY_VERSION) ? 'java' : Gem::Platform::CURRENT
|
46
|
+
|
47
|
+
s.extensions = ['ext/oboe_metal/extconf.rb'] unless defined?(JRUBY_VERSION)
|
48
|
+
|
49
|
+
# this still gives a warning, would have to be pinned to a minor version
|
50
|
+
# but that is not necessary and may restrict other gems
|
51
|
+
s.add_runtime_dependency('json', '~> 2.0')
|
52
|
+
s.add_runtime_dependency('no_proxy_fix', '~> 0.1.2', '>= 0.1.2')
|
53
|
+
|
54
|
+
# Development dependencies used in gem development & testing
|
55
|
+
# s.add_development_dependency('rake', '>= 0.9.0')
|
56
|
+
# s.add_development_dependency('simplecov', '>= 0.16.0') if ENV["SIMPLECOV_COVERAGE"]
|
57
|
+
# s.add_development_dependency('simplecov-console', '>= 0.4.0') if ENV["SIMPLECOV_COVERAGE"]
|
58
|
+
# s.add_development_dependency('irb', '>= 1.0.0', '< 1.2.2') if RUBY_VERSION >= '2.6.0'
|
59
|
+
#
|
60
|
+
# unless defined?(JRUBY_VERSION)
|
61
|
+
# s.add_development_dependency('byebug', '>= 11.0.0')
|
62
|
+
# s.add_development_dependency('minitest')
|
63
|
+
# s.add_development_dependency('minitest-hooks', '>= 1.5.0')
|
64
|
+
# s.add_development_dependency('minitest-focus', '>=1.1.2')
|
65
|
+
# s.add_development_dependency('benchmark-ips', '>= 2.7.2')
|
66
|
+
# end
|
67
|
+
|
68
|
+
s.required_ruby_version = '>= 2.4.0'
|
69
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
70
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
##
|
4
|
+
# execute this with `bundle exec appoptics_apm_config`
|
5
|
+
# copies the configuration template file into the current directory
|
6
|
+
#
|
7
|
+
|
8
|
+
puts "Copying the configuration template file to appoptics_apm_config_tmp.rb"
|
9
|
+
puts "Edit and save as appoptics_apm_config.rb"
|
10
|
+
|
11
|
+
target_file = File.join(Dir.pwd, 'appoptics_apm_config_tmp.rb')
|
12
|
+
temp_orig = File.join(File.dirname(File.dirname(__FILE__)),
|
13
|
+
'lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb')
|
14
|
+
|
15
|
+
FileUtils.copy(temp_orig, target_file)
|
data/examples/prepend.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'appoptics_apm'
|
2
|
+
|
3
|
+
module Measurements
|
4
|
+
def request(*args, &block)
|
5
|
+
req = args.first
|
6
|
+
AppOpticsAPM::SDK.summary_metric("request_size", req.to_hash.to_s.size)
|
7
|
+
resp = super
|
8
|
+
AppOpticsAPM::SDK.summary_metric("response_size", resp.to_hash.to_s.size)
|
9
|
+
return resp
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Net::HTTP.send(:prepend, :Measurements)
|
@@ -0,0 +1,158 @@
|
|
1
|
+
# Copyright (c) 2020 SolarWinds, LLC.
|
2
|
+
# All rights reserved.
|
3
|
+
|
4
|
+
###############################################################
|
5
|
+
# SDK EXAMPLES
|
6
|
+
###############################################################
|
7
|
+
# The uses cases of the SDK include:
|
8
|
+
# - tracing a piece of your own code
|
9
|
+
# - tracing a method call of a gem that is not auto-instrumented
|
10
|
+
# by appoptics_apm
|
11
|
+
#
|
12
|
+
# SDK documentation:
|
13
|
+
# https://rubydoc.info/gems/appoptics_apm/AppOpticsAPM/SDK
|
14
|
+
|
15
|
+
###############################################################
|
16
|
+
# Prerequisits
|
17
|
+
# export APPOPTICS_SERVICE_KEY=<API token>:<service_name>
|
18
|
+
# `bundle exec ruby sdk_examples.rb`
|
19
|
+
# 5 traced requests will show up at https://my.appoptics.com/
|
20
|
+
###############################################################
|
21
|
+
|
22
|
+
require 'appoptics_apm'
|
23
|
+
|
24
|
+
unless AppOpticsAPM::SDK.appoptics_ready?(10_000)
|
25
|
+
puts "aborting!!! Agent not ready after 10 seconds"
|
26
|
+
exit false
|
27
|
+
end
|
28
|
+
|
29
|
+
###############################################################
|
30
|
+
### ADD A SPAN
|
31
|
+
###############################################################
|
32
|
+
#
|
33
|
+
# AppOpticsAPM::SDK.trace()
|
34
|
+
# This method adds a span to a trace that has been started either
|
35
|
+
# by the auto-instrumentation of the gem handling incoming requests
|
36
|
+
# or the SDK method `start_trace`.
|
37
|
+
# If this method is called outside of the context of a started
|
38
|
+
# trace no spans will be created.
|
39
|
+
#
|
40
|
+
# The argument is the name for the span
|
41
|
+
|
42
|
+
AppOpticsAPM::SDK.trace('span_name') do
|
43
|
+
[9, 6, 12, 2, 7, 1, 9, 3, 4, 14, 5, 8].sort
|
44
|
+
end
|
45
|
+
|
46
|
+
###############################################################
|
47
|
+
# START A TRACE, ADD A SPAN, AND LOG AN INFO EVENT
|
48
|
+
###############################################################
|
49
|
+
#
|
50
|
+
# AppOpticsAPM::SDK.start_trace()
|
51
|
+
# This method starts a trace. It is handy for background jobs,
|
52
|
+
# workers, or scripts, that are not part of a rack application
|
53
|
+
|
54
|
+
AppOpticsAPM::SDK.start_trace('outer_span') do
|
55
|
+
AppOpticsAPM::SDK.trace('first_child_span') do
|
56
|
+
[9, 6, 12, 2, 7, 1, 9, 3, 4, 14, 5, 8].sort
|
57
|
+
AppOpticsAPM::SDK.log_info({ some: :fancy, hash: :to, send: 1 })
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
###############################################################
|
62
|
+
# LOG AN ERROR EVENT
|
63
|
+
###############################################################
|
64
|
+
#
|
65
|
+
# AppOpticsAPM::SDK.log_exception()
|
66
|
+
# This method adds an error event to the trace, which will be
|
67
|
+
# displayed and counted as exception on the appoptics dashboard.
|
68
|
+
|
69
|
+
def do_raise
|
70
|
+
raise StandardError.new("oops")
|
71
|
+
end
|
72
|
+
|
73
|
+
AppOpticsAPM::SDK.start_trace('with_error') do
|
74
|
+
begin
|
75
|
+
do_raise
|
76
|
+
rescue => e
|
77
|
+
AppOpticsAPM::SDK.log_exception(e)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
###############################################################
|
82
|
+
# TRACE A METHOD
|
83
|
+
###############################################################
|
84
|
+
#
|
85
|
+
# AppOpticsAPM::SDK.trace_method()
|
86
|
+
# This creates a span every time the defined method is run.
|
87
|
+
# The method can be of any (accessible) type (instance,
|
88
|
+
# singleton, private, protected etc.).
|
89
|
+
|
90
|
+
module ExampleModule
|
91
|
+
def self.do_sum(a, b)
|
92
|
+
a + b
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
AppOpticsAPM::SDK.trace_method(ExampleModule,
|
97
|
+
:do_sum,
|
98
|
+
{ name: 'computation', backtrace: true },
|
99
|
+
{ CustomKey: "some_info"})
|
100
|
+
|
101
|
+
AppOpticsAPM::SDK.start_trace('trace_a_method') do
|
102
|
+
ExampleModule.do_sum(1, 2)
|
103
|
+
ExampleModule.do_sum(3, 4)
|
104
|
+
end
|
105
|
+
|
106
|
+
###############################################################
|
107
|
+
# SET A CUSTOM TRANSACTION NAME
|
108
|
+
###############################################################
|
109
|
+
#
|
110
|
+
# AppOpticsAPM::SDK.set_transaction_name()
|
111
|
+
#
|
112
|
+
# this method can be called anytime after a trace has been started to add a
|
113
|
+
# custom name for the whole transaction.
|
114
|
+
# In case of a controller the trace is usually started in rack.
|
115
|
+
|
116
|
+
class FakeController
|
117
|
+
def create(params)
|
118
|
+
# @fake = fake.new(params.permit(:type, :title))
|
119
|
+
# @fake.save
|
120
|
+
AppOpticsAPM::SDK.set_transaction_name("fake.#{params[:type]}")
|
121
|
+
# redirect_to @fake
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
AppOpticsAPM::SDK.start_trace('set_transaction_name') do
|
126
|
+
FakeController.new.create(type: 'news')
|
127
|
+
end
|
128
|
+
|
129
|
+
###############################################################
|
130
|
+
# LOG INJECTION OF TRACE_ID
|
131
|
+
###############################################################
|
132
|
+
#
|
133
|
+
# AppOpticsAPM::SDK.current_trace
|
134
|
+
# This method creates an object with the current trace ID and
|
135
|
+
# helper methods to add the ID to logs for cross-referencing.
|
136
|
+
|
137
|
+
AppOpticsAPM::Config[:log_traceId] = :always
|
138
|
+
|
139
|
+
AppOpticsAPM::SDK.start_trace('log_trace_id') do
|
140
|
+
trace = AppOpticsAPM::SDK.current_trace
|
141
|
+
AppOpticsAPM.logger.warn "Some log message #{trace.for_log}"
|
142
|
+
end
|
143
|
+
|
144
|
+
###############################################################
|
145
|
+
# START A TRACE AND PROFILE
|
146
|
+
###############################################################
|
147
|
+
#
|
148
|
+
# AppOpticsAPM::Profiling.run
|
149
|
+
# This method adds profiling for the code executed in the block
|
150
|
+
|
151
|
+
AppOpticsAPM::SDK.start_trace("#{name}_profiling") do
|
152
|
+
AppOpticsAPM::Profiling.run do
|
153
|
+
10.times do
|
154
|
+
[9, 6, 12, 2, 7, 1, 9, 3, 4, 14, 5, 8].sort
|
155
|
+
sleep 0.2
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Debug the c-code with gdb
|
2
|
+
|
3
|
+
inspired by: https://dev.to/wataash/how-to-create-and-debug-ruby-gem-with-c-native-extension-3l8b
|
4
|
+
|
5
|
+
|
6
|
+
## install ruby with sources
|
7
|
+
|
8
|
+
rbenv is your friend ;) -k means keep sources
|
9
|
+
|
10
|
+
```
|
11
|
+
rbenv install -k 2.6.3
|
12
|
+
rbenv shell 2.6.3
|
13
|
+
|
14
|
+
# check that ruby is debuggable
|
15
|
+
type ruby # => ruby is /home/wsh/.rbenv/shims/ruby
|
16
|
+
rbenv which ruby # => /home/wsh/.rbenv/versions/2.6.3/bin/ruby
|
17
|
+
```
|
18
|
+
|
19
|
+
|
20
|
+
##
|
21
|
+
## add debug info when compiling appoptics_apm
|
22
|
+
add this line to extconf.rb to turn off optimization
|
23
|
+
|
24
|
+
```
|
25
|
+
CONFIG["optflags"] = "-O0"
|
26
|
+
```
|
27
|
+
|
28
|
+
|
29
|
+
##
|
30
|
+
## start ruby app with gdb
|
31
|
+
|
32
|
+
This will run ruby and load the app with a breakpoint in the Reporter::startThread
|
33
|
+
c-function.
|
34
|
+
|
35
|
+
`bundle exec gdb -q -ex 'set breakpoint pending on' -ex 'b Reporter::startThread' -ex run --args ruby -e 'require "./app"'`
|
36
|
+
|
37
|
+
If there is a bug in the ruby code or a ruby byebug binding that halts the
|
38
|
+
script, the debugger will hang without showing any output.
|
39
|
+
So, make sure `bundle exec ruby app.rb` runs.
|
40
|
+
|
41
|
+
use the gdb navigation commands to step through the code. If it says:
|
42
|
+
|
43
|
+
```
|
44
|
+
(gdb) n
|
45
|
+
Single stepping until exit from function _ZN8Reporter11startThreadEv@plt,
|
46
|
+
which has no line number information.
|
47
|
+
```
|
48
|
+
|
49
|
+
type `c` and it may end up stopping in the right location.
|
50
|
+
|
51
|
+
##
|
52
|
+
## make ruby .gdbinit macros available
|
53
|
+
|
54
|
+
These macros are pretty elaborate. They are checked in the ruby github
|
55
|
+
repo: https://github.com/ruby/ruby/blob/master/.gdbinit
|
56
|
+
The code is nicely formatted and colorized in github and easiest to read there.
|
57
|
+
|
58
|
+
installation in the user's home dir:
|
59
|
+
```
|
60
|
+
wget https://github.com/ruby/ruby/blob/master/.gdbinit
|
61
|
+
```
|
62
|
+
##
|
63
|
+
## examples
|
64
|
+
|
65
|
+
Some inspiring examples here:
|
66
|
+
|
67
|
+
https://jvns.ca/blog/2016/06/12/a-weird-system-call-process-vm-readv/
|
68
|
+
|
69
|
+
https://medium.com/@zanker/finding-a-ruby-bug-with-gdb-56d6b321bc86
|
@@ -0,0 +1,151 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2016 SolarWinds, LLC.
|
4
|
+
# All rights reserved.
|
5
|
+
|
6
|
+
require 'mkmf'
|
7
|
+
require 'rbconfig'
|
8
|
+
require 'open-uri'
|
9
|
+
require 'no_proxy_fix'
|
10
|
+
|
11
|
+
CONFIG['warnflags'] = CONFIG['warnflags'].gsub(/-Wdeclaration-after-statement/, '')
|
12
|
+
.gsub(/-Wimplicit-function-declaration/, '')
|
13
|
+
.gsub(/-Wimplicit-int/, '')
|
14
|
+
.gsub(/-Wno-tautological-compare/, '')
|
15
|
+
.gsub(/-Wno-self-assign/, '')
|
16
|
+
.gsub(/-Wno-parentheses-equality/, '')
|
17
|
+
.gsub(/-Wno-constant-logical-operand/, '')
|
18
|
+
.gsub(/-Wno-cast-function-type/, '')
|
19
|
+
init_mkmf(CONFIG)
|
20
|
+
|
21
|
+
ext_dir = File.expand_path(File.dirname(__FILE__))
|
22
|
+
|
23
|
+
# Check if we're running in JRuby
|
24
|
+
jruby = defined?(JRUBY_VERSION) ? true : false
|
25
|
+
# Set the mkmf lib paths so we have no issues linking to
|
26
|
+
# the AppOpticsAPM libs.
|
27
|
+
ao_lib_dir = File.join(ext_dir, 'lib')
|
28
|
+
ao_include = File.join(ext_dir, 'src')
|
29
|
+
|
30
|
+
# Download the appropriate liboboe from S3(via rake for testing) or files.appoptics.com (production)
|
31
|
+
version = File.read(File.join(ao_include, 'VERSION')).strip
|
32
|
+
if ENV['APPOPTICS_FROM_S3'].to_s.downcase == 'true'
|
33
|
+
ao_path = File.join('https://rc-files-t2.s3-us-west-2.amazonaws.com/c-lib/', version)
|
34
|
+
puts 'Fetching c-lib from S3'
|
35
|
+
else
|
36
|
+
ao_path = File.join('https://files.appoptics.com/c-lib', version)
|
37
|
+
end
|
38
|
+
|
39
|
+
ao_arch = 'x86_64'
|
40
|
+
if File.exist?('/etc/alpine-release')
|
41
|
+
version = File.read('/etc/alpine-release').strip
|
42
|
+
|
43
|
+
ao_arch =
|
44
|
+
if Gem::Version.new(version) < Gem::Version.new('3.9')
|
45
|
+
'alpine-libressl-x86_64'
|
46
|
+
else # openssl
|
47
|
+
'alpine-x86_64'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
ao_clib = "liboboe-1.0-#{ao_arch}.so.0.0.0"
|
52
|
+
ao_item = File.join(ao_path, ao_clib)
|
53
|
+
ao_checksum_file = File.join(ao_lib_dir, "#{ao_clib}.sha256")
|
54
|
+
clib = File.join(ao_lib_dir, ao_clib)
|
55
|
+
|
56
|
+
retries = 3
|
57
|
+
success = false
|
58
|
+
while retries > 0
|
59
|
+
begin
|
60
|
+
download = RUBY_VERSION < '2.5.0' ? open(ao_item, 'rb') : URI.open(ao_item, 'rb')
|
61
|
+
IO.copy_stream(download, clib)
|
62
|
+
|
63
|
+
clib_checksum = Digest::SHA256.file(clib).hexdigest
|
64
|
+
download.close
|
65
|
+
checksum = File.read(ao_checksum_file).strip
|
66
|
+
|
67
|
+
# unfortunately these messages only show if the install command is run
|
68
|
+
# with the `--verbose` flag
|
69
|
+
if clib_checksum != checksum
|
70
|
+
$stderr.puts '== ERROR ================================================================='
|
71
|
+
$stderr.puts 'Checksum Verification failed for the c-extension of the appoptics_apm gem'
|
72
|
+
$stderr.puts 'Installation cannot continue'
|
73
|
+
$stderr.puts "\nChecksum packaged with gem: #{checksum}"
|
74
|
+
$stderr.puts "Checksum calculated from lib: #{clib_checksum}"
|
75
|
+
$stderr.puts 'Contact technicalsupport@solarwinds.com if the problem persists'
|
76
|
+
$stderr.puts '=========================================================================='
|
77
|
+
exit 1
|
78
|
+
else
|
79
|
+
success = true
|
80
|
+
retries = 0
|
81
|
+
end
|
82
|
+
rescue => e
|
83
|
+
File.write(clib, '')
|
84
|
+
retries -= 1
|
85
|
+
if retries == 0
|
86
|
+
$stderr.puts '== ERROR =========================================================='
|
87
|
+
$stderr.puts 'Download of the c-extension for the appoptics_apm gem failed.'
|
88
|
+
$stderr.puts 'appoptics_apm will not instrument the code. No tracing will occur.'
|
89
|
+
$stderr.puts 'Contact technicalsupport@solarwinds.com if the problem persists.'
|
90
|
+
$stderr.puts "error: #{ao_item}\n#{e.message}"
|
91
|
+
$stderr.puts '==================================================================='
|
92
|
+
create_makefile('oboe_noop', 'noop')
|
93
|
+
end
|
94
|
+
sleep 0.5
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
if success
|
99
|
+
# Create relative symlinks for the AppOpticsAPM library
|
100
|
+
Dir.chdir(ao_lib_dir) do
|
101
|
+
File.symlink(ao_clib, 'liboboe.so')
|
102
|
+
File.symlink(ao_clib, 'liboboe-1.0.so.0')
|
103
|
+
end
|
104
|
+
|
105
|
+
dir_config('oboe', 'src', 'lib')
|
106
|
+
|
107
|
+
# create Makefile
|
108
|
+
if jruby || ENV.key?('APPOPTICS_URL')
|
109
|
+
# Build the noop extension under JRuby and Heroku.
|
110
|
+
# The oboe-heroku gem builds it's own c extension which links to
|
111
|
+
# libs specific to a Heroku dyno
|
112
|
+
# FIXME: For JRuby we need to remove the c extension entirely
|
113
|
+
create_makefile('oboe_noop', 'noop')
|
114
|
+
|
115
|
+
elsif have_library('oboe', 'oboe_config_get_revision', 'oboe.h')
|
116
|
+
$libs = append_library($libs, 'oboe')
|
117
|
+
$libs = append_library($libs, 'stdc++')
|
118
|
+
|
119
|
+
$CFLAGS << " #{ENV['CFLAGS']}"
|
120
|
+
# $CPPFLAGS << " #{ENV['CPPFLAGS']} -std=c++11"
|
121
|
+
# TODO for debugging: -pg -gdwarf-2, remove for production
|
122
|
+
# -pg does not work on alpine https://www.openwall.com/lists/musl/2014/11/05/2
|
123
|
+
$CPPFLAGS << " #{ENV['CPPFLAGS']} -std=c++11 -gdwarf-2 -I$$ORIGIN/../ext/oboe_metal/include -I$$ORIGIN/../ext/oboe_metal/src"
|
124
|
+
# $CPPFLAGS << " #{ENV['CPPFLAGS']} -std=c++11 -I$$ORIGIN/../ext/oboe_metal/include"
|
125
|
+
$LIBS << " #{ENV['LIBS']}"
|
126
|
+
|
127
|
+
# use "z,defs" to see what happens during linking
|
128
|
+
# $LDFLAGS << " #{ENV['LDFLAGS']} '-Wl,-rpath=$$ORIGIN/../ext/oboe_metal/lib,-z,defs' -lrt"
|
129
|
+
$LDFLAGS << " #{ENV['LDFLAGS']} '-Wl,-rpath=$$ORIGIN/../ext/oboe_metal/lib' -lrt"
|
130
|
+
$CXXFLAGS += " -std=c++11 "
|
131
|
+
|
132
|
+
# ____ include debug info, comment out when not debugging
|
133
|
+
# ____ -pg -> profiling info for gprof
|
134
|
+
CONFIG["debugflags"] = "-ggdb3 "
|
135
|
+
CONFIG["optflags"] = "-O0"
|
136
|
+
|
137
|
+
create_makefile('libappoptics_apm', 'src')
|
138
|
+
|
139
|
+
else
|
140
|
+
$stderr.puts '== ERROR ========================================================='
|
141
|
+
if have_library('oboe')
|
142
|
+
$stderr.puts "The c-library either needs to be updated or doesn't match the OS."
|
143
|
+
$stderr.puts 'No tracing will occur.'
|
144
|
+
else
|
145
|
+
$stderr.puts 'Could not find a matching c-library. No tracing will occur.'
|
146
|
+
end
|
147
|
+
$stderr.puts 'Contact technicalsupport@solarwinds.com if the problem persists.'
|
148
|
+
$stderr.puts '=================================================================='
|
149
|
+
create_makefile('oboe_noop', 'noop')
|
150
|
+
end
|
151
|
+
end
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
af7d764a88cec323940fc6040947f2dcf8041c389744bdfc46b7f2fe0a465dab
|
@@ -0,0 +1 @@
|
|
1
|
+
092e232d0e1aa1826b77c98d96f7bb2db39058c9bec3e2c0387cc6fb51b5b83c
|