134593ae9SKirill Bobyrev //===--- Monitor.cpp - Request server monitoring information through CLI --===//
234593ae9SKirill Bobyrev //
334593ae9SKirill Bobyrev // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
434593ae9SKirill Bobyrev // See https://llvm.org/LICENSE.txt for license information.
534593ae9SKirill Bobyrev // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
634593ae9SKirill Bobyrev //
734593ae9SKirill Bobyrev //===----------------------------------------------------------------------===//
834593ae9SKirill Bobyrev
934593ae9SKirill Bobyrev #include "MonitoringService.grpc.pb.h"
1034593ae9SKirill Bobyrev #include "MonitoringService.pb.h"
1134593ae9SKirill Bobyrev
1234593ae9SKirill Bobyrev #include "support/Logger.h"
1334593ae9SKirill Bobyrev #include "clang/Basic/Version.h"
1434593ae9SKirill Bobyrev #include "llvm/Support/CommandLine.h"
1534593ae9SKirill Bobyrev #include "llvm/Support/Signals.h"
1634593ae9SKirill Bobyrev
1734593ae9SKirill Bobyrev #include <chrono>
1834593ae9SKirill Bobyrev #include <google/protobuf/util/json_util.h>
1934593ae9SKirill Bobyrev #include <grpc++/grpc++.h>
2034593ae9SKirill Bobyrev
2134593ae9SKirill Bobyrev namespace clang {
2234593ae9SKirill Bobyrev namespace clangd {
2334593ae9SKirill Bobyrev namespace remote {
2434593ae9SKirill Bobyrev namespace {
2534593ae9SKirill Bobyrev
2634593ae9SKirill Bobyrev static constexpr char Overview[] = R"(
2734593ae9SKirill Bobyrev This tool requests monitoring information (uptime, index freshness) from the
2834593ae9SKirill Bobyrev server and prints it to stdout.
2934593ae9SKirill Bobyrev )";
3034593ae9SKirill Bobyrev
3134593ae9SKirill Bobyrev llvm::cl::opt<std::string>
3234593ae9SKirill Bobyrev ServerAddress("server-address", llvm::cl::Positional,
3334593ae9SKirill Bobyrev llvm::cl::desc("Address of the invoked server."),
3434593ae9SKirill Bobyrev llvm::cl::Required);
3534593ae9SKirill Bobyrev
3634593ae9SKirill Bobyrev } // namespace
3734593ae9SKirill Bobyrev } // namespace remote
3834593ae9SKirill Bobyrev } // namespace clangd
3934593ae9SKirill Bobyrev } // namespace clang
4034593ae9SKirill Bobyrev
main(int argc,char * argv[])4134593ae9SKirill Bobyrev int main(int argc, char *argv[]) {
4234593ae9SKirill Bobyrev using namespace clang::clangd::remote;
4334593ae9SKirill Bobyrev llvm::cl::ParseCommandLineOptions(argc, argv, Overview);
4434593ae9SKirill Bobyrev llvm::sys::PrintStackTraceOnErrorSignal(argv[0]);
4534593ae9SKirill Bobyrev
4634593ae9SKirill Bobyrev const auto Channel =
4734593ae9SKirill Bobyrev grpc::CreateChannel(ServerAddress, grpc::InsecureChannelCredentials());
4834593ae9SKirill Bobyrev const auto Stub = clang::clangd::remote::v1::Monitor::NewStub(Channel);
4934593ae9SKirill Bobyrev grpc::ClientContext Context;
5034593ae9SKirill Bobyrev Context.set_deadline(std::chrono::system_clock::now() +
5134593ae9SKirill Bobyrev std::chrono::seconds(10));
5234593ae9SKirill Bobyrev Context.AddMetadata("version", clang::getClangToolFullVersion("clangd"));
5334593ae9SKirill Bobyrev const clang::clangd::remote::v1::MonitoringInfoRequest Request;
5434593ae9SKirill Bobyrev clang::clangd::remote::v1::MonitoringInfoReply Response;
5534593ae9SKirill Bobyrev const auto Status = Stub->MonitoringInfo(&Context, Request, &Response);
5634593ae9SKirill Bobyrev if (!Status.ok()) {
5734593ae9SKirill Bobyrev clang::clangd::elog("Can not request monitoring information ({0}): {1}\n",
5834593ae9SKirill Bobyrev Status.error_code(), Status.error_message());
5934593ae9SKirill Bobyrev return -1;
6034593ae9SKirill Bobyrev }
6134593ae9SKirill Bobyrev std::string Output;
6234593ae9SKirill Bobyrev google::protobuf::util::JsonPrintOptions Options;
6334593ae9SKirill Bobyrev Options.add_whitespace = true;
6434593ae9SKirill Bobyrev Options.always_print_primitive_fields = true;
6534593ae9SKirill Bobyrev Options.preserve_proto_field_names = true;
6634593ae9SKirill Bobyrev const auto JsonStatus =
6734593ae9SKirill Bobyrev google::protobuf::util::MessageToJsonString(Response, &Output, Options);
6834593ae9SKirill Bobyrev if (!JsonStatus.ok()) {
6934593ae9SKirill Bobyrev clang::clangd::elog("Can not convert response ({0}) to JSON ({1}): {2}\n",
70*c21378f9SMatthias Braun Response.DebugString(),
71*c21378f9SMatthias Braun static_cast<int>(JsonStatus.code()),
72*c21378f9SMatthias Braun JsonStatus.message().as_string());
7334593ae9SKirill Bobyrev return -1;
7434593ae9SKirill Bobyrev }
7534593ae9SKirill Bobyrev llvm::outs() << Output;
7634593ae9SKirill Bobyrev }
77