diff --git a/watchman/Client.cpp b/watchman/Client.cpp index 2ba72f028089..ccc587b73a8c 100644 --- a/watchman/Client.cpp +++ b/watchman/Client.cpp @@ -83,7 +83,7 @@ void Client::sendErrorResponse(std::string_view formatted) { resp.set("error", typed_string_to_json(formatted)); if (dispatch_command) { - dispatch_command->meta.base.error = formatted; + dispatch_command->error = formatted; } if (perf_sample) { @@ -165,7 +165,7 @@ bool Client::dispatchCommand(const Command& command, CommandFlags mode) { enqueueResponse(def->handler(this, rendered)); } catch (const ErrorResponse& e) { sendErrorResponse(e.what()); - dispatchCommand.meta.base.error = e.what(); + dispatchCommand.error = e.what(); } catch (const ResponseWasHandledManually&) { } @@ -180,11 +180,11 @@ bool Client::dispatchCommand(const Command& command, CommandFlags mode) { getLogEventCounters(LogEventType::DispatchCommandType); // Log if override set, or if we have hit the sample rate if (sample.will_log || eventCount == samplingRate) { - dispatchCommand.meta.base.event_count = + dispatchCommand.event_count = eventCount != samplingRate ? 0 : eventCount; dispatchCommand.args = renderedString; - dispatchCommand.meta.client_pid = peerPid_; - dispatchCommand.meta.client_name = + dispatchCommand.client_pid = peerPid_; + dispatchCommand.client_name = facebook::eden::ProcessInfoCache::cleanProcessCommandline( std::move(peerInfo_.get().name)); diff --git a/watchman/PerfSample.h b/watchman/PerfSample.h index 59d389786e86..d0b423bf1e29 100644 --- a/watchman/PerfSample.h +++ b/watchman/PerfSample.h @@ -29,10 +29,10 @@ struct RootMetadata { template void addRootMetadataToEvent(const RootMetadata& root_metadata, T& event) { - event.meta.base.root = root_metadata.root_path.string(); - event.meta.recrawl = root_metadata.recrawl_count; - event.meta.case_sensitive = root_metadata.case_sensitive; - event.meta.watcher = root_metadata.watcher.string(); + event.root = root_metadata.root_path.string(); + event.recrawl = root_metadata.recrawl_count; + event.case_sensitive = root_metadata.case_sensitive; + event.watcher = root_metadata.watcher.string(); } class PerfSample { diff --git a/watchman/SanityCheck.cpp b/watchman/SanityCheck.cpp index 9c81cd577f20..44170c685379 100644 --- a/watchman/SanityCheck.cpp +++ b/watchman/SanityCheck.cpp @@ -158,14 +158,14 @@ void do_clock_check(watchman_stream* client) { auto roots = get_watch_list(client); for (auto& r : roots.array()) { ClockTest clockTest; - clockTest.base.root = r.toString(); + clockTest.root = r.toString(); PerfSample sample("clock-test"); sample.add_meta("root", json_object({{"path", r}})); try { check_clock_command(client, r); } catch (const std::exception& ex) { log(watchman::ERR, "Failed do_clock_check : ", ex.what(), "\n"); - clockTest.base.error = ex.what(); + clockTest.error = ex.what(); sample.add_meta("error", w_string_to_json(ex.what())); sample.force_log(); } @@ -178,8 +178,7 @@ void do_clock_check(watchman_stream* client) { getLogEventCounters(LogEventType::ClockTestType); // Log if override set, or if we have hit the sample rate if (sample.will_log || eventCount == samplingRate) { - clockTest.base.event_count = - eventCount != samplingRate ? 0 : eventCount; + clockTest.event_count = eventCount != samplingRate ? 0 : eventCount; getLogger()->logEvent(clockTest); } } diff --git a/watchman/query/eval.cpp b/watchman/query/eval.cpp index f94880153cf9..8298331962f4 100644 --- a/watchman/query/eval.cpp +++ b/watchman/query/eval.cpp @@ -256,8 +256,7 @@ static void execute_common( // Log if override set, or if we have hit the sample rate if (sample->will_log || eventCount == samplingRate) { addRootMetadataToEvent(root_metadata, *queryExecute); - queryExecute->meta.base.event_count = - eventCount != samplingRate ? 0 : eventCount; + queryExecute->event_count = eventCount != samplingRate ? 0 : eventCount; queryExecute->fresh_instance = res->isFreshInstance; queryExecute->deduped = ctx->num_deduped; queryExecute->results = ctx->resultsArray.size(); @@ -272,8 +271,8 @@ static void execute_common( if (ctx->query->query_spec) { queryExecute->query = ctx->query->query_spec->toString(); } - queryExecute->meta.client_pid = clientInfo.clientPid; - queryExecute->meta.client_name = clientInfo.clientInfo.has_value() + queryExecute->client_pid = clientInfo.clientPid; + queryExecute->client_name = clientInfo.clientInfo.has_value() ? facebook::eden::ProcessInfoCache::cleanProcessCommandline( std::move(clientInfo.clientInfo.value().get().name)) : ""; diff --git a/watchman/root/ageout.cpp b/watchman/root/ageout.cpp index 1023e8667db1..a5918a0eb2c9 100644 --- a/watchman/root/ageout.cpp +++ b/watchman/root/ageout.cpp @@ -70,11 +70,11 @@ void Root::performAgeOut(std::chrono::seconds min_age) { // Log if override set, or if we have hit the sample rate if (sample.will_log || eventCount == samplingRate) { AgeOut ageOut; - ageOut.meta.base.root = root_metadata.root_path.string(); - ageOut.meta.base.event_count = eventCount != samplingRate ? 0 : eventCount; - ageOut.meta.recrawl = root_metadata.recrawl_count; - ageOut.meta.case_sensitive = root_metadata.case_sensitive; - ageOut.meta.watcher = root_metadata.watcher.string(); + ageOut.root = root_metadata.root_path.string(); + ageOut.event_count = eventCount != samplingRate ? 0 : eventCount; + ageOut.recrawl = root_metadata.recrawl_count; + ageOut.case_sensitive = root_metadata.case_sensitive; + ageOut.watcher = root_metadata.watcher.string(); ageOut.walked = walked; ageOut.files = files; ageOut.dirs = dirs; diff --git a/watchman/root/iothread.cpp b/watchman/root/iothread.cpp index 9b660420aa18..5366f31fb26a 100644 --- a/watchman/root/iothread.cpp +++ b/watchman/root/iothread.cpp @@ -90,10 +90,10 @@ void InMemoryView::fullCrawl( sample.log(); FullCrawl fullCrawl; - fullCrawl.meta.base.root = root_metadata.root_path.string(); - fullCrawl.meta.recrawl = root_metadata.recrawl_count; - fullCrawl.meta.case_sensitive = root_metadata.case_sensitive; - fullCrawl.meta.watcher = root_metadata.watcher.string(); + fullCrawl.root = root_metadata.root_path.string(); + fullCrawl.recrawl = root_metadata.recrawl_count; + fullCrawl.case_sensitive = root_metadata.case_sensitive; + fullCrawl.watcher = root_metadata.watcher.string(); getLogger()->logEvent(fullCrawl); logf(ERR, "{}crawl complete\n", recrawlCount ? "re" : ""); diff --git a/watchman/root/sync.cpp b/watchman/root/sync.cpp index 053eb2c5d369..f6a9c7dc1317 100644 --- a/watchman/root/sync.cpp +++ b/watchman/root/sync.cpp @@ -44,17 +44,16 @@ CookieSync::SyncResult Root::syncToNow( getLogEventCounters(LogEventType::SyncToNowType); // Log if override set, or if we have hit the sample rate if (sample.will_log || eventCount == samplingRate) { - syncToNow.meta.client_pid = client_info.clientPid; - syncToNow.meta.client_name = client_info.clientInfo.has_value() + syncToNow.client_pid = client_info.clientPid; + syncToNow.client_name = client_info.clientInfo.has_value() ? facebook::eden::ProcessInfoCache::cleanProcessCommandline( std::move(client_info.clientInfo.value().get().name)) : ""; - syncToNow.meta.base.root = root_metadata.root_path.string(); - syncToNow.meta.base.event_count = - eventCount != samplingRate ? 0 : eventCount; - syncToNow.meta.recrawl = root_metadata.recrawl_count; - syncToNow.meta.case_sensitive = root_metadata.case_sensitive; - syncToNow.meta.watcher = root_metadata.watcher.string(); + syncToNow.root = root_metadata.root_path.string(); + syncToNow.event_count = eventCount != samplingRate ? 0 : eventCount; + syncToNow.recrawl = root_metadata.recrawl_count; + syncToNow.case_sensitive = root_metadata.case_sensitive; + syncToNow.watcher = root_metadata.watcher.string(); syncToNow.timeoutms = timeout.count(); getLogger()->logEvent(syncToNow); } @@ -74,13 +73,12 @@ CookieSync::SyncResult Root::syncToNow( const auto& [samplingRate, eventCount] = getLogEventCounters(LogEventType::SyncToNowType); - syncToNow.meta.base.root = root_metadata.root_path.string(); - syncToNow.meta.base.error = exc.what(); - syncToNow.meta.base.event_count = - eventCount != samplingRate ? 0 : eventCount; - syncToNow.meta.recrawl = root_metadata.recrawl_count; - syncToNow.meta.case_sensitive = root_metadata.case_sensitive; - syncToNow.meta.watcher = root_metadata.watcher.string(); + syncToNow.root = root_metadata.root_path.string(); + syncToNow.error = exc.what(); + syncToNow.event_count = eventCount != samplingRate ? 0 : eventCount; + syncToNow.recrawl = root_metadata.recrawl_count; + syncToNow.case_sensitive = root_metadata.case_sensitive; + syncToNow.watcher = root_metadata.watcher.string(); syncToNow.success = false; syncToNow.timeoutms = timeout.count(); getLogger()->logEvent(syncToNow); diff --git a/watchman/telemetry/LogEvent.h b/watchman/telemetry/LogEvent.h index 3d292ce15a22..1fc112d18d32 100644 --- a/watchman/telemetry/LogEvent.h +++ b/watchman/telemetry/LogEvent.h @@ -24,28 +24,7 @@ namespace watchman { using DynamicEvent = facebook::eden::DynamicEvent; using TypedEvent = facebook::eden::TypedEvent; -struct WatchmanEvent : public TypedEvent { - // Keep populate() and getType() pure virtual to force subclasses - // to implement them - virtual void populate(DynamicEvent&) const override = 0; - virtual const char* getType() const override = 0; -}; - -enum LogEventType : uint8_t { - DispatchCommandType, - ClockTestType, - AgeOutType, - SyncToNowType, - SavedStateType, - QueryExecuteType, - FullCrawlType, - DroppedType -}; - -// Returns samplingRate and eventCount -std::pair getLogEventCounters(const LogEventType& type); - -struct BaseEventData { +struct WatchmanBaseEvent : public TypedEvent { // TODO: add system and user time for Unix systems std::chrono::time_point start_time = std::chrono::system_clock::now(); @@ -53,7 +32,7 @@ struct BaseEventData { std::string error; int64_t event_count = 1; - void populate(DynamicEvent& event) const { + void populate(DynamicEvent& event) const override { std::chrono::duration elapsed_time = std::chrono::system_clock::now() - start_time; event.addInt( @@ -70,18 +49,20 @@ struct BaseEventData { } event.addInt("event_count", event_count); } + + // Keep getType() pure virtual to force subclasses to implement it + virtual const char* getType() const override = 0; }; -struct MetadataEventData { - BaseEventData base; +struct WatchmanEvent : public WatchmanBaseEvent { int64_t recrawl = 0; bool case_sensitive = false; std::string watcher; pid_t client_pid = 0; std::string client_name; - void populate(DynamicEvent& event) const { - base.populate(event); + void populate(DynamicEvent& event) const override { + WatchmanBaseEvent::populate(event); event.addInt("recrawl", recrawl); event.addBool("case_sensitive", case_sensitive); if (!watcher.empty()) { @@ -95,18 +76,31 @@ struct MetadataEventData { event.addString("client", client_name); } } + + // Keep getType() pure virtual to force subclasses to implement it + virtual const char* getType() const override = 0; }; -// TODO: add a WatchmanTypedEvent which just contains MetadataEventData and have -// all of these structs inherit from WatchmanTypedEvent rather than TypedEvent +enum LogEventType : uint8_t { + DispatchCommandType, + ClockTestType, + AgeOutType, + SyncToNowType, + SavedStateType, + QueryExecuteType, + FullCrawlType, + DroppedType +}; + +// Returns samplingRate and eventCount +std::pair getLogEventCounters(const LogEventType& type); struct DispatchCommand : public WatchmanEvent { - MetadataEventData meta; std::string command; std::string args; void populate(DynamicEvent& event) const override { - meta.populate(event); + WatchmanEvent::populate(event); event.addString("command", command); if (!args.empty()) { event.addString("args", args); @@ -118,11 +112,9 @@ struct DispatchCommand : public WatchmanEvent { } }; -struct ClockTest : public WatchmanEvent { - BaseEventData base; - +struct ClockTest : public WatchmanBaseEvent { void populate(DynamicEvent& event) const override { - base.populate(event); + WatchmanBaseEvent::populate(event); } const char* getType() const override { @@ -131,13 +123,12 @@ struct ClockTest : public WatchmanEvent { }; struct AgeOut : public WatchmanEvent { - MetadataEventData meta; int64_t walked = 0; int64_t files = 0; int64_t dirs = 0; void populate(DynamicEvent& event) const override { - meta.populate(event); + WatchmanEvent::populate(event); event.addInt("walked", walked); event.addInt("files", files); event.addInt("dirs", dirs); @@ -149,12 +140,11 @@ struct AgeOut : public WatchmanEvent { }; struct SyncToNow : public WatchmanEvent { - MetadataEventData meta; bool success = true; int64_t timeoutms = 0; void populate(DynamicEvent& event) const override { - meta.populate(event); + WatchmanEvent::populate(event); event.addBool("success", success); event.addInt("timeoutms", timeoutms); } @@ -168,7 +158,6 @@ struct SavedState : public WatchmanEvent { enum Target { Manifold = 1, Xdb = 2 }; enum Action { GetProperties = 1, Connect = 2, Query = 3 }; - MetadataEventData meta; Target target = Manifold; Action action = GetProperties; std::string project; @@ -179,7 +168,7 @@ struct SavedState : public WatchmanEvent { bool success = false; void populate(DynamicEvent& event) const override { - meta.populate(event); + WatchmanEvent::populate(event); event.addInt("target", target); event.addInt("action", action); event.addString("project", project); @@ -202,7 +191,6 @@ struct SavedState : public WatchmanEvent { }; struct QueryExecute : public WatchmanEvent { - MetadataEventData meta; std::string request_id; int64_t num_special_files = 0; std::string special_files; @@ -216,7 +204,7 @@ struct QueryExecute : public WatchmanEvent { int64_t eden_file_properties_duration_us = 0; void populate(DynamicEvent& event) const override { - meta.populate(event); + WatchmanEvent::populate(event); if (!request_id.empty()) { event.addString("request_id", request_id); } @@ -250,10 +238,8 @@ struct QueryExecute : public WatchmanEvent { }; struct FullCrawl : public WatchmanEvent { - MetadataEventData meta; - void populate(DynamicEvent& event) const override { - meta.populate(event); + WatchmanEvent::populate(event); } const char* getType() const override { @@ -262,11 +248,10 @@ struct FullCrawl : public WatchmanEvent { }; struct Dropped : public WatchmanEvent { - MetadataEventData meta; bool isKernel = false; void populate(DynamicEvent& event) const override { - meta.populate(event); + WatchmanEvent::populate(event); event.addBool("isKernel", isKernel); } diff --git a/watchman/watcher/fsevents.cpp b/watchman/watcher/fsevents.cpp index 970b729ea0fa..942ab7930937 100644 --- a/watchman/watcher/fsevents.cpp +++ b/watchman/watcher/fsevents.cpp @@ -139,10 +139,10 @@ std::shared_ptr watcherFromRoot( static void log_drop_event(const std::shared_ptr& root, bool isKernel) { auto root_metadata = root->getRootMetadata(); Dropped dropped; - dropped.meta.base.root = root_metadata.root_path.string(); - dropped.meta.recrawl = root_metadata.recrawl_count; - dropped.meta.case_sensitive = root_metadata.case_sensitive; - dropped.meta.watcher = root_metadata.watcher.string(); + dropped.root = root_metadata.root_path.string(); + dropped.recrawl = root_metadata.recrawl_count; + dropped.case_sensitive = root_metadata.case_sensitive; + dropped.watcher = root_metadata.watcher.string(); dropped.isKernel = isKernel; getLogger()->logEvent(dropped);