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

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: Forgot to update comment for StopNetLog() 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());
eroman 2017/02/22 02:03:29 Can you add: DCHECK(getter->GetNetworkTaskRunne
wangyix1 2017/02/23 02:14:57 Done.
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;
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_ = net::FileNetLogObserver::CreateUnbounded(
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;
229 } 270 }
230 dict->SetString("state", state_string); 271 dict->SetString("state", state_string);
231 272
232 dict->SetBoolean("logExists", log_exists_); 273 dict->SetBoolean("logExists", log_exists_);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 void NetLogFileWriter::NotifyStateObserversAsync() { 339 void NetLogFileWriter::NotifyStateObserversAsync() {
299 DCHECK(thread_checker_.CalledOnValidThread()); 340 DCHECK(thread_checker_.CalledOnValidThread());
300 base::ThreadTaskRunnerHandle::Get()->PostTask( 341 base::ThreadTaskRunnerHandle::Get()->PostTask(
301 FROM_HERE, base::Bind(&NetLogFileWriter::NotifyStateObservers, 342 FROM_HERE, base::Bind(&NetLogFileWriter::NotifyStateObservers,
302 weak_ptr_factory_.GetWeakPtr())); 343 weak_ptr_factory_.GetWeakPtr()));
303 } 344 }
304 345
305 void NetLogFileWriter::SetStateAfterSetUpDefaultLogPath( 346 void NetLogFileWriter::SetStateAfterSetUpDefaultLogPath(
306 const DefaultLogPathResults& set_up_default_log_path_results) { 347 const DefaultLogPathResults& set_up_default_log_path_results) {
307 DCHECK(thread_checker_.CalledOnValidThread()); 348 DCHECK(thread_checker_.CalledOnValidThread());
308 DCHECK_EQ(state_, STATE_INITIALIZING); 349 DCHECK_EQ(STATE_INITIALIZING, state_);
309 350
310 if (set_up_default_log_path_results.default_log_path_success) { 351 if (set_up_default_log_path_results.default_log_path_success) {
311 state_ = STATE_NOT_LOGGING; 352 state_ = STATE_NOT_LOGGING;
312 log_path_ = set_up_default_log_path_results.default_log_path; 353 log_path_ = set_up_default_log_path_results.default_log_path;
313 log_exists_ = set_up_default_log_path_results.log_exists; 354 log_exists_ = set_up_default_log_path_results.log_exists;
314 DCHECK(!log_capture_mode_known_); 355 DCHECK(!log_capture_mode_known_);
315 } else { 356 } else {
316 state_ = STATE_UNINITIALIZED; 357 state_ = STATE_UNINITIALIZED;
317 } 358 }
318 NotifyStateObservers(); 359 NotifyStateObservers();
319 } 360 }
320 361
321 void NetLogFileWriter::StopNetLogAfterAddNetInfo( 362 void NetLogFileWriter::StopNetLogAfterAddNetInfo(
322 std::unique_ptr<base::DictionaryValue> polled_data) { 363 std::unique_ptr<base::DictionaryValue> polled_data) {
323 DCHECK(thread_checker_.CalledOnValidThread()); 364 DCHECK(thread_checker_.CalledOnValidThread());
324 DCHECK_EQ(state_, STATE_STOPPING_LOG); 365 DCHECK_EQ(STATE_STOPPING_LOG, state_);
325 366
326 file_net_log_observer_->StopObserving( 367 file_net_log_observer_->StopObserving(
327 std::move(polled_data), 368 std::move(polled_data),
328 base::Bind(&NetLogFileWriter::ResetObserverThenSetStateNotLogging, 369 base::Bind(&NetLogFileWriter::ResetObserverThenSetStateNotLogging,
329 weak_ptr_factory_.GetWeakPtr())); 370 weak_ptr_factory_.GetWeakPtr()));
330 } 371 }
331 372
332 void NetLogFileWriter::ResetObserverThenSetStateNotLogging() { 373 void NetLogFileWriter::ResetObserverThenSetStateNotLogging() {
333 DCHECK(thread_checker_.CalledOnValidThread()); 374 DCHECK(thread_checker_.CalledOnValidThread());
334 file_net_log_observer_.reset(); 375 file_net_log_observer_.reset();
335 state_ = STATE_NOT_LOGGING; 376 state_ = STATE_NOT_LOGGING;
336 377
337 NotifyStateObservers(); 378 NotifyStateObservers();
338 } 379 }
339 380
340 } // namespace net_log 381 } // namespace net_log
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698