]> git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc
2671cc0b6847663e23b095585c8c908ea4c8418d
[ceph.git] / ceph / src / jaegertracing / opentelemetry-cpp / examples / grpc / server.cc
1 #ifdef BAZEL_BUILD
2 # include "examples/grpc/protos/messages.grpc.pb.h"
3 #else
4 # include "messages.grpc.pb.h"
5 #endif
6
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"
11
12 #include <grpcpp/grpcpp.h>
13 #include <grpcpp/server.h>
14 #include <grpcpp/server_builder.h>
15 #include <grpcpp/server_context.h>
16
17 #include <chrono>
18 #include <fstream>
19 #include <map>
20 #include <sstream>
21 #include <string>
22 #include <thread>
23
24 using grpc::Server;
25 using grpc::ServerBuilder;
26 using grpc::ServerContext;
27 using grpc::ServerWriter;
28 using grpc::Status;
29
30 using grpc_example::Greeter;
31 using grpc_example::GreetRequest;
32 using grpc_example::GreetResponse;
33
34 using Span = opentelemetry::trace::Span;
35 using SpanContext = opentelemetry::trace::SpanContext;
36 using namespace opentelemetry::trace;
37
38 namespace context = opentelemetry::context;
39
40 namespace
41 {
42 class GreeterServer final : public Greeter::Service
43 {
44 public:
45 Status Greet(ServerContext *context,
46 const GreetRequest *request,
47 GreetResponse *response) override
48 {
49 for (auto elem : context->client_metadata())
50 {
51 std::cout << "ELEM: " << elem.first << " " << elem.second << "\n";
52 }
53
54 // Create a SpanOptions object and set the kind to Server to inform OpenTel.
55 StartSpanOptions options;
56 options.kind = SpanKind::kServer;
57
58 // extract context from grpc metadata
59 GrpcServerCarrier carrier(context);
60
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();
65
66 std::string span_name = "GreeterService/Greet";
67 auto span =
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}},
73 options);
74 auto scope = get_tracer("grpc")->WithActiveSpan(span);
75
76 // Fetch and parse whatever HTTP headers we can from the gRPC request.
77 span->AddEvent("Processing client attributes");
78
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");
85
86 span->SetStatus(StatusCode::kOk);
87 // Make sure to end your spans!
88 span->End();
89 return Status::OK;
90 }
91 }; // GreeterServer class
92
93 void RunServer(uint16_t port)
94 {
95 std::string address("0.0.0.0:" + std::to_string(port));
96 GreeterServer service;
97 ServerBuilder builder;
98
99 builder.RegisterService(&service);
100 builder.AddListeningPort(address, grpc::InsecureServerCredentials());
101
102 std::unique_ptr<Server> server(builder.BuildAndStart());
103 std::cout << "Server listening on port: " << address << std::endl;
104 server->Wait();
105 server->Shutdown();
106 }
107 } // namespace
108
109 int main(int argc, char **argv)
110 {
111 initTracer();
112 constexpr uint16_t default_port = 8800;
113 uint16_t port;
114 if (argc > 1)
115 {
116 port = atoi(argv[1]);
117 }
118 else
119 {
120 port = default_port;
121 }
122
123 RunServer(port);
124 return 0;
125 }