Chromium Code Reviews| 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 | 10 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 57 | 57 |
| 58 } // namespace | 58 } // namespace |
| 59 | 59 |
| 60 Logger::AggregatedSocketEventLog::AggregatedSocketEventLog() { | 60 Logger::AggregatedSocketEventLog::AggregatedSocketEventLog() { |
| 61 } | 61 } |
| 62 Logger::AggregatedSocketEventLog::~AggregatedSocketEventLog() { | 62 Logger::AggregatedSocketEventLog::~AggregatedSocketEventLog() { |
| 63 } | 63 } |
| 64 | 64 |
| 65 Logger::Logger(scoped_ptr<base::TickClock> clock, | 65 Logger::Logger(scoped_ptr<base::TickClock> clock, |
| 66 base::TimeTicks unix_epoch_time_ticks) | 66 base::TimeTicks unix_epoch_time_ticks) |
| 67 : clock_(clock.Pass()), | 67 : clock_(clock.Pass()), unix_epoch_time_ticks_(unix_epoch_time_ticks) { |
| 68 unix_epoch_time_ticks_(unix_epoch_time_ticks), | |
| 69 num_evicted_aggregated_socket_events_(0), | |
| 70 num_evicted_socket_events_(0) { | |
| 71 DCHECK(clock_); | 68 DCHECK(clock_); |
| 72 | 69 |
| 73 // Logger may not be necessarily be created on the IO thread, but logging | 70 // Logger may not be necessarily be created on the IO thread, but logging |
| 74 // happens exclusively there. | 71 // happens exclusively there. |
| 75 thread_checker_.DetachFromThread(); | 72 thread_checker_.DetachFromThread(); |
| 76 } | 73 } |
| 77 | 74 |
| 78 Logger::~Logger() { | 75 Logger::~Logger() { |
| 79 } | 76 } |
| 80 | 77 |
| 81 void Logger::LogNewSocketEvent(const CastSocket& cast_socket) { | 78 void Logger::LogNewSocketEvent(const CastSocket& cast_socket) { |
| 82 DCHECK(thread_checker_.CalledOnValidThread()); | 79 DCHECK(thread_checker_.CalledOnValidThread()); |
| 83 | 80 |
| 84 int channel_id = cast_socket.id(); | 81 int channel_id = cast_socket.id(); |
| 85 SocketEvent event = CreateEvent(proto::CAST_SOCKET_CREATED); | 82 SocketEvent event = CreateEvent(proto::CAST_SOCKET_CREATED); |
| 86 LogSocketEvent(channel_id, event); | 83 LogSocketEvent(channel_id, event); |
| 87 | 84 |
| 85 AggregatedSocketEventLogMap::iterator it = | |
| 86 aggregated_socket_events_.find(channel_id); | |
| 87 CHECK(it != aggregated_socket_events_.end()); | |
| 88 | |
| 88 AggregatedSocketEvent& aggregated_socket_event = | 89 AggregatedSocketEvent& aggregated_socket_event = |
| 89 aggregated_socket_events_.find(channel_id) | 90 it->second->aggregated_socket_event; |
| 90 ->second->aggregated_socket_event; | |
| 91 const net::IPAddressNumber& ip = cast_socket.ip_endpoint().address(); | 91 const net::IPAddressNumber& ip = cast_socket.ip_endpoint().address(); |
| 92 aggregated_socket_event.set_endpoint_id(ip.back()); | 92 aggregated_socket_event.set_endpoint_id(ip.back()); |
| 93 aggregated_socket_event.set_channel_auth_type(cast_socket.channel_auth() == | 93 aggregated_socket_event.set_channel_auth_type(cast_socket.channel_auth() == |
| 94 CHANNEL_AUTH_TYPE_SSL | 94 CHANNEL_AUTH_TYPE_SSL |
| 95 ? proto::SSL | 95 ? proto::SSL |
| 96 : proto::SSL_VERIFIED); | 96 : proto::SSL_VERIFIED); |
| 97 } | 97 } |
| 98 | 98 |
| 99 void Logger::LogSocketEvent(int channel_id, EventType event_type) { | 99 void Logger::LogSocketEvent(int channel_id, EventType event_type) { |
| 100 DCHECK(thread_checker_.CalledOnValidThread()); | 100 DCHECK(thread_checker_.CalledOnValidThread()); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 116 | 116 |
| 117 void Logger::LogSocketEventWithRv(int channel_id, | 117 void Logger::LogSocketEventWithRv(int channel_id, |
| 118 EventType event_type, | 118 EventType event_type, |
| 119 int rv) { | 119 int rv) { |
| 120 DCHECK(thread_checker_.CalledOnValidThread()); | 120 DCHECK(thread_checker_.CalledOnValidThread()); |
| 121 | 121 |
| 122 SocketEvent event = CreateEvent(event_type); | 122 SocketEvent event = CreateEvent(event_type); |
| 123 event.set_return_value(rv); | 123 event.set_return_value(rv); |
| 124 | 124 |
| 125 LogSocketEvent(channel_id, event); | 125 LogSocketEvent(channel_id, event); |
| 126 | |
| 127 if ((event_type == proto::SOCKET_READ || event_type == proto::SOCKET_WRITE) && | |
| 128 rv > 0) { | |
| 129 AggregatedSocketEventLogMap::iterator it = | |
| 130 aggregated_socket_events_.find(channel_id); | |
| 131 CHECK(it != aggregated_socket_events_.end()); | |
| 132 | |
| 133 AggregatedSocketEvent& aggregated_socket_event = | |
| 134 it->second->aggregated_socket_event; | |
| 135 if (event_type == proto::SOCKET_READ) { | |
| 136 aggregated_socket_event.set_bytes_read( | |
| 137 aggregated_socket_event.bytes_read() + rv); | |
| 138 } else { | |
| 139 aggregated_socket_event.set_bytes_written( | |
| 140 aggregated_socket_event.bytes_written() + rv); | |
| 141 } | |
| 142 } | |
| 126 } | 143 } |
| 127 | 144 |
| 128 void Logger::LogSocketReadyState(int channel_id, proto::ReadyState new_state) { | 145 void Logger::LogSocketReadyState(int channel_id, proto::ReadyState new_state) { |
| 129 DCHECK(thread_checker_.CalledOnValidThread()); | 146 DCHECK(thread_checker_.CalledOnValidThread()); |
| 130 | 147 |
| 131 SocketEvent event = CreateEvent(proto::READY_STATE_CHANGED); | 148 SocketEvent event = CreateEvent(proto::READY_STATE_CHANGED); |
| 132 event.set_ready_state(new_state); | 149 event.set_ready_state(new_state); |
| 133 | 150 |
| 134 LogSocketEvent(channel_id, event); | 151 LogSocketEvent(channel_id, event); |
| 135 } | 152 } |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 207 } | 224 } |
| 208 | 225 |
| 209 void Logger::LogSocketEvent(int channel_id, const SocketEvent& socket_event) { | 226 void Logger::LogSocketEvent(int channel_id, const SocketEvent& socket_event) { |
| 210 AggregatedSocketEventLogMap::iterator it = | 227 AggregatedSocketEventLogMap::iterator it = |
| 211 aggregated_socket_events_.find(channel_id); | 228 aggregated_socket_events_.find(channel_id); |
| 212 if (it == aggregated_socket_events_.end()) { | 229 if (it == aggregated_socket_events_.end()) { |
| 213 if (aggregated_socket_events_.size() >= kMaxSocketsToLog) { | 230 if (aggregated_socket_events_.size() >= kMaxSocketsToLog) { |
| 214 AggregatedSocketEventLogMap::iterator erase_it = | 231 AggregatedSocketEventLogMap::iterator erase_it = |
| 215 aggregated_socket_events_.begin(); | 232 aggregated_socket_events_.begin(); |
| 216 | 233 |
| 217 num_evicted_aggregated_socket_events_++; | 234 log_.set_num_evicted_aggregated_socket_events( |
| 218 num_evicted_socket_events_ += erase_it->second->socket_events.size(); | 235 log_.num_evicted_aggregated_socket_events() + 1); |
| 236 log_.set_num_evicted_socket_events( | |
| 237 log_.num_evicted_socket_events() + | |
| 238 erase_it->second->socket_events.size()); | |
| 219 | 239 |
| 220 aggregated_socket_events_.erase(erase_it); | 240 aggregated_socket_events_.erase(erase_it); |
| 221 } | 241 } |
| 222 | 242 |
| 223 it = aggregated_socket_events_ | 243 it = aggregated_socket_events_ |
| 224 .insert(std::make_pair( | 244 .insert(std::make_pair( |
| 225 channel_id, make_linked_ptr(new AggregatedSocketEventLog))) | 245 channel_id, make_linked_ptr(new AggregatedSocketEventLog))) |
| 226 .first; | 246 .first; |
| 227 it->second->aggregated_socket_event.set_id(channel_id); | 247 it->second->aggregated_socket_event.set_id(channel_id); |
| 228 } | 248 } |
| 229 | 249 |
| 230 std::deque<proto::SocketEvent>& socket_events = it->second->socket_events; | 250 std::deque<proto::SocketEvent>& socket_events = it->second->socket_events; |
| 231 if (socket_events.size() >= kMaxEventsPerSocket) { | 251 if (socket_events.size() >= kMaxEventsPerSocket) { |
| 232 socket_events.pop_front(); | 252 socket_events.pop_front(); |
| 233 num_evicted_socket_events_++; | 253 log_.set_num_evicted_socket_events(log_.num_evicted_socket_events() + 1); |
| 234 } | 254 } |
| 235 | 255 |
| 236 socket_events.push_back(socket_event); | 256 socket_events.push_back(socket_event); |
| 237 } | 257 } |
| 238 | 258 |
| 239 bool Logger::LogToString(std::string* output) const { | 259 bool Logger::LogToString(std::string* output) const { |
| 240 output->clear(); | 260 output->clear(); |
| 241 | 261 |
| 242 Log log; | 262 Log log; |
| 243 log.set_num_evicted_aggregated_socket_events( | 263 log.CopyFrom(log_); |
|
Wez
2014/08/14 18:44:35
nit: This is just to get the evicted counts? Consi
imcheng
2014/08/14 22:43:19
Done.
| |
| 244 num_evicted_aggregated_socket_events_); | |
| 245 log.set_num_evicted_socket_events(num_evicted_socket_events_); | |
| 246 | 264 |
| 247 for (AggregatedSocketEventLogMap::const_iterator it = | 265 for (AggregatedSocketEventLogMap::const_iterator it = |
| 248 aggregated_socket_events_.begin(); | 266 aggregated_socket_events_.begin(); |
| 249 it != aggregated_socket_events_.end(); | 267 it != aggregated_socket_events_.end(); |
| 250 ++it) { | 268 ++it) { |
| 251 AggregatedSocketEvent* new_aggregated_socket_event = | 269 AggregatedSocketEvent* new_aggregated_socket_event = |
| 252 log.add_aggregated_socket_event(); | 270 log.add_aggregated_socket_event(); |
| 253 new_aggregated_socket_event->CopyFrom(it->second->aggregated_socket_event); | 271 new_aggregated_socket_event->CopyFrom(it->second->aggregated_socket_event); |
| 254 | 272 |
| 255 const std::deque<SocketEvent>& socket_events = it->second->socket_events; | 273 const std::deque<SocketEvent>& socket_events = it->second->socket_events; |
| 256 for (std::deque<SocketEvent>::const_iterator socket_event_it = | 274 for (std::deque<SocketEvent>::const_iterator socket_event_it = |
| 257 socket_events.begin(); | 275 socket_events.begin(); |
| 258 socket_event_it != socket_events.end(); | 276 socket_event_it != socket_events.end(); |
| 259 ++socket_event_it) { | 277 ++socket_event_it) { |
| 260 SocketEvent* socket_event = | 278 SocketEvent* socket_event = |
| 261 new_aggregated_socket_event->add_socket_event(); | 279 new_aggregated_socket_event->add_socket_event(); |
| 262 socket_event->CopyFrom(*socket_event_it); | 280 socket_event->CopyFrom(*socket_event_it); |
| 263 } | 281 } |
| 264 } | 282 } |
| 265 | 283 |
| 266 return log.SerializeToString(output); | 284 return log.SerializeToString(output); |
| 267 } | 285 } |
| 268 | 286 |
| 269 void Logger::Reset() { | 287 void Logger::Reset() { |
| 270 aggregated_socket_events_.clear(); | 288 aggregated_socket_events_.clear(); |
| 271 num_evicted_aggregated_socket_events_ = 0; | 289 log_.Clear(); |
| 272 num_evicted_socket_events_ = 0; | |
| 273 } | 290 } |
| 274 | 291 |
| 275 } // namespace cast_channel | 292 } // namespace cast_channel |
| 276 } // namespace api | 293 } // namespace api |
| 277 } // namespace extensions | 294 } // namespace extensions |
| OLD | NEW |