server.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <grpcpp/security/server_credentials.h>
  4. #include <grpcpp/server.h>
  5. #include <grpcpp/server_builder.h>
  6. #include <grpcpp/server_context.h>
  7. #include <grpcpp/support/status.h>
  8. #include <grpcpp/support/string_ref.h>
  9. #include <stdint.h>
  10. #include <stdlib.h>
  11. #include <iostream>
  12. #include <map>
  13. #include <string>
  14. #include <utility>
  15. #include "opentelemetry/context/propagation/global_propagator.h"
  16. #include "opentelemetry/context/propagation/text_map_propagator.h"
  17. #include "opentelemetry/context/runtime_context.h"
  18. #include "opentelemetry/nostd/shared_ptr.h"
  19. #include "opentelemetry/nostd/variant.h"
  20. #include "opentelemetry/semconv/incubating/rpc_attributes.h"
  21. #include "opentelemetry/trace/context.h"
  22. #include "opentelemetry/trace/span.h"
  23. #include "opentelemetry/trace/span_context.h"
  24. #include "opentelemetry/trace/span_metadata.h"
  25. #include "opentelemetry/trace/span_startoptions.h"
  26. #include "opentelemetry/trace/tracer.h"
  27. #include "tracer_common.h"
  28. #ifdef BAZEL_BUILD
  29. # include "examples/grpc/protos/messages.grpc.pb.h"
  30. # include "examples/grpc/protos/messages.pb.h"
  31. #else
  32. # include "messages.grpc.pb.h"
  33. # include "messages.pb.h"
  34. #endif
  35. using grpc::Server;
  36. using grpc::ServerBuilder;
  37. using grpc::ServerContext;
  38. using grpc::Status;
  39. using grpc_example::Greeter;
  40. using grpc_example::GreetRequest;
  41. using grpc_example::GreetResponse;
  42. using Span = opentelemetry::trace::Span;
  43. using SpanContext = opentelemetry::trace::SpanContext;
  44. using namespace opentelemetry::trace;
  45. namespace context = opentelemetry::context;
  46. namespace semconv = opentelemetry::semconv;
  47. namespace
  48. {
  49. class GreeterServer final : public Greeter::Service
  50. {
  51. public:
  52. Status Greet(ServerContext *context,
  53. const GreetRequest *request,
  54. GreetResponse *response) override
  55. {
  56. for (const auto &elem : context->client_metadata())
  57. {
  58. std::cout << "ELEM: " << elem.first << " " << elem.second << "\n";
  59. }
  60. // Create a SpanOptions object and set the kind to Server to inform OpenTel.
  61. StartSpanOptions options;
  62. options.kind = SpanKind::kServer;
  63. // extract context from grpc metadata
  64. GrpcServerCarrier carrier(context);
  65. auto prop = context::propagation::GlobalTextMapPropagator::GetGlobalPropagator();
  66. auto current_ctx = context::RuntimeContext::GetCurrent();
  67. auto new_context = prop->Extract(carrier, current_ctx);
  68. options.parent = GetSpan(new_context)->GetContext();
  69. std::string span_name = "GreeterService/Greet";
  70. auto span = get_tracer("grpc")->StartSpan(span_name,
  71. {{semconv::rpc::kRpcSystem, "grpc"},
  72. {semconv::rpc::kRpcService, "GreeterService"},
  73. {semconv::rpc::kRpcMethod, "Greet"},
  74. {semconv::rpc::kRpcGrpcStatusCode, 0}},
  75. options);
  76. auto scope = get_tracer("grpc")->WithActiveSpan(span);
  77. // Fetch and parse whatever HTTP headers we can from the gRPC request.
  78. span->AddEvent("Processing client attributes");
  79. const std::string &req = request->request();
  80. std::cout << '\n' << "grpc_client says: " << req << '\n';
  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. span->SetStatus(StatusCode::kOk);
  86. // Make sure to end your spans!
  87. span->End();
  88. return Status::OK;
  89. }
  90. }; // GreeterServer class
  91. void RunServer(uint16_t port)
  92. {
  93. std::string address("0.0.0.0:" + std::to_string(port));
  94. GreeterServer service;
  95. ServerBuilder builder;
  96. builder.RegisterService(&service);
  97. builder.AddListeningPort(address, grpc::InsecureServerCredentials());
  98. std::unique_ptr<Server> server(builder.BuildAndStart());
  99. std::cout << "Server listening on port: " << address << '\n';
  100. server->Wait();
  101. server->Shutdown();
  102. }
  103. } // namespace
  104. int main(int argc, char **argv)
  105. {
  106. InitTracer();
  107. constexpr uint16_t default_port = 8800;
  108. uint16_t port;
  109. if (argc > 1)
  110. {
  111. port = atoi(argv[1]);
  112. }
  113. else
  114. {
  115. port = default_port;
  116. }
  117. RunServer(port);
  118. CleanupTracer();
  119. return 0;
  120. }