Skip to content

Commit 7dbdfbe

Browse files
authored
disallow entry span to create propagation context (#55)
* disallow entry span to create propagation context * review
1 parent 591e0dc commit 7dbdfbe

File tree

6 files changed

+56
-39
lines changed

6 files changed

+56
-39
lines changed

cpp2sky/segment_context.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include <list>
1818
#include <memory>
19+
#include <optional>
1920
#include <string_view>
2021

2122
#include "cpp2sky/config.pb.h"
@@ -238,15 +239,12 @@ class SegmentContext {
238239
* @param target_address Target address to send request. For more detail:
239240
* https://github.com/apache/skywalking-data-collect-protocol/blob/master/language-agent/Tracing.proto#L97-L101
240241
*/
241-
virtual std::string createSW8HeaderValue(
242-
CurrentSegmentSpanPtr parent, const std::string& target_address) = 0;
243-
virtual std::string createSW8HeaderValue(CurrentSegmentSpanPtr parent,
244-
std::string&& target_address) = 0;
242+
virtual std::optional<std::string> createSW8HeaderValue(
243+
CurrentSegmentSpanPtr parent, const std::string_view target_address) = 0;
245244
// If you don't specify parent span, stored to current segment, it will be
246245
// selected newest span as parent span.
247-
virtual std::string createSW8HeaderValue(
248-
const std::string& target_address) = 0;
249-
virtual std::string createSW8HeaderValue(std::string&& target_address) = 0;
246+
virtual std::optional<std::string> createSW8HeaderValue(
247+
const std::string_view target_address) = 0;
250248

251249
/**
252250
* Generate Apache SkyWalking native segment object.

example/sample_client.cc

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,14 @@ int main() {
4848
current_span->startSpan("/ping");
4949

5050
httplib::Client cli("remote", 8082);
51-
httplib::Headers headers = {
52-
{kPropagationHeader.data(),
53-
current_segment->createSW8HeaderValue(current_span, "remote:8082")}};
51+
52+
auto context =
53+
current_segment->createSW8HeaderValue(current_span, "remote:8082");
54+
55+
httplib::Headers headers;
56+
if (context.has_value()) {
57+
headers = {{kPropagationHeader.data(), *context}};
58+
}
5459
auto res = cli.Get("/ping", headers);
5560

5661
current_span->endSpan();

source/segment_context_impl.cc

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -198,26 +198,25 @@ CurrentSegmentSpanPtr SegmentContextImpl::createCurrentSegmentRootSpan() {
198198
return createCurrentSegmentSpan(nullptr);
199199
}
200200

201-
std::string SegmentContextImpl::createSW8HeaderValue(
202-
CurrentSegmentSpanPtr parent_span, const std::string& target_address) {
203-
if (parent_span == nullptr) {
201+
std::optional<std::string> SegmentContextImpl::createSW8HeaderValue(
202+
CurrentSegmentSpanPtr parent_span, const std::string_view target_address) {
203+
CurrentSegmentSpanPtr target_span = parent_span;
204+
if (target_span == nullptr) {
204205
if (spans_.empty()) {
205206
throw TracerException(
206207
"Can't create propagation header because current segment has no "
207208
"valid span.");
208209
}
209-
return encodeSpan(spans_.back(), target_address);
210+
target_span = spans_.back();
210211
}
211-
return encodeSpan(parent_span, target_address);
212-
}
213-
214-
std::string SegmentContextImpl::createSW8HeaderValue(
215-
CurrentSegmentSpanPtr parent_span, std::string&& target_address) {
216-
return createSW8HeaderValue(parent_span, target_address);
212+
if (target_span->spanType() != SpanType::Exit) {
213+
return std::nullopt;
214+
}
215+
return encodeSpan(target_span, target_address);
217216
}
218217

219218
std::string SegmentContextImpl::encodeSpan(CurrentSegmentSpanPtr parent_span,
220-
const std::string& target_address) {
219+
const std::string_view target_address) {
221220
assert(parent_span);
222221
std::string header_value;
223222

@@ -232,7 +231,7 @@ std::string SegmentContextImpl::encodeSpan(CurrentSegmentSpanPtr parent_span,
232231
header_value += Base64::encode(service_) + "-";
233232
header_value += Base64::encode(service_instance_) + "-";
234233
header_value += Base64::encode(endpoint) + "-";
235-
header_value += Base64::encode(target_address);
234+
header_value += Base64::encode(target_address.data());
236235

237236
return header_value;
238237
}

source/segment_context_impl.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,24 +148,21 @@ class SegmentContextImpl : public SegmentContext {
148148
CurrentSegmentSpanPtr parent_span) override;
149149

150150
CurrentSegmentSpanPtr createCurrentSegmentRootSpan() override;
151-
std::string createSW8HeaderValue(const std::string& target_address) override {
151+
std::optional<std::string> createSW8HeaderValue(
152+
const std::string_view target_address) override {
152153
return createSW8HeaderValue(nullptr, target_address);
153154
}
154-
std::string createSW8HeaderValue(std::string&& target_address) override {
155-
return createSW8HeaderValue(nullptr, target_address);
156-
}
157-
std::string createSW8HeaderValue(CurrentSegmentSpanPtr parent_span,
158-
const std::string& target_address) override;
159-
std::string createSW8HeaderValue(CurrentSegmentSpanPtr parent,
160-
std::string&& target_address) override;
155+
std::optional<std::string> createSW8HeaderValue(
156+
CurrentSegmentSpanPtr parent_span,
157+
const std::string_view target_address) override;
161158
SegmentObject createSegmentObject() override;
162159
void setSkipAnalysis() override { should_skip_analysis_ = true; }
163160
bool skipAnalysis() override { return should_skip_analysis_; }
164161
bool readyToSend() override;
165162

166163
private:
167164
std::string encodeSpan(CurrentSegmentSpanPtr parent_span,
168-
const std::string& target_address);
165+
const std::string_view target_address);
169166

170167
SpanContextPtr parent_span_context_;
171168
SpanContextExtensionPtr parent_ext_span_context_;

test/e2e/provider.cc

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,12 @@ void requestPong(Tracer* tracer, SegmentContext* scp,
3838
current_span->setPeer(target_address);
3939

4040
httplib::Client cli("consumer", 8080);
41-
httplib::Headers headers = {
42-
{kPropagationHeader.data(),
43-
scp->createSW8HeaderValue(current_span, target_address)}};
41+
auto context = scp->createSW8HeaderValue(current_span, target_address);
42+
43+
httplib::Headers headers;
44+
if (context.has_value()) {
45+
headers = {{kPropagationHeader.data(), *context}};
46+
}
4447
auto res = cli.Get("/pong", headers);
4548

4649
current_span->endSpan();
@@ -54,9 +57,13 @@ void requestUsers(Tracer* tracer, SegmentContext* scp,
5457
current_span->setPeer(target_address);
5558

5659
httplib::Client cli("interm", 8082);
57-
httplib::Headers headers = {
58-
{kPropagationHeader.data(),
59-
scp->createSW8HeaderValue(current_span, target_address)}};
60+
auto context = scp->createSW8HeaderValue(current_span, target_address);
61+
62+
httplib::Headers headers;
63+
if (context.has_value()) {
64+
headers = {{kPropagationHeader.data(), *context}};
65+
}
66+
6067
auto res = cli.Get("/users", headers);
6168

6269
current_span->endSpan();

test/segment_context_test.cc

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,21 @@ TEST_F(SegmentContextTest, SW8CreateTest) {
299299
span->endSpan();
300300

301301
std::string target_address("10.0.0.1:443");
302+
303+
// Entry span should be rejected as propagation context
304+
EXPECT_FALSE(sc.createSW8HeaderValue(span, target_address).has_value());
305+
306+
auto span2 = sc.createCurrentSegmentSpan(span);
307+
308+
EXPECT_EQ(sc.spans().size(), 2);
309+
EXPECT_EQ(span2->spanId(), 1);
310+
span2->startSpan("sample2");
311+
span2->endSpan();
312+
302313
std::string expect_sw8(
303-
"1-MQ==-dXVpZA==-0-bWVzaA==-c2VydmljZV8w-c2FtcGxlMQ==-MTAuMC4wLjE6NDQz");
314+
"1-MQ==-dXVpZA==-1-bWVzaA==-c2VydmljZV8w-c2FtcGxlMQ==-MTAuMC4wLjE6NDQz");
304315

305-
EXPECT_EQ(expect_sw8, sc.createSW8HeaderValue(span, target_address));
316+
EXPECT_EQ(expect_sw8, *sc.createSW8HeaderValue(span2, target_address));
306317
}
307318

308319
TEST_F(SegmentContextTest, ReadyToSendTest) {

0 commit comments

Comments
 (0)