| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- // Copyright The OpenTelemetry Authors
- // SPDX-License-Identifier: Apache-2.0
- #include <grpcpp/security/server_credentials.h>
- #include <grpcpp/server.h>
- #include <grpcpp/server_builder.h>
- #include <grpcpp/server_context.h>
- #include <grpcpp/support/status.h>
- #include <grpcpp/support/string_ref.h>
- #include <stdint.h>
- #include <stdlib.h>
- #include <iostream>
- #include <map>
- #include <string>
- #include <utility>
- #include "opentelemetry/context/propagation/global_propagator.h"
- #include "opentelemetry/context/propagation/text_map_propagator.h"
- #include "opentelemetry/context/runtime_context.h"
- #include "opentelemetry/nostd/shared_ptr.h"
- #include "opentelemetry/nostd/variant.h"
- #include "opentelemetry/semconv/incubating/rpc_attributes.h"
- #include "opentelemetry/trace/context.h"
- #include "opentelemetry/trace/span.h"
- #include "opentelemetry/trace/span_context.h"
- #include "opentelemetry/trace/span_metadata.h"
- #include "opentelemetry/trace/span_startoptions.h"
- #include "opentelemetry/trace/tracer.h"
- #include "tracer_common.h"
- #ifdef BAZEL_BUILD
- # include "examples/grpc/protos/messages.grpc.pb.h"
- # include "examples/grpc/protos/messages.pb.h"
- #else
- # include "messages.grpc.pb.h"
- # include "messages.pb.h"
- #endif
- using grpc::Server;
- using grpc::ServerBuilder;
- using grpc::ServerContext;
- 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 semconv = opentelemetry::semconv;
- namespace
- {
- class GreeterServer final : public Greeter::Service
- {
- public:
- Status Greet(ServerContext *context,
- const GreetRequest *request,
- GreetResponse *response) override
- {
- for (const 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,
- {{semconv::rpc::kRpcSystem, "grpc"},
- {semconv::rpc::kRpcService, "GreeterService"},
- {semconv::rpc::kRpcMethod, "Greet"},
- {semconv::rpc::kRpcGrpcStatusCode, 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");
- const std::string &req = request->request();
- std::cout << '\n' << "grpc_client says: " << req << '\n';
- 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 << '\n';
- 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);
- CleanupTracer();
- return 0;
- }
|