kadircet updated this revision to Diff 258559. kadircet added a comment. Extend tracer api to enable exporting metrics.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D78429/new/ https://reviews.llvm.org/D78429 Files: clang-tools-extra/clangd/TUScheduler.cpp clang-tools-extra/clangd/Trace.cpp clang-tools-extra/clangd/Trace.h
Index: clang-tools-extra/clangd/Trace.h =================================================================== --- clang-tools-extra/clangd/Trace.h +++ clang-tools-extra/clangd/Trace.h @@ -18,14 +18,36 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_TRACE_H_ #include "Context.h" +#include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/JSON.h" #include "llvm/Support/raw_ostream.h" +#include <string> +#include <vector> namespace clang { namespace clangd { namespace trace { +/// Represents measurements of clangd events, e.g. operation latency. +struct Metric { + enum Type { + /// Occurence of an event, e.g. cache access. + Increment, + /// Aspect of an event, e.g. number of symbols in an index lookup. + Sample, + }; + /// Uniquely identifies the metric. + const llvm::StringLiteral Name; + /// Divides a metric into meaningful parts. e.g. hit/miss to represent result + /// of a cache access. + std::vector<std::string> Labels; + double Value = 0; + Type T; + + Metric(llvm::StringLiteral Name) : Name(Name) {} +}; + /// A consumer of trace events. The events are produced by Spans and trace::log. /// Implementations of this interface must be thread-safe. class EventTracer { @@ -47,6 +69,9 @@ /// Called for instant events. virtual void instant(llvm::StringRef Name, llvm::json::Object &&Args) = 0; + + /// Called whenever an event exports a measurement. + virtual void record(const Metric &Metric) {} }; /// Sets up a global EventTracer that consumes events produced by Span and @@ -69,6 +94,9 @@ /// Records a single instant event, associated with the current thread. void log(const llvm::Twine &Name); +/// Reports a metric to tracer. No-op if there's no active tracer. +void record(const Metric &M); + /// Records an event whose duration is the lifetime of the Span object. /// This lifetime is extended when the span's context is reused. /// Index: clang-tools-extra/clangd/Trace.cpp =================================================================== --- clang-tools-extra/clangd/Trace.cpp +++ clang-tools-extra/clangd/Trace.cpp @@ -149,10 +149,10 @@ void rawEvent(llvm::StringRef Phase, const llvm::json::Object &Event) /*REQUIRES(Mu)*/ { // PID 0 represents the clangd process. - Out.object([&]{ + Out.object([&] { Out.attribute("pid", 0); Out.attribute("ph", Phase); - for (const auto& KV : Event) + for (const auto &KV : Event) Out.attribute(KV.first, KV.second); }); } @@ -208,6 +208,12 @@ T->instant("Log", llvm::json::Object{{"Message", Message.str()}}); } +void record(const Metric &M) { + if (!T) + return; + T->record(M); +} + // Returned context owns Args. static Context makeSpanContext(llvm::Twine Name, llvm::json::Object *Args) { if (!T) Index: clang-tools-extra/clangd/TUScheduler.cpp =================================================================== --- clang-tools-extra/clangd/TUScheduler.cpp +++ clang-tools-extra/clangd/TUScheduler.cpp @@ -143,10 +143,18 @@ /// the cache anymore. If nullptr was cached for \p K, this function will /// return a null unique_ptr wrapped into an optional. llvm::Optional<std::unique_ptr<ParsedAST>> take(Key K) { + trace::Metric M("/clangd/ast_cache"); + M.T = trace::Metric::Increment; + M.Value = 1; + // Record metric after unlocking the mutex. + auto _ = llvm::make_scope_exit([&M] { trace::record(M); }); std::unique_lock<std::mutex> Lock(Mut); auto Existing = findByKey(K); - if (Existing == LRU.end()) + if (Existing == LRU.end()) { + M.Labels = {"miss"}; return None; + } + M.Labels = {"hit"}; std::unique_ptr<ParsedAST> V = std::move(Existing->second); LRU.erase(Existing); // GCC 4.8 fails to compile `return V;`, as it tries to call the copy
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits