| 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 |