sapling/eden/fs/telemetry/StructuredLogger.h
Chad Austin 987dd994b6 add a StructuredLogger instance to ServerState
Summary:
Allocate and hook up a StructuredLogger at startup if the EdenConfig
has the appropriate values set.

Reviewed By: simpkins

Differential Revision: D18071821

fbshipit-source-id: 3996b6644bbf0c16bb3b9950d57a79d4619a1656
2019-11-13 15:23:38 -08:00

53 lines
1.3 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This software may be used and distributed according to the terms of the
* GNU General Public License version 2.
*/
#pragma once
#include <unordered_map>
#include "eden/fs/telemetry/LogEvent.h"
#include "eden/fs/telemetry/SessionInfo.h"
namespace facebook {
namespace eden {
class StructuredLogger {
public:
explicit StructuredLogger(bool enabled, SessionInfo sessionInfo);
virtual ~StructuredLogger() = default;
template <typename Event>
void logEvent(const Event& event) {
// Avoid a bunch of work if it's going to be thrown away by the
// logDynamicEvent implementation.
if (!enabled_) {
return;
}
// constexpr to ensure that the type field on the Event struct is constexpr
// too.
constexpr const char* type = Event::type;
// TODO: consider moving the event to another thread and populating the
// default fields there to reduce latency at the call site.
DynamicEvent de{populateDefaultFields(type)};
event.populate(de);
logDynamicEvent(std::move(de));
}
private:
virtual void logDynamicEvent(DynamicEvent event) = 0;
DynamicEvent populateDefaultFields(const char* type);
bool enabled_;
uint32_t sessionId_;
SessionInfo sessionInfo_;
};
} // namespace eden
} // namespace facebook