Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Side by Side Diff: webrtc/api/rtcstatscollector.cc

Issue 2243123002: RTCCertificateStats added. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Addressed comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/api/rtcstatscollector.h ('k') | webrtc/api/rtcstatscollector_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/api/rtcstatscollector.h" 11 #include "webrtc/api/rtcstatscollector.h"
12 12
13 #include <memory> 13 #include <memory>
14 #include <utility> 14 #include <utility>
15 #include <vector> 15 #include <vector>
16 16
17 #include "webrtc/api/peerconnection.h" 17 #include "webrtc/api/peerconnection.h"
18 #include "webrtc/api/webrtcsession.h"
18 #include "webrtc/base/checks.h" 19 #include "webrtc/base/checks.h"
20 #include "webrtc/base/sslidentity.h"
19 21
20 namespace webrtc { 22 namespace webrtc {
21 23
22 rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create( 24 rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create(
23 PeerConnection* pc, int64_t cache_lifetime_us) { 25 PeerConnection* pc, int64_t cache_lifetime_us) {
24 return rtc::scoped_refptr<RTCStatsCollector>( 26 return rtc::scoped_refptr<RTCStatsCollector>(
25 new rtc::RefCountedObject<RTCStatsCollector>(pc, cache_lifetime_us)); 27 new rtc::RefCountedObject<RTCStatsCollector>(pc, cache_lifetime_us));
26 } 28 }
27 29
28 RTCStatsCollector::RTCStatsCollector(PeerConnection* pc, 30 RTCStatsCollector::RTCStatsCollector(PeerConnection* pc,
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 void RTCStatsCollector::ClearCachedStatsReport() { 83 void RTCStatsCollector::ClearCachedStatsReport() {
82 RTC_DCHECK(signaling_thread_->IsCurrent()); 84 RTC_DCHECK(signaling_thread_->IsCurrent());
83 cached_report_ = nullptr; 85 cached_report_ = nullptr;
84 } 86 }
85 87
86 void RTCStatsCollector::ProducePartialResultsOnSignalingThread( 88 void RTCStatsCollector::ProducePartialResultsOnSignalingThread(
87 int64_t timestamp_us) { 89 int64_t timestamp_us) {
88 RTC_DCHECK(signaling_thread_->IsCurrent()); 90 RTC_DCHECK(signaling_thread_->IsCurrent());
89 rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(); 91 rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create();
90 92
91 report->AddStats(ProducePeerConnectionStats_s(timestamp_us)); 93 SessionStats session_stats;
94 if (pc_->session()->GetTransportStats(&session_stats)) {
95 ProduceCertificateStats_s(timestamp_us, session_stats, report.get());
96 }
97 ProducePeerConnectionStats_s(timestamp_us, report.get());
92 98
93 AddPartialResults(report); 99 AddPartialResults(report);
94 } 100 }
95 101
96 void RTCStatsCollector::ProducePartialResultsOnWorkerThread( 102 void RTCStatsCollector::ProducePartialResultsOnWorkerThread(
97 int64_t timestamp_us) { 103 int64_t timestamp_us) {
98 RTC_DCHECK(worker_thread_->IsCurrent()); 104 RTC_DCHECK(worker_thread_->IsCurrent());
99 rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(); 105 rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create();
100 106
101 // TODO(hbos): Gather stats on worker thread. 107 // TODO(hbos): Gather stats on worker thread.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 RTC_DCHECK(signaling_thread_->IsCurrent()); 152 RTC_DCHECK(signaling_thread_->IsCurrent());
147 RTC_DCHECK(!callbacks_.empty()); 153 RTC_DCHECK(!callbacks_.empty());
148 RTC_DCHECK(cached_report_); 154 RTC_DCHECK(cached_report_);
149 for (const rtc::scoped_refptr<RTCStatsCollectorCallback>& callback : 155 for (const rtc::scoped_refptr<RTCStatsCollectorCallback>& callback :
150 callbacks_) { 156 callbacks_) {
151 callback->OnStatsDelivered(cached_report_); 157 callback->OnStatsDelivered(cached_report_);
152 } 158 }
153 callbacks_.clear(); 159 callbacks_.clear();
154 } 160 }
155 161
156 std::unique_ptr<RTCPeerConnectionStats> 162 void RTCStatsCollector::ProduceCertificateStats_s(
157 RTCStatsCollector::ProducePeerConnectionStats_s(int64_t timestamp_us) const { 163 int64_t timestamp_us, const SessionStats& session_stats,
164 RTCStatsReport* report) const {
165 RTC_DCHECK(signaling_thread_->IsCurrent());
166 for (const auto& transport : session_stats.transport_stats) {
167 rtc::scoped_refptr<rtc::RTCCertificate> local_certificate;
168 if (pc_->session()->GetLocalCertificate(
169 transport.second.transport_name, &local_certificate)) {
170 ProduceCertificateStatsFromSSLCertificateAndChain_s(
171 timestamp_us, local_certificate->ssl_certificate(), report);
172 }
173 std::unique_ptr<rtc::SSLCertificate> remote_certificate =
174 pc_->session()->GetRemoteSSLCertificate(
175 transport.second.transport_name);
176 if (remote_certificate) {
177 ProduceCertificateStatsFromSSLCertificateAndChain_s(
178 timestamp_us, *remote_certificate.get(), report);
179 }
180 }
181 }
182
183 void RTCStatsCollector::ProduceCertificateStatsFromSSLCertificateAndChain_s(
184 int64_t timestamp_us, const rtc::SSLCertificate& certificate,
185 RTCStatsReport* report) const {
186 RTC_DCHECK(signaling_thread_->IsCurrent());
187 std::unique_ptr<rtc::SSLCertificateStats> ssl_stats =
188 certificate.GetStats();
189 RTCCertificateStats* prev_stats = nullptr;
190 for (rtc::SSLCertificateStats* s = ssl_stats.get(); s;
191 s = s->issuer.get()) {
192 RTCCertificateStats* stats = new RTCCertificateStats(
193 "RTCCertificate_" + s->fingerprint, timestamp_us);
194 stats->fingerprint = s->fingerprint;
195 stats->fingerprint_algorithm = s->fingerprint_algorithm;
196 stats->base64_certificate = s->base64_certificate;
197 if (prev_stats)
198 prev_stats->issuer_certificate_id = stats->id();
199 report->AddStats(std::unique_ptr<RTCCertificateStats>(stats));
200 prev_stats = stats;
201 }
202 }
203
204 void RTCStatsCollector::ProducePeerConnectionStats_s(
205 int64_t timestamp_us, RTCStatsReport* report) const {
158 RTC_DCHECK(signaling_thread_->IsCurrent()); 206 RTC_DCHECK(signaling_thread_->IsCurrent());
159 // TODO(hbos): If data channels are removed from the peer connection this will 207 // TODO(hbos): If data channels are removed from the peer connection this will
160 // yield incorrect counts. Address before closing crbug.com/636818. See 208 // yield incorrect counts. Address before closing crbug.com/636818. See
161 // https://w3c.github.io/webrtc-stats/webrtc-stats.html#pcstats-dict*. 209 // https://w3c.github.io/webrtc-stats/webrtc-stats.html#pcstats-dict*.
162 uint32_t data_channels_opened = 0; 210 uint32_t data_channels_opened = 0;
163 const std::vector<rtc::scoped_refptr<DataChannel>>& data_channels = 211 const std::vector<rtc::scoped_refptr<DataChannel>>& data_channels =
164 pc_->sctp_data_channels(); 212 pc_->sctp_data_channels();
165 for (const rtc::scoped_refptr<DataChannel>& data_channel : data_channels) { 213 for (const rtc::scoped_refptr<DataChannel>& data_channel : data_channels) {
166 if (data_channel->state() == DataChannelInterface::kOpen) 214 if (data_channel->state() == DataChannelInterface::kOpen)
167 ++data_channels_opened; 215 ++data_channels_opened;
168 } 216 }
169 // There is always just one |RTCPeerConnectionStats| so its |id| can be a 217 // There is always just one |RTCPeerConnectionStats| so its |id| can be a
170 // constant. 218 // constant.
171 std::unique_ptr<RTCPeerConnectionStats> stats( 219 std::unique_ptr<RTCPeerConnectionStats> stats(
172 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us)); 220 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us));
173 stats->data_channels_opened = data_channels_opened; 221 stats->data_channels_opened = data_channels_opened;
174 stats->data_channels_closed = static_cast<uint32_t>(data_channels.size()) - 222 stats->data_channels_closed = static_cast<uint32_t>(data_channels.size()) -
175 data_channels_opened; 223 data_channels_opened;
176 return stats; 224 report->AddStats(std::move(stats));
177 } 225 }
178 226
179 } // namespace webrtc 227 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/api/rtcstatscollector.h ('k') | webrtc/api/rtcstatscollector_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698