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

Side by Side Diff: components/net_log/net_log_file_writer.cc

Issue 2698143004: Add ongoing events to net-export log when logging starts (Closed)
Patch Set: Added/improved some comments Created 3 years, 10 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
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/net_log/net_log_file_writer.h" 5 #include "components/net_log/net_log_file_writer.h"
6 6
7 #include <set>
7 #include <utility> 8 #include <utility>
8 9
9 #include "base/bind.h" 10 #include "base/bind.h"
10 #include "base/callback.h" 11 #include "base/callback.h"
11 #include "base/files/file_path.h" 12 #include "base/files/file_path.h"
12 #include "base/files/file_util.h" 13 #include "base/files/file_util.h"
13 #include "base/files/scoped_file.h" 14 #include "base/files/scoped_file.h"
14 #include "base/memory/ptr_util.h" 15 #include "base/memory/ptr_util.h"
15 #include "base/single_thread_task_runner.h" 16 #include "base/single_thread_task_runner.h"
16 #include "base/task_runner_util.h" 17 #include "base/task_runner_util.h"
17 #include "base/threading/thread_task_runner_handle.h" 18 #include "base/threading/thread_task_runner_handle.h"
18 #include "base/values.h" 19 #include "base/values.h"
19 #include "build/build_config.h" 20 #include "build/build_config.h"
20 #include "components/net_log/chrome_net_log.h" 21 #include "components/net_log/chrome_net_log.h"
21 #include "net/log/file_net_log_observer.h" 22 #include "net/log/file_net_log_observer.h"
22 #include "net/log/net_log_util.h" 23 #include "net/log/net_log_util.h"
23 #include "net/url_request/url_request_context_getter.h" 24 #include "net/url_request/url_request_context_getter.h"
24 25
26 namespace net {
27 class URLRequestContext;
28 }
29
25 namespace net_log { 30 namespace net_log {
26 31
27 namespace { 32 namespace {
28 33
29 // Path of logs relative to default temporary directory given by 34 // Path of logs relative to default temporary directory given by
30 // base::GetTempDir(). Must be kept in sync with 35 // base::GetTempDir(). Must be kept in sync with
31 // chrome/android/java/res/xml/file_paths.xml. Only used if not saving log file 36 // chrome/android/java/res/xml/file_paths.xml. Only used if not saving log file
32 // to a custom path. 37 // to a custom path.
33 const base::FilePath::CharType kLogRelativePath[] = 38 const base::FilePath::CharType kLogRelativePath[] =
34 FILE_PATH_LITERAL("net-export/chrome-net-export-log.json"); 39 FILE_PATH_LITERAL("net-export/chrome-net-export-log.json");
(...skipping 20 matching lines...) Expand all
55 results.default_log_path = default_base_dir.Append(kLogRelativePath); 60 results.default_log_path = default_base_dir.Append(kLogRelativePath);
56 if (!base::CreateDirectoryAndGetError(results.default_log_path.DirName(), 61 if (!base::CreateDirectoryAndGetError(results.default_log_path.DirName(),
57 nullptr)) 62 nullptr))
58 return results; 63 return results;
59 64
60 results.log_exists = base::PathExists(results.default_log_path); 65 results.log_exists = base::PathExists(results.default_log_path);
61 results.default_log_path_success = true; 66 results.default_log_path_success = true;
62 return results; 67 return results;
63 } 68 }
64 69
70 // Generates net log entries for ongoing events from |context_getters| and
71 // adds them to |observer|.
72 void CreateNetLogEntriesForActiveObjects(
73 const NetLogFileWriter::URLRequestContextGetterList& context_getters,
74 net::NetLog::ThreadSafeObserver* observer) {
75 std::set<net::URLRequestContext*> contexts;
76 for (const auto& getter : context_getters) {
77 contexts.insert(getter->GetURLRequestContext());
78 }
79 net::CreateNetLogEntriesForActiveObjects(contexts, observer);
80 }
81
65 // Adds net info from net::GetNetInfo() to |polled_data|. 82 // Adds net info from net::GetNetInfo() to |polled_data|.
66 std::unique_ptr<base::DictionaryValue> AddNetInfo( 83 std::unique_ptr<base::DictionaryValue> AddNetInfo(
67 scoped_refptr<net::URLRequestContextGetter> context_getter, 84 scoped_refptr<net::URLRequestContextGetter> context_getter,
68 std::unique_ptr<base::DictionaryValue> polled_data) { 85 std::unique_ptr<base::DictionaryValue> polled_data) {
69 DCHECK(context_getter); 86 DCHECK(context_getter);
70 std::unique_ptr<base::DictionaryValue> net_info = net::GetNetInfo( 87 std::unique_ptr<base::DictionaryValue> net_info = net::GetNetInfo(
71 context_getter->GetURLRequestContext(), net::NET_INFO_ALL_SOURCES); 88 context_getter->GetURLRequestContext(), net::NET_INFO_ALL_SOURCES);
72 if (polled_data) 89 if (polled_data)
73 net_info->MergeDictionary(polled_data.get()); 90 net_info->MergeDictionary(polled_data.get());
74 return net_info; 91 return net_info;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 } 138 }
122 139
123 void NetLogFileWriter::Initialize( 140 void NetLogFileWriter::Initialize(
124 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, 141 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner,
125 scoped_refptr<base::SingleThreadTaskRunner> net_task_runner) { 142 scoped_refptr<base::SingleThreadTaskRunner> net_task_runner) {
126 DCHECK(thread_checker_.CalledOnValidThread()); 143 DCHECK(thread_checker_.CalledOnValidThread());
127 DCHECK(file_task_runner); 144 DCHECK(file_task_runner);
128 DCHECK(net_task_runner); 145 DCHECK(net_task_runner);
129 146
130 if (file_task_runner_) 147 if (file_task_runner_)
131 DCHECK_EQ(file_task_runner, file_task_runner_); 148 DCHECK_EQ(file_task_runner_, file_task_runner);
132 file_task_runner_ = file_task_runner; 149 file_task_runner_ = file_task_runner;
133 if (net_task_runner_) 150 if (net_task_runner_)
134 DCHECK_EQ(net_task_runner, net_task_runner_); 151 DCHECK_EQ(net_task_runner_, net_task_runner);
135 net_task_runner_ = net_task_runner; 152 net_task_runner_ = net_task_runner;
136 153
137 if (state_ != STATE_UNINITIALIZED) 154 if (state_ != STATE_UNINITIALIZED)
138 return; 155 return;
139 156
140 state_ = STATE_INITIALIZING; 157 state_ = STATE_INITIALIZING;
141 158
142 NotifyStateObserversAsync(); 159 NotifyStateObserversAsync();
143 160
144 base::PostTaskAndReplyWithResult( 161 base::PostTaskAndReplyWithResult(
145 file_task_runner_.get(), FROM_HERE, 162 file_task_runner_.get(), FROM_HERE,
146 base::Bind(&SetUpDefaultLogPath, default_log_base_dir_getter_), 163 base::Bind(&SetUpDefaultLogPath, default_log_base_dir_getter_),
147 base::Bind(&NetLogFileWriter::SetStateAfterSetUpDefaultLogPath, 164 base::Bind(&NetLogFileWriter::SetStateAfterSetUpDefaultLogPath,
148 weak_ptr_factory_.GetWeakPtr())); 165 weak_ptr_factory_.GetWeakPtr()));
149 } 166 }
150 167
151 void NetLogFileWriter::StartNetLog(const base::FilePath& log_path, 168 void NetLogFileWriter::StartNetLog(
152 net::NetLogCaptureMode capture_mode) { 169 const base::FilePath& log_path,
170 net::NetLogCaptureMode capture_mode,
171 const URLRequestContextGetterList& context_getters) {
153 DCHECK(thread_checker_.CalledOnValidThread()); 172 DCHECK(thread_checker_.CalledOnValidThread());
154 DCHECK(file_task_runner_); 173 DCHECK(file_task_runner_);
155 174
156 if (state_ != STATE_NOT_LOGGING) 175 if (state_ != STATE_NOT_LOGGING)
157 return; 176 return;
158 177
159 if (!log_path.empty()) 178 if (!log_path.empty())
160 log_path_ = log_path; 179 log_path_ = log_path;
161 180
162 DCHECK(!log_path_.empty()); 181 DCHECK(!log_path_.empty());
163 182
183 state_ = STATE_STARTING_LOG;
eroman 2017/02/21 22:14:23 Can you explain the role of this new state? It do
wangyix1 2017/02/22 01:28:18 This state is needed so that while pending entries
184
185 NotifyStateObserversAsync();
186
187 std::unique_ptr<base::Value> constants(
188 ChromeNetLog::GetConstants(command_line_string_, channel_string_));
189 // Instantiate a FileNetLogObserver in unbounded mode.
190 file_net_log_observer_ = base::MakeUnique<net::FileNetLogObserver>(
191 file_task_runner_, log_path_, std::move(constants));
192
193 net_task_runner_->PostTaskAndReply(
194 FROM_HERE,
195 base::Bind(&CreateNetLogEntriesForActiveObjects, context_getters,
196 base::Unretained(file_net_log_observer_.get())),
197 base::Bind(
198 &NetLogFileWriter::StartNetLogAfterCreateEntriesForActiveObjects,
199 weak_ptr_factory_.GetWeakPtr(), capture_mode));
200 }
201
202 void NetLogFileWriter::StartNetLogAfterCreateEntriesForActiveObjects(
203 net::NetLogCaptureMode capture_mode) {
204 DCHECK(thread_checker_.CalledOnValidThread());
205 DCHECK_EQ(STATE_STARTING_LOG, state_);
206
164 state_ = STATE_LOGGING; 207 state_ = STATE_LOGGING;
165 log_exists_ = true; 208 log_exists_ = true;
166 log_capture_mode_known_ = true; 209 log_capture_mode_known_ = true;
167 log_capture_mode_ = capture_mode; 210 log_capture_mode_ = capture_mode;
168 211
169 NotifyStateObserversAsync(); 212 NotifyStateObservers();
170 213
171 std::unique_ptr<base::Value> constants( 214 file_net_log_observer_->StartObserving(chrome_net_log_, capture_mode);
172 ChromeNetLog::GetConstants(command_line_string_, channel_string_));
173 file_net_log_observer_ =
174 base::MakeUnique<net::FileNetLogObserver>(file_task_runner_);
175 file_net_log_observer_->StartObservingUnbounded(
176 chrome_net_log_, capture_mode, log_path_, std::move(constants), nullptr);
177 } 215 }
178 216
179 void NetLogFileWriter::StopNetLog( 217 void NetLogFileWriter::StopNetLog(
180 std::unique_ptr<base::DictionaryValue> polled_data, 218 std::unique_ptr<base::DictionaryValue> polled_data,
181 scoped_refptr<net::URLRequestContextGetter> context_getter) { 219 scoped_refptr<net::URLRequestContextGetter> context_getter) {
182 DCHECK(thread_checker_.CalledOnValidThread()); 220 DCHECK(thread_checker_.CalledOnValidThread());
183 DCHECK(net_task_runner_); 221 DCHECK(net_task_runner_);
184 222
185 if (state_ != STATE_LOGGING) 223 if (state_ != STATE_LOGGING)
186 return; 224 return;
(...skipping 26 matching lines...) Expand all
213 switch (state_) { 251 switch (state_) {
214 case STATE_UNINITIALIZED: 252 case STATE_UNINITIALIZED:
215 state_string = "UNINITIALIZED"; 253 state_string = "UNINITIALIZED";
216 break; 254 break;
217 case STATE_INITIALIZING: 255 case STATE_INITIALIZING:
218 state_string = "INITIALIZING"; 256 state_string = "INITIALIZING";
219 break; 257 break;
220 case STATE_NOT_LOGGING: 258 case STATE_NOT_LOGGING:
221 state_string = "NOT_LOGGING"; 259 state_string = "NOT_LOGGING";
222 break; 260 break;
261 case STATE_STARTING_LOG:
262 state_string = "STARTING_LOG";
263 break;
223 case STATE_LOGGING: 264 case STATE_LOGGING:
224 state_string = "LOGGING"; 265 state_string = "LOGGING";
225 break; 266 break;
226 case STATE_STOPPING_LOG: 267 case STATE_STOPPING_LOG:
227 state_string = "STOPPING_LOG"; 268 state_string = "STOPPING_LOG";
228 break; 269 break;
270 default:
eroman 2017/02/21 22:14:23 Why add the default case? We try to avoid specifyi
wangyix1 2017/02/22 01:28:18 Done.
271 NOTREACHED();
272 break;
229 } 273 }
230 dict->SetString("state", state_string); 274 dict->SetString("state", state_string);
231 275
232 dict->SetBoolean("logExists", log_exists_); 276 dict->SetBoolean("logExists", log_exists_);
233 dict->SetBoolean("logCaptureModeKnown", log_capture_mode_known_); 277 dict->SetBoolean("logCaptureModeKnown", log_capture_mode_known_);
234 dict->SetString("captureMode", CaptureModeToString(log_capture_mode_)); 278 dict->SetString("captureMode", CaptureModeToString(log_capture_mode_));
235 279
236 return dict; 280 return dict;
237 } 281 }
238 282
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 void NetLogFileWriter::NotifyStateObserversAsync() { 342 void NetLogFileWriter::NotifyStateObserversAsync() {
299 DCHECK(thread_checker_.CalledOnValidThread()); 343 DCHECK(thread_checker_.CalledOnValidThread());
300 base::ThreadTaskRunnerHandle::Get()->PostTask( 344 base::ThreadTaskRunnerHandle::Get()->PostTask(
301 FROM_HERE, base::Bind(&NetLogFileWriter::NotifyStateObservers, 345 FROM_HERE, base::Bind(&NetLogFileWriter::NotifyStateObservers,
302 weak_ptr_factory_.GetWeakPtr())); 346 weak_ptr_factory_.GetWeakPtr()));
303 } 347 }
304 348
305 void NetLogFileWriter::SetStateAfterSetUpDefaultLogPath( 349 void NetLogFileWriter::SetStateAfterSetUpDefaultLogPath(
306 const DefaultLogPathResults& set_up_default_log_path_results) { 350 const DefaultLogPathResults& set_up_default_log_path_results) {
307 DCHECK(thread_checker_.CalledOnValidThread()); 351 DCHECK(thread_checker_.CalledOnValidThread());
308 DCHECK_EQ(state_, STATE_INITIALIZING); 352 DCHECK_EQ(STATE_INITIALIZING, state_);
309 353
310 if (set_up_default_log_path_results.default_log_path_success) { 354 if (set_up_default_log_path_results.default_log_path_success) {
311 state_ = STATE_NOT_LOGGING; 355 state_ = STATE_NOT_LOGGING;
312 log_path_ = set_up_default_log_path_results.default_log_path; 356 log_path_ = set_up_default_log_path_results.default_log_path;
313 log_exists_ = set_up_default_log_path_results.log_exists; 357 log_exists_ = set_up_default_log_path_results.log_exists;
314 DCHECK(!log_capture_mode_known_); 358 DCHECK(!log_capture_mode_known_);
315 } else { 359 } else {
316 state_ = STATE_UNINITIALIZED; 360 state_ = STATE_UNINITIALIZED;
317 } 361 }
318 NotifyStateObservers(); 362 NotifyStateObservers();
319 } 363 }
320 364
321 void NetLogFileWriter::StopNetLogAfterAddNetInfo( 365 void NetLogFileWriter::StopNetLogAfterAddNetInfo(
322 std::unique_ptr<base::DictionaryValue> polled_data) { 366 std::unique_ptr<base::DictionaryValue> polled_data) {
323 DCHECK(thread_checker_.CalledOnValidThread()); 367 DCHECK(thread_checker_.CalledOnValidThread());
324 DCHECK_EQ(state_, STATE_STOPPING_LOG); 368 DCHECK_EQ(STATE_STOPPING_LOG, state_);
325 369
326 file_net_log_observer_->StopObserving( 370 file_net_log_observer_->StopObserving(
327 std::move(polled_data), 371 std::move(polled_data),
328 base::Bind(&NetLogFileWriter::ResetObserverThenSetStateNotLogging, 372 base::Bind(&NetLogFileWriter::ResetObserverThenSetStateNotLogging,
329 weak_ptr_factory_.GetWeakPtr())); 373 weak_ptr_factory_.GetWeakPtr()));
330 } 374 }
331 375
332 void NetLogFileWriter::ResetObserverThenSetStateNotLogging() { 376 void NetLogFileWriter::ResetObserverThenSetStateNotLogging() {
333 DCHECK(thread_checker_.CalledOnValidThread()); 377 DCHECK(thread_checker_.CalledOnValidThread());
334 file_net_log_observer_.reset(); 378 file_net_log_observer_.reset();
335 state_ = STATE_NOT_LOGGING; 379 state_ = STATE_NOT_LOGGING;
336 380
337 NotifyStateObservers(); 381 NotifyStateObservers();
338 } 382 }
339 383
340 } // namespace net_log 384 } // namespace net_log
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698