16 #include <QtCore/QString>
17 #include <QtCore/QVariantMap>
18 #include <QtCore/QHash>
19 #include <QtCore/QSet>
20 #include <QtCore/QLoggingCategory>
22 #include "DependencyManager.h"
28 using TraceTimestamp = uint64_t;
30 enum EventType :
char {
38 AsyncNestableStart =
'b',
39 AsyncNestableInstant =
'n',
40 AsyncNestableEnd =
'e',
50 ObjectDestroyed =
'D',
54 MemoryDumpGlobal =
'V',
55 MemoryDumpProcess =
'v',
72 const QLoggingCategory& category;
76 void writeJson(QTextStream& out)
const;
79 class Tracer :
public Dependency {
82 void traceEvent(
const QLoggingCategory& category,
83 const QString& name, EventType type,
84 const QString&
id =
"",
85 const QVariantMap& args = QVariantMap(),
const QVariantMap& extra = QVariantMap());
87 void traceEvent(
const QLoggingCategory& category,
88 const QString& name, EventType type,
90 const QString&
id =
"",
91 const QVariantMap& args = QVariantMap(),
const QVariantMap& extra = QVariantMap());
95 void serialize(
const QString& file);
96 bool isEnabled()
const {
return _enabled; }
99 void traceEvent(
const QLoggingCategory& category,
100 const QString& name, EventType type,
101 qint64 timestamp, qint64 processID, qint64 threadID,
102 const QString&
id =
"",
103 const QVariantMap& args = QVariantMap(),
const QVariantMap& extra = QVariantMap());
105 bool _enabled {
false };
106 std::list<TraceEvent> _events;
107 std::list<TraceEvent> _metadataEvents;
108 std::mutex _eventsMutex;
111 inline void traceEvent(
const QLoggingCategory& category, int64_t timestamp,
const QString& name, EventType type,
const QString&
id =
"",
const QVariantMap& args = {},
const QVariantMap& extra = {}) {
112 if (!DependencyManager::isSet<Tracer>()) {
115 const auto& tracer = DependencyManager::get<Tracer>();
117 tracer->traceEvent(category, name, type, timestamp,
id, args, extra);
121 inline void traceEvent(
const QLoggingCategory& category,
const QString& name, EventType type,
const QString&
id =
"",
const QVariantMap& args = {},
const QVariantMap& extra = {}) {
122 if (!DependencyManager::isSet<Tracer>()) {
125 const auto& tracer = DependencyManager::get<Tracer>();
127 tracer->traceEvent(category, name, type,
id, args, extra);
131 inline void traceEvent(
const QLoggingCategory& category,
const QString& name, EventType type,
int id,
const QVariantMap& args = {},
const QVariantMap& extra = {}) {
132 traceEvent(category, name, type, QString::number(
id), args, extra);