libcouchbase 1.2.8 → 1.3.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 +4 -4
- data/.travis.yml +4 -4
- data/README.md +16 -8
- data/ext/libcouchbase/CMakeLists.txt +34 -32
- data/ext/libcouchbase/RELEASE_NOTES.markdown +277 -6
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +14 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +2 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +2 -1
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +2 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +8 -1
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
- data/ext/libcouchbase/cmake/config-cmake.h.in +14 -0
- data/ext/libcouchbase/cmake/configure +8 -26
- data/ext/libcouchbase/cmake/defs.mk.in +2 -2
- data/ext/libcouchbase/cmake/libcouchbase.stp.in +829 -0
- data/ext/libcouchbase/cmake/source_files.cmake +11 -2
- data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +18 -2
- data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +44 -2
- data/ext/libcouchbase/contrib/cbsasl/src/client.c +285 -73
- data/ext/libcouchbase/contrib/cbsasl/src/common.c +4 -0
- data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.c +500 -0
- data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.h +99 -0
- data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +1 -1
- data/ext/libcouchbase/contrib/cliopts/cliopts.h +14 -1
- data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +2 -3
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +4 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +7 -5
- data/ext/libcouchbase/contrib/snappy/snappy.cc +7 -2
- data/ext/libcouchbase/example/crypto/.gitignore +2 -0
- data/ext/libcouchbase/example/crypto/Makefile +13 -0
- data/ext/libcouchbase/example/crypto/common_provider.c +24 -0
- data/ext/libcouchbase/example/crypto/common_provider.h +31 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_decrypt.c +139 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_encrypt.c +147 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.c +281 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.h +29 -0
- data/ext/libcouchbase/example/tracing/.gitignore +2 -0
- data/ext/libcouchbase/example/tracing/Makefile +8 -0
- data/ext/libcouchbase/example/tracing/cJSON.c +1 -0
- data/ext/libcouchbase/example/tracing/cJSON.h +1 -0
- data/ext/libcouchbase/example/tracing/tracing.c +439 -0
- data/ext/libcouchbase/example/tracing/views.c +444 -0
- data/ext/libcouchbase/include/libcouchbase/auth.h +56 -4
- data/ext/libcouchbase/include/libcouchbase/cbft.h +8 -0
- data/ext/libcouchbase/include/libcouchbase/cntl-private.h +55 -1
- data/ext/libcouchbase/include/libcouchbase/cntl.h +101 -1
- data/ext/libcouchbase/include/libcouchbase/configuration.h.in +6 -0
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +109 -6
- data/ext/libcouchbase/include/libcouchbase/crypto.h +140 -0
- data/ext/libcouchbase/include/libcouchbase/error.h +38 -2
- data/ext/libcouchbase/include/libcouchbase/kvbuf.h +6 -1
- data/ext/libcouchbase/include/libcouchbase/metrics.h +79 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +9 -0
- data/ext/libcouchbase/include/libcouchbase/tracing.h +319 -0
- data/ext/libcouchbase/include/libcouchbase/vbucket.h +1 -1
- data/ext/libcouchbase/include/libcouchbase/views.h +8 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +40 -10
- data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +6 -14
- data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +3 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +1 -0
- data/ext/libcouchbase/plugins/io/select/plugin-select.c +4 -1
- data/ext/libcouchbase/src/auth-priv.h +36 -4
- data/ext/libcouchbase/src/auth.cc +66 -27
- data/ext/libcouchbase/src/bootstrap.cc +1 -1
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +12 -7
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +26 -17
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +1 -1
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +4 -2
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +6 -3
- data/ext/libcouchbase/src/cbft.cc +48 -0
- data/ext/libcouchbase/src/cntl.cc +138 -2
- data/ext/libcouchbase/src/config_static.h +17 -0
- data/ext/libcouchbase/src/connspec.cc +54 -6
- data/ext/libcouchbase/src/connspec.h +9 -1
- data/ext/libcouchbase/src/crypto.cc +386 -0
- data/ext/libcouchbase/src/ctx-log-inl.h +23 -6
- data/ext/libcouchbase/src/dump.cc +4 -0
- data/ext/libcouchbase/src/getconfig.cc +1 -2
- data/ext/libcouchbase/src/handler.cc +65 -27
- data/ext/libcouchbase/src/hostlist.cc +35 -7
- data/ext/libcouchbase/src/hostlist.h +7 -0
- data/ext/libcouchbase/src/http/http-priv.h +2 -0
- data/ext/libcouchbase/src/http/http.cc +77 -37
- data/ext/libcouchbase/src/http/http_io.cc +19 -2
- data/ext/libcouchbase/src/instance.cc +90 -17
- data/ext/libcouchbase/src/internal.h +5 -0
- data/ext/libcouchbase/src/lcbio/connect.cc +39 -4
- data/ext/libcouchbase/src/lcbio/connect.h +27 -0
- data/ext/libcouchbase/src/lcbio/ctx.c +49 -23
- data/ext/libcouchbase/src/lcbio/ioutils.cc +30 -3
- data/ext/libcouchbase/src/lcbio/ioutils.h +2 -0
- data/ext/libcouchbase/src/lcbio/manager.cc +44 -8
- data/ext/libcouchbase/src/lcbio/manager.h +2 -0
- data/ext/libcouchbase/src/lcbio/rw-inl.h +1 -0
- data/ext/libcouchbase/src/lcbio/ssl.h +3 -5
- data/ext/libcouchbase/src/logging.c +1 -1
- data/ext/libcouchbase/src/logging.h +2 -0
- data/ext/libcouchbase/src/mc/compress.cc +164 -0
- data/ext/libcouchbase/src/mc/compress.h +7 -12
- data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +5 -1
- data/ext/libcouchbase/src/mc/mcreq.c +11 -1
- data/ext/libcouchbase/src/mc/mcreq.h +35 -4
- data/ext/libcouchbase/src/mcserver/mcserver.cc +30 -7
- data/ext/libcouchbase/src/mcserver/mcserver.h +7 -0
- data/ext/libcouchbase/src/mcserver/negotiate.cc +103 -57
- data/ext/libcouchbase/src/mcserver/negotiate.h +2 -2
- data/ext/libcouchbase/src/mctx-helper.h +11 -0
- data/ext/libcouchbase/src/metrics.cc +132 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +2 -1
- data/ext/libcouchbase/src/n1ql/n1ql.cc +66 -0
- data/ext/libcouchbase/src/newconfig.cc +9 -2
- data/ext/libcouchbase/src/operations/counter.cc +2 -1
- data/ext/libcouchbase/src/operations/durability-cas.cc +11 -0
- data/ext/libcouchbase/src/operations/durability-seqno.cc +3 -0
- data/ext/libcouchbase/src/operations/durability.cc +24 -2
- data/ext/libcouchbase/src/operations/durability_internal.h +19 -0
- data/ext/libcouchbase/src/operations/get.cc +4 -2
- data/ext/libcouchbase/src/operations/observe-seqno.cc +1 -0
- data/ext/libcouchbase/src/operations/observe.cc +113 -62
- data/ext/libcouchbase/src/operations/ping.cc +246 -67
- data/ext/libcouchbase/src/operations/remove.cc +2 -1
- data/ext/libcouchbase/src/operations/store.cc +17 -14
- data/ext/libcouchbase/src/operations/touch.cc +3 -0
- data/ext/libcouchbase/src/packetutils.h +68 -4
- data/ext/libcouchbase/src/probes.d +132 -161
- data/ext/libcouchbase/src/rdb/bigalloc.c +1 -1
- data/ext/libcouchbase/src/retryq.cc +6 -2
- data/ext/libcouchbase/src/rnd.cc +68 -0
- data/ext/libcouchbase/src/rnd.h +39 -0
- data/ext/libcouchbase/src/settings.c +27 -0
- data/ext/libcouchbase/src/settings.h +67 -3
- data/ext/libcouchbase/src/ssl/CMakeLists.txt +0 -12
- data/ext/libcouchbase/src/ssl/ssl_common.c +23 -4
- data/ext/libcouchbase/src/strcodecs/base64.c +141 -16
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +16 -1
- data/ext/libcouchbase/src/trace.h +68 -61
- data/ext/libcouchbase/src/tracing/span.cc +289 -0
- data/ext/libcouchbase/src/tracing/threshold_logging_tracer.cc +171 -0
- data/ext/libcouchbase/src/tracing/tracer.cc +53 -0
- data/ext/libcouchbase/src/tracing/tracing-internal.h +213 -0
- data/ext/libcouchbase/src/utilities.c +5 -0
- data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -2
- data/ext/libcouchbase/src/vbucket/vbucket.c +50 -18
- data/ext/libcouchbase/src/views/docreq.cc +26 -1
- data/ext/libcouchbase/src/views/docreq.h +17 -0
- data/ext/libcouchbase/src/views/viewreq.cc +64 -1
- data/ext/libcouchbase/src/views/viewreq.h +21 -0
- data/ext/libcouchbase/tests/CMakeLists.txt +6 -6
- data/ext/libcouchbase/tests/basic/t_base64.cc +34 -6
- data/ext/libcouchbase/tests/basic/t_connstr.cc +14 -0
- data/ext/libcouchbase/tests/basic/t_creds.cc +10 -10
- data/ext/libcouchbase/tests/basic/t_host.cc +22 -2
- data/ext/libcouchbase/tests/basic/t_scram.cc +514 -0
- data/ext/libcouchbase/tests/check-all.cc +6 -2
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +64 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.h +27 -1
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +2 -2
- data/ext/libcouchbase/tests/iotests/t_forward.cc +8 -0
- data/ext/libcouchbase/tests/iotests/t_netfail.cc +124 -0
- data/ext/libcouchbase/tests/iotests/t_smoke.cc +1 -1
- data/ext/libcouchbase/tests/iotests/t_snappy.cc +316 -0
- data/ext/libcouchbase/tests/socktests/socktest.cc +2 -2
- data/ext/libcouchbase/tests/socktests/t_basic.cc +6 -6
- data/ext/libcouchbase/tests/socktests/t_manager.cc +1 -1
- data/ext/libcouchbase/tests/socktests/t_ssl.cc +1 -1
- data/ext/libcouchbase/tools/CMakeLists.txt +1 -1
- data/ext/libcouchbase/tools/cbc-handlers.h +17 -0
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +7 -4
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +408 -100
- data/ext/libcouchbase/tools/cbc-proxy.cc +134 -3
- data/ext/libcouchbase/tools/cbc-subdoc.cc +1 -2
- data/ext/libcouchbase/tools/cbc.cc +113 -8
- data/ext/libcouchbase/tools/common/histogram.cc +1 -0
- data/ext/libcouchbase/tools/common/options.cc +28 -1
- data/ext/libcouchbase/tools/common/options.h +5 -0
- data/ext/libcouchbase/tools/docgen/docgen.h +36 -10
- data/ext/libcouchbase/tools/docgen/loc.h +5 -4
- data/ext/libcouchbase/tools/docgen/seqgen.h +28 -0
- data/lib/libcouchbase/ext/libcouchbase/enums.rb +10 -0
- data/lib/libcouchbase/n1ql.rb +6 -1
- data/lib/libcouchbase/version.rb +1 -1
- data/spec/connection_spec.rb +6 -6
- metadata +38 -5
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +0 -11
- data/ext/libcouchbase/src/mc/compress.c +0 -90
- data/ext/libcouchbase/tools/common/my_inttypes.h +0 -22
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2018 Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include "internal.h"
|
|
19
|
+
|
|
20
|
+
#include <iostream>
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#define LOGARGS(tracer, lvl) tracer->m_settings, "tracer", LCB_LOG_##lvl, __FILE__, __LINE__
|
|
24
|
+
|
|
25
|
+
using namespace lcb::trace;
|
|
26
|
+
|
|
27
|
+
LIBCOUCHBASE_API lcbtrace_TRACER *lcbtrace_new(lcb_t instance, uint64_t flags)
|
|
28
|
+
{
|
|
29
|
+
if (instance == NULL || (flags & LCBTRACE_F_THRESHOLD) == 0) {
|
|
30
|
+
return NULL;
|
|
31
|
+
}
|
|
32
|
+
return (new ThresholdLoggingTracer(instance))->wrap();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
extern "C" {
|
|
36
|
+
static void tlt_destructor(lcbtrace_TRACER *wrapper)
|
|
37
|
+
{
|
|
38
|
+
if (wrapper == NULL) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (wrapper->cookie) {
|
|
42
|
+
ThresholdLoggingTracer *tracer = reinterpret_cast< ThresholdLoggingTracer * >(wrapper->cookie);
|
|
43
|
+
delete tracer;
|
|
44
|
+
wrapper->cookie = NULL;
|
|
45
|
+
}
|
|
46
|
+
delete wrapper;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static void tlt_report(lcbtrace_TRACER *wrapper, lcbtrace_SPAN *span)
|
|
50
|
+
{
|
|
51
|
+
if (wrapper == NULL || wrapper->cookie == NULL) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
ThresholdLoggingTracer *tracer = reinterpret_cast< ThresholdLoggingTracer * >(wrapper->cookie);
|
|
56
|
+
if (span->tags[LCBTRACE_TAG_SERVICE] == LCBTRACE_TAG_SERVICE_KV) {
|
|
57
|
+
if (lcbtrace_span_is_orphaned(span)) {
|
|
58
|
+
tracer->add_orphan(span);
|
|
59
|
+
} else {
|
|
60
|
+
tracer->check_threshold(span);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
lcbtrace_TRACER *ThresholdLoggingTracer::wrap()
|
|
67
|
+
{
|
|
68
|
+
if (m_wrapper) {
|
|
69
|
+
return m_wrapper;
|
|
70
|
+
}
|
|
71
|
+
m_wrapper = new lcbtrace_TRACER();
|
|
72
|
+
m_wrapper->version = 0;
|
|
73
|
+
m_wrapper->flags = 0;
|
|
74
|
+
m_wrapper->cookie = this;
|
|
75
|
+
m_wrapper->destructor = tlt_destructor;
|
|
76
|
+
m_wrapper->v.v0.report = tlt_report;
|
|
77
|
+
return m_wrapper;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
ReportedSpan ThresholdLoggingTracer::convert(lcbtrace_SPAN *span)
|
|
81
|
+
{
|
|
82
|
+
ReportedSpan orphan;
|
|
83
|
+
orphan.duration = span->duration();
|
|
84
|
+
Json::Value entry;
|
|
85
|
+
entry["operation_name"] = span->m_opname;
|
|
86
|
+
entry["operation_id"] = span->tags[LCBTRACE_TAG_OPERATION_ID];
|
|
87
|
+
entry["last_local_id"] = span->tags[LCBTRACE_TAG_LOCAL_ID];
|
|
88
|
+
entry["last_local_address"] = span->tags[LCBTRACE_TAG_LOCAL_ADDRESS];
|
|
89
|
+
entry["last_remote_address"] = span->tags[LCBTRACE_TAG_PEER_ADDRESS];
|
|
90
|
+
entry["server_us"] = span->tags[LCBTRACE_TAG_PEER_LATENCY];
|
|
91
|
+
entry["total_us"] = (Json::UInt64)orphan.duration;
|
|
92
|
+
orphan.payload = Json::FastWriter().write(entry);
|
|
93
|
+
return orphan;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
void ThresholdLoggingTracer::add_orphan(lcbtrace_SPAN *span)
|
|
97
|
+
{
|
|
98
|
+
m_orphans.push(convert(span));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
void ThresholdLoggingTracer::check_threshold(lcbtrace_SPAN *span)
|
|
102
|
+
{
|
|
103
|
+
if (span->duration() > m_settings->tracer_threshold[LCBTRACE_THRESHOLD_KV]) {
|
|
104
|
+
m_threshold.push(convert(span));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
void ThresholdLoggingTracer::flush_queue(FixedQueue< ReportedSpan > &queue, const char *message)
|
|
109
|
+
{
|
|
110
|
+
std::vector< ReportedSpan > &slice = queue.get_sorted();
|
|
111
|
+
Json::Value entries;
|
|
112
|
+
entries["service"] = "kv";
|
|
113
|
+
entries["count"] = (Json::UInt)slice.size();
|
|
114
|
+
Json::Value top;
|
|
115
|
+
for (size_t ii = 0; ii < slice.size(); ii++) {
|
|
116
|
+
Json::Value entry;
|
|
117
|
+
if (Json::Reader().parse(slice[ii].payload, entry)) {
|
|
118
|
+
top.append(entry);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
entries["top"] = top;
|
|
122
|
+
std::string doc = Json::FastWriter().write(entries);
|
|
123
|
+
if (doc.size() > 0 && doc[doc.size() - 1] == '\n') {
|
|
124
|
+
doc[doc.size() - 1] = '\0';
|
|
125
|
+
}
|
|
126
|
+
lcb_log(LOGARGS(this, WARN), "%s: %s", message, doc.c_str());
|
|
127
|
+
queue.clear();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
void ThresholdLoggingTracer::flush_orphans()
|
|
131
|
+
{
|
|
132
|
+
lcb_U32 tv = m_settings->tracer_orphaned_queue_flush_interval;
|
|
133
|
+
if (tv == 0) {
|
|
134
|
+
m_oflush.cancel();
|
|
135
|
+
} else {
|
|
136
|
+
m_oflush.rearm(tv);
|
|
137
|
+
}
|
|
138
|
+
if (m_orphans.empty()) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
flush_queue(m_orphans, "Orphan responses observed");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
void ThresholdLoggingTracer::flush_threshold()
|
|
145
|
+
{
|
|
146
|
+
lcb_U32 tv = m_settings->tracer_threshold_queue_flush_interval;
|
|
147
|
+
if (tv == 0) {
|
|
148
|
+
m_tflush.cancel();
|
|
149
|
+
} else {
|
|
150
|
+
m_tflush.rearm(tv);
|
|
151
|
+
}
|
|
152
|
+
if (m_threshold.empty()) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
flush_queue(m_threshold, "Operations over threshold");
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
ThresholdLoggingTracer::ThresholdLoggingTracer(lcb_t instance)
|
|
159
|
+
: m_wrapper(NULL), m_settings(instance->settings), m_orphans(LCBT_SETTING(instance, tracer_orphaned_queue_size)),
|
|
160
|
+
m_threshold(LCBT_SETTING(instance, tracer_threshold_queue_size)), m_oflush(instance->iotable, this),
|
|
161
|
+
m_tflush(instance->iotable, this)
|
|
162
|
+
{
|
|
163
|
+
lcb_U32 tv = m_settings->tracer_orphaned_queue_flush_interval;
|
|
164
|
+
if (tv > 0) {
|
|
165
|
+
m_oflush.rearm(tv);
|
|
166
|
+
}
|
|
167
|
+
tv = m_settings->tracer_threshold_queue_flush_interval;
|
|
168
|
+
if (tv > 0) {
|
|
169
|
+
m_tflush.rearm(tv);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2017 Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include "internal.h"
|
|
19
|
+
|
|
20
|
+
using namespace lcb::trace;
|
|
21
|
+
|
|
22
|
+
LIBCOUCHBASE_API void lcbtrace_destroy(lcbtrace_TRACER *tracer)
|
|
23
|
+
{
|
|
24
|
+
if (tracer && tracer->destructor) {
|
|
25
|
+
tracer->destructor(tracer);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
LIBCOUCHBASE_API
|
|
30
|
+
lcbtrace_SPAN *lcbtrace_span_start(lcbtrace_TRACER *tracer, const char *opname, uint64_t start, lcbtrace_REF *ref)
|
|
31
|
+
{
|
|
32
|
+
lcbtrace_REF_TYPE type = LCBTRACE_REF_NONE;
|
|
33
|
+
lcbtrace_SPAN *other = NULL;
|
|
34
|
+
if (ref) {
|
|
35
|
+
type = ref->type;
|
|
36
|
+
other = ref->span;
|
|
37
|
+
}
|
|
38
|
+
return new Span(tracer, opname, start, type, other);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
LIBCOUCHBASE_API
|
|
42
|
+
lcbtrace_TRACER *lcb_get_tracer(lcb_t instance)
|
|
43
|
+
{
|
|
44
|
+
return (instance && instance->settings) ? instance->settings->tracer : NULL;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
LIBCOUCHBASE_API
|
|
48
|
+
void lcb_set_tracer(lcb_t instance, lcbtrace_TRACER *tracer)
|
|
49
|
+
{
|
|
50
|
+
if (instance && instance->settings) {
|
|
51
|
+
instance->settings->tracer = tracer;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2018 Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef LCB_TRACING_INTERNAL_H
|
|
19
|
+
#define LCB_TRACING_INTERNAL_H
|
|
20
|
+
|
|
21
|
+
#ifdef LCB_TRACING
|
|
22
|
+
#include <libcouchbase/tracing.h>
|
|
23
|
+
#include "rnd.h"
|
|
24
|
+
|
|
25
|
+
#ifdef __cplusplus
|
|
26
|
+
|
|
27
|
+
#include <queue>
|
|
28
|
+
|
|
29
|
+
namespace lcb
|
|
30
|
+
{
|
|
31
|
+
namespace trace
|
|
32
|
+
{
|
|
33
|
+
|
|
34
|
+
class Span
|
|
35
|
+
{
|
|
36
|
+
public:
|
|
37
|
+
Span(lcbtrace_TRACER *tracer, const char *opname, uint64_t start, lcbtrace_REF_TYPE ref, lcbtrace_SPAN *other);
|
|
38
|
+
|
|
39
|
+
void finish(uint64_t finish);
|
|
40
|
+
uint64_t duration()
|
|
41
|
+
{
|
|
42
|
+
return m_finish - m_start;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
template < typename T > void add_tag(const char *name, T value);
|
|
46
|
+
|
|
47
|
+
lcbtrace_TRACER *m_tracer;
|
|
48
|
+
std::string m_opname;
|
|
49
|
+
uint64_t m_span_id;
|
|
50
|
+
uint64_t m_start;
|
|
51
|
+
uint64_t m_finish;
|
|
52
|
+
bool m_orphaned;
|
|
53
|
+
Json::Value tags;
|
|
54
|
+
Span *m_parent;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
struct ReportedSpan {
|
|
58
|
+
uint64_t duration;
|
|
59
|
+
std::string payload;
|
|
60
|
+
|
|
61
|
+
bool operator<(const ReportedSpan &rhs) const
|
|
62
|
+
{
|
|
63
|
+
return duration < rhs.duration;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
template < typename T > class FixedQueue
|
|
68
|
+
{
|
|
69
|
+
public:
|
|
70
|
+
explicit FixedQueue(size_t capacity) : m_capacity(capacity) {}
|
|
71
|
+
|
|
72
|
+
void push(T item)
|
|
73
|
+
{
|
|
74
|
+
if (m_items.size() < m_capacity) {
|
|
75
|
+
m_items.push_back(item);
|
|
76
|
+
std::push_heap(m_items.begin(), m_items.end());
|
|
77
|
+
} else {
|
|
78
|
+
std::sort_heap(m_items.begin(), m_items.end());
|
|
79
|
+
if (m_items.front() < item) {
|
|
80
|
+
m_items[0] = item;
|
|
81
|
+
}
|
|
82
|
+
std::make_heap(m_items.begin(), m_items.end());
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
size_t size()
|
|
87
|
+
{
|
|
88
|
+
return m_items.size();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
bool empty()
|
|
92
|
+
{
|
|
93
|
+
return m_items.empty();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
void clear()
|
|
97
|
+
{
|
|
98
|
+
m_items.clear();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
std::vector< T > &get_sorted()
|
|
102
|
+
{
|
|
103
|
+
std::sort_heap(m_items.begin(), m_items.end());
|
|
104
|
+
return m_items;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private:
|
|
108
|
+
size_t m_capacity;
|
|
109
|
+
std::vector< T > m_items;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
class ThresholdLoggingTracer
|
|
113
|
+
{
|
|
114
|
+
lcbtrace_TRACER *m_wrapper;
|
|
115
|
+
lcb_settings *m_settings;
|
|
116
|
+
|
|
117
|
+
FixedQueue< ReportedSpan > m_orphans;
|
|
118
|
+
FixedQueue< ReportedSpan > m_threshold;
|
|
119
|
+
|
|
120
|
+
void flush_queue(FixedQueue< ReportedSpan > &queue, const char *message);
|
|
121
|
+
ReportedSpan convert(lcbtrace_SPAN *span);
|
|
122
|
+
|
|
123
|
+
public:
|
|
124
|
+
ThresholdLoggingTracer(lcb_t instance);
|
|
125
|
+
|
|
126
|
+
lcbtrace_TRACER *wrap();
|
|
127
|
+
void add_orphan(lcbtrace_SPAN *span);
|
|
128
|
+
void check_threshold(lcbtrace_SPAN *span);
|
|
129
|
+
|
|
130
|
+
void flush_orphans();
|
|
131
|
+
void flush_threshold();
|
|
132
|
+
|
|
133
|
+
lcb::io::Timer< ThresholdLoggingTracer, &ThresholdLoggingTracer::flush_orphans > m_oflush;
|
|
134
|
+
lcb::io::Timer< ThresholdLoggingTracer, &ThresholdLoggingTracer::flush_threshold > m_tflush;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
} // namespace trace
|
|
138
|
+
} // namespace lcb
|
|
139
|
+
|
|
140
|
+
extern "C" {
|
|
141
|
+
#endif
|
|
142
|
+
LCB_INTERNAL_API
|
|
143
|
+
void lcbtrace_span_add_system_tags(lcbtrace_SPAN *span, lcb_settings *settings, const char *service);
|
|
144
|
+
LCB_INTERNAL_API
|
|
145
|
+
void lcbtrace_span_set_parent(lcbtrace_SPAN *span, lcbtrace_SPAN *parent);
|
|
146
|
+
LCB_INTERNAL_API
|
|
147
|
+
void lcbtrace_span_set_orphaned(lcbtrace_SPAN *span, int val);
|
|
148
|
+
|
|
149
|
+
#define LCBTRACE_KV_START(settings, cmd, operation_name, opaque, outspan) \
|
|
150
|
+
if ((settings)->tracer) { \
|
|
151
|
+
lcbtrace_REF ref; \
|
|
152
|
+
char opid[20] = {}; \
|
|
153
|
+
snprintf(opid, sizeof(opid), "0x%x", (int)opaque); \
|
|
154
|
+
ref.type = LCBTRACE_REF_CHILD_OF; \
|
|
155
|
+
ref.span = (cmd->_hashkey.type & LCB_KV_TRACESPAN) ? (lcbtrace_SPAN *)cmd->_hashkey.contig.bytes : NULL; \
|
|
156
|
+
outspan = lcbtrace_span_start((settings)->tracer, operation_name, LCBTRACE_NOW, &ref); \
|
|
157
|
+
lcbtrace_span_add_tag_str(outspan, LCBTRACE_TAG_OPERATION_ID, opid); \
|
|
158
|
+
lcbtrace_span_add_system_tags(outspan, (settings), LCBTRACE_TAG_SERVICE_KV); \
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
#define LCBTRACE_KV_COMPLETE(pipeline, request, response) \
|
|
162
|
+
do { \
|
|
163
|
+
lcbtrace_SPAN *span = MCREQ_PKT_RDATA(request)->span; \
|
|
164
|
+
if (span) { \
|
|
165
|
+
lcbtrace_span_add_tag_uint64(span, LCBTRACE_TAG_PEER_LATENCY, (response)->duration()); \
|
|
166
|
+
lcb::Server *server = static_cast< lcb::Server * >(pipeline); \
|
|
167
|
+
const lcb_host_t &remote = server->get_host(); \
|
|
168
|
+
std::string hh; \
|
|
169
|
+
if (remote.ipv6) { \
|
|
170
|
+
hh.append("[").append(remote.host).append("]:").append(remote.port); \
|
|
171
|
+
} else { \
|
|
172
|
+
hh.append(remote.host).append(":").append(remote.port); \
|
|
173
|
+
} \
|
|
174
|
+
lcbtrace_span_add_tag_str(span, LCBTRACE_TAG_PEER_ADDRESS, hh.c_str()); \
|
|
175
|
+
lcbio_CTX *ctx = server->connctx; \
|
|
176
|
+
if (ctx) { \
|
|
177
|
+
char local_id[34] = {}; \
|
|
178
|
+
snprintf(local_id, sizeof(local_id), "%016" PRIx64 "/%016" PRIx64, \
|
|
179
|
+
(lcb_U64)server->get_settings()->iid, ctx->sock->id); \
|
|
180
|
+
lcbtrace_span_add_tag_str(span, LCBTRACE_TAG_LOCAL_ID, local_id); \
|
|
181
|
+
lcbtrace_span_add_tag_str(span, LCBTRACE_TAG_LOCAL_ADDRESS, \
|
|
182
|
+
lcbio__inet_ntop(&ctx->sock->info->sa_local).c_str()); \
|
|
183
|
+
} \
|
|
184
|
+
} \
|
|
185
|
+
} while (0);
|
|
186
|
+
|
|
187
|
+
#define LCBTRACE_KV_CLOSE(request) \
|
|
188
|
+
do { \
|
|
189
|
+
lcbtrace_SPAN *span = MCREQ_PKT_RDATA(request)->span; \
|
|
190
|
+
if (span) { \
|
|
191
|
+
lcbtrace_span_finish(span, LCBTRACE_NOW); \
|
|
192
|
+
MCREQ_PKT_RDATA(request)->span = NULL; \
|
|
193
|
+
} \
|
|
194
|
+
} while (0);
|
|
195
|
+
|
|
196
|
+
#define LCBTRACE_KV_FINISH(pipeline, request, response) \
|
|
197
|
+
LCBTRACE_KV_COMPLETE(pipeline, request, response) \
|
|
198
|
+
LCBTRACE_KV_CLOSE(request)
|
|
199
|
+
|
|
200
|
+
#ifdef __cplusplus
|
|
201
|
+
}
|
|
202
|
+
#endif
|
|
203
|
+
|
|
204
|
+
#else
|
|
205
|
+
|
|
206
|
+
#define LCBTRACE_KV_START(settings, cmd, operation_name, opaque, outspan)
|
|
207
|
+
#define LCBTRACE_KV_COMPLETE(pipeline, request, response)
|
|
208
|
+
#define LCBTRACE_KV_CLOSE(request)
|
|
209
|
+
#define LCBTRACE_KV_FINISH(pipeline, request, response)
|
|
210
|
+
|
|
211
|
+
#endif /* LCB_TRACING */
|
|
212
|
+
|
|
213
|
+
#endif /* LCB_TRACING_INTERNAL_H */
|
|
@@ -34,6 +34,11 @@ extern lcb_uint64_t lcb_byteswap64(lcb_uint64_t val)
|
|
|
34
34
|
return ret;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
extern lcb_uint16_t lcb_byteswap16(lcb_uint16_t val)
|
|
38
|
+
{
|
|
39
|
+
return ((val & 0xff) << 8) | ((val >> 8) & 0xff);
|
|
40
|
+
}
|
|
41
|
+
|
|
37
42
|
/**
|
|
38
43
|
* While the C standard library uses 'putenv' for environment variable
|
|
39
44
|
* manipulation, POSIX defines setenv (which works sanely) but Windows
|