ClickHouse/src/Interpreters/TraceCollector.cpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

147 lines
3.9 KiB
C++
Raw Normal View History

2019-02-03 09:57:12 +00:00
#include "TraceCollector.h"
2019-07-05 13:48:47 +00:00
#include <Core/Field.h>
2020-01-16 12:37:29 +00:00
#include <IO/ReadBufferFromFileDescriptor.h>
#include <IO/ReadHelpers.h>
#include <IO/WriteBufferFromFileDescriptor.h>
#include <IO/WriteHelpers.h>
#include <Interpreters/TraceLog.h>
2019-07-05 13:48:47 +00:00
#include <Poco/Logger.h>
#include <Common/ProfileEvents.h>
2020-11-11 18:30:17 +00:00
#include <Common/setThreadName.h>
2022-04-27 15:05:45 +00:00
#include <Common/logger_useful.h>
2019-02-03 21:30:45 +00:00
2019-07-24 02:02:10 +00:00
2019-07-10 20:47:39 +00:00
namespace DB
{
TraceCollector::TraceCollector(std::shared_ptr<TraceLog> trace_log_)
: trace_log(std::move(trace_log_))
2019-07-10 20:47:39 +00:00
{
TraceSender::pipe.open();
2019-07-24 02:02:10 +00:00
/** Turn write end of pipe to non-blocking mode to avoid deadlocks
* when QueryProfiler is invoked under locks and TraceCollector cannot pull data from pipe.
*/
TraceSender::pipe.setNonBlockingWrite();
TraceSender::pipe.tryIncreaseSize(1 << 20);
2019-07-24 02:02:10 +00:00
2019-07-10 20:47:39 +00:00
thread = ThreadFromGlobalPool(&TraceCollector::run, this);
}
void TraceCollector::tryClosePipe()
2019-07-10 20:47:39 +00:00
{
try
{
TraceSender::pipe.close();
}
catch (...)
{
tryLogCurrentException("TraceCollector");
}
}
2019-02-03 09:57:12 +00:00
2019-07-10 20:47:39 +00:00
TraceCollector::~TraceCollector()
2019-07-05 13:48:47 +00:00
{
try
{
/** Sends TraceCollector stop message
*
* Each sequence of data for TraceCollector thread starts with a boolean flag.
* If this flag is true, TraceCollector must stop reading trace_pipe and exit.
* This function sends flag with a true value to stop TraceCollector gracefully.
*/
WriteBufferFromFileDescriptor out(TraceSender::pipe.fds_rw[1]);
writeChar(true, out);
out.next();
}
catch (...)
{
tryLogCurrentException("TraceCollector");
}
tryClosePipe();
2023-05-04 13:07:28 +00:00
2023-05-08 12:39:01 +00:00
if (thread.joinable())
thread.join();
else
LOG_ERROR(&Poco::Logger::get("TraceCollector"), "TraceCollector thread is malformed and cannot be joined");
2019-07-05 13:48:47 +00:00
}
2019-02-03 09:57:12 +00:00
2019-07-05 13:48:47 +00:00
void TraceCollector::run()
{
2020-11-11 18:30:17 +00:00
setThreadName("TraceCollector");
ReadBufferFromFileDescriptor in(TraceSender::pipe.fds_rw[0]);
2020-01-16 12:37:29 +00:00
try
2019-07-05 13:48:47 +00:00
{
while (true)
{
char is_last;
readChar(is_last, in);
if (is_last)
break;
std::string query_id;
UInt8 query_id_size = 0;
readBinary(query_id_size, in);
query_id.resize(query_id_size);
in.readStrict(query_id.data(), query_id_size);
UInt8 trace_size = 0;
readIntBinary(trace_size, in);
Array trace;
trace.reserve(trace_size);
for (size_t i = 0; i < trace_size; ++i)
{
uintptr_t addr = 0;
readPODBinary(addr, in);
trace.emplace_back(static_cast<UInt64>(addr));
}
TraceType trace_type;
readPODBinary(trace_type, in);
UInt64 thread_id;
readPODBinary(thread_id, in);
Int64 size;
readPODBinary(size, in);
UInt64 ptr;
readPODBinary(ptr, in);
ProfileEvents::Event event;
readPODBinary(event, in);
ProfileEvents::Count increment;
readPODBinary(increment, in);
if (trace_log)
{
// time and time_in_microseconds are both being constructed from the same timespec so that the
// times will be equal up to the precision of a second.
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
UInt64 time = static_cast<UInt64>(ts.tv_sec * 1000000000LL + ts.tv_nsec);
UInt64 time_in_microseconds = static_cast<UInt64>((ts.tv_sec * 1000000LL) + (ts.tv_nsec / 1000));
TraceLogElement element{time_t(time / 1000000000), time_in_microseconds, time, trace_type, thread_id, query_id, trace, size, ptr, event, increment};
2023-07-28 07:23:34 +00:00
trace_log->add(std::move(element));
}
2020-01-23 09:42:58 +00:00
}
2019-02-03 09:57:12 +00:00
}
catch (...)
{
tryClosePipe();
throw;
}
2019-02-03 09:57:12 +00:00
}
2019-07-10 20:47:39 +00:00
}