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 |