]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / jaegertracing / opentelemetry-cpp / examples / grpc / server.cc
diff --git a/ceph/src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc b/ceph/src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc
new file mode 100644 (file)
index 0000000..2671cc0
--- /dev/null
@@ -0,0 +1,125 @@
+#ifdef BAZEL_BUILD
+#  include "examples/grpc/protos/messages.grpc.pb.h"
+#else
+#  include "messages.grpc.pb.h"
+#endif
+
+#include "opentelemetry/trace/context.h"
+#include "opentelemetry/trace/experimental_semantic_conventions.h"
+#include "opentelemetry/trace/span_context_kv_iterable_view.h"
+#include "tracer_common.h"
+
+#include <grpcpp/grpcpp.h>
+#include <grpcpp/server.h>
+#include <grpcpp/server_builder.h>
+#include <grpcpp/server_context.h>
+
+#include <chrono>
+#include <fstream>
+#include <map>
+#include <sstream>
+#include <string>
+#include <thread>
+
+using grpc::Server;
+using grpc::ServerBuilder;
+using grpc::ServerContext;
+using grpc::ServerWriter;
+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
+{
+class GreeterServer final : public Greeter::Service
+{
+public:
+  Status Greet(ServerContext *context,
+               const GreetRequest *request,
+               GreetResponse *response) override
+  {
+    for (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,
+                                      {{OTEL_GET_TRACE_ATTR(AttrRpcSystem), "grpc"},
+                                       {OTEL_GET_TRACE_ATTR(AttrRpcService), "GreeterService"},
+                                       {OTEL_GET_TRACE_ATTR(AttrRpcMethod), "Greet"},
+                                       {OTEL_GET_TRACE_ATTR(AttrRpcGrpcStatusCode), 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");
+
+    std::string req = request->request();
+    std::cout << std::endl << "grpc_client says: " << req << std::endl;
+    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 class
+
+void 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 << std::endl;
+  server->Wait();
+  server->Shutdown();
+}
+}  // namespace
+
+int 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);
+  return 0;
+}