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.
Files changed (145) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +5 -0
  3. data/.github/ISSUE_TEMPLATE/bug-or-feature-request.md +16 -0
  4. data/.github/workflows/build_and_release_gem.yml +103 -0
  5. data/.github/workflows/build_for_packagecloud.yml +70 -0
  6. data/.github/workflows/docker-images.yml +47 -0
  7. data/.github/workflows/run_cpluplus_tests.yml +73 -0
  8. data/.github/workflows/run_tests.yml +168 -0
  9. data/.github/workflows/scripts/test_install.rb +23 -0
  10. data/.github/workflows/swig/swig-v4.0.2.tar.gz +0 -0
  11. data/.github/workflows/test_on_4_linux.yml +159 -0
  12. data/.gitignore +36 -0
  13. data/.rubocop.yml +29 -0
  14. data/.travis.yml +130 -0
  15. data/.yardopts +6 -0
  16. data/CHANGELOG.md +769 -0
  17. data/CONFIG.md +33 -0
  18. data/Gemfile +14 -0
  19. data/LICENSE +202 -0
  20. data/README.md +393 -0
  21. data/appoptics_apm.gemspec +70 -0
  22. data/bin/appoptics_apm_config +15 -0
  23. data/examples/prepend.rb +13 -0
  24. data/examples/sdk_examples.rb +158 -0
  25. data/ext/oboe_metal/README.md +69 -0
  26. data/ext/oboe_metal/extconf.rb +151 -0
  27. data/ext/oboe_metal/lib/.keep +0 -0
  28. data/ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.0.0.0.sha256 +1 -0
  29. data/ext/oboe_metal/lib/liboboe-1.0-x86_64.so.0.0.0.sha256 +1 -0
  30. data/ext/oboe_metal/noop/noop.c +8 -0
  31. data/ext/oboe_metal/src/README.md +6 -0
  32. data/ext/oboe_metal/src/VERSION +2 -0
  33. data/ext/oboe_metal/src/bson/bson.h +220 -0
  34. data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
  35. data/ext/oboe_metal/src/frames.cc +246 -0
  36. data/ext/oboe_metal/src/frames.h +40 -0
  37. data/ext/oboe_metal/src/init_appoptics_apm.cc +21 -0
  38. data/ext/oboe_metal/src/logging.cc +95 -0
  39. data/ext/oboe_metal/src/logging.h +35 -0
  40. data/ext/oboe_metal/src/oboe.h +1156 -0
  41. data/ext/oboe_metal/src/oboe_api.cpp +652 -0
  42. data/ext/oboe_metal/src/oboe_api.hpp +431 -0
  43. data/ext/oboe_metal/src/oboe_debug.h +59 -0
  44. data/ext/oboe_metal/src/oboe_swig_wrap.cc +7329 -0
  45. data/ext/oboe_metal/src/profiling.cc +435 -0
  46. data/ext/oboe_metal/src/profiling.h +78 -0
  47. data/ext/oboe_metal/test/CMakeLists.txt +53 -0
  48. data/ext/oboe_metal/test/FindGMock.cmake +43 -0
  49. data/ext/oboe_metal/test/README.md +56 -0
  50. data/ext/oboe_metal/test/frames_test.cc +164 -0
  51. data/ext/oboe_metal/test/profiling_test.cc +93 -0
  52. data/ext/oboe_metal/test/ruby_inc_dir.rb +8 -0
  53. data/ext/oboe_metal/test/ruby_prefix.rb +8 -0
  54. data/ext/oboe_metal/test/ruby_test_helper.rb +67 -0
  55. data/ext/oboe_metal/test/test.h +11 -0
  56. data/ext/oboe_metal/test/test_main.cc +32 -0
  57. data/init.rb +4 -0
  58. data/lib/appoptics_apm/api/layerinit.rb +41 -0
  59. data/lib/appoptics_apm/api/logging.rb +381 -0
  60. data/lib/appoptics_apm/api/memcache.rb +37 -0
  61. data/lib/appoptics_apm/api/metrics.rb +63 -0
  62. data/lib/appoptics_apm/api/tracing.rb +57 -0
  63. data/lib/appoptics_apm/api/util.rb +120 -0
  64. data/lib/appoptics_apm/api.rb +21 -0
  65. data/lib/appoptics_apm/base.rb +231 -0
  66. data/lib/appoptics_apm/config.rb +299 -0
  67. data/lib/appoptics_apm/frameworks/grape.rb +98 -0
  68. data/lib/appoptics_apm/frameworks/padrino.rb +78 -0
  69. data/lib/appoptics_apm/frameworks/rails/inst/action_controller.rb +104 -0
  70. data/lib/appoptics_apm/frameworks/rails/inst/action_controller4.rb +48 -0
  71. data/lib/appoptics_apm/frameworks/rails/inst/action_controller5.rb +50 -0
  72. data/lib/appoptics_apm/frameworks/rails/inst/action_controller6.rb +50 -0
  73. data/lib/appoptics_apm/frameworks/rails/inst/action_controller_api.rb +50 -0
  74. data/lib/appoptics_apm/frameworks/rails/inst/action_view.rb +88 -0
  75. data/lib/appoptics_apm/frameworks/rails/inst/active_record.rb +27 -0
  76. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
  77. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +29 -0
  78. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +31 -0
  79. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils.rb +119 -0
  80. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +114 -0
  81. data/lib/appoptics_apm/frameworks/rails/inst/logger_formatters.rb +27 -0
  82. data/lib/appoptics_apm/frameworks/rails.rb +100 -0
  83. data/lib/appoptics_apm/frameworks/sinatra.rb +96 -0
  84. data/lib/appoptics_apm/inst/bunny-client.rb +148 -0
  85. data/lib/appoptics_apm/inst/bunny-consumer.rb +89 -0
  86. data/lib/appoptics_apm/inst/curb.rb +332 -0
  87. data/lib/appoptics_apm/inst/dalli.rb +85 -0
  88. data/lib/appoptics_apm/inst/delayed_job.rb +92 -0
  89. data/lib/appoptics_apm/inst/em-http-request.rb +101 -0
  90. data/lib/appoptics_apm/inst/excon.rb +125 -0
  91. data/lib/appoptics_apm/inst/faraday.rb +106 -0
  92. data/lib/appoptics_apm/inst/graphql.rb +240 -0
  93. data/lib/appoptics_apm/inst/grpc_client.rb +159 -0
  94. data/lib/appoptics_apm/inst/grpc_server.rb +120 -0
  95. data/lib/appoptics_apm/inst/http.rb +81 -0
  96. data/lib/appoptics_apm/inst/httpclient.rb +174 -0
  97. data/lib/appoptics_apm/inst/logger_formatter.rb +50 -0
  98. data/lib/appoptics_apm/inst/logging_log_event.rb +28 -0
  99. data/lib/appoptics_apm/inst/lumberjack_formatter.rb +13 -0
  100. data/lib/appoptics_apm/inst/memcached.rb +86 -0
  101. data/lib/appoptics_apm/inst/mongo.rb +246 -0
  102. data/lib/appoptics_apm/inst/mongo2.rb +225 -0
  103. data/lib/appoptics_apm/inst/moped.rb +466 -0
  104. data/lib/appoptics_apm/inst/rack.rb +182 -0
  105. data/lib/appoptics_apm/inst/rack_cache.rb +35 -0
  106. data/lib/appoptics_apm/inst/redis.rb +274 -0
  107. data/lib/appoptics_apm/inst/resque.rb +151 -0
  108. data/lib/appoptics_apm/inst/rest-client.rb +48 -0
  109. data/lib/appoptics_apm/inst/sequel.rb +178 -0
  110. data/lib/appoptics_apm/inst/sidekiq-client.rb +55 -0
  111. data/lib/appoptics_apm/inst/sidekiq-worker.rb +66 -0
  112. data/lib/appoptics_apm/inst/twitter-cassandra.rb +294 -0
  113. data/lib/appoptics_apm/inst/typhoeus.rb +108 -0
  114. data/lib/appoptics_apm/instrumentation.rb +22 -0
  115. data/lib/appoptics_apm/loading.rb +65 -0
  116. data/lib/appoptics_apm/logger.rb +14 -0
  117. data/lib/appoptics_apm/noop/README.md +9 -0
  118. data/lib/appoptics_apm/noop/context.rb +27 -0
  119. data/lib/appoptics_apm/noop/metadata.rb +25 -0
  120. data/lib/appoptics_apm/noop/profiling.rb +21 -0
  121. data/lib/appoptics_apm/oboe_init_options.rb +211 -0
  122. data/lib/appoptics_apm/ruby.rb +35 -0
  123. data/lib/appoptics_apm/sdk/current_trace.rb +77 -0
  124. data/lib/appoptics_apm/sdk/custom_metrics.rb +94 -0
  125. data/lib/appoptics_apm/sdk/logging.rb +37 -0
  126. data/lib/appoptics_apm/sdk/tracing.rb +434 -0
  127. data/lib/appoptics_apm/support/profiling.rb +18 -0
  128. data/lib/appoptics_apm/support/transaction_metrics.rb +67 -0
  129. data/lib/appoptics_apm/support/transaction_settings.rb +219 -0
  130. data/lib/appoptics_apm/support/x_trace_options.rb +110 -0
  131. data/lib/appoptics_apm/support_report.rb +119 -0
  132. data/lib/appoptics_apm/test.rb +95 -0
  133. data/lib/appoptics_apm/thread_local.rb +26 -0
  134. data/lib/appoptics_apm/util.rb +326 -0
  135. data/lib/appoptics_apm/version.rb +16 -0
  136. data/lib/appoptics_apm/xtrace.rb +115 -0
  137. data/lib/appoptics_apm.rb +77 -0
  138. data/lib/joboe_metal.rb +212 -0
  139. data/lib/oboe.rb +7 -0
  140. data/lib/oboe_metal.rb +172 -0
  141. data/lib/rails/generators/appoptics_apm/install_generator.rb +47 -0
  142. data/lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb +425 -0
  143. data/log/.keep +0 -0
  144. data/yardoc_frontpage.md +26 -0
  145. 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)
@@ -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
@@ -0,0 +1,8 @@
1
+ #include <ruby.h>
2
+
3
+ /* ruby calls this to load the extension */
4
+ void Init_oboe_noop(void) {
5
+ /* assume we haven't yet defined Hola */
6
+ // VALUE klass = rb_define_class("OboeNoop", rb_cObject);
7
+ rb_define_class("OboeNoop", rb_cObject);
8
+ }
@@ -0,0 +1,6 @@
1
+
2
+ oboe_api.hpp and oboe_api.cpp are copied here from the oboe repo during install
3
+
4
+ it is best to edit these file in the oboe repo and use the OBOE_WIP=true env
5
+ var to include the development version while they aren't deploy to s3.
6
+
@@ -0,0 +1,2 @@
1
+ 10.2.0
2
+