2626namespace cpp2sky {
2727
2828TracingSpanImpl::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
7748void 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
8352void 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
9457void 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
10575void 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
11079void 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
11684void 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
12899void TracingSpanImpl::endSpan (TimePoint<SystemTime> current_time) {
129- end_time_ = current_time.fetch ();
130- finished_ = true ;
100+ endSpanImpl (current_time.fetch ());
131101}
132102
133103void TracingSpanImpl::endSpan (TimePoint<SteadyTime> current_time) {
134- end_time_ = current_time.fetch ();
135- finished_ = true ;
104+ endSpanImpl (current_time.fetch ());
136105}
137106
138107void 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
147116void 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
160136TracingContextImpl::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
171154TracingContextImpl::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
181161TracingSpanPtr 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
243228skywalking::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
259233bool TracingContextImpl::readyToSend () {
@@ -268,10 +242,10 @@ bool TracingContextImpl::readyToSend() {
268242std::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