Skip to content

Commit

Permalink
move BaseEventData and MetadataEventData into the TypedEvent inherita…
Browse files Browse the repository at this point in the history
…nce structure

Summary: Followup from D63797385 - moves watchman `LogEvent` into an inheritance structure instead of a aggregation structure

Reviewed By: jdelliot

Differential Revision: D64086899

fbshipit-source-id: 650652c986f1418f8a9aea73df72ca4d54aff3f7
  • Loading branch information
genevievehelsel authored and facebook-github-bot committed Oct 10, 2024
1 parent d5107b1 commit fc2407d
Show file tree
Hide file tree
Showing 9 changed files with 74 additions and 93 deletions.
10 changes: 5 additions & 5 deletions watchman/Client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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&) {
}

Expand All @@ -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));

Expand Down
8 changes: 4 additions & 4 deletions watchman/PerfSample.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ struct RootMetadata {

template <typename T>
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 {
Expand Down
7 changes: 3 additions & 4 deletions watchman/SanityCheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand All @@ -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);
}
}
Expand Down
7 changes: 3 additions & 4 deletions watchman/query/eval.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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))
: "";
Expand Down
10 changes: 5 additions & 5 deletions watchman/root/ageout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
8 changes: 4 additions & 4 deletions watchman/root/iothread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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" : "");
Expand Down
28 changes: 13 additions & 15 deletions watchman/root/sync.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -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);
Expand Down
81 changes: 33 additions & 48 deletions watchman/telemetry/LogEvent.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,36 +24,15 @@ 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<int64_t, int64_t> getLogEventCounters(const LogEventType& type);

struct BaseEventData {
struct WatchmanBaseEvent : public TypedEvent {
// TODO: add system and user time for Unix systems
std::chrono::time_point<std::chrono::system_clock> start_time =
std::chrono::system_clock::now();
std::string root;
std::string error;
int64_t event_count = 1;

void populate(DynamicEvent& event) const {
void populate(DynamicEvent& event) const override {
std::chrono::duration<int64_t, std::nano> elapsed_time =
std::chrono::system_clock::now() - start_time;
event.addInt(
Expand All @@ -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()) {
Expand All @@ -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<int64_t, int64_t> 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);
Expand All @@ -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 {
Expand All @@ -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);
Expand All @@ -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);
}
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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;
Expand All @@ -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);
}
Expand Down Expand Up @@ -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 {
Expand All @@ -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);
}

Expand Down
8 changes: 4 additions & 4 deletions watchman/watcher/fsevents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,10 +139,10 @@ std::shared_ptr<FSEventsWatcher> watcherFromRoot(
static void log_drop_event(const std::shared_ptr<Root>& 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);

Expand Down

0 comments on commit fc2407d

Please sign in to comment.