Skip to content

Commit 2fba3f0

Browse files
committed
add Tracer level sample rate
1 parent d90d263 commit 2fba3f0

File tree

9 files changed

+67
-10
lines changed

9 files changed

+67
-10
lines changed

examples/grpc_greeter/greeter_client.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,17 @@ class GreeterClient
9494

9595
if (span.parent_id())
9696
send_header(ZIPKIN_X_PARENT_SPAN_ID, folly::to<std::string>(span.parent_id()));
97-
97+
if (span.sampled())
98+
send_header(ZIPKIN_X_SAMPLED, "1");
9899
if (span.debug())
99100
send_header(ZIPKIN_X_FLAGS, "1");
100101

101-
span << zipkin::TraceKeys::CLIENT_SEND;
102+
span << zipkin::TraceKeys::CLIENT_SEND << endpoint;
102103

103104
// The actual RPC.
104105
Status status = stub_->SayHello(&context, request, &reply);
105106

106-
span << zipkin::TraceKeys::CLIENT_RECV;
107+
span << zipkin::TraceKeys::CLIENT_RECV << endpoint;
107108

108109
// Act upon its status.
109110
if (status.ok())

examples/simple_proxy/main.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,10 @@ void forward_http_request(struct mg_connection *nc, struct http_message *hm)
212212
{
213213
p += snprintf(p, end - p, ZIPKIN_X_PARENT_SPAN_ID ": " ZIPKIN_SPAN_ID_FMT CRLF, zipkin_span_parent_id(span));
214214
}
215+
if (zipkin_span_sampled(span))
216+
{
217+
p += snprintf(p, end - p, ZIPKIN_X_SAMPLED ": 1" CRLF);
218+
}
215219
if (zipkin_span_debug(span))
216220
{
217221
p += snprintf(p, end - p, ZIPKIN_X_FLAGS ": 1" CRLF);
@@ -283,6 +287,10 @@ void reply_json_response(struct mg_connection *nc, struct http_message *hm)
283287
{
284288
zipkin_span_set_parent_id(span, strtoull(hv->p, NULL, 16));
285289
}
290+
else if (0 == mg_vcmp(hn, ZIPKIN_X_SAMPLED))
291+
{
292+
zipkin_span_set_sampled(span, strtoul(hv->p, NULL, 10));
293+
}
286294

287295
mg_printf(nc, "%s\"%.*s\": \"%.*s\"", (i != 0 ? "," : ""), (int)hn->len, hn->p, (int)hv->len, hv->p);
288296
}

include/zipkin.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ zipkin_span_t zipkin_span_parse_trace_id(zipkin_span_t span, const char *str, si
114114

115115
int zipkin_span_debug(zipkin_span_t span);
116116

117+
int zipkin_span_sampled(zipkin_span_t span);
118+
zipkin_span_t zipkin_span_set_sampled(zipkin_span_t span, int sampled);
119+
117120
zipkin_userdata_t zipkin_span_userdata(zipkin_span_t span);
118121
zipkin_span_t zipkin_span_set_userdata(zipkin_span_t span, zipkin_userdata_t userdata);
119122

src/CApi.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,17 @@ int zipkin_span_debug(zipkin_span_t span)
142142
{
143143
return span ? static_cast<zipkin::Span *>(span)->debug() : false;
144144
}
145+
int zipkin_span_sampled(zipkin_span_t span)
146+
{
147+
return span ? static_cast<zipkin::Span *>(span)->sampled() : false;
148+
}
149+
zipkin_span_t zipkin_span_set_sampled(zipkin_span_t span, int sampled)
150+
{
151+
if (span)
152+
static_cast<zipkin::Span *>(span)->with_sampled(sampled);
153+
154+
return span;
155+
}
145156
zipkin_userdata_t zipkin_span_userdata(zipkin_span_t span)
146157
{
147158
if (span)

src/Span.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ const std::string decode(const std::string &encoded_string)
230230

231231
} // namespace base64
232232

233-
Span::Span(Tracer *tracer, const std::string &name, span_id_t parent_id, userdata_t userdata) : m_tracer(tracer)
233+
Span::Span(Tracer *tracer, const std::string &name, span_id_t parent_id, userdata_t userdata, bool sampled) : m_tracer(tracer)
234234
{
235235
if (tracer)
236236
{
@@ -242,10 +242,10 @@ Span::Span(Tracer *tracer, const std::string &name, span_id_t parent_id, userdat
242242
}
243243
}
244244

245-
reset(name, parent_id, userdata);
245+
reset(name, parent_id, userdata, sampled);
246246
}
247247

248-
void Span::reset(const std::string &name, span_id_t parent_id, userdata_t userdata)
248+
void Span::reset(const std::string &name, span_id_t parent_id, userdata_t userdata, bool sampled)
249249
{
250250
m_span.__isset = _Span__isset();
251251
m_span.__set_name(name);
@@ -260,6 +260,7 @@ void Span::reset(const std::string &name, span_id_t parent_id, userdata_t userda
260260
}
261261

262262
m_userdata = userdata;
263+
m_sampled = sampled;
263264
}
264265

265266
void Span::submit(void)

src/Span.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,19 +538,20 @@ class Span
538538
Tracer *m_tracer;
539539
::Span m_span;
540540
userdata_t m_userdata;
541+
bool m_sampled;
541542

542543
static const ::Endpoint host(const Endpoint *endpoint);
543544

544545
public:
545546
/**
546547
* \brief Construct a span
547548
*/
548-
Span(Tracer *tracer, const std::string &name, span_id_t parent_id = 0, userdata_t userdata = nullptr);
549+
Span(Tracer *tracer, const std::string &name, span_id_t parent_id = 0, userdata_t userdata = nullptr, bool sampled = true);
549550

550551
/**
551552
* \brief Reset a span
552553
*/
553-
void reset(const std::string &name, span_id_t parent_id = 0, userdata_t userdata = nullptr);
554+
void reset(const std::string &name, span_id_t parent_id = 0, userdata_t userdata = nullptr, bool sampled = true);
554555

555556
/**
556557
* \brief Submit a Span to Tracer
@@ -705,6 +706,18 @@ class Span
705706
return *this;
706707
}
707708

709+
/**
710+
* \brief Report this span to the tracing system
711+
*/
712+
inline bool sampled(void) const { return m_sampled; }
713+
714+
/** \sa Span#sampled */
715+
inline Span &with_sampled(bool sampled = true)
716+
{
717+
m_sampled = sampled;
718+
return *this;
719+
}
720+
708721
virtual inline Span *span(const std::string &name, userdata_t userdata = nullptr) const
709722
{
710723
return new Span(m_tracer, name, m_span.id, userdata ? userdata : m_userdata);

src/Tracer.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ Span *CachedTracer::span(const std::string &name, span_id_t parent_id, void *use
2828
span = new (this) CachedSpan(this, name, parent_id, userdata);
2929
}
3030

31+
span->with_sampled(m_total_spans++ % m_sample_rate == 0);
32+
3133
return span;
3234
}
3335

3436
void CachedTracer::submit(Span *span)
3537
{
36-
if (m_collector)
38+
if (m_collector && span->sampled())
3739
{
3840
VLOG(2) << "Span @ " << span << " submited to collector @ " << m_collector << ", id=" << span->id();
3941

src/Tracer.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <cstddef>
44
#include <string>
5+
#include <atomic>
56

67
#include <boost/lockfree/stack.hpp>
78

@@ -50,6 +51,14 @@ struct Tracer
5051
*/
5152
virtual const std::string &name(void) const = 0;
5253

54+
/**
55+
* \brief Tracer sample rate
56+
*/
57+
virtual size_t sample_rate(void) const = 0;
58+
59+
/** \sa Tracer#sample_rate */
60+
virtual void set_sample_rate(size_t sample_rate) = 0;
61+
5362
/**
5463
* \brief Associated Collector
5564
*/
@@ -135,6 +144,8 @@ class CachedTracer : public Tracer
135144

136145
trace_id_t m_id, m_id_high;
137146
const std::string m_name;
147+
size_t m_sample_rate;
148+
std::atomic_size_t m_total_spans;
138149

139150
public:
140151
typedef SpanCache<64> span_cache_t;
@@ -144,7 +155,7 @@ class CachedTracer : public Tracer
144155

145156
public:
146157
CachedTracer(Collector *collector, const std::string &name, size_t cache_message_size = default_cache_message_size)
147-
: m_collector(collector), m_id(Span::next_id()), m_id_high(0), m_name(name), m_cache(cache_message_size)
158+
: m_collector(collector), m_id(Span::next_id()), m_id_high(0), m_name(name), m_sample_rate(1), m_cache(cache_message_size)
148159
{
149160
}
150161

@@ -165,6 +176,9 @@ class CachedTracer : public Tracer
165176
m_id_high = id.first;
166177
}
167178
virtual const std::string &name(void) const override { return m_name; }
179+
virtual size_t sample_rate(void) const override { return m_sample_rate; }
180+
virtual void set_sample_rate(size_t sample_rate) override { m_sample_rate = sample_rate; }
181+
168182
virtual Collector *collector(void) const override { return m_collector; }
169183

170184
virtual Span *span(const std::string &name, span_id_t parent_id = 0, void *userdata = nullptr) override;

test/Mocks.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ class MockTracer : public zipkin::Tracer
2323

2424
MOCK_CONST_METHOD0(name, const std::string &(void));
2525

26+
MOCK_CONST_METHOD0(sample_rate, size_t(void));
27+
28+
MOCK_METHOD1(set_sample_rate, void(size_t sample_rate));
29+
2630
MOCK_CONST_METHOD0(collector, zipkin::Collector *(void));
2731

2832
MOCK_METHOD3(span, zipkin::Span *(const std::string &, span_id_t, userdata_t));

0 commit comments

Comments
 (0)