| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | // Copyright The OpenTelemetry Authors// SPDX-License-Identifier: Apache-2.0#include <grpcpp/security/server_credentials.h>#include <grpcpp/server.h>#include <grpcpp/server_builder.h>#include <grpcpp/server_context.h>#include <grpcpp/support/status.h>#include <grpcpp/support/string_ref.h>#include <stdint.h>#include <stdlib.h>#include <iostream>#include <map>#include <string>#include <utility>#include "opentelemetry/context/propagation/global_propagator.h"#include "opentelemetry/context/propagation/text_map_propagator.h"#include "opentelemetry/context/runtime_context.h"#include "opentelemetry/nostd/shared_ptr.h"#include "opentelemetry/nostd/variant.h"#include "opentelemetry/semconv/incubating/rpc_attributes.h"#include "opentelemetry/trace/context.h"#include "opentelemetry/trace/span.h"#include "opentelemetry/trace/span_context.h"#include "opentelemetry/trace/span_metadata.h"#include "opentelemetry/trace/span_startoptions.h"#include "opentelemetry/trace/tracer.h"#include "tracer_common.h"#ifdef BAZEL_BUILD#  include "examples/grpc/protos/messages.grpc.pb.h"#  include "examples/grpc/protos/messages.pb.h"#else#  include "messages.grpc.pb.h"#  include "messages.pb.h"#endifusing grpc::Server;using grpc::ServerBuilder;using grpc::ServerContext;using grpc::Status;using grpc_example::Greeter;using grpc_example::GreetRequest;using grpc_example::GreetResponse;using Span        = opentelemetry::trace::Span;using SpanContext = opentelemetry::trace::SpanContext;using namespace opentelemetry::trace;namespace context = opentelemetry::context;namespace semconv = opentelemetry::semconv;namespace{class GreeterServer final : public Greeter::Service{public:  Status Greet(ServerContext *context,               const GreetRequest *request,               GreetResponse *response) override  {    for (const auto &elem : context->client_metadata())    {      std::cout << "ELEM: " << elem.first << " " << elem.second << "\n";    }    // Create a SpanOptions object and set the kind to Server to inform OpenTel.    StartSpanOptions options;    options.kind = SpanKind::kServer;    // extract context from grpc metadata    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 = "GreeterService/Greet";    auto span             = get_tracer("grpc")->StartSpan(span_name,                                                          {{semconv::rpc::kRpcSystem, "grpc"},                                                           {semconv::rpc::kRpcService, "GreeterService"},                                                           {semconv::rpc::kRpcMethod, "Greet"},                                                           {semconv::rpc::kRpcGrpcStatusCode, 0}},                                                          options);    auto scope            = get_tracer("grpc")->WithActiveSpan(span);    // Fetch and parse whatever HTTP headers we can from the gRPC request.    span->AddEvent("Processing client attributes");    const std::string &req = request->request();    std::cout << '\n' << "grpc_client says: " << req << '\n';    std::string message = "The pleasure is mine.";    // Send response to client    response->set_response(message);    span->AddEvent("Response sent to client");    span->SetStatus(StatusCode::kOk);    // Make sure to end your spans!    span->End();    return Status::OK;  }};  // GreeterServer classvoid RunServer(uint16_t port){  std::string address("0.0.0.0:" + std::to_string(port));  GreeterServer service;  ServerBuilder builder;  builder.RegisterService(&service);  builder.AddListeningPort(address, grpc::InsecureServerCredentials());  std::unique_ptr<Server> server(builder.BuildAndStart());  std::cout << "Server listening on port: " << address << '\n';  server->Wait();  server->Shutdown();}}  // namespaceint main(int argc, char **argv){  InitTracer();  constexpr uint16_t default_port = 8800;  uint16_t port;  if (argc > 1)  {    port = atoi(argv[1]);  }  else  {    port = default_port;  }  RunServer(port);  CleanupTracer();  return 0;}
 |