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

Side by Side Diff: net/log/net_log.h

Issue 2333923004: Extracting NetLog inner classes into their own classes. (Closed)
Patch Set: Some nit fixes and better, impl-agnostic naming of net_log_parameters_callback_typedef.h -> net/log… Created 4 years, 2 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #ifndef NET_LOG_NET_LOG_H_ 5 #ifndef NET_LOG_NET_LOG_H_
6 #define NET_LOG_NET_LOG_H_ 6 #define NET_LOG_NET_LOG_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <memory>
11 #include <string> 10 #include <string>
12 11
13 #include "base/atomicops.h" 12 #include "base/atomicops.h"
14 #include "base/callback_forward.h"
15 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
16 #include "base/macros.h" 14 #include "base/macros.h"
17 #include "base/observer_list.h" 15 #include "base/observer_list.h"
18 #include "base/strings/string16.h" 16 #include "base/strings/string16.h"
19 #include "base/synchronization/lock.h" 17 #include "base/synchronization/lock.h"
20 #include "base/time/time.h" 18 #include "base/time/time.h"
21 #include "build/build_config.h" 19 #include "build/build_config.h"
22 #include "net/base/net_export.h" 20 #include "net/base/net_export.h"
23 #include "net/log/net_log_capture_mode.h" 21 #include "net/log/net_log_capture_mode.h"
22 #include "net/log/net_log_entry.h"
24 #include "net/log/net_log_event_type.h" 23 #include "net/log/net_log_event_type.h"
24 #include "net/log/net_log_parameters_callback.h"
25 #include "net/log/net_log_source.h"
25 #include "net/log/net_log_source_type.h" 26 #include "net/log/net_log_source_type.h"
26 27
27 namespace base { 28 namespace base {
28 class DictionaryValue; 29 class DictionaryValue;
29 class Value; 30 class Value;
30 } 31 }
31 32
32 namespace net { 33 namespace net {
33 34
34 // NetLog is the destination for log messages generated by the network stack. 35 // NetLog is the destination for log messages generated by the network stack.
35 // Each log message has a "source" field which identifies the specific entity 36 // Each log message has a "source" field which identifies the specific entity
36 // that generated the message (for example, which URLRequest or which 37 // that generated the message (for example, which URLRequest or which
37 // SpdySession). 38 // SpdySession).
38 // 39 //
39 // To avoid needing to pass in the "source ID" to the logging functions, NetLog 40 // To avoid needing to pass in the "source ID" to the logging functions, NetLog
40 // is usually accessed through a NetLogWithSource, which will always pass in a 41 // is usually accessed through a NetLogWithSource, which will always pass in a
41 // specific source ID. 42 // specific source ID.
42 // 43 //
43 // All methods are thread safe, with the exception that no NetLog or 44 // All methods are thread safe, with the exception that no NetLog or
44 // NetLog::ThreadSafeObserver functions may be called by an observer's 45 // NetLog::ThreadSafeObserver functions may be called by an observer's
45 // OnAddEntry() method. Doing so will result in a deadlock. 46 // OnAddEntry() method. Doing so will result in a deadlock.
46 // 47 //
47 // For a broader introduction see the design document: 48 // For a broader introduction see the design document:
48 // https://sites.google.com/a/chromium.org/dev/developers/design-documents/netwo rk-stack/netlog 49 // https://sites.google.com/a/chromium.org/dev/developers/design-documents/netwo rk-stack/netlog
49 class NET_EXPORT NetLog { 50 class NET_EXPORT NetLog {
50 public: 51 public:
51 52
52 // A callback that returns a Value representation of the parameters
53 // associated with an event. If called, it will be called synchronously,
54 // so it need not have owning references. May be called more than once, or
55 // not at all. May return NULL.
56 typedef base::Callback<std::unique_ptr<base::Value>(NetLogCaptureMode)>
57 ParametersCallback;
58
59 // Identifies the entity that generated this log. The |id| field should
60 // uniquely identify the source, and is used by log observers to infer
61 // message groupings. Can use NetLog::NextID() to create unique IDs.
62 struct NET_EXPORT Source {
63 static const uint32_t kInvalidId;
64
65 Source();
66 Source(NetLogSourceType type, uint32_t id);
67 bool IsValid() const;
68
69 // Adds the source to a DictionaryValue containing event parameters,
70 // using the name "source_dependency".
71 void AddToEventParameters(base::DictionaryValue* event_params) const;
72
73 // Returns a callback that returns a dictionary with a single entry
74 // named "source_dependency" that describes |this|.
75 ParametersCallback ToEventParametersCallback() const;
76
77 // Attempts to extract a Source from a set of event parameters. Returns
78 // true and writes the result to |source| on success. Returns false and
79 // makes |source| an invalid source on failure.
80 // TODO(mmenke): Long term, we want to remove this.
81 static bool FromEventParameters(base::Value* event_params, Source* source);
82
83 NetLogSourceType type;
84 uint32_t id;
85 };
86
87 struct NET_EXPORT EntryData {
88 EntryData(NetLogEventType type,
89 Source source,
90 NetLogEventPhase phase,
91 base::TimeTicks time,
92 const ParametersCallback* parameters_callback);
93 ~EntryData();
94
95 const NetLogEventType type;
96 const Source source;
97 const NetLogEventPhase phase;
98 const base::TimeTicks time;
99 const ParametersCallback* const parameters_callback;
100 };
101
102 // An Entry pre-binds EntryData to a capture mode, so observers will observe
103 // the output of ToValue() and ParametersToValue() at their log capture mode
104 // rather than the current maximum.
105 class NET_EXPORT Entry {
106 public:
107 Entry(const EntryData* data, NetLogCaptureMode capture_mode);
108 ~Entry();
109
110 NetLogEventType type() const { return data_->type; }
111 Source source() const { return data_->source; }
112 NetLogEventPhase phase() const { return data_->phase; }
113
114 // Serializes the specified event to a Value. The Value also includes the
115 // current time. Takes in a time to allow back-dating entries.
116 std::unique_ptr<base::Value> ToValue() const;
117
118 // Returns the parameters as a Value. Returns NULL if there are no
119 // parameters.
120 std::unique_ptr<base::Value> ParametersToValue() const;
121
122 private:
123 const EntryData* const data_;
124
125 // Log capture mode when the event occurred.
126 const NetLogCaptureMode capture_mode_;
127
128 // It is not safe to copy this class, since |parameters_callback_| may
129 // include pointers that become stale immediately after the event is added,
130 // even if the code were modified to keep its own copy of the callback.
131 DISALLOW_COPY_AND_ASSIGN(Entry);
132 };
133
134 // An observer that is notified of entries added to the NetLog. The 53 // An observer that is notified of entries added to the NetLog. The
135 // "ThreadSafe" prefix of the name emphasizes that this observer may be 54 // "ThreadSafe" prefix of the name emphasizes that this observer may be
136 // called from different threads then the one which added it as an observer. 55 // called from different threads then the one which added it as an observer.
137 class NET_EXPORT ThreadSafeObserver { 56 class NET_EXPORT ThreadSafeObserver {
138 public: 57 public:
139 // Constructs an observer that wants to see network events, with 58 // Constructs an observer that wants to see network events, with
140 // the specified minimum event granularity. A ThreadSafeObserver can only 59 // the specified minimum event granularity. A ThreadSafeObserver can only
141 // observe a single NetLog at a time. 60 // observe a single NetLog at a time.
142 // 61 //
143 // Observers will be called on the same thread an entry is added on, 62 // Observers will be called on the same thread an entry is added on,
(...skipping 18 matching lines...) Expand all
162 // 81 //
163 // Whenever OnAddEntry() is invoked, the NetLog's mutex is held. The 82 // Whenever OnAddEntry() is invoked, the NetLog's mutex is held. The
164 // consequences of this are: 83 // consequences of this are:
165 // 84 //
166 // * OnAddEntry() will never be called concurrently -- implementations 85 // * OnAddEntry() will never be called concurrently -- implementations
167 // can rely on this to avoid needing their own synchronization. 86 // can rely on this to avoid needing their own synchronization.
168 // 87 //
169 // * It is illegal for an observer to call back into the NetLog, or the 88 // * It is illegal for an observer to call back into the NetLog, or the
170 // observer itself, as this can result in deadlock or violating 89 // observer itself, as this can result in deadlock or violating
171 // expectations of non re-entrancy into ThreadSafeObserver. 90 // expectations of non re-entrancy into ThreadSafeObserver.
172 virtual void OnAddEntry(const Entry& entry) = 0; 91 virtual void OnAddEntry(const NetLogEntry& entry) = 0;
173 92
174 protected: 93 protected:
175 virtual ~ThreadSafeObserver(); 94 virtual ~ThreadSafeObserver();
176 95
177 private: 96 private:
178 friend class NetLog; 97 friend class NetLog;
179 98
180 void OnAddEntryData(const EntryData& entry_data); 99 void OnAddEntryData(const NetLogEntryData& entry_data);
181 100
182 // Both of these values are only modified by the NetLog. 101 // Both of these values are only modified by the NetLog.
183 NetLogCaptureMode capture_mode_; 102 NetLogCaptureMode capture_mode_;
184 NetLog* net_log_; 103 NetLog* net_log_;
185 104
186 DISALLOW_COPY_AND_ASSIGN(ThreadSafeObserver); 105 DISALLOW_COPY_AND_ASSIGN(ThreadSafeObserver);
187 }; 106 };
188 107
189 NetLog(); 108 NetLog();
190 virtual ~NetLog(); 109 virtual ~NetLog();
191 110
192 // Emits a global event to the log stream, with its own unique source ID. 111 // Emits a global event to the log stream, with its own unique source ID.
193 void AddGlobalEntry(NetLogEventType type); 112 void AddGlobalEntry(NetLogEventType type);
194 void AddGlobalEntry(NetLogEventType type, 113 void AddGlobalEntry(NetLogEventType type,
195 const NetLog::ParametersCallback& parameters_callback); 114 const NetLogParametersCallback& parameters_callback);
196 115
197 // Returns a unique ID which can be used as a source ID. All returned IDs 116 // Returns a unique ID which can be used as a source ID. All returned IDs
198 // will be unique and greater than 0. 117 // will be unique and greater than 0.
199 uint32_t NextID(); 118 uint32_t NextID();
200 119
201 // Returns true if there are any observers attached to the NetLog. This can be 120 // Returns true if there are any observers attached to the NetLog. This can be
202 // used as an optimization to avoid emitting log entries when there is no 121 // used as an optimization to avoid emitting log entries when there is no
203 // chance that the data will be consumed. 122 // chance that the data will be consumed.
204 bool IsCapturing() const; 123 bool IsCapturing() const;
205 124
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 // Returns a C-String symbolic name for |source_type|. 161 // Returns a C-String symbolic name for |source_type|.
243 static const char* SourceTypeToString(NetLogSourceType source_type); 162 static const char* SourceTypeToString(NetLogSourceType source_type);
244 163
245 // Returns a dictionary that maps source type symbolic names to their enum 164 // Returns a dictionary that maps source type symbolic names to their enum
246 // values. Caller takes ownership of the returned Value. 165 // values. Caller takes ownership of the returned Value.
247 static base::Value* GetSourceTypesAsValue(); 166 static base::Value* GetSourceTypesAsValue();
248 167
249 // Returns a C-String symbolic name for |event_phase|. 168 // Returns a C-String symbolic name for |event_phase|.
250 static const char* EventPhaseToString(NetLogEventPhase event_phase); 169 static const char* EventPhaseToString(NetLogEventPhase event_phase);
251 170
252 // Creates a ParametersCallback that encapsulates a single bool. 171 // Creates a NetLogParametersCallback that encapsulates a single bool.
253 // Warning: |name| must remain valid for the life of the callback. 172 // Warning: |name| must remain valid for the life of the callback.
254 static ParametersCallback BoolCallback(const char* name, bool value); 173 static NetLogParametersCallback BoolCallback(const char* name, bool value);
255 174
256 // Warning: |name| must remain valid for the life of the callback. 175 // Warning: |name| must remain valid for the life of the callback.
257 static ParametersCallback IntCallback(const char* name, int value); 176 static NetLogParametersCallback IntCallback(const char* name, int value);
258 177
259 // Creates a ParametersCallback that encapsulates a single int64_t. The 178 // Creates a NetLogParametersCallback that encapsulates a single int64_t. The
260 // callback will return the value as a StringValue, since IntegerValues 179 // callback will return the value as a StringValue, since IntegerValues
261 // only support 32-bit values. 180 // only support 32-bit values.
262 // Warning: |name| must remain valid for the life of the callback. 181 // Warning: |name| must remain valid for the life of the callback.
263 static ParametersCallback Int64Callback(const char* name, int64_t value); 182 static NetLogParametersCallback Int64Callback(const char* name,
183 int64_t value);
264 184
265 // Creates a ParametersCallback that encapsulates a single UTF8 string. Takes 185 // Creates a NetLogParametersCallback that encapsulates a single UTF8 string.
186 // Takes
266 // |value| as a pointer to avoid copying, and emphasize it must be valid for 187 // |value| as a pointer to avoid copying, and emphasize it must be valid for
267 // the life of the callback. |value| may not be NULL. 188 // the life of the callback. |value| may not be NULL.
268 // Warning: |name| and |value| must remain valid for the life of the callback. 189 // Warning: |name| and |value| must remain valid for the life of the callback.
269 static ParametersCallback StringCallback(const char* name, 190 static NetLogParametersCallback StringCallback(const char* name,
270 const std::string* value); 191 const std::string* value);
271 static ParametersCallback StringCallback(const char* name, const char* value); 192 static NetLogParametersCallback StringCallback(const char* name,
193 const char* value);
272 194
273 // Same as above, but takes in a UTF16 string. 195 // Same as above, but takes in a UTF16 string.
274 static ParametersCallback StringCallback(const char* name, 196 static NetLogParametersCallback StringCallback(const char* name,
275 const base::string16* value); 197 const base::string16* value);
276 198
277 private: 199 private:
278 friend class NetLogWithSource; 200 friend class NetLogWithSource;
279 201
280 void AddEntry(NetLogEventType type, 202 void AddEntry(NetLogEventType type,
281 const Source& source, 203 const NetLogSource& source,
282 NetLogEventPhase phase, 204 NetLogEventPhase phase,
283 const NetLog::ParametersCallback* parameters_callback); 205 const NetLogParametersCallback* parameters_callback);
284 206
285 // Called whenever an observer is added or removed, to update 207 // Called whenever an observer is added or removed, to update
286 // |has_observers_|. Must have acquired |lock_| prior to calling. 208 // |has_observers_|. Must have acquired |lock_| prior to calling.
287 void UpdateIsCapturing(); 209 void UpdateIsCapturing();
288 210
289 // |lock_| protects access to |observers_|. 211 // |lock_| protects access to |observers_|.
290 base::Lock lock_; 212 base::Lock lock_;
291 213
292 // Last assigned source ID. Incremented to get the next one. 214 // Last assigned source ID. Incremented to get the next one.
293 base::subtle::Atomic32 last_id_; 215 base::subtle::Atomic32 last_id_;
294 216
295 // |is_capturing_| will be 0 when there are no observers watching the NetLog, 217 // |is_capturing_| will be 0 when there are no observers watching the NetLog,
296 // 1 otherwise. Note that this is stored as an Atomic32 rather than a boolean 218 // 1 otherwise. Note that this is stored as an Atomic32 rather than a boolean
297 // so it can be accessed without needing a lock. 219 // so it can be accessed without needing a lock.
298 base::subtle::Atomic32 is_capturing_; 220 base::subtle::Atomic32 is_capturing_;
299 221
300 // |lock_| must be acquired whenever reading or writing to this. 222 // |lock_| must be acquired whenever reading or writing to this.
301 base::ObserverList<ThreadSafeObserver, true> observers_; 223 base::ObserverList<ThreadSafeObserver, true> observers_;
302 224
303 DISALLOW_COPY_AND_ASSIGN(NetLog); 225 DISALLOW_COPY_AND_ASSIGN(NetLog);
304 }; 226 };
305 227
306 // Helper that binds a Source to a NetLog, and exposes convenience methods to
307 // output log messages without needing to pass in the source.
308 class NET_EXPORT NetLogWithSource {
309 public:
310 NetLogWithSource() : net_log_(NULL) {}
311 ~NetLogWithSource();
312
313 // Add a log entry to the NetLog for the bound source.
314 void AddEntry(NetLogEventType type, NetLogEventPhase phase) const;
315 void AddEntry(NetLogEventType type,
316 NetLogEventPhase phase,
317 const NetLog::ParametersCallback& get_parameters) const;
318
319 // Convenience methods that call AddEntry with a fixed "capture phase"
320 // (begin, end, or none).
321 void BeginEvent(NetLogEventType type) const;
322 void BeginEvent(NetLogEventType type,
323 const NetLog::ParametersCallback& get_parameters) const;
324
325 void EndEvent(NetLogEventType type) const;
326 void EndEvent(NetLogEventType type,
327 const NetLog::ParametersCallback& get_parameters) const;
328
329 void AddEvent(NetLogEventType type) const;
330 void AddEvent(NetLogEventType type,
331 const NetLog::ParametersCallback& get_parameters) const;
332
333 // Just like AddEvent, except |net_error| is a net error code. A parameter
334 // called "net_error" with the indicated value will be recorded for the event.
335 // |net_error| must be negative, and not ERR_IO_PENDING, as it's not a true
336 // error.
337 void AddEventWithNetErrorCode(NetLogEventType event_type,
338 int net_error) const;
339
340 // Just like EndEvent, except |net_error| is a net error code. If it's
341 // negative, a parameter called "net_error" with a value of |net_error| is
342 // associated with the event. Otherwise, the end event has no parameters.
343 // |net_error| must not be ERR_IO_PENDING, as it's not a true error.
344 void EndEventWithNetErrorCode(NetLogEventType event_type,
345 int net_error) const;
346
347 // Logs a byte transfer event to the NetLog. Determines whether to log the
348 // received bytes or not based on the current logging level.
349 void AddByteTransferEvent(NetLogEventType event_type,
350 int byte_count,
351 const char* bytes) const;
352
353 bool IsCapturing() const;
354
355 // Helper to create a NetLogWithSource given a NetLog and a NetLogSourceType.
356 // Takes care of creating a unique source ID, and handles
357 // the case of NULL net_log.
358 static NetLogWithSource Make(NetLog* net_log, NetLogSourceType source_type);
359
360 const NetLog::Source& source() const { return source_; }
361 NetLog* net_log() const { return net_log_; }
362
363 private:
364 // TODO(eroman): Temporary until crbug.com/467797 is solved.
365 enum Liveness {
366 ALIVE = 0xCA11AB13,
367 DEAD = 0xDEADBEEF,
368 };
369
370 NetLogWithSource(const NetLog::Source& source, NetLog* net_log)
371 : source_(source), net_log_(net_log) {}
372
373 // TODO(eroman): Temporary until crbug.com/467797 is solved.
374 void CrashIfInvalid() const;
375
376 NetLog::Source source_;
377 NetLog* net_log_;
378
379 // TODO(eroman): Temporary until crbug.com/467797 is solved.
380 Liveness liveness_ = ALIVE;
381 };
382
383 } // namespace net 228 } // namespace net
384 229
385 #endif // NET_LOG_NET_LOG_H_ 230 #endif // NET_LOG_NET_LOG_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698