Skip to content

EnvoyCarrier v2 #43

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Feb 27, 2017
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
EXTRA_DIST = LICENSE lightstep-tracer-common/collector.proto
EXTRA_DIST = \
LICENSE \
lightstep-tracer-common/collector.proto \
lightstep-tracer-common/envoy_carrier.proto

SUBDIRS = src test
2 changes: 1 addition & 1 deletion lightstep-tracer-common
19 changes: 9 additions & 10 deletions src/c++11/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ PROTOC = @PROTOC@
.PHONY: $(PROTOC)

# Lightstep Collector reporting:
collector_srcdir = $(top_srcdir)/lightstep-tracer-common
proto_srcdir = $(top_srcdir)/lightstep-tracer-common

PROTO_SRC = \
$(collector_srcdir)/collector.proto \
$(srcdir)/envoy_carrier.proto
$(proto_srcdir)/collector.proto \
$(proto_srcdir)/envoy_carrier.proto

PROTO_GEN = \
collector.pb.h \
Expand All @@ -20,8 +20,8 @@ PROTO_GEN = \
envoy_carrier.pb.cc

proto.stamp: $(PROTO_SRC)
$(PROTOC) --proto_path=$(collector_srcdir) --cpp_out=$(builddir) $(collector_srcdir)/collector.proto
$(PROTOC) --proto_path=$(srcdir) --cpp_out=$(builddir) $(srcdir)/envoy_carrier.proto
$(PROTOC) --proto_path=$(proto_srcdir) --cpp_out=$(builddir) $(proto_srcdir)/collector.proto
$(PROTOC) --proto_path=$(proto_srcdir) --cpp_out=$(builddir) $(proto_srcdir)/envoy_carrier.proto
touch proto.stamp

$(PROTO_GEN): proto.stamp
Expand Down Expand Up @@ -71,8 +71,7 @@ liblightstep_core_cxx11_la_LDFLAGS = $(protobuf_LIBS)
AM_CXXFLAGS = -Wno-deprecated-declarations

EXTRA_DIST = \
mapbox_variant/LICENSE \
envoy_carrier.proto
mapbox_variant/LICENSE

# The builtin gRPC transport is built by default. When supplying your
# own gRPC transport, you can disable the built-in recorder:
Expand All @@ -81,7 +80,7 @@ EXTRA_DIST = \
if ENABLE_GRPC

GRPC_PROTO_SRC = \
$(collector_srcdir)/collector.proto
$(proto_srcdir)/collector.proto

GRPC_PROTO_GEN = \
collector.grpc.pb.h \
Expand All @@ -93,9 +92,9 @@ CLEANFILES += $(GRPC_PROTO_GEN) proto.grpc.stamp
# TODO make grpc_cpp_plugin a configure option
#
proto.grpc.stamp: $(GRPC_PROTO_SRC)
$(PROTOC) --proto_path=$(collector_srcdir) --grpc_out=$(builddir) \
$(PROTOC) --proto_path=$(proto_srcdir) --grpc_out=$(builddir) \
--plugin=protoc-gen-grpc=`which grpc_cpp_plugin` \
$(collector_srcdir)/collector.proto
$(proto_srcdir)/collector.proto
touch proto.grpc.stamp

$(GRPC_PROTO_GEN): proto.grpc.stamp
Expand Down
15 changes: 0 additions & 15 deletions src/c++11/envoy_carrier.proto

This file was deleted.

55 changes: 50 additions & 5 deletions src/c++11/impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -134,12 +134,12 @@ bool TracerImpl::inject(SpanContext sc, CarrierFormat format, const CarrierWrite
switch (format.type()) {
case CarrierFormat::HTTPHeaders:
case CarrierFormat::TextMap:
case CarrierFormat::EnvoyProto:
return inject_basic_carrier(sc, opaque);
case CarrierFormat::Binary:
break;
case CarrierFormat::EnvoyProto:
return inject_envoy_carrier(sc, opaque);
default:
return false;
}
return false;
}

bool TracerImpl::inject_basic_carrier(SpanContext sc, const CarrierWriter& opaque) {
Expand All @@ -159,12 +159,33 @@ bool TracerImpl::inject_basic_carrier(SpanContext sc, const CarrierWriter& opaqu
return true;
}

bool TracerImpl::inject_envoy_carrier(SpanContext sc, const CarrierWriter& opaque) {
const envoy::ProtoWriter* carrier = dynamic_cast<const envoy::ProtoWriter*>(&opaque);
if (carrier == nullptr) {
return false;
}
envoy::EnvoyCarrier *const output = carrier->output_;
output->set_span_id(sc.span_id());
output->set_trace_id(sc.trace_id());

sc.ForeachBaggageItem([output](const std::string& key,
const std::string& value) {
(*output->mutable_baggage_items())[key] = value;
return true;
});

envoy::LegacyProtoWriter legacy_writer(output);
inject_basic_carrier(sc, legacy_writer);
return true;
}

SpanContext TracerImpl::extract(CarrierFormat format, const CarrierReader& opaque) {
switch (format.type()) {
case CarrierFormat::HTTPHeaders:
case CarrierFormat::TextMap:
case CarrierFormat::EnvoyProto:
return extract_basic_carrier(opaque);
case CarrierFormat::EnvoyProto:
return extract_envoy_carrier(opaque);
default:
return SpanContext();
}
Expand Down Expand Up @@ -200,6 +221,30 @@ SpanContext TracerImpl::extract_basic_carrier(const CarrierReader& opaque) {
return SpanContext(ctx);
}

SpanContext TracerImpl::extract_envoy_carrier(const CarrierReader& opaque) {
const envoy::ProtoReader* carrier = dynamic_cast<const envoy::ProtoReader*>(&opaque);
if (carrier == nullptr) {
return SpanContext();
}

const envoy::EnvoyCarrier& proto = carrier->data_;
if (proto.deprecated_context_size() != 0) {
envoy::LegacyProtoReader legacy_reader(proto);
return extract_basic_carrier(legacy_reader);
}

std::shared_ptr<ContextImpl> ctx(new ContextImpl);

ctx->trace_id = proto.trace_id();
ctx->span_id = proto.span_id();

for (const auto& entry : proto.baggage_items()) {
ctx->setBaggageItem(entry);
}

return SpanContext(ctx);
}

void StartTimestamp::Apply(SpanImpl *span) const {
// Note: no locking, only called from StartSpan
span->start_timestamp_ = when_;
Expand Down
47 changes: 36 additions & 11 deletions src/c++11/lightstep/envoy.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,35 +8,60 @@
namespace lightstep {
namespace envoy {

// ProtoReader reads an Envoy CarrierStruct for extracting Envoy-carried SpanContext.
class ProtoReader : public BasicCarrierReader {
// ProtoReader reads an EnvoyCarrier for extracting Envoy-carried
// SpanContext. Note! Most client libraries support
// injecting/extracting EnvoyCarrier from a string and handle base64
// encoding/decoding themselves. This library does not, it is up to
// the caller to serialize / deserialize EnvoyCarrier then base64
// encode / decode manually.

class ProtoReader : public CarrierReader {
public:
explicit ProtoReader(const EnvoyCarrier& data) : data_(data) { }

private:
friend class lightstep::TracerImpl;
const EnvoyCarrier& data_;
};

// ProtoReader writes an EnvoyCarrier for injecting Envoy-carried SpanContext.
class ProtoWriter : public CarrierWriter {
public:
explicit ProtoWriter(EnvoyCarrier *output) : output_(output) { }

private:
friend class lightstep::TracerImpl;
EnvoyCarrier *const output_;
};

// Legacy Reader/Writer handle reading and writing the legacy format.
class LegacyProtoReader : public BasicCarrierReader {
public:
explicit ProtoReader(const CarrierStruct& data) : data_(data) { }
explicit LegacyProtoReader(const EnvoyCarrier& data) : data_(data) { }

void ForeachKey(std::function<void(const std::string& key,
const std::string& value)> f) const override {
for (const auto& c : data_.context()) {
const std::string& value)> f) const override {
for (const auto& c : data_.deprecated_context()) {
f(c.key(), c.value());
}
}

private:
const CarrierStruct& data_;
const EnvoyCarrier& data_;
};

// ProtoReader writes an Envoy CarrierStruct for injecting Envoy-carried SpanContext.
class ProtoWriter : public BasicCarrierWriter {
class LegacyProtoWriter : public BasicCarrierWriter {
public:
explicit ProtoWriter(CarrierStruct *output) : output_(output) { }
explicit LegacyProtoWriter(EnvoyCarrier *output) : output_(output) { }

void Set(const std::string &key, const std::string &value) const override {
CarrierPair *kv = output_->add_context();
LegacyCarrierPair *kv = output_->add_deprecated_context();
kv->set_key(key);
kv->set_value(value);
}

private:
CarrierStruct *const output_;
EnvoyCarrier *const output_;
};

} // namespace envoy
Expand Down
2 changes: 2 additions & 0 deletions src/c++11/lightstep/impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,11 @@ class TracerImpl {

bool inject(SpanContext sc, CarrierFormat format, const CarrierWriter &writer);
bool inject_basic_carrier(SpanContext sc, const CarrierWriter& opaque);
bool inject_envoy_carrier(SpanContext sc, const CarrierWriter& opaque);

SpanContext extract(CarrierFormat format, const CarrierReader& reader);
SpanContext extract_basic_carrier(const CarrierReader& reader);
SpanContext extract_envoy_carrier(const CarrierReader& reader);

void GetTwoIds(uint64_t *a, uint64_t *b);
uint64_t GetOneId();
Expand Down