in src/currency/src/server.cpp [166:229]
Status Convert(ServerContext* context,
const CurrencyConversionRequest* request,
Money* response) override
{
StartSpanOptions options;
options.kind = SpanKind::kServer;
GrpcServerCarrier carrier(context);
auto prop = context::propagation::GlobalTextMapPropagator::GetGlobalPropagator();
auto current_ctx = context::RuntimeContext::GetCurrent();
auto new_context = prop->Extract(carrier, current_ctx);
options.parent = GetSpan(new_context)->GetContext();
std::string span_name = "Currency/Convert";
auto span =
get_tracer("currency")->StartSpan(span_name,
{{SemanticConventions::kRpcSystem, "grpc"},
{SemanticConventions::kRpcService, "oteldemo.CurrencyService"},
{SemanticConventions::kRpcMethod, "Convert"},
{SemanticConventions::kRpcGrpcStatusCode, 0}},
options);
auto scope = get_tracer("currency")->WithActiveSpan(span);
span->AddEvent("Processing currency conversion request");
try {
// Do the conversion work
Money from = request->from();
string from_code = from.currency_code();
double rate = currency_conversion[from_code];
double one_euro = getDouble(from) / rate ;
string to_code = request->to_code();
double to_rate = currency_conversion[to_code];
double final = one_euro * to_rate;
getUnitsAndNanos(*response, final);
response->set_currency_code(to_code);
span->SetAttribute("app.currency.conversion.from", from_code);
span->SetAttribute("app.currency.conversion.to", to_code);
CurrencyCounter(to_code);
span->AddEvent("Conversion successful, response sent back");
span->SetStatus(StatusCode::kOk);
logger->Info(std::string(__func__) + " conversion successful");
// End the span
span->End();
return Status::OK;
} catch(...) {
span->AddEvent("Conversion failed");
span->SetStatus(StatusCode::kError);
logger->Error(std::string(__func__) + " conversion failure");
span->End();
return Status::CANCELLED;
}
return Status::OK;
}