]>
git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc
2671cc0b6847663e23b095585c8c908ea4c8418d
2 # include "examples/grpc/protos/messages.grpc.pb.h"
4 # include "messages.grpc.pb.h"
7 #include "opentelemetry/trace/context.h"
8 #include "opentelemetry/trace/experimental_semantic_conventions.h"
9 #include "opentelemetry/trace/span_context_kv_iterable_view.h"
10 #include "tracer_common.h"
12 #include <grpcpp/grpcpp.h>
13 #include <grpcpp/server.h>
14 #include <grpcpp/server_builder.h>
15 #include <grpcpp/server_context.h>
25 using grpc::ServerBuilder
;
26 using grpc::ServerContext
;
27 using grpc::ServerWriter
;
30 using grpc_example::Greeter
;
31 using grpc_example::GreetRequest
;
32 using grpc_example::GreetResponse
;
34 using Span
= opentelemetry::trace::Span
;
35 using SpanContext
= opentelemetry::trace::SpanContext
;
36 using namespace opentelemetry::trace
;
38 namespace context
= opentelemetry::context
;
42 class GreeterServer final
: public Greeter::Service
45 Status
Greet(ServerContext
*context
,
46 const GreetRequest
*request
,
47 GreetResponse
*response
) override
49 for (auto elem
: context
->client_metadata())
51 std::cout
<< "ELEM: " << elem
.first
<< " " << elem
.second
<< "\n";
54 // Create a SpanOptions object and set the kind to Server to inform OpenTel.
55 StartSpanOptions options
;
56 options
.kind
= SpanKind::kServer
;
58 // extract context from grpc metadata
59 GrpcServerCarrier
carrier(context
);
61 auto prop
= context::propagation::GlobalTextMapPropagator::GetGlobalPropagator();
62 auto current_ctx
= context::RuntimeContext::GetCurrent();
63 auto new_context
= prop
->Extract(carrier
, current_ctx
);
64 options
.parent
= GetSpan(new_context
)->GetContext();
66 std::string span_name
= "GreeterService/Greet";
68 get_tracer("grpc")->StartSpan(span_name
,
69 {{OTEL_GET_TRACE_ATTR(AttrRpcSystem
), "grpc"},
70 {OTEL_GET_TRACE_ATTR(AttrRpcService
), "GreeterService"},
71 {OTEL_GET_TRACE_ATTR(AttrRpcMethod
), "Greet"},
72 {OTEL_GET_TRACE_ATTR(AttrRpcGrpcStatusCode
), 0}},
74 auto scope
= get_tracer("grpc")->WithActiveSpan(span
);
76 // Fetch and parse whatever HTTP headers we can from the gRPC request.
77 span
->AddEvent("Processing client attributes");
79 std::string req
= request
->request();
80 std::cout
<< std::endl
<< "grpc_client says: " << req
<< std::endl
;
81 std::string message
= "The pleasure is mine.";
82 // Send response to client
83 response
->set_response(message
);
84 span
->AddEvent("Response sent to client");
86 span
->SetStatus(StatusCode::kOk
);
87 // Make sure to end your spans!
91 }; // GreeterServer class
93 void RunServer(uint16_t port
)
95 std::string
address("0.0.0.0:" + std::to_string(port
));
96 GreeterServer service
;
97 ServerBuilder builder
;
99 builder
.RegisterService(&service
);
100 builder
.AddListeningPort(address
, grpc::InsecureServerCredentials());
102 std::unique_ptr
<Server
> server(builder
.BuildAndStart());
103 std::cout
<< "Server listening on port: " << address
<< std::endl
;
109 int main(int argc
, char **argv
)
112 constexpr uint16_t default_port
= 8800;
116 port
= atoi(argv
[1]);