appoptics_apm 4.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.codeclimate.yml +43 -0
- data/.dockerignore +5 -0
- data/.gitignore +23 -0
- data/.rubocop.yml +5 -0
- data/.travis.yml +82 -0
- data/CHANGELOG.md +769 -0
- data/CONFIG.md +33 -0
- data/Dockerfile +41 -0
- data/Dockerfile_test +66 -0
- data/Gemfile +41 -0
- data/LICENSE +193 -0
- data/README.md +351 -0
- data/Rakefile +202 -0
- data/Vagrantfile +67 -0
- data/appoptics_apm.gemspec +55 -0
- data/build_gems.sh +15 -0
- data/docker-compose.yml +73 -0
- data/examples/DNT.md +35 -0
- data/examples/carrying_context.rb +220 -0
- data/examples/instrumenting_metal_controller.rb +8 -0
- data/examples/puma_on_heroku_config.rb +17 -0
- data/examples/tracing_async_threads.rb +124 -0
- data/examples/tracing_background_jobs.rb +53 -0
- data/examples/tracing_forked_processes.rb +99 -0
- data/examples/unicorn_on_heroku_config.rb +28 -0
- data/ext/oboe_metal/extconf.rb +54 -0
- data/ext/oboe_metal/lib/.keep +0 -0
- data/ext/oboe_metal/lib/liboboe-1.0.so.0.0.0 +0 -0
- data/ext/oboe_metal/noop/noop.c +7 -0
- data/ext/oboe_metal/src/VERSION +1 -0
- data/ext/oboe_metal/src/bson/bson.h +221 -0
- data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
- data/ext/oboe_metal/src/oboe.h +883 -0
- data/ext/oboe_metal/src/oboe.hpp +793 -0
- data/ext/oboe_metal/src/oboe_debug.h +50 -0
- data/ext/oboe_metal/src/oboe_wrap.cxx +6088 -0
- data/ext/oboe_metal/tests/test.rb +11 -0
- data/gemfiles/delayed_job.gemfile +36 -0
- data/gemfiles/frameworks.gemfile +44 -0
- data/gemfiles/instrumentation_mocked.gemfile +29 -0
- data/gemfiles/libraries.gemfile +85 -0
- data/gemfiles/rails23.gemfile +39 -0
- data/gemfiles/rails30.gemfile +42 -0
- data/gemfiles/rails31.gemfile +44 -0
- data/gemfiles/rails32.gemfile +54 -0
- data/gemfiles/rails40.gemfile +27 -0
- data/gemfiles/rails41.gemfile +27 -0
- data/gemfiles/rails42.gemfile +35 -0
- data/gemfiles/rails50.gemfile +44 -0
- data/gemfiles/rails51.gemfile +44 -0
- data/get_version.rb +5 -0
- data/init.rb +4 -0
- data/lib/appoptics_apm/api/layerinit.rb +39 -0
- data/lib/appoptics_apm/api/logging.rb +359 -0
- data/lib/appoptics_apm/api/memcache.rb +34 -0
- data/lib/appoptics_apm/api/profiling.rb +201 -0
- data/lib/appoptics_apm/api/tracing.rb +152 -0
- data/lib/appoptics_apm/api/util.rb +128 -0
- data/lib/appoptics_apm/api.rb +18 -0
- data/lib/appoptics_apm/base.rb +252 -0
- data/lib/appoptics_apm/config.rb +281 -0
- data/lib/appoptics_apm/frameworks/grape.rb +93 -0
- data/lib/appoptics_apm/frameworks/padrino/templates.rb +58 -0
- data/lib/appoptics_apm/frameworks/padrino.rb +52 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller.rb +106 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller2.rb +61 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller3.rb +58 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller4.rb +48 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller5.rb +50 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller_api.rb +50 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_view.rb +58 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_view_2x.rb +56 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_view_30.rb +50 -0
- data/lib/appoptics_apm/frameworks/rails/inst/active_record.rb +27 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +28 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +30 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils.rb +120 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +101 -0
- data/lib/appoptics_apm/frameworks/rails.rb +116 -0
- data/lib/appoptics_apm/frameworks/sinatra/templates.rb +56 -0
- data/lib/appoptics_apm/frameworks/sinatra.rb +71 -0
- data/lib/appoptics_apm/inst/bunny-client.rb +148 -0
- data/lib/appoptics_apm/inst/bunny-consumer.rb +92 -0
- data/lib/appoptics_apm/inst/curb.rb +329 -0
- data/lib/appoptics_apm/inst/dalli.rb +85 -0
- data/lib/appoptics_apm/inst/delayed_job.rb +92 -0
- data/lib/appoptics_apm/inst/em-http-request.rb +105 -0
- data/lib/appoptics_apm/inst/excon.rb +130 -0
- data/lib/appoptics_apm/inst/faraday.rb +77 -0
- data/lib/appoptics_apm/inst/http.rb +83 -0
- data/lib/appoptics_apm/inst/httpclient.rb +176 -0
- data/lib/appoptics_apm/inst/memcache.rb +102 -0
- data/lib/appoptics_apm/inst/memcached.rb +94 -0
- data/lib/appoptics_apm/inst/mongo.rb +242 -0
- data/lib/appoptics_apm/inst/mongo2.rb +225 -0
- data/lib/appoptics_apm/inst/moped.rb +466 -0
- data/lib/appoptics_apm/inst/rack.rb +146 -0
- data/lib/appoptics_apm/inst/redis.rb +275 -0
- data/lib/appoptics_apm/inst/resque.rb +151 -0
- data/lib/appoptics_apm/inst/rest-client.rb +50 -0
- data/lib/appoptics_apm/inst/sequel.rb +178 -0
- data/lib/appoptics_apm/inst/sidekiq-client.rb +53 -0
- data/lib/appoptics_apm/inst/sidekiq-worker.rb +67 -0
- data/lib/appoptics_apm/inst/twitter-cassandra.rb +294 -0
- data/lib/appoptics_apm/inst/typhoeus.rb +113 -0
- data/lib/appoptics_apm/instrumentation.rb +22 -0
- data/lib/appoptics_apm/legacy_method_profiling.rb +97 -0
- data/lib/appoptics_apm/loading.rb +66 -0
- data/lib/appoptics_apm/logger.rb +41 -0
- data/lib/appoptics_apm/method_profiling.rb +33 -0
- data/lib/appoptics_apm/ruby.rb +35 -0
- data/lib/appoptics_apm/support.rb +135 -0
- data/lib/appoptics_apm/test.rb +94 -0
- data/lib/appoptics_apm/thread_local.rb +26 -0
- data/lib/appoptics_apm/util.rb +312 -0
- data/lib/appoptics_apm/version.rb +15 -0
- data/lib/appoptics_apm/xtrace.rb +103 -0
- data/lib/appoptics_apm.rb +72 -0
- data/lib/joboe_metal.rb +214 -0
- data/lib/oboe/README +2 -0
- data/lib/oboe/backward_compatibility.rb +80 -0
- data/lib/oboe/inst/rack.rb +11 -0
- data/lib/oboe.rb +7 -0
- data/lib/oboe_metal.rb +187 -0
- data/lib/rails/generators/appoptics_apm/install_generator.rb +45 -0
- data/lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb +222 -0
- data/ruby_setup.sh +47 -0
- data/run_docker_build_gem_upload_to_packagecloud.sh +20 -0
- data/run_tests_docker.rb +32 -0
- data/test/benchmark/README.md +65 -0
- data/test/benchmark/logging_bench.rb +54 -0
- data/test/benchmark/with_libraries_gemfile/bunny_bench.rb +69 -0
- data/test/benchmark/with_rails5x_gemfile/action_controller5x_bench.rb +43 -0
- data/test/frameworks/apps/grape_nested.rb +33 -0
- data/test/frameworks/apps/grape_simple.rb +80 -0
- data/test/frameworks/apps/padrino_simple.rb +80 -0
- data/test/frameworks/apps/sinatra_simple.rb +55 -0
- data/test/frameworks/grape_test.rb +286 -0
- data/test/frameworks/padrino_test.rb +222 -0
- data/test/frameworks/rails3x_test.rb +554 -0
- data/test/frameworks/rails4x_test.rb +570 -0
- data/test/frameworks/rails5x_api_test.rb +210 -0
- data/test/frameworks/rails5x_test.rb +376 -0
- data/test/frameworks/rails_shared_tests.rb +172 -0
- data/test/frameworks/sinatra_test.rb +140 -0
- data/test/instrumentation/bunny_client_test.rb +276 -0
- data/test/instrumentation/bunny_consumer_test.rb +204 -0
- data/test/instrumentation/curb_test.rb +398 -0
- data/test/instrumentation/dalli_test.rb +177 -0
- data/test/instrumentation/em_http_request_test.rb +89 -0
- data/test/instrumentation/excon_test.rb +231 -0
- data/test/instrumentation/faraday_test.rb +228 -0
- data/test/instrumentation/http_test.rb +143 -0
- data/test/instrumentation/httpclient_test.rb +320 -0
- data/test/instrumentation/memcache_test.rb +260 -0
- data/test/instrumentation/memcached_test.rb +229 -0
- data/test/instrumentation/mongo_v1_test.rb +479 -0
- data/test/instrumentation/mongo_v2_index_test.rb +124 -0
- data/test/instrumentation/mongo_v2_test.rb +584 -0
- data/test/instrumentation/mongo_v2_view_test.rb +435 -0
- data/test/instrumentation/moped_test.rb +517 -0
- data/test/instrumentation/rack_test.rb +165 -0
- data/test/instrumentation/redis_hashes_test.rb +268 -0
- data/test/instrumentation/redis_keys_test.rb +321 -0
- data/test/instrumentation/redis_lists_test.rb +310 -0
- data/test/instrumentation/redis_misc_test.rb +163 -0
- data/test/instrumentation/redis_sets_test.rb +296 -0
- data/test/instrumentation/redis_sortedsets_test.rb +328 -0
- data/test/instrumentation/redis_strings_test.rb +349 -0
- data/test/instrumentation/resque_test.rb +185 -0
- data/test/instrumentation/rest-client_test.rb +288 -0
- data/test/instrumentation/sequel_mysql2_test.rb +353 -0
- data/test/instrumentation/sequel_mysql_test.rb +334 -0
- data/test/instrumentation/sequel_pg_test.rb +336 -0
- data/test/instrumentation/sidekiq-client_test.rb +159 -0
- data/test/instrumentation/sidekiq-worker_test.rb +180 -0
- data/test/instrumentation/twitter-cassandra_test.rb +424 -0
- data/test/instrumentation/typhoeus_test.rb +284 -0
- data/test/jobs/delayed_job/db_worker_job.rb +29 -0
- data/test/jobs/delayed_job/error_worker_job.rb +10 -0
- data/test/jobs/delayed_job/remote_call_worker_job.rb +20 -0
- data/test/jobs/resque/db_worker_job.rb +29 -0
- data/test/jobs/resque/error_worker_job.rb +10 -0
- data/test/jobs/resque/remote_call_worker_job.rb +20 -0
- data/test/jobs/sidekiq/db_worker_job.rb +29 -0
- data/test/jobs/sidekiq/error_worker_job.rb +10 -0
- data/test/jobs/sidekiq/remote_call_worker_job.rb +20 -0
- data/test/minitest_helper.rb +276 -0
- data/test/mocked/curb_mocked_test.rb +311 -0
- data/test/mocked/excon_mocked_test.rb +166 -0
- data/test/mocked/faraday_mocked_test.rb +93 -0
- data/test/mocked/http_mocked_test.rb +129 -0
- data/test/mocked/httpclient_mocked_test.rb +245 -0
- data/test/mocked/rest_client_mocked_test.rb +103 -0
- data/test/mocked/typhoeus_mocked_test.rb +192 -0
- data/test/models/widget.rb +36 -0
- data/test/profiling/legacy_method_profiling_test.rb +201 -0
- data/test/profiling/method_profiling_test.rb +631 -0
- data/test/queues/delayed_job-client_test.rb +95 -0
- data/test/queues/delayed_job-worker_test.rb +91 -0
- data/test/reporter/reporter_test.rb +14 -0
- data/test/servers/delayed_job.rb +107 -0
- data/test/servers/rackapp_8101.rb +29 -0
- data/test/servers/rails3x_8140.rb +96 -0
- data/test/servers/rails4x_8140.rb +96 -0
- data/test/servers/rails5x_8140.rb +95 -0
- data/test/servers/rails5x_api_8150.rb +78 -0
- data/test/servers/sidekiq.rb +29 -0
- data/test/servers/sidekiq.yml +7 -0
- data/test/servers/sidekiq_initializer.rb +25 -0
- data/test/settings +0 -0
- data/test/support/auto_tracing_test.rb +50 -0
- data/test/support/backcompat_test.rb +276 -0
- data/test/support/config_test.rb +149 -0
- data/test/support/dnt_test.rb +98 -0
- data/test/support/init_report_test.rb +25 -0
- data/test/support/liboboe_settings_test.rb +110 -0
- data/test/support/logging_test.rb +130 -0
- data/test/support/noop_test.rb +88 -0
- data/test/support/sql_sanitize_test.rb +55 -0
- data/test/support/tracing_mode_test.rb +33 -0
- data/test/support/tvalias_test.rb +15 -0
- data/test/support/xtrace_test.rb +41 -0
- metadata +475 -0
@@ -0,0 +1,793 @@
|
|
1
|
+
/**
|
2
|
+
* @file oboe.hpp - C++ liboboe wrapper primarily for generating SWIG interfaces
|
3
|
+
*
|
4
|
+
* This API should follow https://github.com/tracelytics/tracelons/wiki/Instrumentation-API
|
5
|
+
*/
|
6
|
+
|
7
|
+
#ifndef OBOE_HPP
|
8
|
+
#define OBOE_HPP
|
9
|
+
|
10
|
+
#include <string>
|
11
|
+
#include <oboe.h>
|
12
|
+
|
13
|
+
|
14
|
+
class Event;
|
15
|
+
class Reporter;
|
16
|
+
class Context;
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Metadata is the X-Trace identifier and the information needed to work with it.
|
20
|
+
*/
|
21
|
+
class Metadata : private oboe_metadata_t {
|
22
|
+
friend class Reporter;
|
23
|
+
friend class SslReporter;
|
24
|
+
friend class UdpReporter;
|
25
|
+
friend class FileReporter;
|
26
|
+
friend class Context;
|
27
|
+
|
28
|
+
public:
|
29
|
+
Metadata(oboe_metadata_t *md) {
|
30
|
+
oboe_metadata_copy(this, md);
|
31
|
+
}
|
32
|
+
|
33
|
+
~Metadata() {
|
34
|
+
oboe_metadata_destroy(this);
|
35
|
+
}
|
36
|
+
|
37
|
+
static Metadata* fromString(std::string s) {
|
38
|
+
oboe_metadata_t md;
|
39
|
+
oboe_metadata_fromstr(&md, s.data(), s.size());
|
40
|
+
return new Metadata(&md); // copies md
|
41
|
+
}
|
42
|
+
|
43
|
+
// these new objects are managed by SWIG %newobject
|
44
|
+
Event *createEvent();
|
45
|
+
|
46
|
+
static Metadata *makeRandom(bool sampled=true) {
|
47
|
+
oboe_metadata_t md;
|
48
|
+
oboe_metadata_init(&md);
|
49
|
+
oboe_metadata_random(&md);
|
50
|
+
|
51
|
+
if (sampled) {
|
52
|
+
md.flags |= XTR_FLAGS_SAMPLED;
|
53
|
+
}
|
54
|
+
|
55
|
+
return new Metadata(&md); // copies md
|
56
|
+
}
|
57
|
+
|
58
|
+
Metadata *copy() {
|
59
|
+
return new Metadata(this);
|
60
|
+
}
|
61
|
+
|
62
|
+
bool isValid() {
|
63
|
+
return oboe_metadata_is_valid(this);
|
64
|
+
}
|
65
|
+
|
66
|
+
bool isSampled() {
|
67
|
+
return oboe_metadata_is_sampled(this);
|
68
|
+
}
|
69
|
+
|
70
|
+
#ifdef SWIGJAVA
|
71
|
+
std::string toStr() {
|
72
|
+
#else
|
73
|
+
std::string toString() {
|
74
|
+
#endif
|
75
|
+
char buf[OBOE_MAX_METADATA_PACK_LEN];
|
76
|
+
|
77
|
+
int rc = oboe_metadata_tostr(this, buf, sizeof(buf) - 1);
|
78
|
+
if (rc == 0) {
|
79
|
+
return std::string(buf);
|
80
|
+
} else {
|
81
|
+
return std::string(); // throw exception?
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
};
|
86
|
+
|
87
|
+
/**
|
88
|
+
* The Context class manages the metadata and the settings configuration.
|
89
|
+
*
|
90
|
+
* The metadata includes the X-Trace identifier fields and the information work working with it.
|
91
|
+
* The metadata is needed before any trace messages can be sent and must either be generated for
|
92
|
+
* new traces or derived from the X-Trace header of an existing trace.
|
93
|
+
*
|
94
|
+
* The settings information is used primarily to determine when a new request should be traced.
|
95
|
+
* The information begins with configuration values for tracing_mode and sample_rate and then
|
96
|
+
* updates are received periodically from the collector to adjust the rate at which traces
|
97
|
+
* are generated.
|
98
|
+
*/
|
99
|
+
class Context {
|
100
|
+
public:
|
101
|
+
/**
|
102
|
+
* Set the tracing mode.
|
103
|
+
*
|
104
|
+
* @param newMode One of
|
105
|
+
* - OBOE_TRACE_NEVER(0) to disable tracing,
|
106
|
+
* - OBOE_TRACE_ALWAYS(1) to start a new trace if needed, or
|
107
|
+
* - OBOE_TRACE_THROUGH(2) to only add to an existing trace.
|
108
|
+
*/
|
109
|
+
static void setTracingMode(int newMode) {
|
110
|
+
oboe_settings_mode_set(newMode);
|
111
|
+
}
|
112
|
+
|
113
|
+
/**
|
114
|
+
* Set the default sample rate.
|
115
|
+
*
|
116
|
+
* This rate is used until overridden by the AppOptics servers. If not set then the
|
117
|
+
* value comes from settings records downloaded from AppOptics.
|
118
|
+
*
|
119
|
+
* The rate is interpreted as a ratio out of OBOE_SAMPLE_RESOLUTION (currently 1,000,000).
|
120
|
+
*
|
121
|
+
* @param newRate A number between 0 (none) and OBOE_SAMPLE_RESOLUTION (a million)
|
122
|
+
*/
|
123
|
+
static void setDefaultSampleRate(int newRate) {
|
124
|
+
oboe_settings_rate_set(newRate);
|
125
|
+
}
|
126
|
+
|
127
|
+
/**
|
128
|
+
* Check if the current request should be traced based on the current settings.
|
129
|
+
*
|
130
|
+
* If in_xtrace is empty, or if it is identified as a foreign (ie. cross customer)
|
131
|
+
* trace, then sampling will be considered as a new trace.
|
132
|
+
* Otherwise sampling will be considered as adding to the current trace.
|
133
|
+
* Different layers may have special rules. Also special rules for AppView
|
134
|
+
* Web synthetic traces apply if in_tv_meta is given a non-empty string.
|
135
|
+
*
|
136
|
+
* This is designed to be called once per layer per request.
|
137
|
+
*
|
138
|
+
* @param layer Name of the layer being considered for tracing
|
139
|
+
* @param in_xtrace Incoming X-Trace ID (NULL or empty string if not present)
|
140
|
+
* @return Zero to not trace; otherwise return the sample rate used in the low order
|
141
|
+
* bytes 0 to 2 and the sample source in the higher-order byte 3.
|
142
|
+
*/
|
143
|
+
static int sampleRequest(
|
144
|
+
std::string layer,
|
145
|
+
std::string in_xtrace)
|
146
|
+
{
|
147
|
+
int sample_rate = 0;
|
148
|
+
int sample_source = 0;
|
149
|
+
int rc = (oboe_sample_layer(layer.c_str(), in_xtrace.c_str(), &sample_rate, &sample_source));
|
150
|
+
|
151
|
+
return (rc == 0 ? 0 : (((sample_source & 0xFF) << 24) | (sample_rate & 0xFFFFFF)));
|
152
|
+
}
|
153
|
+
|
154
|
+
/**
|
155
|
+
* Get a pointer to the current context (from thread-local storage)
|
156
|
+
*/
|
157
|
+
static oboe_metadata_t *get() {
|
158
|
+
return oboe_context_get();
|
159
|
+
}
|
160
|
+
|
161
|
+
/**
|
162
|
+
* Get the current context as a printable string.
|
163
|
+
*/
|
164
|
+
#ifdef SWIGJAVA
|
165
|
+
static std::string toStr() {
|
166
|
+
#else
|
167
|
+
static std::string toString() {
|
168
|
+
#endif
|
169
|
+
char buf[OBOE_MAX_METADATA_PACK_LEN];
|
170
|
+
|
171
|
+
oboe_metadata_t *md = Context::get();
|
172
|
+
int rc = oboe_metadata_tostr(md, buf, sizeof(buf) - 1);
|
173
|
+
if (rc == 0) {
|
174
|
+
return std::string(buf);
|
175
|
+
} else {
|
176
|
+
return std::string(); // throw exception?
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
/**
|
181
|
+
* Set the current context (this updates thread-local storage).
|
182
|
+
*/
|
183
|
+
static void set(oboe_metadata_t *md) {
|
184
|
+
oboe_context_set(md);
|
185
|
+
}
|
186
|
+
|
187
|
+
/**
|
188
|
+
* Set the current context from a string.
|
189
|
+
*/
|
190
|
+
static void fromString(std::string s) {
|
191
|
+
oboe_context_set_fromstr(s.data(), s.size());
|
192
|
+
}
|
193
|
+
|
194
|
+
// this new object is managed by SWIG %newobject
|
195
|
+
static Metadata *copy() {
|
196
|
+
return new Metadata(Context::get());
|
197
|
+
}
|
198
|
+
|
199
|
+
static void setSampledFlag() {
|
200
|
+
oboe_metadata_t *md = Context::get();
|
201
|
+
md->flags |= XTR_FLAGS_SAMPLED;
|
202
|
+
}
|
203
|
+
|
204
|
+
static void clear() {
|
205
|
+
oboe_context_clear();
|
206
|
+
}
|
207
|
+
|
208
|
+
static bool isValid() {
|
209
|
+
return oboe_context_is_valid();
|
210
|
+
}
|
211
|
+
|
212
|
+
static bool isSampled() {
|
213
|
+
return oboe_context_is_sampled();
|
214
|
+
}
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Initialize the Oboe subsystems.
|
218
|
+
*
|
219
|
+
* This should be called before any other oboe_* functions. However, in order
|
220
|
+
* to make the library easier to work with, checks are in place so that it
|
221
|
+
* will be called by any of the other functions that depend on it.
|
222
|
+
*
|
223
|
+
* Besides initializing the oboe library, this will also initialize a
|
224
|
+
* reporter based on the values of environment variables, configuration
|
225
|
+
* file options.
|
226
|
+
*/
|
227
|
+
static void init(std::string access_key, std::string hostname_alias) {
|
228
|
+
oboe_init(access_key.c_str(), hostname_alias.c_str());
|
229
|
+
}
|
230
|
+
|
231
|
+
/**
|
232
|
+
* Initialize the Oboe subsytems using a specific reporter configuration.
|
233
|
+
*
|
234
|
+
* This should be called before any other oboe_* functions butm may also be
|
235
|
+
* used to change or re-initialize the current reporter. To reconnect the
|
236
|
+
* reporter use oboe_disconnect() and oboe_reconnect() instead.
|
237
|
+
*
|
238
|
+
* @param protocol One of OBOE_REPORTER_PROTOCOL_FILE, OBOE_REPORTER_PROTOCOL_UDP,
|
239
|
+
* or OBOE_REPORTER_PROTOCOL_SSL.
|
240
|
+
* @param args A configuration string for the specified protocol (protocol dependent syntax).
|
241
|
+
* @return Zero on success; otherwise an error code.
|
242
|
+
*/
|
243
|
+
static int init_reporter(const char *protocol, const char *args) {
|
244
|
+
return oboe_init_reporter(protocol, args);
|
245
|
+
}
|
246
|
+
|
247
|
+
/**
|
248
|
+
* Disconnect or shut down the Oboe reporter, but allow it to be reconnect()ed.
|
249
|
+
*
|
250
|
+
* We don't make this a Reporter method in case there is other housework to do.
|
251
|
+
*
|
252
|
+
* @param rep Pointer to the active reporter object.
|
253
|
+
*/
|
254
|
+
static void disconnect(Reporter *rep);
|
255
|
+
|
256
|
+
/**
|
257
|
+
* Reconnect or restart the Oboe reporter.
|
258
|
+
*
|
259
|
+
* We don't make this a Reporter method in case there is other housework to do.
|
260
|
+
*
|
261
|
+
* @param rep Pointer to the active reporter object.
|
262
|
+
*/
|
263
|
+
static void reconnect(Reporter *rep);
|
264
|
+
|
265
|
+
/**
|
266
|
+
* Shut down the Oboe library.
|
267
|
+
*
|
268
|
+
* This releases any resources held by the library which may include terminating
|
269
|
+
* child threads.
|
270
|
+
*/
|
271
|
+
static void shutdown() {
|
272
|
+
oboe_shutdown();
|
273
|
+
}
|
274
|
+
|
275
|
+
// these new objects are managed by SWIG %newobject
|
276
|
+
static Event *createEvent();
|
277
|
+
static Event *startTrace();
|
278
|
+
|
279
|
+
private:
|
280
|
+
|
281
|
+
};
|
282
|
+
|
283
|
+
class Event : private oboe_event_t {
|
284
|
+
friend class Reporter;
|
285
|
+
friend class SslReporter;
|
286
|
+
friend class UdpReporter;
|
287
|
+
friend class FileReporter;
|
288
|
+
friend class Context;
|
289
|
+
friend class Metadata;
|
290
|
+
|
291
|
+
private:
|
292
|
+
Event() {
|
293
|
+
oboe_event_init(this, Context::get());
|
294
|
+
}
|
295
|
+
|
296
|
+
Event(const oboe_metadata_t *md, bool addEdge=true) {
|
297
|
+
// both methods copy metadata from md -> this
|
298
|
+
if (addEdge) {
|
299
|
+
// create_event automatically adds edge in event to md
|
300
|
+
oboe_metadata_create_event(md, this);
|
301
|
+
} else {
|
302
|
+
// initializes new Event with this md's task_id & new random op_id; no edges set
|
303
|
+
oboe_event_init(this, md);
|
304
|
+
}
|
305
|
+
}
|
306
|
+
|
307
|
+
public:
|
308
|
+
~Event() {
|
309
|
+
oboe_event_destroy(this);
|
310
|
+
}
|
311
|
+
|
312
|
+
// called e.g. from Python e.addInfo("Key", None) & Ruby e.addInfo("Key", nil)
|
313
|
+
bool addInfo(char *key, void* val) {
|
314
|
+
// oboe_event_add_info(evt, key, NULL) does nothing
|
315
|
+
(void) key;
|
316
|
+
(void) val;
|
317
|
+
return true;
|
318
|
+
}
|
319
|
+
|
320
|
+
bool addInfo(char *key, const std::string& val) {
|
321
|
+
if (memchr(val.data(), '\0', val.size())) {
|
322
|
+
return oboe_event_add_info_binary(this, key, val.data(), val.size()) == 0;
|
323
|
+
} else {
|
324
|
+
return oboe_event_add_info(this, key, val.data()) == 0;
|
325
|
+
}
|
326
|
+
}
|
327
|
+
|
328
|
+
bool addInfo(char *key, long val) {
|
329
|
+
int64_t val_ = val;
|
330
|
+
return oboe_event_add_info_int64(this, key, val_) == 0;
|
331
|
+
}
|
332
|
+
|
333
|
+
bool addInfo(char *key, double val) {
|
334
|
+
return oboe_event_add_info_double(this, key, val) == 0;
|
335
|
+
}
|
336
|
+
|
337
|
+
bool addEdge(oboe_metadata_t *md) {
|
338
|
+
return oboe_event_add_edge(this, md) == 0;
|
339
|
+
}
|
340
|
+
|
341
|
+
bool addEdgeStr(const std::string& val) {
|
342
|
+
return oboe_event_add_edge_fromstr(this, val.c_str(), val.size()) == 0;
|
343
|
+
}
|
344
|
+
|
345
|
+
/**
|
346
|
+
* Get a new copy of this metadata.
|
347
|
+
*
|
348
|
+
* NOTE: The returned object must be "delete"d.
|
349
|
+
*/
|
350
|
+
Metadata* getMetadata() {
|
351
|
+
return new Metadata(&this->metadata);
|
352
|
+
}
|
353
|
+
|
354
|
+
std::string metadataString() {
|
355
|
+
char buf[OBOE_MAX_METADATA_PACK_LEN];
|
356
|
+
|
357
|
+
int rc = oboe_metadata_tostr(&this->metadata, buf, sizeof(buf) - 1);
|
358
|
+
if (rc == 0) {
|
359
|
+
return std::string(buf);
|
360
|
+
} else {
|
361
|
+
return std::string(); // throw exception?
|
362
|
+
}
|
363
|
+
}
|
364
|
+
|
365
|
+
/**
|
366
|
+
* Report this event.
|
367
|
+
*
|
368
|
+
* This sends the event using the default reporter.
|
369
|
+
*
|
370
|
+
* @return True on success; otherwise an error message is logged.
|
371
|
+
*/
|
372
|
+
bool send() {
|
373
|
+
return (oboe_event_send(OBOE_SEND_EVENT, this, Context::get()) >= 0);
|
374
|
+
}
|
375
|
+
|
376
|
+
static Event* startTrace(const oboe_metadata_t *md);
|
377
|
+
|
378
|
+
};
|
379
|
+
|
380
|
+
class Span {
|
381
|
+
public:
|
382
|
+
static void createHttpSpan(const char *transaction, const char *url, const int64_t duration,
|
383
|
+
const int status, const char *method, const int has_error);
|
384
|
+
};
|
385
|
+
|
386
|
+
void Span::createHttpSpan(const char *transaction, const char *url, const int64_t duration,
|
387
|
+
const int status, const char *method, const int has_error) {
|
388
|
+
oboe_http_span(transaction, url, duration, status, method, has_error);
|
389
|
+
}
|
390
|
+
|
391
|
+
class MetricTags {
|
392
|
+
friend class CustomMetrics;
|
393
|
+
public:
|
394
|
+
MetricTags(size_t count) {
|
395
|
+
tags = new oboe_metric_tag_t[count];
|
396
|
+
size = count;
|
397
|
+
}
|
398
|
+
~MetricTags() {
|
399
|
+
delete[] tags;
|
400
|
+
}
|
401
|
+
bool add(size_t index, char *k, char *v) {
|
402
|
+
if (index < size) {
|
403
|
+
tags[index].key = k;
|
404
|
+
tags[index].value = v;
|
405
|
+
return true;
|
406
|
+
}
|
407
|
+
return false;
|
408
|
+
}
|
409
|
+
private:
|
410
|
+
oboe_metric_tag_t* get() const {
|
411
|
+
return tags;
|
412
|
+
}
|
413
|
+
|
414
|
+
oboe_metric_tag_t *tags;
|
415
|
+
size_t size;
|
416
|
+
};
|
417
|
+
|
418
|
+
class CustomMetrics {
|
419
|
+
public:
|
420
|
+
static int summary(const char *name, const double value, const int count, const int host_tag,
|
421
|
+
const MetricTags *tags, const size_t tags_count) {
|
422
|
+
return oboe_custom_metric_summary(name, value, count, host_tag, tags->get(), tags_count);
|
423
|
+
}
|
424
|
+
|
425
|
+
static int increment(const char *name, const int count, const int host_tag,
|
426
|
+
const MetricTags *tags, const size_t tags_count) {
|
427
|
+
return oboe_custom_metric_increment(name, count, host_tag, tags->get(), tags_count);
|
428
|
+
}
|
429
|
+
};
|
430
|
+
|
431
|
+
/**
|
432
|
+
* Create a new event object using the thread's context.
|
433
|
+
*
|
434
|
+
* NOTE: The returned object must be "delete"d.
|
435
|
+
*/
|
436
|
+
Event *Context::createEvent() {
|
437
|
+
return new Event(Context::get());
|
438
|
+
}
|
439
|
+
|
440
|
+
/**
|
441
|
+
* Create a new event object using this Metadata's context.
|
442
|
+
*
|
443
|
+
* NOTE: The returned object must be "delete"d.
|
444
|
+
*/
|
445
|
+
Event *Metadata::createEvent() {
|
446
|
+
return new Event(this);
|
447
|
+
}
|
448
|
+
|
449
|
+
/**
|
450
|
+
* Create a new event object with a new trace context.
|
451
|
+
*
|
452
|
+
* NOTE: The returned object must be "delete"d.
|
453
|
+
*/
|
454
|
+
Event *Context::startTrace() {
|
455
|
+
oboe_metadata_t *md = Context::get();
|
456
|
+
oboe_metadata_random(md);
|
457
|
+
return new Event();
|
458
|
+
}
|
459
|
+
|
460
|
+
/**
|
461
|
+
* Create a new event object using the given metadata context.
|
462
|
+
*
|
463
|
+
* NOTE: The metadata context must be unique to the new trace.
|
464
|
+
*
|
465
|
+
* NOTE: The returned object must be "delete"d.
|
466
|
+
*
|
467
|
+
* @param md The metadata object to use when creating the new event.
|
468
|
+
*/
|
469
|
+
Event *Event::startTrace(const oboe_metadata_t *md) {
|
470
|
+
return new Event(md, false);
|
471
|
+
}
|
472
|
+
|
473
|
+
class Reporter : private oboe_reporter_t {
|
474
|
+
friend class Context; // Access to the private oboe_reporter_t base structure.
|
475
|
+
public:
|
476
|
+
/**
|
477
|
+
* Initialize a reporter structure for use with the specified protocol.
|
478
|
+
*
|
479
|
+
* @param protocol One of "file", "udp", or "ssl".
|
480
|
+
* @param args A configuration string for the specified protocol (protocol dependent syntax).
|
481
|
+
*/
|
482
|
+
Reporter(const char *protocol, const char *args) {
|
483
|
+
oboe_init_reporter(protocol, args);
|
484
|
+
}
|
485
|
+
|
486
|
+
~Reporter() {
|
487
|
+
oboe_reporter_destroy(this);
|
488
|
+
}
|
489
|
+
|
490
|
+
bool sendReport(Event *evt) {
|
491
|
+
return oboe_event_send(OBOE_SEND_EVENT, evt, Context::get()) >= 0;
|
492
|
+
}
|
493
|
+
|
494
|
+
bool sendReport(Event *evt, oboe_metadata_t *md) {
|
495
|
+
return oboe_event_send(OBOE_SEND_EVENT, evt, md) >= 0;
|
496
|
+
}
|
497
|
+
|
498
|
+
bool sendStatus(Event *evt) {
|
499
|
+
return oboe_event_send(OBOE_SEND_STATUS, evt, Context::get()) >= 0;
|
500
|
+
}
|
501
|
+
|
502
|
+
bool sendStatus(Event *evt, oboe_metadata_t *md) {
|
503
|
+
return oboe_event_send(OBOE_SEND_STATUS, evt, md) >= 0;
|
504
|
+
}
|
505
|
+
};
|
506
|
+
|
507
|
+
|
508
|
+
class SslReporter : private oboe_reporter_t {
|
509
|
+
public:
|
510
|
+
SslReporter(const char *config) {
|
511
|
+
oboe_reporter_ssl_init(this, config);
|
512
|
+
}
|
513
|
+
|
514
|
+
~SslReporter() {
|
515
|
+
oboe_reporter_destroy(this);
|
516
|
+
}
|
517
|
+
|
518
|
+
bool sendReport(Event *evt) {
|
519
|
+
return oboe_event_send(OBOE_SEND_EVENT, evt, Context::get()) >= 0;
|
520
|
+
}
|
521
|
+
|
522
|
+
bool sendReport(Event *evt, oboe_metadata_t *md) {
|
523
|
+
return oboe_event_send(OBOE_SEND_EVENT, evt, md) >= 0;
|
524
|
+
}
|
525
|
+
|
526
|
+
bool sendStatus(Event *evt) {
|
527
|
+
return oboe_event_send(OBOE_SEND_STATUS, evt, Context::get()) >= 0;
|
528
|
+
}
|
529
|
+
|
530
|
+
bool sendStatus(Event *evt, oboe_metadata_t *md) {
|
531
|
+
return oboe_event_send(OBOE_SEND_STATUS, evt, md) >= 0;
|
532
|
+
}
|
533
|
+
};
|
534
|
+
|
535
|
+
|
536
|
+
class UdpReporter : private oboe_reporter_t {
|
537
|
+
public:
|
538
|
+
UdpReporter(const char *addr, const char *port=NULL) {
|
539
|
+
if (port == NULL)
|
540
|
+
port = "7831";
|
541
|
+
|
542
|
+
oboe_reporter_udp_init(this, addr, port);
|
543
|
+
}
|
544
|
+
|
545
|
+
~UdpReporter() {
|
546
|
+
oboe_reporter_destroy(this);
|
547
|
+
}
|
548
|
+
|
549
|
+
bool sendReport(Event *evt) {
|
550
|
+
return oboe_event_send(OBOE_SEND_EVENT, evt, Context::get()) >= 0;
|
551
|
+
}
|
552
|
+
|
553
|
+
bool sendReport(Event *evt, oboe_metadata_t *md) {
|
554
|
+
return oboe_event_send(OBOE_SEND_EVENT, evt, md) >= 0;
|
555
|
+
}
|
556
|
+
|
557
|
+
bool sendStatus(Event *evt) {
|
558
|
+
return oboe_event_send(OBOE_SEND_STATUS, evt, Context::get()) >= 0;
|
559
|
+
}
|
560
|
+
|
561
|
+
bool sendStatus(Event *evt, oboe_metadata_t *md) {
|
562
|
+
return oboe_event_send(OBOE_SEND_STATUS, evt, md) >= 0;
|
563
|
+
}
|
564
|
+
};
|
565
|
+
|
566
|
+
class FileReporter : private oboe_reporter_t {
|
567
|
+
public:
|
568
|
+
FileReporter(const char *file) {
|
569
|
+
oboe_reporter_file_init(this, file);
|
570
|
+
}
|
571
|
+
|
572
|
+
~FileReporter() {
|
573
|
+
oboe_reporter_destroy(this);
|
574
|
+
}
|
575
|
+
|
576
|
+
bool sendReport(Event *evt) {
|
577
|
+
return oboe_event_send(OBOE_SEND_EVENT, evt, Context::get()) >= 0;
|
578
|
+
}
|
579
|
+
|
580
|
+
bool sendReport(Event *evt, oboe_metadata_t *md) {
|
581
|
+
return oboe_event_send(OBOE_SEND_EVENT, evt, md) >= 0;
|
582
|
+
}
|
583
|
+
|
584
|
+
bool sendStatus(Event *evt) {
|
585
|
+
return oboe_event_send(OBOE_SEND_STATUS, evt, Context::get()) >= 0;
|
586
|
+
}
|
587
|
+
|
588
|
+
bool sendStatus(Event *evt, oboe_metadata_t *md) {
|
589
|
+
return oboe_event_send(OBOE_SEND_STATUS, evt, md) >= 0;
|
590
|
+
}
|
591
|
+
};
|
592
|
+
|
593
|
+
|
594
|
+
/**
|
595
|
+
* Base class for a diagnostic log message handler.
|
596
|
+
*/
|
597
|
+
class DebugLogger {
|
598
|
+
public:
|
599
|
+
virtual ~DebugLogger() {}
|
600
|
+
virtual void log(int module, int level, const char *source_name, int source_lineno, const char *msg) = 0;
|
601
|
+
};
|
602
|
+
|
603
|
+
/**
|
604
|
+
* "C" language wrapper for DebugLogger classes.
|
605
|
+
*
|
606
|
+
* A logging function that can be added to the logger chain using
|
607
|
+
* DebugLog::addDebugLogger().
|
608
|
+
*
|
609
|
+
* @param context The context pointer that was registered in the call to
|
610
|
+
* DebugLog::addDebugLogger(). Use it to pass the pointer-to-self for
|
611
|
+
* objects (ie. "this" in C++) or just a structure in C, May be
|
612
|
+
* NULL.
|
613
|
+
* @param module The module identifier as passed to oboe_debug_logger().
|
614
|
+
* @param level The diagnostic detail level as passed to oboe_debug_logger().
|
615
|
+
* @param source_name Name of the source file as passed to oboe_debug_logger().
|
616
|
+
* @param source_lineno Number of the line in the source file where message is
|
617
|
+
* logged from as passed to oboe_debug_logger().
|
618
|
+
* @param msg The formatted message produced from the format string and its
|
619
|
+
* arguments as passed to oboe_debug_logger().
|
620
|
+
*/
|
621
|
+
extern "C" void oboe_debug_log_handler(void *context, int module, int level, const char *source_name, int source_lineno, const char *msg) {
|
622
|
+
((DebugLogger *)context)->log(module, level, source_name, source_lineno, msg);
|
623
|
+
}
|
624
|
+
|
625
|
+
class DebugLog {
|
626
|
+
public:
|
627
|
+
/**
|
628
|
+
* Get a printable name for a diagnostics logging level.
|
629
|
+
*
|
630
|
+
* @param level A detail level in the range 0 to 6 (OBOE_DEBUG_FATAL to OBOE_DEBUG_HIGH).
|
631
|
+
*/
|
632
|
+
static std::string getLevelName(int level) {
|
633
|
+
return std::string(oboe_debug_log_level_name(level));
|
634
|
+
}
|
635
|
+
|
636
|
+
/**
|
637
|
+
* Get a printable name for a diagnostics logging module identifier.
|
638
|
+
*
|
639
|
+
* @param module One of the OBOE_MODULE_* values.
|
640
|
+
*/
|
641
|
+
static std::string getModuleName(int module) {
|
642
|
+
return std::string(oboe_debug_module_name(module));
|
643
|
+
}
|
644
|
+
|
645
|
+
/**
|
646
|
+
* Get the maximum logging detail level for a module or for all modules.
|
647
|
+
*
|
648
|
+
* This level applies to the default logger only. Added loggers get all messages
|
649
|
+
* below their registed detail level and need to do their own module-specific
|
650
|
+
* filtering.
|
651
|
+
*
|
652
|
+
* @param module One of the OBOE_MODULE_* values. Use OBOE_MODULE_ALL (-1) to
|
653
|
+
* get the overall maximum detail level.
|
654
|
+
* @return Maximum detail level value for module (or overall) where zero is the
|
655
|
+
* lowest and higher values generate more detailed log messages.
|
656
|
+
*/
|
657
|
+
static int getLevel(int module) {
|
658
|
+
return oboe_debug_log_level_get(module);
|
659
|
+
}
|
660
|
+
|
661
|
+
/**
|
662
|
+
* Set the maximum logging detail level for a module or for all modules.
|
663
|
+
*
|
664
|
+
* This level applies to the default logger only. Added loggers get all messages
|
665
|
+
* below their registered detail level and need to do their own module-specific
|
666
|
+
* filtering.
|
667
|
+
*
|
668
|
+
* @param module One of the OBOE_MODULE_* values. Use OBOE_MODULE_ALL to set
|
669
|
+
* the overall maximum detail level.
|
670
|
+
* @param newLevel Maximum detail level value where zero is the lowest and higher
|
671
|
+
* values generate more detailed log messages.
|
672
|
+
*/
|
673
|
+
static void setLevel(int module, int newLevel) {
|
674
|
+
oboe_debug_log_level_set(module, newLevel);
|
675
|
+
}
|
676
|
+
|
677
|
+
/**
|
678
|
+
* Set the output stream for the default logger.
|
679
|
+
*
|
680
|
+
* @param newStream A valid, open FILE* stream or NULL to disable the default logger.
|
681
|
+
* @return Zero on success; otherwise an error code (normally from errno).
|
682
|
+
*/
|
683
|
+
static int setOutputStream(FILE *newStream) {
|
684
|
+
return oboe_debug_log_to_stream(newStream);
|
685
|
+
}
|
686
|
+
|
687
|
+
/**
|
688
|
+
* Set the default logger to write to the specified file.
|
689
|
+
*
|
690
|
+
* A NULL or empty path name will disable the default logger.
|
691
|
+
*
|
692
|
+
* If the file exists then it will be opened in append mode.
|
693
|
+
*
|
694
|
+
* @param pathname The path name of the
|
695
|
+
* @return Zero on success; otherwise an error code (normally from errno).
|
696
|
+
*/
|
697
|
+
static int setOutputFile(const char *pathname) {
|
698
|
+
return oboe_debug_log_to_file(pathname);
|
699
|
+
}
|
700
|
+
|
701
|
+
/**
|
702
|
+
* Add a logger that takes messages up to a given logging detail level.
|
703
|
+
*
|
704
|
+
* This adds the logger to a chain in order of the logging level. Log messages
|
705
|
+
* are passed to each logger down the chain until the remaining loggers only
|
706
|
+
* accept messages of a lower detail level.
|
707
|
+
*
|
708
|
+
* @return Zero on success, one if re-registered with the new logging level, and
|
709
|
+
* otherwise a negative value to indicate an error.
|
710
|
+
*/
|
711
|
+
static int addDebugLogger(DebugLogger *newLogger, int logLevel) {
|
712
|
+
return oboe_debug_log_add(oboe_debug_log_handler, newLogger, logLevel);
|
713
|
+
}
|
714
|
+
|
715
|
+
/**
|
716
|
+
* Remove a logger.
|
717
|
+
*
|
718
|
+
* Remove the logger from the message handling chain.
|
719
|
+
*
|
720
|
+
* @return Zero on success, one if it was not found, and otherwise a negative
|
721
|
+
* value to indicate an error.
|
722
|
+
*/
|
723
|
+
static int removeDebugLogger(DebugLogger *oldLogger) {
|
724
|
+
return oboe_debug_log_remove(oboe_debug_log_handler, oldLogger);
|
725
|
+
}
|
726
|
+
|
727
|
+
/**
|
728
|
+
* Low-level diagnostics logging function.
|
729
|
+
*
|
730
|
+
* Use this to pass
|
731
|
+
* @param module One of the numeric module identifiers defined in debug.h - used to control logging detail by module.
|
732
|
+
* @param level Diagnostic detail level of this message - used to control logging volume by detail level.
|
733
|
+
* @param source_name Name of the source file, if available, or another useful name, or NULL.
|
734
|
+
* @param source_lineno Number of the line in the source file where message is logged from, if available, or zero.
|
735
|
+
* @param format A C language printf format specification string.
|
736
|
+
* @param args A variable argument list in VA_ARG format containing arguments for each argument specifier in the format.
|
737
|
+
*/
|
738
|
+
static void logMessage(int module, int level, const char *source_name, int source_lineno, const char *msg) {
|
739
|
+
oboe_debug_logger(module, level, source_name, source_lineno, "%s", msg);
|
740
|
+
}
|
741
|
+
};
|
742
|
+
|
743
|
+
class Config {
|
744
|
+
public:
|
745
|
+
/**
|
746
|
+
* Check if the Oboe library is compatible with a given version.revision.
|
747
|
+
*
|
748
|
+
* This will succeed if the library is at least as recent as specified and if no
|
749
|
+
* definitions have been removed since that revision.
|
750
|
+
*
|
751
|
+
* @param version The library's version number which increments every time the API changes.
|
752
|
+
* @param revision The revision of the current version of the library.
|
753
|
+
* @return Non-zero if the Oboe library is considered compatible with the specified revision.
|
754
|
+
*/
|
755
|
+
static bool checkVersion(int version, int revision) {
|
756
|
+
return (oboe_config_check_version(version, revision) != 0);
|
757
|
+
}
|
758
|
+
|
759
|
+
/**
|
760
|
+
* Get the Oboe library version number.
|
761
|
+
*
|
762
|
+
* This number increments whenever an incompatible change to the API/ABI is made.
|
763
|
+
*
|
764
|
+
* @return The library's version number or -1 if the version is not known.
|
765
|
+
*/
|
766
|
+
static int getVersion() {
|
767
|
+
return oboe_config_get_version();
|
768
|
+
}
|
769
|
+
|
770
|
+
/**
|
771
|
+
* Get the Oboe library revision number.
|
772
|
+
*
|
773
|
+
* This number increments whenever a compatible change is made to the
|
774
|
+
* API/ABI (ie. an addition).
|
775
|
+
*
|
776
|
+
* @return The library's revision number or -1 if not known.
|
777
|
+
*/
|
778
|
+
static int getRevision() {
|
779
|
+
return oboe_config_get_revision();
|
780
|
+
}
|
781
|
+
};
|
782
|
+
|
783
|
+
|
784
|
+
void Context::disconnect(Reporter *rep) {
|
785
|
+
oboe_disconnect(rep);
|
786
|
+
}
|
787
|
+
|
788
|
+
void Context::reconnect(Reporter *rep) {
|
789
|
+
oboe_reconnect(rep);
|
790
|
+
}
|
791
|
+
|
792
|
+
|
793
|
+
#endif // OBOE_HPP
|