appoptics_apm 4.8.0 → 4.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0ccc84ee6065cc578c0b3dd768825b56a9cd17a1661e4df703621cec10e03c7
4
- data.tar.gz: f981f8b2dd4e858b52dc71ad8055c931544a3428a35ca13f30575447fb4a67d9
3
+ metadata.gz: c4b87b6581745b8485f7ddb38f17cb6eab85244a950e7d67cecfe0e97cdbd0bc
4
+ data.tar.gz: dce765afa7ceb92b523c448cd9b1b10efc1b6c5bb0f2f92842dc6af3c1934b27
5
5
  SHA512:
6
- metadata.gz: 8636c892f94298fb8851641566ca7ccef1f72888c4f37242898993e68278f09904b231c75271a2448cef3530ab7477b36cab000644ab24e605eee9ba0f377c6e
7
- data.tar.gz: 96b455b4744604a8d52ce794c070bca3b95543a0e820454d86e3a55ab49a9f22232b9386cecf4bdd1d97585f5e4fdb4e8d796af9ee4cf5138a67736ee0cefedd
6
+ metadata.gz: d9b446519730872b09136e9b80e546a68dce40abf52fbb0e5ac139244c6ed3c7fa8ef45eb855714d8e11924886d0b972aa04332cec6342339c65772f5b7aec0f
7
+ data.tar.gz: 80df368e2ed2c868348ba5e7e9b24dfa2498d6f0cb703d568fbf8310879d06fee5ac59187a70747f04c040d4d54df2b8925faa856dc5a01b036375f21edacfbe
data/.gitignore CHANGED
@@ -1,5 +1,5 @@
1
1
  oboe*.gem
2
- Gemfile.lock
2
+ *.lock
3
3
  gemfiles/*.lock
4
4
  .ruby-version
5
5
  *~
@@ -27,3 +27,7 @@ coverage
27
27
  doc
28
28
  .*byebug*
29
29
  gemfiles/vendor*
30
+ scrap.rb
31
+ scarp_gemfile
32
+ .irbrc
33
+ *.code-workspace
data/.irbrc ADDED
@@ -0,0 +1,3 @@
1
+ require 'irb/ext/save-history'
2
+ IRB.conf[:SAVE_HISTORY] = 2000
3
+ IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-history"
data/.travis.yml CHANGED
@@ -11,8 +11,8 @@ env:
11
11
  - DBTYPE=mysql
12
12
 
13
13
  rvm:
14
- - 2.6.2
15
- - 2.5.3
14
+ - 2.6.4
15
+ - 2.5.5
16
16
  - 2.4.5
17
17
  - ruby-head
18
18
  # - jruby-9.0.5.0
@@ -23,6 +23,7 @@ gemfile:
23
23
  - gemfiles/instrumentation_mocked.gemfile
24
24
  - gemfiles/instrumentation_mocked_oldgems.gemfile
25
25
  - gemfiles/frameworks.gemfile
26
+ - gemfiles/rails60.gemfile
26
27
  - gemfiles/rails52.gemfile
27
28
  - gemfiles/rails42.gemfile
28
29
  - gemfiles/delayed_job.gemfile
@@ -32,13 +33,14 @@ matrix:
32
33
  exclude:
33
34
  - rvm: ruby-head
34
35
  gemfile: gemfiles/rails42.gemfile
35
- - rvm: 2.6.2
36
+ - rvm: 2.6.4
36
37
  gemfile: gemfiles/rails42.gemfile
38
+ - rvm: 2.4.5
39
+ gemfile: gemfiles/rails60.gemfile
37
40
 
38
-
39
- - rmv: 2.6.2
41
+ - rmv: 2.6.4
40
42
  env: DBTYPE=mysql
41
- - rvm: 2.5.3
43
+ - rvm: 2.5.5
42
44
  env: DBTYPE=mysql
43
45
  - rvm: 2.4.5
44
46
  env: DBTYPE=mysql
@@ -57,10 +59,10 @@ matrix:
57
59
  env: DBTYPE=mysql
58
60
  - gemfile: gemfiles/frameworks.gemfile
59
61
  env: DBTYPE=mysql
60
- - gemfile: gemfiles/rails51.gemfile
61
- env: DBTYPE=mysql
62
62
  - gemfile: gemfiles/rails52.gemfile
63
63
  env: DBTYPE=mysql
64
+ - gemfile: gemfiles/rails60.gemfile
65
+ env: DBTYPE=mysql
64
66
  - gemfile: gemfiles/delayed_job.gemfile
65
67
  env: DBTYPE=mysql
66
68
 
@@ -85,37 +87,50 @@ matrix:
85
87
  # Attempt Travis/Cassandra fix re: https://github.com/travis-ci/travis-ci/issues/1484
86
88
  # Updated Cassandra: https://github.com/travis-ci/travis-ci/issues/1650
87
89
 
88
- before_install:
89
- - sudo service cassandra stop
90
- - sudo sh -c "echo 'JVM_OPTS=\"\${JVM_OPTS} -Djava.net.preferIPv4Stack=false\"' >> /etc/cassandra/cassandra-env.sh"
91
- - echo "127.0.0.1 localhost" | sudo tee /etc/hosts
92
- - echo "127.0.0.1 " `hostname` | sudo tee -a /etc/hosts
93
- - sudo service cassandra start
90
+ # the following is not working anymore on travis
91
+ # commenting it out as per AO-13532 as we currently don't have instrumentation
92
+ # for cassandra
93
+ #before_install:
94
+ # - sudo service cassandra stop
95
+ # - sudo sh -c "echo 'JVM_OPTS=\"\${JVM_OPTS} -Djava.net.preferIPv4Stack=false\"' >> /etc/cassandra/cassandra-env.sh"
96
+ # - echo "127.0.0.1 localhost" | sudo tee /etc/hosts
97
+ # - echo "127.0.0.1 " `hostname` | sudo tee -a /etc/hosts
98
+ # - sudo service cassandra start
94
99
 
95
100
  install:
96
- - curl -LO http://kent.dl.sourceforge.net/project/swig/swig/swig-3.0.8/swig-3.0.8.tar.gz
97
- - tar xzf swig-3.0.8.tar.gz
98
- - pushd swig-3.0.8
101
+ - curl -LO http://kent.dl.sourceforge.net/project/swig/swig/swig-3.0.12/swig-3.0.12.tar.gz
102
+ - tar xzf swig-3.0.12.tar.gz
103
+ - pushd swig-3.0.12
99
104
  - ./configure && make && sudo make install
100
105
  - popd
101
106
 
102
107
  before_script:
108
+ - export APPOPTICS_GEM_TEST=true
109
+ - export APPOPTICS_REPORTER=file
110
+ - export APPOPTICS_COLLECTOR=/tmp/appoptics_traces.bson
111
+ - export APPOPTICS_REPORTER_FILE_SINGLE=false
112
+ - export APPOPTICS_TOKEN_BUCKET_CAPACITY=1000
113
+ - export APPOPTICS_TOKEN_BUCKET_RATE=1000
114
+
103
115
  - bundle update --jobs=3 --retry=3
104
- - bundle exec rake fetch_ext_deps
105
- - bundle exec rake clean
106
- - bundle exec rake compile
116
+ - bundle exec rake clean fetch compile
107
117
  - psql -c 'create database travis_ci_test;' -U postgres
108
118
  - mysql -e 'create database travis_ci_test;'
109
119
  - redis-server --requirepass secret_pass &
110
120
  - sleep 10
111
- - export APPOPTICS_TOKEN_BUCKET_CAPACITY=1000
112
- - export APPOPTICS_TOKEN_BUCKET_RATE=1000
113
121
 
114
122
  script: "N=1 bundle exec rake test"
115
123
 
116
124
  services:
117
125
  - mongodb
118
126
  - memcached
119
- - cassandra
120
- # - redis
127
+ - mysql
128
+ # - cassandra
129
+ - postgresql
130
+ # - redis-server
121
131
  - rabbitmq
132
+
133
+ addons:
134
+ apt:
135
+ packages:
136
+ - rabbitmq-server
data/CONFIG.md CHANGED
@@ -17,7 +17,7 @@ Name | Description | Default
17
17
 
18
18
  Name | Description | Default
19
19
  ---- | ----------- | -------
20
- `APPOPTICS_GEM_TEST` | puts the gem in test mode. Traces are written to /tmp/trace_output.bson. | `false`
20
+ `APPOPTICS_GEM_TEST` | puts the gem in test mode to avoid restarting certain background services used in testing. `false`
21
21
  `DBTYPE` | For tests on Ruby on Rails, specifies the database type to test against. `postgres`, `mysql` and `mysql2` are valid options. | `postgres`
22
22
  `APPOPTICS_CASSANDRA_SERVER` | specifies the Cassandra server to test against. | `127.0.0.1:9160`
23
23
  `APPOPTICS_MONGO_SERVER` | specifies the Mongo server to test against. | `127.0.0.1:27017`
data/README.md CHANGED
@@ -390,4 +390,4 @@ See the README in the test directory.
390
390
 
391
391
  Copyright (c) 2018 SolarWinds, LLC
392
392
 
393
- Released under the [Librato Open License](https://docs.appoptics.com/kb/apm_tracing/librato-open-license/)
393
+ Released under the [Librato Open License](https://docs.appoptics.com/kb/apm_tracing/librato-open-license/)
data/Rakefile CHANGED
@@ -31,6 +31,9 @@ Rake::TestTask.new do |t|
31
31
  if Rails::VERSION::MAJOR == 5
32
32
  t.test_files = FileList["test/frameworks/rails#{Rails::VERSION::MAJOR}x_test.rb"] +
33
33
  FileList["test/frameworks/rails#{Rails::VERSION::MAJOR}x_api_test.rb"]
34
+ elsif Rails::VERSION::MAJOR == 6
35
+ t.test_files = FileList["test/frameworks/rails5x_test.rb"] +
36
+ FileList["test/frameworks/rails5x_api_test.rb"]
34
37
  else
35
38
  t.test_files = FileList["test/frameworks/rails#{Rails::VERSION::MAJOR}x_test.rb"]
36
39
  end
@@ -56,74 +59,77 @@ Rake::TestTask.new do |t|
56
59
  end
57
60
 
58
61
  if defined?(JRUBY_VERSION)
59
- t.ruby_opts << ['-J-javaagent:/usr/local/tracelytics/tracelyticsagent.jar']
62
+ t.ruby_opts << ['-J-javaagent:/usr/local/tracelytics/tracelyticsagent.jar']
63
+ end
60
64
  end
61
- end
62
-
63
- desc "Run all test suites defined by travis"
64
- task "docker_tests" do
65
- Dir.chdir('test/run_tests')
66
- exec('docker-compose run ruby_appoptics /code/ruby-appoptics/test/run_tests/ruby_setup.sh test --remove-orphans')
67
- end
68
65
 
69
- desc "Start docker container for testing and debugging"
70
- task "docker" do
71
- Dir.chdir('test/run_tests')
72
- exec('docker-compose run ruby_appoptics /code/ruby-appoptics/test/run_tests/ruby_setup.sh bash --remove-orphans')
73
- end
74
66
 
75
- desc "Stop all containers that were started for testing and debugging"
76
- task "docker_down" do
77
- Dir.chdir('test/run_tests')
78
- exec('docker-compose down')
79
- end
67
+ desc "Run all test suites defined by travis"
68
+ task "docker_tests" do
69
+ Dir.chdir('test/run_tests')
70
+ exec('docker-compose run ruby_appoptics /code/ruby-appoptics/test/run_tests/ruby_setup.sh test --remove-orphans')
71
+ end
80
72
 
81
- desc "Fetch extension dependency files"
82
- task :fetch_ext_deps do
83
- swig_version = %x{swig -version} rescue ''
84
- swig_version = swig_version.scan(/swig version 3.0.\d*/i)
85
- if swig_version.empty?
86
- $stderr.puts '== ERROR ================================================================='
87
- $stderr.puts "Could not find required swig version 3.0.*, found #{swig_version.inspect}"
88
- $stderr.puts 'Please install swig "~ 3.0.8" and try again.'
89
- $stderr.puts '=========================================================================='
90
- raise
73
+ desc "Start docker container for testing and debugging"
74
+ task "docker" do
75
+ Dir.chdir('test/run_tests')
76
+ exec('docker-compose run ruby_appoptics /code/ruby-appoptics/test/run_tests/ruby_setup.sh bash --remove-orphans')
91
77
  end
92
78
 
93
- # The c-lib version is different from the gem version
94
- oboe_version = ENV['OBOE_VERSION'] || 'latest'
95
- oboe_s3_dir = "https://s3-us-west-2.amazonaws.com/rc-files-t2/c-lib/#{oboe_version}"
96
- ext_src_dir = File.expand_path('ext/oboe_metal/src')
97
-
98
- # VERSION is used by extconf.rb to download the correct liboboe when installing the gem
99
- remote_file = File.join(oboe_s3_dir, 'VERSION')
100
- local_file = File.join(ext_src_dir, 'VERSION')
101
- puts "fetching #{remote_file} to #{local_file}"
102
- open(remote_file, 'rb') do |rf|
103
- content = rf.read
104
- File.open(local_file, 'wb') { |f| f.puts content }
105
- puts "!!!!!!! C-Lib VERSION: #{content.strip} !!!!!!!!"
79
+ desc "Stop all containers that were started for testing and debugging"
80
+ task "docker_down" do
81
+ Dir.chdir('test/run_tests')
82
+ exec('docker-compose down')
106
83
  end
107
84
 
108
- # oboe and bson header files
109
- FileUtils.mkdir_p(File.join(ext_src_dir, 'bson'))
110
- %w(oboe.h oboe.hpp oboe_debug.h oboe.i bson/bson.h bson/platform_hacks.h).each do |filename|
111
- # %w(oboe.h oboe_debug.h bson/bson.h bson/platform_hacks.h).each do |filename|
112
- remote_file = File.join(oboe_s3_dir, 'include', filename)
113
- local_file = File.join(ext_src_dir, filename)
85
+ desc "Fetch extension dependency files"
86
+ task :fetch_ext_deps do
87
+ swig_version = %x{swig -version} rescue ''
88
+ swig_version = swig_version.scan(/swig version [34].0.\d*/i)
89
+ if swig_version.empty?
90
+ $stderr.puts '== ERROR ================================================================='
91
+ $stderr.puts "Could not find required swig version >3.0.8, found #{swig_version.inspect}"
92
+ $stderr.puts 'Please install swig "~ 3.0.12" and try again.'
93
+ $stderr.puts '=========================================================================='
94
+ raise
95
+ end
96
+
97
+ # The c-lib version is different from the gem version
98
+ oboe_version = ENV['OBOE_VERSION'] || 'latest'
99
+ oboe_s3_dir = "https://s3-us-west-2.amazonaws.com/rc-files-t2/c-lib/#{oboe_version}"
100
+ ext_src_dir = File.expand_path('ext/oboe_metal/src')
114
101
 
102
+ # VERSION is used by extconf.rb to download the correct liboboe when installing the gem
103
+ remote_file = File.join(oboe_s3_dir, 'VERSION')
104
+ local_file = File.join(ext_src_dir, 'VERSION')
115
105
  puts "fetching #{remote_file} to #{local_file}"
116
106
  open(remote_file, 'rb') do |rf|
117
107
  content = rf.read
118
108
  File.open(local_file, 'wb') { |f| f.puts content }
109
+ puts "!!!!!!! C-Lib VERSION: #{content.strip} !!!!!!!!"
110
+ end
111
+
112
+ # oboe and bson header files
113
+ FileUtils.mkdir_p(File.join(ext_src_dir, 'bson'))
114
+ %w(oboe.h oboe.hpp oboe_debug.h oboe.i bson/bson.h bson/platform_hacks.h).each do |filename|
115
+ # %w(oboe.h oboe_debug.h bson/bson.h bson/platform_hacks.h).each do |filename|
116
+ remote_file = File.join(oboe_s3_dir, 'include', filename)
117
+ local_file = File.join(ext_src_dir, filename)
118
+
119
+ puts "fetching #{remote_file} to #{local_file}"
120
+ open(remote_file, 'rb') do |rf|
121
+ content = rf.read
122
+ File.open(local_file, 'wb') { |f| f.puts content }
123
+ end
119
124
  end
120
- end
121
125
 
122
- FileUtils.cd(ext_src_dir) do
123
- system('swig -c++ -ruby -module oboe_metal oboe.i')
124
- FileUtils.rm('oboe.i')
126
+ FileUtils.cd(ext_src_dir) do
127
+ system('swig -c++ -ruby -module oboe_metal oboe.i')
128
+ FileUtils.rm('oboe.i')
129
+ end
125
130
  end
126
- end
131
+
132
+ task :fetch => :fetch_ext_deps
127
133
 
128
134
  desc "Build the gem's c extension"
129
135
  task :compile do
@@ -136,7 +142,7 @@ task :compile do
136
142
  so_file = File.expand_path('ext/oboe_metal/oboe_metal.so')
137
143
 
138
144
  Dir.chdir ext_dir
139
- ENV['APPOPTICS_FROM_S3'] = 'true'
145
+ # ENV['APPOPTICS_FROM_S3'] = 'true'
140
146
  cmd = [Gem.ruby, 'extconf.rb']
141
147
  sh cmd.join(' ')
142
148
  sh '/usr/bin/env make'
@@ -174,6 +180,7 @@ task :clean do
174
180
  Dir.chdir ext_dir
175
181
  sh '/usr/bin/env make clean' if File.exist? 'Makefile'
176
182
 
183
+ FileUtils.rm_f "src/oboe_wrap.cxx"
177
184
  Dir.chdir pwd
178
185
  else
179
186
  puts '== Nothing to do under JRuby.'
@@ -54,6 +54,6 @@ Automatic tracing and metrics for Ruby applications. Get started at appoptics.co
54
54
  s.add_development_dependency('benchmark-ips', '>= 2.7.2')
55
55
  end
56
56
 
57
- s.required_ruby_version = '>= 2.0.0'
57
+ s.required_ruby_version = '>= 2.4.0'
58
58
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
59
59
  end
@@ -8,13 +8,8 @@ else
8
8
  ./build_gem.sh
9
9
  fi
10
10
 
11
- # save current rbenv setting and switch to 2.4.1 for the package_cloud commands
12
- current_ruby=`rbenv global`
13
- rbenv global 2.4.1
11
+ gem install package_cloud --no-document
14
12
 
15
13
  # prerequisite: package_cloud token needs to be in ~/.packagecloud
16
14
  gem=`ls -dt1 appoptics_apm-[^pre]*.gem | head -1`
17
15
  package_cloud push solarwinds/appoptics-apm-ruby $gem
18
-
19
- # restore ruby version
20
- rbenv global $current_ruby
@@ -63,8 +63,6 @@ def do_traced_work
63
63
  end
64
64
  end
65
65
 
66
- # Example with logging
67
66
  AppOpticsAPM::SDK.start_trace('outer_span_2') do
68
- AppopticsAPM.logger.warn "Hello World!"
69
67
  do_traced_work
70
68
  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
@@ -1 +1 @@
1
- 5.0.0
1
+ 6.0.0
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * @file oboe.h
3
- *
3
+ *
4
4
  * API header for AppOptics' Oboe application tracing library for use with AppOptics.
5
5
  *
6
6
  * @package Oboe
7
7
  * @author AppOptics
8
8
  * @copyright Copyright (c) 2016, SolarWinds LLC
9
- * @license
9
+ * @license
10
10
  * @link https://appoptics.com
11
11
  **/
12
12
 
@@ -81,6 +81,10 @@ extern "C" {
81
81
  * Default events flush batch size in KB.
82
82
  */
83
83
  #define OBOE_DEFAULT_EVENTS_FLUSH_BATCH_SIZE 2000
84
+ /**
85
+ * Default EC2 metadata timeout in milliseconds
86
+ */
87
+ #define OBOE_DEFAULT_EC2_METADATA_TIMEOUT 1000
84
88
 
85
89
  #define OBOE_SAMPLE_RESOLUTION 1000000
86
90
 
@@ -167,6 +171,8 @@ typedef struct oboe_init_options {
167
171
  int token_bucket_capacity; // custom token bucket capacity
168
172
  int token_bucket_rate; // custom token bucket rate
169
173
  int file_single; // use single files in file reporter for each event
174
+
175
+ int ec2_metadata_timeout; // EC2 metadata timeout in milliseconds
170
176
  } oboe_init_options_t;
171
177
 
172
178
  typedef struct oboe_span_params {
@@ -183,12 +189,22 @@ typedef struct oboe_span_params {
183
189
  int do_metrics; // boolean flag whether a (HTTP) span should be sent (1) or not (0)
184
190
  } oboe_span_params_t;
185
191
 
192
+ //
193
+ // oboe_get_tracing_decisions input and output structures
194
+ //
186
195
  typedef struct oboe_tracing_decisions_in {
187
- int version;
188
- const char *service_name;
189
- const char *in_xtrace;
190
- int custom_sample_rate;
191
- int custom_tracing_mode;
196
+ int version; // the version of this structure
197
+ const char *service_name; // custom service name
198
+ const char *in_xtrace; // existing X-Trace from passed in HTTP header
199
+ int custom_sample_rate; // custom sample rate
200
+ int custom_tracing_mode; // custom tracing mode
201
+
202
+ // v2
203
+ int custom_trigger_mode; // custom trigger mode
204
+ int request_type; // the request type: OBOE_REQUEST_TYPE_REGULAR, OBOE_REQUEST_TYPE_TRIGGER
205
+ const char *header_options; // X-Trace-Options HTTP header value
206
+ const char *header_signature; // X-Trace-Options-Signature HTTP header value
207
+ time_t header_timestamp; // timestamp from X-Trace-Options header, converted to UNIX timestamp format
192
208
  } oboe_tracing_decisions_in_t;
193
209
 
194
210
  typedef struct oboe_tracing_decisions_out {
@@ -197,6 +213,12 @@ typedef struct oboe_tracing_decisions_out {
197
213
  int sample_source;
198
214
  int do_sample;
199
215
  int do_metrics;
216
+
217
+ // v2
218
+ int request_provisioned;
219
+ int auth_status;
220
+ const char *auth_message;
221
+ const char *status_message;
200
222
  } oboe_tracing_decisions_out_t;
201
223
 
202
224
  typedef struct oboe_internal_stats {
@@ -357,7 +379,7 @@ int oboe_init(oboe_init_options_t* options);
357
379
  * Initialize the Oboe subsytems using a specific reporter configuration.
358
380
  *
359
381
  * This should be called before any other oboe_* functions butm may also be
360
- * used to change or re-initialize the current reporter. To reconnect the
382
+ * used to change or re-initialize the current reporter. To reconnect the
361
383
  * reporter use oboe_disconnect() and oboe_reconnect() instead.
362
384
  *
363
385
  * @param protocol One of OBOE_REPORTER_PROTOCOL_FILE, OBOE_REPORTER_PROTOCOL_UDP,
@@ -367,7 +389,12 @@ int oboe_init(oboe_init_options_t* options);
367
389
  */
368
390
  int oboe_init_reporter(const char *protocol, oboe_init_options_t *options);
369
391
 
370
- void oboe_init_options_set_defaults(oboe_init_options_t *options);
392
+ /**
393
+ * returns one of these:
394
+ * - OBOE_INIT_OPTIONS_SET_DEFAULTS_OK
395
+ * - OBOE_INIT_OPTIONS_SET_DEFAULTS_WRONG_VERSION
396
+ */
397
+ int oboe_init_options_set_defaults(oboe_init_options_t *options);
371
398
 
372
399
  /**
373
400
  * Disconnect or shut down the Oboe reporter, but allow it to be reconnect()ed.
@@ -429,6 +456,7 @@ void oboe_shutdown();
429
456
  #define OBOE_SETTINGS_FLAG_SAMPLE_START 0x4
430
457
  #define OBOE_SETTINGS_FLAG_SAMPLE_THROUGH 0x8
431
458
  #define OBOE_SETTINGS_FLAG_SAMPLE_THROUGH_ALWAYS 0x10
459
+ #define OBOE_SETTINGS_FLAG_TRIGGERED_TRACE 0x20
432
460
  #define OBOE_SETTINGS_MAX_STRLEN 256
433
461
 
434
462
  #define OBOE_SETTINGS_UNSET -1
@@ -455,9 +483,6 @@ void oboe_shutdown();
455
483
  #pragma pack(push, 1)
456
484
  #endif
457
485
 
458
- #define TOKEN_BUCKET_CAPACITY_DEFAULT 16 // bucket capacity (how many tokens fit into the bucket)
459
- #define TOKEN_BUCKET_RATE_PER_SECOND_DEFAULT 8 // rate per second (number of tokens per second)
460
-
461
486
  #define OBOE_SEND_EVENT 0
462
487
  #define OBOE_SEND_STATUS 1
463
488
  #define OBOE_SEND_PROFILING 2
@@ -477,7 +502,17 @@ void oboe_shutdown();
477
502
  #define OBOE_SPAN_NO_REPORTER -4
478
503
  #define OBOE_SPAN_NOT_READY -5
479
504
 
480
- // these codes are used by oboe_sample_layer_custom(), oboe_tracing_decisions(), oboe_reporter_is_ready()
505
+ // these codes are returned by oboe_sample_layer_custom(), oboe_tracing_decisions(),
506
+ // oboe_reporter_is_ready(), and referenced in settings_messages.c (to convert
507
+ // error codes to messages.)
508
+ //
509
+ // they are structured such that codes that are <= 0 are successful, i.e., no
510
+ // error status needs to be reported to the user, while codes > 0 are errors that
511
+ // need to be reported.
512
+
513
+ #define OBOE_TRACING_DECISIONS_FAILED_AUTH -5
514
+ #define OBOE_TRACING_DECISIONS_TRIGGERED_TRACE_EXHAUSTED -4
515
+ #define OBOE_TRACING_DECISIONS_TRIGGERED_TRACE_DISABLED -3
481
516
  #define OBOE_TRACING_DECISIONS_TRACING_DISABLED -2
482
517
  #define OBOE_TRACING_DECISIONS_XTRACE_NOT_SAMPLED -1
483
518
  #define OBOE_TRACING_DECISIONS_OK 0
@@ -486,8 +521,31 @@ void oboe_shutdown();
486
521
  #define OBOE_TRACING_DECISIONS_REPORTER_NOT_READY 3
487
522
  #define OBOE_TRACING_DECISIONS_NO_VALID_SETTINGS 4
488
523
  #define OBOE_TRACING_DECISIONS_QUEUE_FULL 5
524
+ #define OBOE_TRACING_DECISIONS_BAD_ARG 6
525
+
526
+ // convert above codes into const char* messages.
527
+ const char* oboe_get_tracing_decisions_message(int code);
528
+
529
+ #define OBOE_TRACING_DECISIONS_AUTH_NOT_CHECKED -2
530
+ #define OBOE_TRACING_DECISIONS_AUTH_NOT_PRESENT -1
531
+ #define OBOE_TRACING_DECISIONS_AUTH_OK 0
532
+ #define OBOE_TRACING_DECISIONS_AUTH_NO_SIG_KEY 1
533
+ #define OBOE_TRACING_DECISIONS_AUTH_INVALID_SIG 2
534
+ #define OBOE_TRACING_DECISIONS_AUTH_BAD_TIMESTAMP 3
489
535
 
490
- // these codes are used by oboe_init(), oboe_init_reporter(), _oboe_create_reporter()
536
+ // convert above codes into const char* messages.
537
+ const char* oboe_get_tracing_decisions_auth_message (int code);
538
+
539
+ #define OBOE_REQUEST_TYPE_NONE -1
540
+ #define OBOE_REQUEST_TYPE_REGULAR 0
541
+ #define OBOE_REQUEST_TYPE_TRIGGER 1
542
+
543
+ #define OBOE_INIT_OPTIONS_SET_DEFAULTS_OK 0
544
+ #define OBOE_INIT_OPTIONS_SET_DEFAULTS_WRONG_VERSION 1
545
+
546
+ //
547
+ // these codes are returned by oboe_init(), oboe_init_reporter(), _oboe_create_reporter()
548
+ //
491
549
  #define OBOE_INIT_ALREADY_INIT -1
492
550
  #define OBOE_INIT_OK 0
493
551
  #define OBOE_INIT_WRONG_VERSION 1
@@ -501,6 +559,17 @@ void oboe_shutdown();
501
559
  #define OBOE_INIT_SSL_LOAD_CERT 9
502
560
  #define OBOE_INIT_SSL_REPORTER_CREATE 10
503
561
 
562
+ // token buckets
563
+ enum TOKEN_BUCKETS {
564
+ TOKEN_BUCKET_SAMPLING, // for normal requests
565
+ TOKEN_BUCKET_TT_RELAXED, // for triggered traces initiated by Pingdom and
566
+ // other trusted sources (relaxed settings)
567
+ TOKEN_BUCKET_TT_STRICT, // for triggered traces initiated by CLI and
568
+ // other untrusted sources (strict settings)
569
+ TOKEN_BUCKET_COUNT // IMPORTANT NOTE: this must be the last element
570
+ // inside the enum
571
+ };
572
+
504
573
  typedef struct {
505
574
  uint32_t magic;
506
575
  uint32_t timestamp;
@@ -510,8 +579,9 @@ typedef struct {
510
579
  uint32_t ttl;
511
580
  uint32_t _pad;
512
581
  char layer[OBOE_SETTINGS_MAX_STRLEN]; // Flawfinder: ignore
513
- double bucket_capacity;
514
- double bucket_rate_per_sec;
582
+ double bucket_capacity[TOKEN_BUCKET_COUNT];
583
+ double bucket_rate_per_sec[TOKEN_BUCKET_COUNT];
584
+ char signature_key[OBOE_SETTINGS_MAX_STRLEN]; // Flawfinder: ignore
515
585
  } oboe_settings_t;
516
586
 
517
587
  typedef struct {
@@ -531,6 +601,7 @@ typedef struct {
531
601
  volatile uint32_t through_count; // # of through traces
532
602
  volatile uint32_t through_ignored_count; // # of new requests, that are rejected due to start_always_flag == 0
533
603
  // that have through_always_flag == 1
604
+ volatile uint32_t triggered_count; // # of triggered traces
534
605
  volatile uint32_t last_used_sample_rate;
535
606
  volatile uint32_t last_used_sample_source;
536
607
 
@@ -541,12 +612,13 @@ typedef struct {
541
612
  typedef struct {
542
613
  int tracing_mode; // pushed from server, override from config file
543
614
  int sample_rate; // pushed from server, override from config file
615
+ int trigger_mode; // pushed from server, override from config file
544
616
  oboe_settings_t *settings; // cached settings, updated by tracelyzer (init to NULL)
545
- int last_auto_sample_rate; // stores last known automatic sampling rate
546
- uint16_t last_auto_flags; // stores last known flags associated with above
617
+ int last_auto_sample_rate; // stores last known automatic sampling rate
618
+ uint16_t last_auto_flags; // stores last known flags associated with above
547
619
  uint32_t last_auto_timestamp; // timestamp from last *settings lookup
548
620
  uint32_t last_refresh; // last refresh time
549
- token_bucket_t bucket;
621
+ token_bucket_t bucket[TOKEN_BUCKET_COUNT]; // token buckets for various tasks
550
622
  } oboe_settings_cfg_t;
551
623
 
552
624
  int oboe_settings_init_local();
@@ -560,9 +632,10 @@ entry_layer_t* oboe_settings_entry_layer_get(const char* name);
560
632
  oboe_settings_cfg_t* oboe_settings_cfg_get();
561
633
  void oboe_settings_cfg_init(oboe_settings_cfg_t *cfg);
562
634
 
563
- void oboe_settings_set(int sample_rate, int tracing_mode);
635
+ void oboe_settings_set(int sample_rate, int tracing_mode, int trigger_mode);
564
636
  void oboe_settings_rate_set(int sample_rate);
565
637
  void oboe_settings_mode_set(int tracing_mode);
638
+ void oboe_settings_trigger_set(int trigger_mode);
566
639
 
567
640
  int oboe_rand_get_value();
568
641
 
@@ -588,49 +661,7 @@ int oboe_sample_is_enabled(oboe_settings_cfg_t *cfg);
588
661
  * headers, and, if appropriate, rolls the virtual dice to
589
662
  * decide if this request should be sampled.
590
663
  *
591
- * This is designed to be called once per layer per request.
592
- *
593
- * @param service_name Service name used for this request (may be NULL to use default settings)
594
- * @param xtrace X-Trace ID string from an HTTP request or higher layer (NULL or empty string if not present).
595
- * @param sample_rate_out The sample rate used to check if this request should be sampled
596
- * (output - may be zero if not used).
597
- * @param sample_source_out The OBOE_SAMPLE_RATE_SOURCE used to check if this request
598
- * should be sampled (output - may be zero if not used).
599
- * @return Non-zero if the given request should be sampled.
600
- */
601
- int oboe_sample_layer(
602
- const char *service_name,
603
- const char *xtrace,
604
- int *sample_rate_out,
605
- int *sample_source_out
606
- );
607
-
608
- /**
609
- * Same as oboe_sample_layer() but accepting custom sample rate and custom tracing mode
610
- *
611
- * @param service_name Service name used for this request (may be NULL to use default settings)
612
- * @param xtrace X-Trace ID string from an HTTP request or higher layer (NULL or empty string if not present).
613
- * @param custom_sample_rate a custom sample rate only used for this request (OBOE_SETTINGS_UNSET won't override)
614
- * @param custom_tracing_mode a custom tracing mode only used for this request (OBOE_SETTINGS_UNSET won't override)
615
- * @param sample_rate_out The sample rate used to check if this request should be sampled
616
- * (output - may be zero if not used).
617
- * @param sample_source_out The OBOE_SAMPLE_RATE_SOURCE used to check if this request
618
- * should be sampled (output - may be zero if not used).
619
- * @param flags_out The flags used to check if this request should be sampled
620
- */
621
- int oboe_sample_layer_custom(
622
- const char *service_name,
623
- const char *in_xtrace,
624
- int custom_sample_rate,
625
- int custom_tracing_mode,
626
- int *sampling_decision_out,
627
- int *sample_rate_out,
628
- int *sample_source_out,
629
- uint16_t *flags_out
630
- );
631
-
632
- /**
633
- * wrapper for calling oboe_sample_layer_custom() with input/output structs instead of individual params
664
+ * This is designed to be called once per request.
634
665
  *
635
666
  * @param in Struct containing all params to help making a tracing decision
636
667
  * @param out Struct containing all params that get set during decision making
@@ -773,21 +804,21 @@ extern int oboe_debug_log_remove(OboeDebugLoggerFcn oldLogger, void *context);
773
804
  * We use this to get a reasonable standard format between apps.
774
805
  *
775
806
  * @param module An OBOE_MODULE_* module identifier. Use zero for undefined.
776
- * @param app_name Either NULL or a pointer to a string containing a name for
777
- * the application - will prefix the log entry. Useful when multiple
778
- * apps log to the same destination.
807
+ * @param app_name Either NULL or a pointer to a string containing a name for
808
+ * the application - will prefix the log entry. Useful when multiple
809
+ * apps log to the same destination.
779
810
  * @param trace_mode A string identifying the configured tracing mode, one of:
780
811
  * "enabled", "disabled", "unset", or "undef" (for invalid values)
781
812
  * Use the oboe_tracing_mode_to_string() function to convert from
782
813
  * numeric values.
783
814
  * @param sample_rate The configured sampling rate: -1 for unset or a
784
815
  * integer fraction of 1000000.
785
- * @param reporter_type String identifying the type of reporter configured:
816
+ * @param reporter_type String identifying the type of reporter configured:
786
817
  * One of 'udp' (the default), 'ssl', or 'file'.
787
818
  * @param reporter_args The string of comma-separated key=value settings
788
819
  * used to initialize the reporter.
789
820
  * @param extra: Either NULL or a pointer to a string to be appended to
790
- * the log message and designed to include a few other
821
+ * the log message and designed to include a few other
791
822
  * configuration parameters of interest.
792
823
  */
793
824
  #if OBOE_DEBUG_LEVEL >= OBOE_DEBUG_INFO
@@ -821,7 +852,7 @@ extern int oboe_debug_log_remove(OboeDebugLoggerFcn oldLogger, void *context);
821
852
  /**
822
853
  * Log a recoverable error.
823
854
  *
824
- * Each message is limited in the number of times that it will be reported at the
855
+ * Each message is limited in the number of times that it will be reported at the
825
856
  * ERROR level after which it will be logged at the debug MEDIUM level.
826
857
  */
827
858
  #if OBOE_DEBUG_LEVEL >= OBOE_DEBUG_ERROR
@@ -838,7 +869,7 @@ extern int oboe_debug_log_remove(OboeDebugLoggerFcn oldLogger, void *context);
838
869
  /**
839
870
  * Log a warning.
840
871
  *
841
- * Each message is limited in the number of times that it will be reported at the
872
+ * Each message is limited in the number of times that it will be reported at the
842
873
  * WARNING level after which it will be logged at the debug MEDIUM level.
843
874
  */
844
875
  #if OBOE_DEBUG_LEVEL >= OBOE_DEBUG_WARNING
@@ -855,7 +886,7 @@ extern int oboe_debug_log_remove(OboeDebugLoggerFcn oldLogger, void *context);
855
886
  /**
856
887
  * Log an informative message.
857
888
  *
858
- * Each message is limited in the number of times that it will be reported at the
889
+ * Each message is limited in the number of times that it will be reported at the
859
890
  * INFO level after which it will be logged at the debug MEDIUM level.
860
891
  */
861
892
  #if OBOE_DEBUG_LEVEL >= OBOE_DEBUG_INFO