Skip to content

Commit 5bc9386

Browse files
Ilia Cherniavskiifacebook-github-bot
authored andcommitted
Support for trace metadata (#192)
Summary: Pull Request resolved: #192 Add user-defined metadata api Reviewed By: gdankel Differential Revision: D27906278 fbshipit-source-id: 601de1e6f7ce61ed2cc62dd7d9a4bd3d4c955286
1 parent b4e71c3 commit 5bc9386

11 files changed

+80
-12
lines changed

libkineto/include/ActivityProfilerInterface.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ class ActivityProfilerInterface {
8181
// Maps kernel thread id -> pthread id for CPU ops.
8282
// Client must record any new kernel thread where the activity has occured.
8383
virtual void recordThreadInfo(pid_t tid, pthread_t pthreadId) {}
84+
85+
// Record trace metadata, currently supporting only string key and values,
86+
// values with the same key are overwritten
87+
virtual void addMetadata(const std::string& key, const std::string& value) = 0;
8488
};
8589

8690
} // namespace libkineto

libkineto/src/ActivityProfiler.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ void ActivityProfiler::processTraceInternal(ActivityLogger& logger) {
127127
<< " CPU buffers";
128128
VLOG(0) << "Profile time range: " << captureWindowStartTime_ << " - "
129129
<< captureWindowEndTime_;
130+
logger.handleTraceStart(metadata_);
130131
for (auto& cpu_trace : traceBuffers_->cpu) {
131132
string trace_name = cpu_trace->span.name;
132133
VLOG(0) << "Processing CPU buffer for " << trace_name << " ("
@@ -696,6 +697,7 @@ void ActivityProfiler::finalizeTrace(const Config& config, ActivityLogger& logge
696697
}
697698
}
698699
}
700+
699701
// Thread info
700702
for (auto pair : threadInfo_) {
701703
const auto& thread_info = pair.second;
@@ -728,6 +730,7 @@ void ActivityProfiler::resetTraceData() {
728730
clientActivityTraceMap_.clear();
729731
disabledTraceSpans_.clear();
730732
traceBuffers_ = nullptr;
733+
metadata_.clear();
731734
}
732735

733736

libkineto/src/ActivityProfiler.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ class ActivityProfiler {
111111
}
112112
}
113113

114+
void addMetadata(const std::string& key, const std::string& value) {
115+
std::lock_guard<std::mutex> guard(mutex_);
116+
metadata_[key] = value;
117+
}
118+
114119
private:
115120
class ExternalEventMap {
116121
public:
@@ -366,6 +371,9 @@ class ActivityProfiler {
366371
// Buffers where trace data is stored
367372
std::unique_ptr<ActivityBuffers> traceBuffers_;
368373

374+
// Trace metadata
375+
std::unordered_map<std::string, std::string> metadata_;
376+
369377
};
370378

371379
} // namespace KINETO_NAMESPACE

libkineto/src/ActivityProfilerController.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,9 @@ std::unique_ptr<ActivityTraceInterface> ActivityProfilerController::stopTrace()
147147
return std::make_unique<ActivityTrace>(std::move(logger), CuptiActivityInterface::singleton());
148148
}
149149

150+
void ActivityProfilerController::addMetadata(
151+
const std::string& key, const std::string& value) {
152+
profiler_->addMetadata(key, value);
153+
}
154+
150155
} // namespace KINETO_NAMESPACE

libkineto/src/ActivityProfilerController.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,11 @@ class ActivityProfilerController {
5858
}
5959

6060
void recordThreadInfo(pid_t tid, pthread_t pthreadId) {
61-
profiler_->recordThreadInfo(tid, pthreadId);
61+
profiler_->recordThreadInfo(tid, pthreadId);
6262
}
6363

64+
void addMetadata(const std::string& key, const std::string& value);
65+
6466
private:
6567
void profilerLoop();
6668

libkineto/src/ActivityProfilerProxy.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,12 @@ bool ActivityProfilerProxy::enableForRegion(const std::string& match) {
8585
}
8686

8787
void ActivityProfilerProxy::recordThreadInfo(pid_t tid, pthread_t pthreadId) {
88-
controller_->recordThreadInfo(tid, pthreadId);
88+
controller_->recordThreadInfo(tid, pthreadId);
89+
}
90+
91+
void ActivityProfilerProxy::addMetadata(
92+
const std::string& key, const std::string& value) {
93+
controller_->addMetadata(key, value);
8994
}
9095

9196
} // namespace libkineto

libkineto/src/ActivityProfilerProxy.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ class ActivityProfilerProxy : public ActivityProfilerInterface {
6060

6161
bool enableForRegion(const std::string& match) override;
6262

63+
void addMetadata(const std::string& key, const std::string& value) override;
64+
6365
private:
6466
bool cpuOnly_{true};
6567
ActivityProfilerController* controller_{nullptr};

libkineto/src/output_base.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ class ActivityLogger {
6767
const GpuActivity<CUpti_ActivityMemset>& activity) = 0;
6868
#endif // HAS_CUPTI
6969

70+
virtual void handleTraceStart(
71+
const std::unordered_map<std::string, std::string>& metadata) = 0;
72+
73+
void handleTraceStart() {
74+
handleTraceStart(std::unordered_map<std::string, std::string>());
75+
}
76+
7077
virtual void finalizeTrace(
7178
const KINETO_NAMESPACE::Config& config,
7279
std::unique_ptr<ActivityBuffers> buffers,

libkineto/src/output_json.cpp

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,28 +31,48 @@ namespace KINETO_NAMESPACE {
3131

3232
static constexpr int kSchemaVersion = 1;
3333

34-
static void writeHeader(std::ofstream& stream) {
35-
stream << fmt::format(R"JSON(
34+
void ChromeTraceLogger::handleTraceStart(
35+
const std::unordered_map<std::string, std::string>& metadata) {
36+
traceOf_ << fmt::format(R"JSON(
3637
{{
3738
"schemaVersion": {},
38-
"traceEvents": [
3939
)JSON", kSchemaVersion);
40+
41+
if (!metadata.empty()) {
42+
traceOf_ << R"JSON(
43+
"metadata": {
44+
)JSON";
45+
bool first = true;
46+
for (const auto& kv : metadata) {
47+
if (!first) {
48+
traceOf_ << ",\n";
49+
}
50+
traceOf_ << fmt::format(R"( "{}": "{}")", kv.first, kv.second);
51+
first = false;
52+
}
53+
traceOf_ << R"JSON(
54+
},
55+
)JSON";
56+
}
57+
58+
traceOf_ << R"JSON(
59+
"traceEvents": [
60+
)JSON";
4061
}
4162

42-
static void openTraceFile(std::string& name, std::ofstream& stream) {
43-
stream.open(name, std::ofstream::out | std::ofstream::trunc);
44-
if (!stream) {
45-
PLOG(ERROR) << "Failed to open '" << name << "'";
63+
void ChromeTraceLogger::openTraceFile() {
64+
traceOf_.open(fileName_, std::ofstream::out | std::ofstream::trunc);
65+
if (!traceOf_) {
66+
PLOG(ERROR) << "Failed to open '" << fileName_ << "'";
4667
} else {
47-
LOG(INFO) << "Tracing to " << name;
48-
writeHeader(stream);
68+
LOG(INFO) << "Tracing to " << fileName_;
4969
}
5070
}
5171

5272
ChromeTraceLogger::ChromeTraceLogger(const std::string& traceFileName, int smCount)
5373
: fileName_(traceFileName), pid_(getpid()) {
5474
traceOf_.clear(std::ios_base::badbit);
55-
openTraceFile(fileName_, traceOf_);
75+
openTraceFile();
5676
#ifdef HAS_CUPTI
5777
smCount_ = CuptiActivityInterface::singleton().smCount();
5878
#endif

libkineto/src/output_json.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ class ChromeTraceLogger : public libkineto::ActivityLogger {
6060
void handleGpuActivity(const GpuActivity<CUpti_ActivityMemset>& activity) override;
6161
#endif // HAS_CUPTI
6262

63+
void handleTraceStart(
64+
const std::unordered_map<std::string, std::string>& metadata) override;
65+
6366
void finalizeTrace(
6467
const Config& config,
6568
std::unique_ptr<ActivityBuffers> buffers,
@@ -73,6 +76,8 @@ class ChromeTraceLogger : public libkineto::ActivityLogger {
7376
void handleLinkEnd(const TraceActivity& e);
7477
#endif // HAS_CUPTI
7578

79+
void openTraceFile();
80+
7681
std::string fileName_;
7782
std::ofstream traceOf_;
7883

0 commit comments

Comments
 (0)