Skip to content

Commit e5d747f

Browse files
author
code
authored
use proto span object to store span info directly to avoid uncessary copies (#94)
1 parent f126935 commit e5d747f

File tree

4 files changed

+158
-211
lines changed

4 files changed

+158
-211
lines changed

cpp2sky/tracing_context.h

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class TracingSpan {
5858
/**
5959
* Get peer address.
6060
*/
61-
virtual const std::string& peer() const = 0;
61+
virtual std::string_view peer() const = 0;
6262

6363
/**
6464
* Get span type.
@@ -85,21 +85,10 @@ class TracingSpan {
8585
*/
8686
virtual int32_t componentId() const = 0;
8787

88-
/**
89-
* Get tags.
90-
*/
91-
virtual const std::vector<std::pair<std::string, std::string>>& tags()
92-
const = 0;
93-
94-
/**
95-
* Get logs.
96-
*/
97-
virtual const std::vector<skywalking::v3::Log>& logs() const = 0;
98-
9988
/**
10089
* Get operation name.
10190
*/
102-
virtual std::string operationName() const = 0;
91+
virtual std::string_view operationName() const = 0;
10392

10493
/**
10594
* Set parent span ID of this span.
@@ -125,12 +114,7 @@ class TracingSpan {
125114
/**
126115
* Set peer address for this span (lvalue)
127116
*/
128-
virtual void setPeer(const std::string& remote_address) = 0;
129-
130-
/**
131-
* Set peer address for this span (rvalue)
132-
*/
133-
virtual void setPeer(std::string&& remote_address) = 0;
117+
virtual void setPeer(std::string_view remote_address) = 0;
134118

135119
/**
136120
* Set span type. Entry or Exit. Entry span means origin span which doesn't
@@ -179,6 +163,11 @@ class TracingSpan {
179163
*/
180164
virtual void setOperationName(std::string_view operation_name) = 0;
181165

166+
/**
167+
* Add parent segment reference to current span.
168+
*/
169+
virtual void addSegmentRef(const SpanContext& span_context) = 0;
170+
182171
/**
183172
* This span had finished or not.
184173
*/
@@ -246,7 +235,8 @@ class TracingContext {
246235
const std::string_view target_address) = 0;
247236

248237
/**
249-
* Generate Apache SkyWalking native segment object.
238+
* Generate Apache SkyWalking native segment object. This method **SHOULD**
239+
* only be called once.
250240
*/
251241
virtual skywalking::v3::SegmentObject createSegmentObject() = 0;
252242

@@ -274,6 +264,7 @@ class TracingContext {
274264
};
275265

276266
using TracingContextPtr = std::shared_ptr<TracingContext>;
267+
277268
/**
278269
* RAII based span creation. It acquired then create new span with required
279270
* properties. The span wiil be closed and set end time when called destructor.

source/tracing_context_impl.cc

Lines changed: 89 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -26,113 +26,82 @@
2626
namespace cpp2sky {
2727

2828
TracingSpanImpl::TracingSpanImpl(int32_t span_id,
29-
TracingContext& parent_tracing_context)
30-
: span_id_(span_id), parent_tracing_context_(parent_tracing_context) {}
31-
32-
skywalking::v3::SpanObject TracingSpanImpl::createSpanObject() {
33-
skywalking::v3::SpanObject obj;
34-
35-
obj.set_spanid(span_id_);
36-
obj.set_parentspanid(parent_span_id_);
37-
obj.set_starttime(start_time_);
38-
obj.set_endtime(end_time_);
39-
obj.set_operationname(operation_name_);
40-
obj.set_spantype(type_);
41-
obj.set_spanlayer(layer_);
42-
obj.set_componentid(component_id_);
43-
obj.set_iserror(is_error_);
44-
obj.set_peer(peer_);
45-
obj.set_skipanalysis(skip_analysis_);
46-
47-
auto parent_span = parent_tracing_context_.parentSpanContext();
48-
// Inject request parent to the current segment.
49-
if (parent_span != nullptr) {
50-
auto* entry = obj.mutable_refs()->Add();
51-
// TODO(shikugawa): cpp2sky only supports cross process propagation right
52-
// now. So It is correct to specify this.
53-
entry->set_reftype(skywalking::v3::RefType::CrossProcess);
54-
entry->set_traceid(parent_span->traceId());
55-
entry->set_parenttracesegmentid(parent_span->traceSegmentId());
56-
entry->set_parentservice(parent_span->service());
57-
entry->set_parentserviceinstance(parent_span->serviceInstance());
58-
entry->set_parentspanid(parent_span->spanId());
59-
entry->set_parentendpoint(parent_span->endpoint());
60-
entry->set_networkaddressusedatpeer(parent_span->targetAddress());
61-
}
62-
63-
for (auto& tag : tags_) {
64-
auto* entry = obj.mutable_tags()->Add();
65-
entry->set_key(std::string(tag.first));
66-
entry->set_value(std::string(tag.second));
67-
}
68-
69-
for (auto& log : logs_) {
70-
auto* entry = obj.mutable_logs()->Add();
71-
*entry = log;
72-
}
29+
TracingContextImpl& parent_tracing_context)
30+
: span_store_(
31+
*parent_tracing_context.segment_store_.mutable_spans()->Add()),
32+
parent_tracing_context_(parent_tracing_context) {
33+
span_store_.set_spanid(span_id);
34+
// Default component id for historical reason.
35+
span_store_.set_componentid(9000);
36+
}
7337

74-
return obj;
38+
void TracingSpanImpl::addLogImpl(std::string_view key, std::string_view value,
39+
int64_t timestamp) {
40+
assert(!finished_);
41+
auto* l = span_store_.add_logs();
42+
l->set_time(timestamp);
43+
auto* e = l->add_data();
44+
e->set_key(std::string(key));
45+
e->set_value(std::string(value));
7546
}
7647

7748
void TracingSpanImpl::addLog(std::string_view key, std::string_view value) {
78-
assert(!finished_);
79-
auto now = TimePoint<SystemTime>();
80-
addLog(key, value, now);
49+
addLogImpl(key, value, TimePoint<SystemTime>().fetch());
8150
}
8251

8352
void TracingSpanImpl::addLog(std::string_view key, std::string_view value,
8453
TimePoint<SystemTime> current_time) {
85-
assert(!finished_);
86-
skywalking::v3::Log l;
87-
l.set_time(current_time.fetch());
88-
auto* entry = l.add_data();
89-
entry->set_key(std::string(key));
90-
entry->set_value(std::string(value));
91-
logs_.emplace_back(l);
54+
addLogImpl(key, value, current_time.fetch());
9255
}
9356

9457
void TracingSpanImpl::addLog(std::string_view key, std::string_view value,
9558
TimePoint<SteadyTime> current_time) {
59+
addLogImpl(key, value, current_time.fetch());
60+
}
61+
62+
void TracingSpanImpl::addTag(std::string_view key, std::string_view value) {
9663
assert(!finished_);
97-
skywalking::v3::Log l;
98-
l.set_time(current_time.fetch());
99-
auto* entry = l.add_data();
100-
entry->set_key(std::string(key));
101-
entry->set_value(std::string(value));
102-
logs_.emplace_back(l);
64+
auto* kv = span_store_.add_tags();
65+
kv->set_key(std::string(key));
66+
kv->set_value(std::string(value));
67+
}
68+
69+
void TracingSpanImpl::startSpanImpl(std::string_view operation_name,
70+
int64_t timestamp) {
71+
span_store_.set_operationname(std::string(operation_name));
72+
span_store_.set_starttime(timestamp);
10373
}
10474

10575
void TracingSpanImpl::startSpan(std::string_view operation_name) {
106-
auto now = TimePoint<SystemTime>();
107-
startSpan(operation_name, now);
76+
startSpanImpl(operation_name, TimePoint<SystemTime>().fetch());
10877
}
10978

11079
void TracingSpanImpl::startSpan(std::string_view operation_name,
11180
TimePoint<SystemTime> current_time) {
112-
operation_name_ = operation_name;
113-
start_time_ = current_time.fetch();
81+
startSpanImpl(operation_name, current_time.fetch());
11482
}
11583

11684
void TracingSpanImpl::startSpan(std::string_view operation_name,
11785
TimePoint<SteadyTime> current_time) {
118-
operation_name_ = operation_name;
119-
start_time_ = current_time.fetch();
86+
startSpanImpl(operation_name, current_time.fetch());
12087
}
12188

122-
void TracingSpanImpl::endSpan() {
89+
void TracingSpanImpl::endSpanImpl(int64_t timestamp) {
12390
assert(!finished_);
124-
auto now = TimePoint<SystemTime>();
125-
endSpan(now);
91+
span_store_.set_endtime(timestamp);
92+
finished_ = true;
93+
}
94+
95+
void TracingSpanImpl::endSpan() {
96+
endSpanImpl(TimePoint<SystemTime>().fetch());
12697
}
12798

12899
void TracingSpanImpl::endSpan(TimePoint<SystemTime> current_time) {
129-
end_time_ = current_time.fetch();
130-
finished_ = true;
100+
endSpanImpl(current_time.fetch());
131101
}
132102

133103
void TracingSpanImpl::endSpan(TimePoint<SteadyTime> current_time) {
134-
end_time_ = current_time.fetch();
135-
finished_ = true;
104+
endSpanImpl(current_time.fetch());
136105
}
137106

138107
void TracingSpanImpl::setComponentId(int32_t component_id) {
@@ -141,42 +110,53 @@ void TracingSpanImpl::setComponentId(int32_t component_id) {
141110
// Component ID is reserved on Skywalking spec.
142111
// For more details here:
143112
// https://github.com/apache/skywalking/blob/master/docs/en/guides/Component-library-settings.md
144-
component_id_ = component_id;
113+
span_store_.set_componentid(component_id);
145114
}
146115

147116
void TracingSpanImpl::setOperationName(std::string_view name) {
148117
assert(!finished_);
149-
operation_name_ = name;
118+
span_store_.set_operationname(std::string(name));
150119
}
151120

152-
TracingContextImpl::TracingContextImpl(const std::string& service_name,
153-
const std::string& instance_name,
154-
RandomGenerator& random)
155-
: trace_id_(random.uuid()),
156-
trace_segment_id_(random.uuid()),
157-
service_(service_name),
158-
service_instance_(instance_name) {}
121+
void TracingSpanImpl::addSegmentRef(const SpanContext& span_context) {
122+
// TODO(shikugawa): cpp2sky only supports cross process propagation right now.
123+
// So It is correct to specify this.
124+
auto* entry = span_store_.add_refs();
125+
126+
entry->set_reftype(skywalking::v3::RefType::CrossProcess);
127+
entry->set_traceid(span_context.traceId());
128+
entry->set_parenttracesegmentid(span_context.traceSegmentId());
129+
entry->set_parentservice(span_context.service());
130+
entry->set_parentserviceinstance(span_context.serviceInstance());
131+
entry->set_parentspanid(span_context.spanId());
132+
entry->set_parentendpoint(span_context.endpoint());
133+
entry->set_networkaddressusedatpeer(span_context.targetAddress());
134+
}
159135

160136
TracingContextImpl::TracingContextImpl(
161137
const std::string& service_name, const std::string& instance_name,
162138
SpanContextPtr parent_span_context,
163139
SpanContextExtensionPtr parent_ext_span_context, RandomGenerator& random)
164140
: parent_span_context_(std::move(parent_span_context)),
165-
parent_ext_span_context_(std::move(parent_ext_span_context)),
166-
trace_id_(parent_span_context_->traceId()),
167-
trace_segment_id_(random.uuid()),
168-
service_(service_name),
169-
service_instance_(instance_name) {}
141+
parent_ext_span_context_(std::move(parent_ext_span_context)) {
142+
segment_store_.set_traceid(random.uuid());
143+
segment_store_.set_tracesegmentid(random.uuid());
144+
segment_store_.set_service(service_name);
145+
segment_store_.set_serviceinstance(instance_name);
146+
}
147+
148+
TracingContextImpl::TracingContextImpl(const std::string& service_name,
149+
const std::string& instance_name,
150+
RandomGenerator& random)
151+
: TracingContextImpl(service_name, instance_name, nullptr, nullptr,
152+
random) {}
170153

171154
TracingContextImpl::TracingContextImpl(const std::string& service_name,
172155
const std::string& instance_name,
173156
SpanContextPtr parent_span_context,
174157
RandomGenerator& random)
175-
: parent_span_context_(std::move(parent_span_context)),
176-
trace_id_(parent_span_context_->traceId()),
177-
trace_segment_id_(random.uuid()),
178-
service_(service_name),
179-
service_instance_(instance_name) {}
158+
: TracingContextImpl(service_name, instance_name,
159+
std::move(parent_span_context), nullptr, random) {}
180160

181161
TracingSpanPtr TracingContextImpl::createExitSpan(TracingSpanPtr parent_span) {
182162
auto current_span = createSpan();
@@ -193,6 +173,11 @@ TracingSpanPtr TracingContextImpl::createEntrySpan() {
193173
auto current_span = createSpan();
194174
current_span->setParentSpanId(-1);
195175
current_span->setSpanType(skywalking::v3::SpanType::Entry);
176+
177+
if (parent_span_context_ != nullptr) {
178+
current_span->addSegmentRef(*parent_span_context_);
179+
}
180+
196181
return current_span;
197182
}
198183

@@ -215,12 +200,12 @@ std::string TracingContextImpl::encodeSpan(
215200

216201
// always send to OAP
217202
header_value += "1-";
218-
header_value += Base64::encode(trace_id_) + "-";
219-
header_value += Base64::encode(trace_segment_id_) + "-";
203+
header_value += Base64::encode(segment_store_.traceid()) + "-";
204+
header_value += Base64::encode(segment_store_.tracesegmentid()) + "-";
220205
header_value += parent_spanid + "-";
221-
header_value += Base64::encode(service_) + "-";
222-
header_value += Base64::encode(service_instance_) + "-";
223-
header_value += Base64::encode(endpoint) + "-";
206+
header_value += Base64::encode(segment_store_.service()) + "-";
207+
header_value += Base64::encode(segment_store_.serviceinstance()) + "-";
208+
header_value += Base64::encode(endpoint.data(), endpoint.size()) + "-";
224209
header_value +=
225210
Base64::encode(target_address.data(), target_address.length());
226211

@@ -241,19 +226,8 @@ TracingSpanPtr TracingContextImpl::createSpan() {
241226
}
242227

243228
skywalking::v3::SegmentObject TracingContextImpl::createSegmentObject() {
244-
skywalking::v3::SegmentObject obj;
245-
246-
obj.set_traceid(trace_id_);
247-
obj.set_tracesegmentid(trace_segment_id_);
248-
obj.set_service(service_);
249-
obj.set_serviceinstance(service_instance_);
250-
251-
for (auto& span : spans_) {
252-
auto* entry = obj.mutable_spans()->Add();
253-
*entry = span->createSpanObject();
254-
}
255-
256-
return obj;
229+
spans_.clear();
230+
return std::move(segment_store_);
257231
}
258232

259233
bool TracingContextImpl::readyToSend() {
@@ -268,10 +242,10 @@ bool TracingContextImpl::readyToSend() {
268242
std::string TracingContextImpl::logMessage(std::string_view message) const {
269243
std::string output = message.data();
270244
output += "\", \"SW_CTX\": [";
271-
output += "\"" + service_ + "\",";
272-
output += "\"" + service_instance_ + "\",";
273-
output += "\"" + trace_id_ + "\",";
274-
output += "\"" + trace_segment_id_ + "\",";
245+
output += "\"" + segment_store_.service() + "\",";
246+
output += "\"" + segment_store_.serviceinstance() + "\",";
247+
output += "\"" + segment_store_.traceid() + "\",";
248+
output += "\"" + segment_store_.tracesegmentid() + "\",";
275249

276250
if (!spans_.empty()) {
277251
output += "\"" + std::to_string(spans_.back()->spanId()) + "\"]}";

0 commit comments

Comments
 (0)