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 "remoting/client/server_log_entry.h" | 5 #include "remoting/client/server_log_entry_client.h" |
6 | 6 |
7 #include "base/logging.h" | |
8 #include "base/macros.h" | |
9 #include "base/rand_util.h" | |
10 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
11 #include "base/strings/stringize_macros.h" | 8 #include "base/strings/stringize_macros.h" |
12 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
13 #include "base/sys_info.h" | 10 #include "base/sys_info.h" |
14 #include "remoting/base/constants.h" | |
15 #include "remoting/client/chromoting_stats.h" | 11 #include "remoting/client/chromoting_stats.h" |
16 #include "remoting/protocol/connection_to_host.h" | 12 #include "remoting/jingle_glue/server_log_entry.h" |
17 #include "remoting/protocol/errors.h" | |
18 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h" | |
19 | 13 |
20 using base::StringPrintf; | 14 using base::StringPrintf; |
21 using base::SysInfo; | 15 using base::SysInfo; |
22 using buzz::QName; | |
23 using buzz::XmlElement; | |
24 using remoting::protocol::ConnectionToHost; | 16 using remoting::protocol::ConnectionToHost; |
| 17 using remoting::protocol::ErrorCode; |
25 | 18 |
26 namespace remoting { | 19 namespace remoting { |
27 | 20 |
28 namespace client { | 21 namespace { |
| 22 const char kValueRoleClient[] = "client"; |
29 | 23 |
30 namespace { | |
31 const char kLogCommand[] = "log"; | |
32 | |
33 const char kLogEntry[] = "entry"; | |
34 | |
35 const char kKeyEventName[] = "event-name"; | |
36 const char kValueEventNameSessionState[] = "session-state"; | 24 const char kValueEventNameSessionState[] = "session-state"; |
37 const char kValueEventNameStatistics[] = "connection-statistics"; | 25 const char kValueEventNameStatistics[] = "connection-statistics"; |
38 const char kValueEventNameSessionIdOld[] = "session-id-old"; | 26 const char kValueEventNameSessionIdOld[] = "session-id-old"; |
39 const char kValueEventNameSessionIdNew[] = "session-id-new"; | 27 const char kValueEventNameSessionIdNew[] = "session-id-new"; |
40 | 28 |
41 const char kKeyRole[] = "role"; | 29 const char kKeySessionId[] = "session-id"; |
42 const char kValueRoleClient[] = "client"; | 30 const char kKeySessionDuration[] = "session-duration"; |
43 | |
44 const char kKeyMode[] = "mode"; | |
45 const char kValueModeIt2Me[] = "it2me"; | |
46 const char kValueModeMe2Me[] = "me2me"; | |
47 | 31 |
48 const char kKeySessionState[] = "session-state"; | 32 const char kKeySessionState[] = "session-state"; |
| 33 const char kKeyConnectionError[] = "connection-error"; |
49 const char kValueSessionStateConnected[] = "connected"; | 34 const char kValueSessionStateConnected[] = "connected"; |
50 const char kValueSessionStateClosed[] = "closed"; | 35 const char kValueSessionStateClosed[] = "closed"; |
51 | 36 |
52 const char kKeyOsName[] = "os-name"; | 37 const char kKeyOsName[] = "os-name"; |
53 const char kKeyOsVersion[] = "os-version"; | 38 const char kKeyOsVersion[] = "os-version"; |
54 const char kKeyAppVersion[] = "app-version"; | 39 const char kKeyAppVersion[] = "app-version"; |
55 | 40 |
56 const char kKeyCpu[] = "cpu"; | 41 const char* GetValueSessionState(ConnectionToHost::State state) { |
57 | |
58 } // namespace | |
59 | |
60 ServerLogEntry::ServerLogEntry() { | |
61 } | |
62 | |
63 ServerLogEntry::~ServerLogEntry() { | |
64 } | |
65 | |
66 // static | |
67 scoped_ptr<buzz::XmlElement> ServerLogEntry::MakeStanza() { | |
68 return scoped_ptr<buzz::XmlElement>( | |
69 new XmlElement(QName(kChromotingXmlNamespace, kLogCommand))); | |
70 } | |
71 | |
72 // static | |
73 scoped_ptr<ServerLogEntry> ServerLogEntry::MakeForSessionStateChange( | |
74 protocol::ConnectionToHost::State state, | |
75 protocol::ErrorCode error) { | |
76 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); | |
77 entry->Set(kKeyRole, kValueRoleClient); | |
78 entry->Set(kKeyEventName, kValueEventNameSessionState); | |
79 | |
80 entry->Set(kKeySessionState, GetValueSessionState(state)); | |
81 if (error != protocol::OK) { | |
82 entry->Set("connection-error", GetValueError(error)); | |
83 } | |
84 | |
85 return entry.Pass(); | |
86 } | |
87 | |
88 // static | |
89 scoped_ptr<ServerLogEntry> ServerLogEntry::MakeForStatistics( | |
90 ChromotingStats* statistics) { | |
91 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); | |
92 entry->Set(kKeyRole, kValueRoleClient); | |
93 entry->Set(kKeyEventName, kValueEventNameStatistics); | |
94 | |
95 entry->Set("video-bandwidth", | |
96 StringPrintf("%.2f", statistics->video_bandwidth()->Rate())); | |
97 entry->Set("capture-latency", | |
98 StringPrintf("%.2f", statistics->video_capture_ms()->Average())); | |
99 entry->Set("encode-latency", | |
100 StringPrintf("%.2f", statistics->video_encode_ms()->Average())); | |
101 entry->Set("decode-latency", | |
102 StringPrintf("%.2f", statistics->video_decode_ms()->Average())); | |
103 entry->Set("render-latency", | |
104 StringPrintf("%.2f", statistics->video_frame_rate()->Rate())); | |
105 entry->Set("roundtrip-latency", | |
106 StringPrintf("%.2f", statistics->round_trip_ms()->Average())); | |
107 | |
108 return entry.Pass(); | |
109 } | |
110 | |
111 // static | |
112 scoped_ptr<ServerLogEntry> ServerLogEntry::MakeForSessionIdOld( | |
113 const std::string& session_id) { | |
114 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); | |
115 entry->Set(kKeyRole, kValueRoleClient); | |
116 entry->Set(kKeyEventName, kValueEventNameSessionIdOld); | |
117 entry->AddSessionId(session_id); | |
118 return entry.Pass(); | |
119 } | |
120 | |
121 // static | |
122 scoped_ptr<ServerLogEntry> ServerLogEntry::MakeForSessionIdNew( | |
123 const std::string& session_id) { | |
124 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); | |
125 entry->Set(kKeyRole, kValueRoleClient); | |
126 entry->Set(kKeyEventName, kValueEventNameSessionIdNew); | |
127 entry->AddSessionId(session_id); | |
128 return entry.Pass(); | |
129 } | |
130 | |
131 void ServerLogEntry::AddClientFields() { | |
132 Set(kKeyOsName, SysInfo::OperatingSystemName()); | |
133 Set(kKeyOsVersion, SysInfo::OperatingSystemVersion()); | |
134 Set(kKeyAppVersion, STRINGIZE(VERSION)); | |
135 Set(kKeyCpu, SysInfo::OperatingSystemArchitecture()); | |
136 }; | |
137 | |
138 void ServerLogEntry::AddModeField(ServerLogEntry::Mode mode) { | |
139 Set(kKeyMode, GetValueMode(mode)); | |
140 } | |
141 | |
142 void ServerLogEntry::AddSessionId(const std::string& session_id) { | |
143 Set("session-id", session_id); | |
144 } | |
145 | |
146 void ServerLogEntry::AddSessionDuration(base::TimeDelta duration) { | |
147 Set("session-duration", base::Int64ToString(duration.InSeconds())); | |
148 } | |
149 | |
150 // static | |
151 const char* ServerLogEntry::GetValueMode(ServerLogEntry::Mode mode) { | |
152 switch (mode) { | |
153 case IT2ME: | |
154 return kValueModeIt2Me; | |
155 case ME2ME: | |
156 return kValueModeMe2Me; | |
157 default: | |
158 NOTREACHED(); | |
159 return NULL; | |
160 } | |
161 } | |
162 | |
163 scoped_ptr<XmlElement> ServerLogEntry::ToStanza() const { | |
164 scoped_ptr<XmlElement> stanza(new XmlElement(QName( | |
165 kChromotingXmlNamespace, kLogEntry))); | |
166 ValuesMap::const_iterator iter; | |
167 for (iter = values_map_.begin(); iter != values_map_.end(); ++iter) { | |
168 stanza->AddAttr(QName(std::string(), iter->first), iter->second); | |
169 } | |
170 return stanza.Pass(); | |
171 } | |
172 | |
173 // static | |
174 const char* ServerLogEntry::GetValueSessionState( | |
175 ConnectionToHost::State state) { | |
176 switch (state) { | 42 switch (state) { |
177 // Where possible, these are the same strings that the webapp sends for the | 43 // Where possible, these are the same strings that the webapp sends for the |
178 // corresponding state - see remoting/webapp/server_log_entry.js. | 44 // corresponding state - see remoting/webapp/server_log_entry.js. |
179 case ConnectionToHost::INITIALIZING: | 45 case ConnectionToHost::INITIALIZING: |
180 return "initializing"; | 46 return "initializing"; |
181 case ConnectionToHost::CONNECTING: | 47 case ConnectionToHost::CONNECTING: |
182 return "connecting"; | 48 return "connecting"; |
183 case ConnectionToHost::AUTHENTICATED: | 49 case ConnectionToHost::AUTHENTICATED: |
184 return "authenticated"; | 50 return "authenticated"; |
185 case ConnectionToHost::CONNECTED: | 51 case ConnectionToHost::CONNECTED: |
186 return kValueSessionStateConnected; | 52 return kValueSessionStateConnected; |
187 case ConnectionToHost::FAILED: | 53 case ConnectionToHost::FAILED: |
188 return "connection-failed"; | 54 return "connection-failed"; |
189 case ConnectionToHost::CLOSED: | 55 case ConnectionToHost::CLOSED: |
190 return kValueSessionStateClosed; | 56 return kValueSessionStateClosed; |
191 default: | 57 default: |
192 NOTREACHED(); | 58 NOTREACHED(); |
193 return NULL; | 59 return NULL; |
194 } | 60 } |
195 } | 61 } |
196 | 62 |
197 // static | 63 const char* GetValueError(ErrorCode error) { |
198 const char* ServerLogEntry::GetValueError(protocol::ErrorCode error) { | |
199 switch (error) { | 64 switch (error) { |
200 // Where possible, these are the same strings that the webapp sends for the | 65 // Where possible, these are the same strings that the webapp sends for the |
201 // corresponding error - see remoting/webapp/server_log_entry.js. | 66 // corresponding error - see remoting/webapp/server_log_entry.js. |
202 case protocol::OK: | 67 case protocol::OK: |
203 return "none"; | 68 return "none"; |
204 case protocol::PEER_IS_OFFLINE: | 69 case protocol::PEER_IS_OFFLINE: |
205 return "host-is-offline"; | 70 return "host-is-offline"; |
206 case protocol::SESSION_REJECTED: | 71 case protocol::SESSION_REJECTED: |
207 return "session-rejected"; | 72 return "session-rejected"; |
208 case protocol::INCOMPATIBLE_PROTOCOL: | 73 case protocol::INCOMPATIBLE_PROTOCOL: |
209 return "incompatible-protocol"; | 74 return "incompatible-protocol"; |
210 case protocol::AUTHENTICATION_FAILED: | 75 case protocol::AUTHENTICATION_FAILED: |
211 return "authentication-failed"; | 76 return "authentication-failed"; |
212 case protocol::CHANNEL_CONNECTION_ERROR: | 77 case protocol::CHANNEL_CONNECTION_ERROR: |
213 return "channel-connection-error"; | 78 return "channel-connection-error"; |
214 case protocol::SIGNALING_ERROR: | 79 case protocol::SIGNALING_ERROR: |
215 return "signaling-error"; | 80 return "signaling-error"; |
216 case protocol::SIGNALING_TIMEOUT: | 81 case protocol::SIGNALING_TIMEOUT: |
217 return "signaling-timeout"; | 82 return "signaling-timeout"; |
218 case protocol::HOST_OVERLOAD: | 83 case protocol::HOST_OVERLOAD: |
219 return "host-overload"; | 84 return "host-overload"; |
220 case protocol::UNKNOWN_ERROR: | 85 case protocol::UNKNOWN_ERROR: |
221 return "unknown-error"; | 86 return "unknown-error"; |
222 default: | 87 default: |
223 NOTREACHED(); | 88 NOTREACHED(); |
224 return NULL; | 89 return NULL; |
225 } | 90 } |
226 } | 91 } |
227 | 92 |
228 void ServerLogEntry::AddEventName(const std::string& event_name) { | 93 } // namespace |
229 Set("event-name", event_name); | 94 |
| 95 scoped_ptr<ServerLogEntry> MakeLogEntryForSessionStateChange( |
| 96 ConnectionToHost::State state, |
| 97 ErrorCode error) { |
| 98 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); |
| 99 entry->AddRoleField(kValueRoleClient); |
| 100 entry->AddEventNameField(kValueEventNameSessionState); |
| 101 |
| 102 entry->Set(kKeySessionState, GetValueSessionState(state)); |
| 103 if (error != protocol::OK) { |
| 104 entry->Set(kKeyConnectionError, GetValueError(error)); |
| 105 } |
| 106 |
| 107 return entry.Pass(); |
230 } | 108 } |
231 | 109 |
232 void ServerLogEntry::Set(const std::string& key, const std::string& value) { | 110 scoped_ptr<ServerLogEntry> MakeLogEntryForStatistics( |
233 values_map_[key] = value; | 111 ChromotingStats* statistics) { |
| 112 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); |
| 113 entry->AddRoleField(kValueRoleClient); |
| 114 entry->AddEventNameField(kValueEventNameStatistics); |
| 115 |
| 116 entry->Set("video-bandwidth", |
| 117 StringPrintf("%.2f", statistics->video_bandwidth()->Rate())); |
| 118 entry->Set("capture-latency", |
| 119 StringPrintf("%.2f", statistics->video_capture_ms()->Average())); |
| 120 entry->Set("encode-latency", |
| 121 StringPrintf("%.2f", statistics->video_encode_ms()->Average())); |
| 122 entry->Set("decode-latency", |
| 123 StringPrintf("%.2f", statistics->video_decode_ms()->Average())); |
| 124 entry->Set("render-latency", |
| 125 StringPrintf("%.2f", statistics->video_frame_rate()->Rate())); |
| 126 entry->Set("roundtrip-latency", |
| 127 StringPrintf("%.2f", statistics->round_trip_ms()->Average())); |
| 128 |
| 129 return entry.Pass(); |
234 } | 130 } |
235 | 131 |
236 } // namespace client | 132 scoped_ptr<ServerLogEntry> MakeLogEntryForSessionIdOld( |
| 133 const std::string& session_id) { |
| 134 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); |
| 135 entry->AddRoleField(kValueRoleClient); |
| 136 entry->AddEventNameField(kValueEventNameSessionIdOld); |
| 137 AddSessionIdToLogEntry(entry.get(), session_id); |
| 138 return entry.Pass(); |
| 139 } |
| 140 |
| 141 scoped_ptr<ServerLogEntry> MakeLogEntryForSessionIdNew( |
| 142 const std::string& session_id) { |
| 143 scoped_ptr<ServerLogEntry> entry(new ServerLogEntry()); |
| 144 entry->AddRoleField(kValueRoleClient); |
| 145 entry->AddEventNameField(kValueEventNameSessionIdNew); |
| 146 AddSessionIdToLogEntry(entry.get(), session_id); |
| 147 return entry.Pass(); |
| 148 } |
| 149 |
| 150 void AddClientFieldsToLogEntry(ServerLogEntry* entry) { |
| 151 entry->Set(kKeyOsName, SysInfo::OperatingSystemName()); |
| 152 entry->Set(kKeyOsVersion, SysInfo::OperatingSystemVersion()); |
| 153 entry->Set(kKeyAppVersion, STRINGIZE(VERSION)); |
| 154 entry->AddCpuField(); |
| 155 } |
| 156 |
| 157 void AddSessionIdToLogEntry(ServerLogEntry* entry, const std::string& id) { |
| 158 entry->Set(kKeySessionId, id); |
| 159 } |
| 160 |
| 161 void AddSessionDurationToLogEntry(ServerLogEntry* entry, |
| 162 base::TimeDelta duration) { |
| 163 entry->Set(kKeySessionDuration, base::Int64ToString(duration.InSeconds())); |
| 164 } |
237 | 165 |
238 } // namespace remoting | 166 } // namespace remoting |
OLD | NEW |