summaryrefslogtreecommitdiffstats
path: root/src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc')
-rw-r--r--src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc b/src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc
new file mode 100644
index 000000000..2671cc0b6
--- /dev/null
+++ b/src/jaegertracing/opentelemetry-cpp/examples/grpc/server.cc
@@ -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;
+}