23 #ifndef OMNISCI_THRIFTHANDLER_QUERYSTATE_H
24 #define OMNISCI_THRIFTHANDLER_QUERYSTATE_H
29 #include <boost/circular_buffer.hpp>
30 #include <boost/filesystem.hpp>
31 #include <boost/noncopyable.hpp>
32 #include <boost/optional.hpp>
33 #include <boost/preprocessor.hpp>
81 namespace Catalog_Namespace {
85 namespace query_state {
87 using Clock = std::chrono::steady_clock;
100 template <
typename Units = std::chrono::milliseconds>
101 boost::optional<typename Units::rep>
duration()
const {
102 auto const stop_time =
stopped.load();
103 return boost::make_optional(
104 stop_time != Clock::duration::zero(),
105 std::chrono::duration_cast<Units>(stop_time -
started).count());
123 SessionData(std::shared_ptr<Catalog_Namespace::SessionInfo const>
const&);
128 class QueryState :
public std::enable_shared_from_this<QueryState> {
137 void logCallStack(std::stringstream&,
unsigned const depth, Events::iterator parent);
140 QueryState(std::shared_ptr<Catalog_Namespace::SessionInfo const>
const&,
141 std::string query_str);
144 template <
typename... ARGS>
150 return std::make_shared<EnableMakeShared>(std::forward<ARGS>(
args)...);
188 using CircleBuffer = boost::circular_buffer<std::shared_ptr<QueryState>>;
194 template <
typename... ARGS>
219 Timer(std::shared_ptr<QueryState>&&, Events::iterator event);
235 #define STDLOG(...) \
236 BOOST_PP_IF(BOOST_PP_IS_EMPTY(__VA_ARGS__), \
237 query_state::StdLog(__FILE__, __LINE__, __func__), \
238 query_state::StdLog(__FILE__, __LINE__, __func__, __VA_ARGS__))
249 template <
typename... Pairs>
257 static_assert(
sizeof...(Pairs) % 2 == 0,
258 "StdLogData() requires an even number of name/value parameters.");
270 template <
typename... Pairs>
274 std::shared_ptr<Catalog_Namespace::SessionInfo> session_info,
276 :
StdLogData(file, line, func, std::forward<Pairs>(pairs)...)
281 template <
typename... Pairs>
285 std::shared_ptr<Catalog_Namespace::SessionInfo> session_info,
286 std::shared_ptr<QueryState> query_state,
288 :
StdLogData(file, line, func, std::forward<Pairs>(pairs)...)
294 template <
typename... Pairs>
298 std::shared_ptr<QueryState> query_state,
300 :
StdLogData(file, line, func, std::forward<Pairs>(pairs)...)
304 template <
typename... Pairs>
305 StdLog(
char const* file,
unsigned line,
char const* func, Pairs&&... pairs)
306 :
StdLogData(file, line, func, std::forward<Pairs>(pairs)...) {
312 template <
typename... Pairs>
314 static_assert(
sizeof...(Pairs) % 2 == 0,
315 "appendNameValuePairs() requires an even number of parameters.");
317 {
to_string(std::forward<Pairs>(pairs))...});
319 template <
typename Units = std::chrono::milliseconds>
321 return std::chrono::duration_cast<Units>(Clock::now() -
start_).count();
324 std::shared_ptr<Catalog_Namespace::SessionInfo>
getSessionInfo()
const;
326 void setSessionInfo(std::shared_ptr<Catalog_Namespace::SessionInfo>);
331 #endif // OMNISCI_THRIFTHANDLER_QUERYSTATE_H
boost::optional< SessionData > session_data_
std::shared_ptr< QueryState > query_state_
void logCallStack(std::stringstream &, unsigned const depth, Events::iterator parent)
QueryStateProxy createQueryStateProxy()
boost::optional< SessionData > const & getSessionData() const
const QueryState & getConstQueryState() const
std::string const & getQueryStr() const
logger::QueryId const id_
Events::iterator const parent_
Clock::duration const started
static std::shared_ptr< QueryState > create(ARGS &&...args)
void setQuerySubmittedTime(const std::string &t)
Timer & operator=(Timer const &)=delete
CircleBuffer::value_type create(ARGS &&...args)
Events::iterator const parent
void setSessionInfo(std::shared_ptr< Catalog_Namespace::SessionInfo >)
Timer createTimer(char const *event_name)
logger::QidScopeGuard setThreadLocalQueryId() const
QueryState(std::shared_ptr< Catalog_Namespace::SessionInfo const > const &, std::string query_str)
Units::rep duration() const
std::atomic< Clock::duration > stopped
std::list< std::string > name_value_pairs_
StdLogData(char const *file, unsigned line, char const *func, Pairs &&...pairs)
logger::QueryId getId() const
void setLogged(bool logged)
boost::circular_buffer< std::shared_ptr< QueryState >> CircleBuffer
std::string const query_str_
static logger::Severity stdlogBeginSeverity(char const *func)
QueryState & getQueryState()
void setQueryState(std::shared_ptr< QueryState >)
StdLog(char const *file, unsigned line, char const *func, std::shared_ptr< Catalog_Namespace::SessionInfo > session_info, Pairs &&...pairs)
void logCallStack(logger::Severity, char const *label)
std::shared_ptr< Catalog_Namespace::SessionInfo > getSessionInfo() const
QueryStateProxy(QueryState &query_state, Events::iterator parent)
std::thread::id const thread_id
Timer(std::shared_ptr< QueryState > &&, Events::iterator event)
StdLog(char const *file, unsigned line, char const *func, std::shared_ptr< QueryState > query_state, Pairs &&...pairs)
QueryStateProxy createQueryStateProxy()
std::shared_ptr< Catalog_Namespace::SessionInfo > session_info_
std::weak_ptr< Catalog_Namespace::SessionInfo const > session_info
std::list< Event > Events
Event(char const *const name, Events::iterator parent)
void appendNameValuePairs(Pairs &&...pairs)
static std::atomic< int64_t > s_match
QueryState & query_state_
boost::optional< typename Units::rep > duration() const
std::shared_ptr< QueryState > query_state_
static std::atomic< logger::QueryId > s_next_id
std::string filename(char const *path)
Clock::time_point const start_
std::function< void(Event const &)> EventFunction
StdLog(char const *file, unsigned line, char const *func, std::shared_ptr< Catalog_Namespace::SessionInfo > session_info, std::shared_ptr< QueryState > query_state, Pairs &&...pairs)
StdLog(char const *file, unsigned line, char const *func, Pairs &&...pairs)
std::string public_session_id
void log(logger::Severity, char const *label)
std::shared_ptr< Catalog_Namespace::SessionInfo const > getConstSessionInfo() const
CircleBuffer circle_buffer_
std::shared_ptr< Catalog_Namespace::SessionInfo const > getConstSessionInfo() const
Timer createTimer(char const *event_name, Events::iterator parent)
std::chrono::steady_clock Clock
const std::string getQuerySubmittedTime() const
std::atomic< bool > logged_