Skip to content

Commit fd8b77b

Browse files
Added support for baggage read and Set as attributes, added sdk builders and Semantic changes (open-telemetry#281)
* Updating grpc version * Baggage changes * Added Baggage support * Updated docs * Udpated client * update * update Readme * Updated Changelog Co-authored-by: Carter Socha <[email protected]>
1 parent 778a642 commit fd8b77b

7 files changed

+80
-28
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,4 @@ significant modifications will be credited to OpenTelemetry Authors.
6969
([#290](https://github.com/open-telemetry/opentelemetry-demo/pull/290))
7070
* Added Frontend [Cypress](https://www.cypress.io/) E2E tests
7171
([#298](https://github.com/open-telemetry/opentelemetry-demo/pull/298))
72+
* Added baggage support in CurrencyService [#281](https://github.com/open-telemetry/opentelemetry-demo/pull/281)

docker-compose.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ services:
120120
context: ./src/currencyservice
121121
args:
122122
- GRPC_VERSION=1.46.0
123-
- OPENTELEMETRY_VERSION=1.4.0
123+
- OPENTELEMETRY_VERSION=1.5.0
124124
ports:
125125
- "${CURRENCY_SERVICE_PORT}"
126126
environment:

docs/trace_service_features.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Emoji Legend
1111
| Ad | Java | :100: | :100: | :100: | :construction: | :construction: | :construction: |
1212
| Cart | .NET | :100: | :construction: | :100: | :construction: | :construction: | :construction: |
1313
| Checkout | Go | :100: | :100: | :100: | :construction: | :construction: | :construction: |
14-
| Currency | C++ | :no_bell: | :100: | :100: | :100: | :construction: | :construction: |
14+
| Currency | C++ | :no_bell: | :100: | :100: | :100: | :construction: | :100: |
1515
| Email | Ruby | :100: | :100: | :100: | :construction: | :construction: | :construction: |
1616
| Feature Flag | Erlang / Elixir | :100: | :construction: | :construction: | :construction: | :construction: | :construction: |
1717
| Frontend | JavaScript | :construction: | :construction: | :construction: | :construction: | :construction: | :construction: |

src/currencyservice/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ add_executable(currencyservice src/server.cpp)
6262
add_dependencies(currencyservice demo-proto)
6363
target_link_libraries(
6464
currencyservice demo-proto protobuf::libprotobuf
65-
opentelemetry_resources opentelemetry_trace opentelemetry_common opentelemetry_exporter_otlp_grpc opentelemetry_proto opentelemetry_otlp_recordable gRPC::grpc++)
65+
opentelemetry_trace opentelemetry_common opentelemetry_exporter_otlp_grpc opentelemetry_proto opentelemetry_otlp_recordable opentelemetry_resources gRPC::grpc++)
6666

6767
add_executable(currencyclient src/client.cpp)
6868
add_dependencies(currencyclient demo-proto)

src/currencyservice/src/client.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class CurrencyClient
4646
Empty request;
4747
GetSupportedCurrenciesResponse response;
4848
ClientContext context;
49+
context.AddMetadata("baggage", "ServiceName=CurrencyService,Method=GetSupportedCurrencies");
4950

5051
supported_currencies.clear();
5152
Status status = stub_->GetSupportedCurrencies(&context, request, &response);
@@ -81,6 +82,8 @@ class CurrencyClient
8182

8283
Money response;
8384
ClientContext context;
85+
context.AddMetadata("baggage", "ServiceName=CurrencyService,Method=Convert");
86+
8487
Status status = stub_->Convert(&context, request, &response);
8588

8689
if (status.ok()) {

src/currencyservice/src/server.cpp

+60-10
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@
77
#include <grpc/health/v1/health.grpc.pb.h>
88

99
#include "opentelemetry/trace/context.h"
10-
#include "opentelemetry/trace/experimental_semantic_conventions.h"
10+
#include "opentelemetry/trace/semantic_conventions.h"
1111
#include "opentelemetry/trace/span_context_kv_iterable_view.h"
12+
#include "opentelemetry/baggage/baggage.h"
13+
#include "opentelemetry/nostd/string_view.h"
1214
#include "tracer_common.h"
1315

1416
#include <grpcpp/grpcpp.h>
1517
#include <grpcpp/server.h>
1618
#include <grpcpp/server_builder.h>
1719
#include <grpcpp/server_context.h>
20+
#include <grpcpp/impl/codegen/string_ref.h>
1821

1922
using namespace std;
2023

@@ -31,7 +34,7 @@ using grpc::Server;
3134
using Span = opentelemetry::trace::Span;
3235
using SpanContext = opentelemetry::trace::SpanContext;
3336
using namespace opentelemetry::trace;
34-
37+
using namespace opentelemetry::baggage;
3538
namespace context = opentelemetry::context;
3639

3740
namespace
@@ -90,6 +93,20 @@ class CurrencyService final : public hipstershop::CurrencyService::Service
9093
const Empty* request,
9194
GetSupportedCurrenciesResponse* response) override
9295
{
96+
// Read baggage from client context
97+
auto clientContext = context->client_metadata();
98+
auto range = clientContext.equal_range("baggage");
99+
std::vector<std::string> baggageLists;
100+
for (auto i = range.first; i != range.second; ++i)
101+
{
102+
baggageLists.emplace_back(std::string(i->second.data()));
103+
}
104+
std::vector<opentelemetry::nostd::shared_ptr<Baggage>> baggages(baggageLists.size());
105+
for (int i = 0; i < baggageLists.size(); i++) {
106+
auto baggage = Baggage::FromHeader(baggageLists[i]);
107+
baggages[i] = baggage;
108+
}
109+
93110
StartSpanOptions options;
94111
options.kind = SpanKind::kServer;
95112
GrpcServerCarrier carrier(context);
@@ -102,12 +119,22 @@ class CurrencyService final : public hipstershop::CurrencyService::Service
102119
std::string span_name = "CurrencyService/GetSupportedCurrencies";
103120
auto span =
104121
get_tracer("currencyservice")->StartSpan(span_name,
105-
{{OTEL_GET_TRACE_ATTR(AttrRpcSystem), "grpc"},
106-
{OTEL_GET_TRACE_ATTR(AttrRpcService), "CurrencyService"},
107-
{OTEL_GET_TRACE_ATTR(AttrRpcMethod), "GetSupportedCurrencies"},
108-
{OTEL_GET_TRACE_ATTR(AttrRpcGrpcStatusCode), 0}},
122+
{{SemanticConventions::RPC_SYSTEM, "grpc"},
123+
{SemanticConventions::RPC_SERVICE, "CurrencyService"},
124+
{SemanticConventions::RPC_METHOD, "GetSupportedCurrencies"},
125+
{SemanticConventions::RPC_GRPC_STATUS_CODE, 0}},
109126
options);
110127
auto scope = get_tracer("currencyservice")->WithActiveSpan(span);
128+
129+
for (auto& baggage : baggages) {
130+
// Set the key value pairs from baggage to Span Attributes
131+
baggage->GetAllEntries([&span](opentelemetry::nostd::string_view key,
132+
opentelemetry::nostd::string_view value) {
133+
span->SetAttribute(key, value);
134+
return true;
135+
});
136+
}
137+
111138
// Fetch and parse whatever HTTP headers we can from the gRPC request.
112139
span->AddEvent("Processing supported currencies request");
113140

@@ -150,6 +177,20 @@ class CurrencyService final : public hipstershop::CurrencyService::Service
150177
const CurrencyConversionRequest* request,
151178
Money* response) override
152179
{
180+
// Read baggage from client context
181+
auto clientContext = context->client_metadata();
182+
auto range = clientContext.equal_range("baggage");
183+
std::vector<std::string> baggageLists;
184+
for (auto i = range.first; i != range.second; ++i)
185+
{
186+
baggageLists.emplace_back(std::string(i->second.data()));
187+
}
188+
std::vector<opentelemetry::nostd::shared_ptr<Baggage>> baggages(baggageLists.size());
189+
for (int i = 0; i < baggageLists.size(); i++) {
190+
auto baggage = Baggage::FromHeader(baggageLists[i]);
191+
baggages[i] = baggage;
192+
}
193+
153194
StartSpanOptions options;
154195
options.kind = SpanKind::kServer;
155196
GrpcServerCarrier carrier(context);
@@ -162,12 +203,21 @@ class CurrencyService final : public hipstershop::CurrencyService::Service
162203
std::string span_name = "CurrencyService/Convert";
163204
auto span =
164205
get_tracer("currencyservice")->StartSpan(span_name,
165-
{{OTEL_GET_TRACE_ATTR(AttrRpcSystem), "grpc"},
166-
{OTEL_GET_TRACE_ATTR(AttrRpcService), "CurrencyService"},
167-
{OTEL_GET_TRACE_ATTR(AttrRpcMethod), "Convert"},
168-
{OTEL_GET_TRACE_ATTR(AttrRpcGrpcStatusCode), 0}},
206+
{{SemanticConventions::RPC_SYSTEM, "grpc"},
207+
{SemanticConventions::RPC_SERVICE, "CurrencyService"},
208+
{SemanticConventions::RPC_METHOD, "Convert"},
209+
{SemanticConventions::RPC_GRPC_STATUS_CODE, 0}},
169210
options);
170211
auto scope = get_tracer("currencyservice")->WithActiveSpan(span);
212+
213+
for (auto& baggage : baggages) {
214+
// Set the key value pairs from baggage to Span Attributes
215+
baggage->GetAllEntries([&span](opentelemetry::nostd::string_view key,
216+
opentelemetry::nostd::string_view value) {
217+
span->SetAttribute(key, value);
218+
return true;
219+
});
220+
}
171221
// Fetch and parse whatever HTTP headers we can from the gRPC request.
172222
span->AddEvent("Processing currency conversion request");
173223

src/currencyservice/src/tracer_common.h

+13-15
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,16 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
#pragma once
5-
#include "opentelemetry/exporters/ostream/span_exporter.h"
6-
#include "opentelemetry/sdk/trace/simple_processor.h"
7-
#include "opentelemetry/sdk/trace/tracer_provider.h"
8-
#include "opentelemetry/sdk/resource/resource.h"
9-
#include "opentelemetry/trace/provider.h"
10-
#include "opentelemetry/exporters/otlp/otlp_grpc_exporter.h"
11-
5+
#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h"
126
#include "opentelemetry/context/propagation/global_propagator.h"
137
#include "opentelemetry/context/propagation/text_map_propagator.h"
8+
#include "opentelemetry/exporters/ostream/span_exporter_factory.h"
149
#include "opentelemetry/nostd/shared_ptr.h"
10+
#include "opentelemetry/sdk/trace/simple_processor_factory.h"
11+
#include "opentelemetry/sdk/trace/tracer_context_factory.h"
12+
#include "opentelemetry/sdk/trace/tracer_provider_factory.h"
1513
#include "opentelemetry/trace/propagation/http_trace_context.h"
14+
#include "opentelemetry/trace/provider.h"
1615

1716
#include <grpcpp/grpcpp.h>
1817
#include <cstring>
@@ -72,16 +71,15 @@ class GrpcServerCarrier : public opentelemetry::context::propagation::TextMapCar
7271

7372
void initTracer()
7473
{
75-
auto exporter = std::unique_ptr<opentelemetry::sdk::trace::SpanExporter>(
76-
new opentelemetry::exporter::otlp::OtlpGrpcExporter());
77-
auto processor = std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>(
78-
new opentelemetry::sdk::trace::SimpleSpanProcessor(std::move(exporter)));
74+
auto exporter = opentelemetry::exporter::otlp::OtlpGrpcExporterFactory::Create();
75+
auto processor =
76+
opentelemetry::sdk::trace::SimpleSpanProcessorFactory::Create(std::move(exporter));
7977
std::vector<std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>> processors;
8078
processors.push_back(std::move(processor));
81-
82-
auto context = std::make_shared<opentelemetry::sdk::trace::TracerContext>(std::move(processors));
83-
auto provider = opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider>(
84-
new opentelemetry::sdk::trace::TracerProvider(context));
79+
std::shared_ptr<opentelemetry::sdk::trace::TracerContext> context =
80+
opentelemetry::sdk::trace::TracerContextFactory::Create(std::move(processors));
81+
std::shared_ptr<opentelemetry::trace::TracerProvider> provider =
82+
opentelemetry::sdk::trace::TracerProviderFactory::Create(context);
8583
// Set the global trace provider
8684
opentelemetry::trace::Provider::SetTracerProvider(provider);
8785

0 commit comments

Comments
 (0)