OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/browser/api/cast_channel/logger.h" | 5 #include "extensions/browser/api/cast_channel/logger.h" |
6 | 6 |
7 #include "base/strings/string_util.h" | 7 #include "base/strings/string_util.h" |
8 #include "base/time/tick_clock.h" | 8 #include "base/time/tick_clock.h" |
9 #include "extensions/browser/api/cast_channel/cast_auth_util.h" | 9 #include "extensions/browser/api/cast_channel/cast_auth_util.h" |
10 #include "extensions/browser/api/cast_channel/logger_util.h" | 10 #include "extensions/browser/api/cast_channel/logger_util.h" |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 } // namespace | 101 } // namespace |
102 | 102 |
103 Logger::AggregatedSocketEventLog::AggregatedSocketEventLog() { | 103 Logger::AggregatedSocketEventLog::AggregatedSocketEventLog() { |
104 } | 104 } |
105 | 105 |
106 Logger::AggregatedSocketEventLog::~AggregatedSocketEventLog() { | 106 Logger::AggregatedSocketEventLog::~AggregatedSocketEventLog() { |
107 } | 107 } |
108 | 108 |
109 Logger::Logger(scoped_ptr<base::TickClock> clock, | 109 Logger::Logger(scoped_ptr<base::TickClock> clock, |
110 base::TimeTicks unix_epoch_time_ticks) | 110 base::TimeTicks unix_epoch_time_ticks) |
111 : clock_(clock.Pass()), | 111 : clock_(clock.Pass()), unix_epoch_time_ticks_(unix_epoch_time_ticks) { |
112 unix_epoch_time_ticks_(unix_epoch_time_ticks), | |
113 num_evicted_aggregated_socket_events_(0), | |
114 num_evicted_socket_events_(0) { | |
115 DCHECK(clock_); | 112 DCHECK(clock_); |
116 | 113 |
117 // Logger may not be necessarily be created on the IO thread, but logging | 114 // Logger may not be necessarily be created on the IO thread, but logging |
118 // happens exclusively there. | 115 // happens exclusively there. |
119 thread_checker_.DetachFromThread(); | 116 thread_checker_.DetachFromThread(); |
120 } | 117 } |
121 | 118 |
122 Logger::~Logger() { | 119 Logger::~Logger() { |
123 } | 120 } |
124 | 121 |
125 void Logger::LogNewSocketEvent(const CastSocket& cast_socket) { | 122 void Logger::LogNewSocketEvent(const CastSocket& cast_socket) { |
126 DCHECK(thread_checker_.CalledOnValidThread()); | 123 DCHECK(thread_checker_.CalledOnValidThread()); |
127 | 124 |
128 int channel_id = cast_socket.id(); | 125 int channel_id = cast_socket.id(); |
129 SocketEvent event = CreateEvent(proto::CAST_SOCKET_CREATED); | 126 SocketEvent event = CreateEvent(proto::CAST_SOCKET_CREATED); |
130 LogSocketEvent(channel_id, event); | 127 AggregatedSocketEvent& aggregated_socket_event = |
| 128 LogSocketEvent(channel_id, event); |
131 | 129 |
132 AggregatedSocketEvent& aggregated_socket_event = | |
133 aggregated_socket_events_.find(channel_id) | |
134 ->second->aggregated_socket_event; | |
135 const net::IPAddressNumber& ip = cast_socket.ip_endpoint().address(); | 130 const net::IPAddressNumber& ip = cast_socket.ip_endpoint().address(); |
136 aggregated_socket_event.set_endpoint_id(ip.back()); | 131 aggregated_socket_event.set_endpoint_id(ip.back()); |
137 aggregated_socket_event.set_channel_auth_type(cast_socket.channel_auth() == | 132 aggregated_socket_event.set_channel_auth_type(cast_socket.channel_auth() == |
138 CHANNEL_AUTH_TYPE_SSL | 133 CHANNEL_AUTH_TYPE_SSL |
139 ? proto::SSL | 134 ? proto::SSL |
140 : proto::SSL_VERIFIED); | 135 : proto::SSL_VERIFIED); |
141 } | 136 } |
142 | 137 |
143 void Logger::LogSocketEvent(int channel_id, EventType event_type) { | 138 void Logger::LogSocketEvent(int channel_id, EventType event_type) { |
144 DCHECK(thread_checker_.CalledOnValidThread()); | 139 DCHECK(thread_checker_.CalledOnValidThread()); |
(...skipping 14 matching lines...) Expand all Loading... |
159 } | 154 } |
160 | 155 |
161 void Logger::LogSocketEventWithRv(int channel_id, | 156 void Logger::LogSocketEventWithRv(int channel_id, |
162 EventType event_type, | 157 EventType event_type, |
163 int rv) { | 158 int rv) { |
164 DCHECK(thread_checker_.CalledOnValidThread()); | 159 DCHECK(thread_checker_.CalledOnValidThread()); |
165 | 160 |
166 SocketEvent event = CreateEvent(event_type); | 161 SocketEvent event = CreateEvent(event_type); |
167 event.set_net_return_value(rv); | 162 event.set_net_return_value(rv); |
168 | 163 |
169 LogSocketEvent(channel_id, event); | 164 AggregatedSocketEvent& aggregated_socket_event = |
| 165 LogSocketEvent(channel_id, event); |
| 166 |
| 167 if ((event_type == proto::SOCKET_READ || event_type == proto::SOCKET_WRITE) && |
| 168 rv > 0) { |
| 169 if (event_type == proto::SOCKET_READ) { |
| 170 aggregated_socket_event.set_bytes_read( |
| 171 aggregated_socket_event.bytes_read() + rv); |
| 172 } else { |
| 173 aggregated_socket_event.set_bytes_written( |
| 174 aggregated_socket_event.bytes_written() + rv); |
| 175 } |
| 176 } |
170 } | 177 } |
171 | 178 |
172 void Logger::LogSocketReadyState(int channel_id, proto::ReadyState new_state) { | 179 void Logger::LogSocketReadyState(int channel_id, proto::ReadyState new_state) { |
173 DCHECK(thread_checker_.CalledOnValidThread()); | 180 DCHECK(thread_checker_.CalledOnValidThread()); |
174 | 181 |
175 SocketEvent event = CreateEvent(proto::READY_STATE_CHANGED); | 182 SocketEvent event = CreateEvent(proto::READY_STATE_CHANGED); |
176 event.set_ready_state(new_state); | 183 event.set_ready_state(new_state); |
177 | 184 |
178 LogSocketEvent(channel_id, event); | 185 LogSocketEvent(channel_id, event); |
179 } | 186 } |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 } | 250 } |
244 | 251 |
245 SocketEvent Logger::CreateEvent(EventType event_type) { | 252 SocketEvent Logger::CreateEvent(EventType event_type) { |
246 SocketEvent event; | 253 SocketEvent event; |
247 event.set_type(event_type); | 254 event.set_type(event_type); |
248 event.set_timestamp_micros(clock_->NowTicks().ToInternalValue() - | 255 event.set_timestamp_micros(clock_->NowTicks().ToInternalValue() - |
249 unix_epoch_time_ticks_.ToInternalValue()); | 256 unix_epoch_time_ticks_.ToInternalValue()); |
250 return event; | 257 return event; |
251 } | 258 } |
252 | 259 |
253 void Logger::LogSocketEvent(int channel_id, const SocketEvent& socket_event) { | 260 AggregatedSocketEvent& Logger::LogSocketEvent(int channel_id, |
| 261 const SocketEvent& socket_event) { |
254 AggregatedSocketEventLogMap::iterator it = | 262 AggregatedSocketEventLogMap::iterator it = |
255 aggregated_socket_events_.find(channel_id); | 263 aggregated_socket_events_.find(channel_id); |
256 if (it == aggregated_socket_events_.end()) { | 264 if (it == aggregated_socket_events_.end()) { |
257 if (aggregated_socket_events_.size() >= kMaxSocketsToLog) { | 265 if (aggregated_socket_events_.size() >= kMaxSocketsToLog) { |
258 AggregatedSocketEventLogMap::iterator erase_it = | 266 AggregatedSocketEventLogMap::iterator erase_it = |
259 aggregated_socket_events_.begin(); | 267 aggregated_socket_events_.begin(); |
260 | 268 |
261 num_evicted_aggregated_socket_events_++; | 269 log_.set_num_evicted_aggregated_socket_events( |
262 num_evicted_socket_events_ += erase_it->second->socket_events.size(); | 270 log_.num_evicted_aggregated_socket_events() + 1); |
| 271 log_.set_num_evicted_socket_events( |
| 272 log_.num_evicted_socket_events() + |
| 273 erase_it->second->socket_events.size()); |
263 | 274 |
264 aggregated_socket_events_.erase(erase_it); | 275 aggregated_socket_events_.erase(erase_it); |
265 } | 276 } |
266 | 277 |
267 it = aggregated_socket_events_ | 278 it = aggregated_socket_events_ |
268 .insert(std::make_pair( | 279 .insert(std::make_pair( |
269 channel_id, make_linked_ptr(new AggregatedSocketEventLog))) | 280 channel_id, make_linked_ptr(new AggregatedSocketEventLog))) |
270 .first; | 281 .first; |
271 it->second->aggregated_socket_event.set_id(channel_id); | 282 it->second->aggregated_socket_event.set_id(channel_id); |
272 } | 283 } |
273 | 284 |
274 std::deque<proto::SocketEvent>& socket_events = it->second->socket_events; | 285 std::deque<proto::SocketEvent>& socket_events = it->second->socket_events; |
275 if (socket_events.size() >= kMaxEventsPerSocket) { | 286 if (socket_events.size() >= kMaxEventsPerSocket) { |
276 socket_events.pop_front(); | 287 socket_events.pop_front(); |
277 num_evicted_socket_events_++; | 288 log_.set_num_evicted_socket_events(log_.num_evicted_socket_events() + 1); |
278 } | 289 } |
279 | 290 |
280 socket_events.push_back(socket_event); | 291 socket_events.push_back(socket_event); |
281 | 292 |
282 it->second->last_errors.event_type = socket_event.type(); | 293 it->second->last_errors.event_type = socket_event.type(); |
283 if (socket_event.has_net_return_value()) { | 294 if (socket_event.has_net_return_value()) { |
284 it->second->last_errors.net_return_value = socket_event.net_return_value(); | 295 it->second->last_errors.net_return_value = socket_event.net_return_value(); |
285 } | 296 } |
286 if (socket_event.has_challenge_reply_error_type()) { | 297 if (socket_event.has_challenge_reply_error_type()) { |
287 it->second->last_errors.challenge_reply_error_type = | 298 it->second->last_errors.challenge_reply_error_type = |
288 socket_event.challenge_reply_error_type(); | 299 socket_event.challenge_reply_error_type(); |
289 } | 300 } |
290 if (socket_event.has_nss_error_code()) | 301 if (socket_event.has_nss_error_code()) |
291 it->second->last_errors.nss_error_code = socket_event.nss_error_code(); | 302 it->second->last_errors.nss_error_code = socket_event.nss_error_code(); |
| 303 |
| 304 return it->second->aggregated_socket_event; |
292 } | 305 } |
293 | 306 |
294 scoped_ptr<char[]> Logger::GetLogs(size_t* length) const { | 307 scoped_ptr<char[]> Logger::GetLogs(size_t* length) const { |
295 *length = 0; | 308 *length = 0; |
296 | 309 |
297 Log log; | 310 Log log; |
298 log.set_num_evicted_aggregated_socket_events( | 311 // Copy "global" values from |log_|. Don't use |log_| directly since this |
299 num_evicted_aggregated_socket_events_); | 312 // function is const. |
300 log.set_num_evicted_socket_events(num_evicted_socket_events_); | 313 log.CopyFrom(log_); |
301 | 314 |
302 for (AggregatedSocketEventLogMap::const_iterator it = | 315 for (AggregatedSocketEventLogMap::const_iterator it = |
303 aggregated_socket_events_.begin(); | 316 aggregated_socket_events_.begin(); |
304 it != aggregated_socket_events_.end(); | 317 it != aggregated_socket_events_.end(); |
305 ++it) { | 318 ++it) { |
306 AggregatedSocketEvent* new_aggregated_socket_event = | 319 AggregatedSocketEvent* new_aggregated_socket_event = |
307 log.add_aggregated_socket_event(); | 320 log.add_aggregated_socket_event(); |
308 new_aggregated_socket_event->CopyFrom(it->second->aggregated_socket_event); | 321 new_aggregated_socket_event->CopyFrom(it->second->aggregated_socket_event); |
309 | 322 |
310 const std::deque<SocketEvent>& socket_events = it->second->socket_events; | 323 const std::deque<SocketEvent>& socket_events = it->second->socket_events; |
(...skipping 11 matching lines...) Expand all Loading... |
322 if (!log.SerializeToString(&serialized)) { | 335 if (!log.SerializeToString(&serialized)) { |
323 VLOG(2) << "Failed to serialized proto to string."; | 336 VLOG(2) << "Failed to serialized proto to string."; |
324 return scoped_ptr<char[]>(); | 337 return scoped_ptr<char[]>(); |
325 } | 338 } |
326 | 339 |
327 return Compress(serialized, length); | 340 return Compress(serialized, length); |
328 } | 341 } |
329 | 342 |
330 void Logger::Reset() { | 343 void Logger::Reset() { |
331 aggregated_socket_events_.clear(); | 344 aggregated_socket_events_.clear(); |
332 num_evicted_aggregated_socket_events_ = 0; | 345 log_.Clear(); |
333 num_evicted_socket_events_ = 0; | |
334 } | 346 } |
335 | 347 |
336 LastErrors Logger::GetLastErrors(int channel_id) const { | 348 LastErrors Logger::GetLastErrors(int channel_id) const { |
337 AggregatedSocketEventLogMap::const_iterator it = | 349 AggregatedSocketEventLogMap::const_iterator it = |
338 aggregated_socket_events_.find(channel_id); | 350 aggregated_socket_events_.find(channel_id); |
339 if (it != aggregated_socket_events_.end()) { | 351 if (it != aggregated_socket_events_.end()) { |
340 return it->second->last_errors; | 352 return it->second->last_errors; |
341 } else { | 353 } else { |
342 return LastErrors(); | 354 return LastErrors(); |
343 } | 355 } |
344 } | 356 } |
345 | 357 |
346 } // namespace cast_channel | 358 } // namespace cast_channel |
347 } // namespace api | 359 } // namespace api |
348 } // namespace extensions | 360 } // namespace extensions |
OLD | NEW |