diff --git a/clang-tools-extra/clangd/index/remote/Client.cpp b/clang-tools-extra/clangd/index/remote/Client.cpp --- a/clang-tools-extra/clangd/index/remote/Client.cpp +++ b/clang-tools-extra/clangd/index/remote/Client.cpp @@ -17,6 +17,7 @@ #include "clang/Basic/Version.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/Chrono.h" #include "llvm/Support/Error.h" #include @@ -70,8 +71,7 @@ SPAN_ATTACH(Tracer, "Request", RPCRequest.DebugString()); grpc::ClientContext Context; Context.AddMetadata("version", clang::getClangToolFullVersion("clangd")); - std::chrono::system_clock::time_point StartTime = - std::chrono::system_clock::now(); + llvm::sys::TimePoint<> StartTime = std::chrono::system_clock::now(); auto Deadline = StartTime + DeadlineWaitingTime; Context.set_deadline(Deadline); auto Reader = (Stub.get()->*RPCCall)(&Context, RPCRequest); diff --git a/clang-tools-extra/clangd/index/remote/Service.proto b/clang-tools-extra/clangd/index/remote/Service.proto --- a/clang-tools-extra/clangd/index/remote/Service.proto +++ b/clang-tools-extra/clangd/index/remote/Service.proto @@ -10,8 +10,11 @@ package clang.clangd.remote.v1; +import "google/protobuf/empty.proto"; import "Index.proto"; +message MonitoringInfoReply { optional string info = 1; } + // Semantics of SymbolIndex match clangd::SymbolIndex with all required // structures corresponding to their clangd::* counterparts. service SymbolIndex { @@ -22,5 +25,7 @@ rpc Refs(RefsRequest) returns (stream RefsReply) {} rpc Relations(RelationsRequest) returns (stream RelationsReply) {} + + rpc MonitoringInfo(google.protobuf.Empty) returns (MonitoringInfoReply) {} } diff --git a/clang-tools-extra/clangd/index/remote/server/Server.cpp b/clang-tools-extra/clangd/index/remote/server/Server.cpp --- a/clang-tools-extra/clangd/index/remote/server/Server.cpp +++ b/clang-tools-extra/clangd/index/remote/server/Server.cpp @@ -90,7 +90,7 @@ class RemoteIndexServer final : public v1::SymbolIndex::Service { public: RemoteIndexServer(clangd::SymbolIndex &Index, llvm::StringRef IndexRoot) - : Index(Index) { + : Index(Index), ServiceStartTime(std::chrono::system_clock::now()) { llvm::SmallString<256> NativePath = IndexRoot; llvm::sys::path::native(NativePath); ProtobufMarshaller = std::unique_ptr(new Marshaller( @@ -279,8 +279,20 @@ Millis); } + grpc::Status MonitoringInfo(grpc::ServerContext *Context, + const google::protobuf::Empty *Request, + v1::MonitoringInfoReply *Reply) override { + Reply->set_info( + llvm::formatv("Service started at {0}. Uptime: {1}", ServiceStartTime, + ServiceStartTime - std::chrono::system_clock::now())); + logRequest(*Request); + logResponse(*Reply); + return grpc::Status::OK; + } + std::unique_ptr ProtobufMarshaller; clangd::SymbolIndex &Index; + llvm::sys::TimePoint<> ServiceStartTime; }; // Detect changes in \p IndexPath file and load new versions of the index