appoptics_apm 4.8.0 → 4.9.0

Sign up to get free protection for your applications and to get access to all the features.
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