Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(92)

Side by Side Diff: base/trace_event/trace_event_etw_export_win.cc

Issue 1038453002: Add option to export tracing events to ETW. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add compiling manifest to GYP/GN. Formatting and other minor fixes. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/trace_event/trace_event_etw_export_win.h"
6
7 #include "base/command_line.h"
8 #include "base/logging.h"
9 #include "base/memory/singleton.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "base/trace_event/etw_manifest/chrome_events_win.h" // In SHARED_INTER MEDIATE_DIR.
12 #include "base/trace_event/trace_event.h"
13 #include "base/trace_event/trace_event_impl.h"
14
15 #include <evntprov.h> // NOLINT
16 #include <initguid.h> // NOLINT
17
18 namespace base {
19 namespace trace_event {
20
21 TraceEventETWExport::TraceEventETWExport() : ETWExportEnabled_(false) {
22 EventRegisterChrome();
23 }
24
25 TraceEventETWExport::~TraceEventETWExport() {
26 EventUnregisterChrome();
27 }
28
29 // static
30 TraceEventETWExport* TraceEventETWExport::GetInstance() {
31 return Singleton<TraceEventETWExport,
32 StaticMemorySingletonTraits<TraceEventETWExport>>::get();
33 }
34
35 // static
36 void TraceEventETWExport::EnableETWExport() {
37 GetInstance()->ETWExportEnabled_ = true;
38 }
39
40 // static
41 void TraceEventETWExport::DisableETWExport() {
42 GetInstance()->ETWExportEnabled_ = false;
43 }
44
45 // static
46 void TraceEventETWExport::AddEvent(
47 char phase,
48 const unsigned char* category_group_enabled,
49 const char* name,
50 unsigned long long id,
51 int num_args,
52 const char** arg_names,
53 const unsigned char* arg_types,
54 const unsigned long long* arg_values,
55 const scoped_refptr<ConvertableToTraceFormat>* convertable_values) {
56 // We bail early in case exporting is disabled or no consumer is listening.
57 if (!GetInstance()->ETWExportEnabled_ || !EventEnabledChromeEvent())
58 return;
59
60 std::string phase_string = "Unknown";
61 switch (phase) {
62 case TRACE_EVENT_PHASE_BEGIN:
dsinclair 2015/03/26 18:18:17 This seems fragile to me. This list is going to ge
Georges Khalil 2015/03/26 23:09:19 I added a default statement that outputs the code.
63 phase_string = "Begin";
64 break;
65 case TRACE_EVENT_PHASE_END:
66 phase_string = "End";
67 break;
68 case TRACE_EVENT_PHASE_COMPLETE:
69 phase_string = "Complete";
70 break;
71 case TRACE_EVENT_PHASE_INSTANT:
72 phase_string = "Instant";
73 break;
74 case TRACE_EVENT_PHASE_ASYNC_BEGIN:
75 phase_string = "Async Begin";
76 break;
77 case TRACE_EVENT_PHASE_ASYNC_STEP_INTO:
78 phase_string = "Async Step Into";
79 break;
80 case TRACE_EVENT_PHASE_ASYNC_STEP_PAST:
81 phase_string = "Async Step Past";
82 break;
83 case TRACE_EVENT_PHASE_ASYNC_END:
84 phase_string = "Async End";
85 break;
86 case TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN:
87 phase_string = "NEStable Async Begin";
88 break;
89 case TRACE_EVENT_PHASE_NESTABLE_ASYNC_END:
90 phase_string = "NEStable Async End";
91 break;
92 case TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT:
93 phase_string = "NEStable Async Instant";
94 break;
95 case TRACE_EVENT_PHASE_FLOW_BEGIN:
96 phase_string = "Phase Flow Begin";
97 break;
98 case TRACE_EVENT_PHASE_FLOW_STEP:
99 phase_string = "Phase Flow Step";
100 break;
101 case TRACE_EVENT_PHASE_FLOW_END:
102 phase_string = "Phase Flow End";
103 break;
104 case TRACE_EVENT_PHASE_METADATA:
105 phase_string = "Phase Metadata";
106 break;
107 case TRACE_EVENT_PHASE_COUNTER:
108 phase_string = "Phase Counter";
109 break;
110 case TRACE_EVENT_PHASE_SAMPLE:
111 phase_string = "Phase Sample";
112 break;
113 case TRACE_EVENT_PHASE_CREATE_OBJECT:
114 phase_string = "Phase Create Object";
115 break;
116 case TRACE_EVENT_PHASE_SNAPSHOT_OBJECT:
117 phase_string = "Phase Snapshot Object";
118 break;
119 case TRACE_EVENT_PHASE_DELETE_OBJECT:
120 phase_string = "Phase Delete Object";
121 break;
122 }
123
124 std::string arg_values_string[3];
125 for (int i = 0; i < num_args; i++) {
126 if (arg_types[i] == TRACE_VALUE_TYPE_CONVERTABLE) {
127 convertable_values[i]->AppendAsTraceFormat(arg_values_string + i);
128 } else {
129 TraceEvent::TraceValue trace_event;
130 trace_event.as_uint = arg_values[i];
131 TraceEvent::AppendValueAsJSON(arg_types[i], trace_event,
132 arg_values_string + i);
133 }
134 }
135
136 EventWriteChromeEvent(
137 name, phase_string.c_str(), num_args > 0 ? arg_names[0] : "",
138 arg_values_string[0].c_str(), num_args > 1 ? arg_names[1] : "",
139 arg_values_string[1].c_str(), num_args > 2 ? arg_names[2] : "",
140 arg_values_string[2].c_str());
141 }
142
143 // static
144 void TraceEventETWExport::AddCustomEvent(const char* name,
145 char const* phase,
146 const char* arg_name_1,
147 const char* arg_value_1,
148 const char* arg_name_2,
149 const char* arg_value_2,
150 const char* arg_name_3,
151 const char* arg_value_3) {
152 if (!GetInstance()->ETWExportEnabled_ || !EventEnabledChromeEvent())
153 return;
154
155 EventWriteChromeEvent(name, phase, arg_name_1, arg_value_1, arg_name_2,
156 arg_value_2, arg_name_3, arg_value_3);
157 }
158
159 void TraceEventETWExport::Resurrect() {
160 StaticMemorySingletonTraits<TraceEventETWExport>::Resurrect();
161 }
162
163 } // namespace trace_event
164 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698