Skip to content

Commit cae64ea

Browse files
saxrainliu
authored andcommitted
Collect stats from certificates
TODO: get base64_certificate and issuer_certificate_id
1 parent f2067ed commit cae64ea

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed

src/dtls_transport/mod.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use tokio::sync::{mpsc, Mutex};
1818
use util::Conn;
1919

2020
use dtls_role::*;
21+
use waitgroup::Worker;
2122

2223
use crate::api::setting_engine::SettingEngine;
2324
use crate::dtls_transport::dtls_parameters::DTLSParameters;
@@ -30,6 +31,7 @@ use crate::mux::endpoint::Endpoint;
3031
use crate::mux::mux_func::{match_dtls, match_srtcp, match_srtp, MatchFunc};
3132
use crate::peer_connection::certificate::RTCCertificate;
3233
use crate::rtp_transceiver::SSRC;
34+
use crate::stats::stats_collector::StatsCollector;
3335

3436
#[cfg(test)]
3537
mod dtls_transport_test;
@@ -305,6 +307,16 @@ impl RTCDtlsTransport {
305307
DEFAULT_DTLS_ROLE_ANSWER
306308
}
307309

310+
pub(crate) async fn collect_stats(
311+
&self,
312+
collector: &Arc<Mutex<StatsCollector>>,
313+
worker: Worker,
314+
) {
315+
for cert in &self.certificates {
316+
cert.collect_stats(&collector, worker.clone()).await;
317+
}
318+
}
319+
308320
async fn prepare_transport(
309321
&self,
310322
remote_parameters: DTLSParameters,

src/peer_connection/certificate.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
use crate::dtls_transport::dtls_fingerprint::RTCDtlsFingerprint;
22
use crate::error::{Error, Result};
33
use crate::peer_connection::math_rand_alpha;
4+
use crate::stats::{CertificateStats, StatsReportType};
5+
use crate::stats::stats_collector::StatsCollector;
46

57
use dtls::crypto::{CryptoPrivateKey, CryptoPrivateKeyKind};
68
use rcgen::{CertificateParams, KeyPair, RcgenError};
79
use ring::signature::{EcdsaKeyPair, Ed25519KeyPair, RsaKeyPair};
810
use sha2::{Digest, Sha256};
11+
use tokio::time::Instant;
912
use std::ops::Add;
13+
use std::sync::Arc;
1014
use std::time::{Duration, SystemTime, UNIX_EPOCH};
15+
use tokio::sync::Mutex;
16+
use waitgroup::Worker;
1117

1218
/// Certificate represents a x509Cert used to authenticate WebRTC communications.
1319
pub struct RTCCertificate {
@@ -161,6 +167,29 @@ impl RTCCertificate {
161167
RTCCertificate::from_params(params)
162168
}
163169

170+
pub(crate) async fn collect_stats(
171+
&self,
172+
collector: &Arc<Mutex<StatsCollector>>,
173+
worker: Worker,
174+
) {
175+
let fingerprints = self.get_fingerprints().unwrap();
176+
if let Some(fingerprint) = fingerprints.into_iter().nth(0) {
177+
let stats = CertificateStats {
178+
timestamp: Instant::now(),
179+
id: self.stats_id.clone(),
180+
// base64_certificate
181+
fingerprint: fingerprint.value,
182+
fingerprint_algorithm: fingerprint.algorithm,
183+
// issuer_certificate_id
184+
185+
};
186+
let mut lock = collector.try_lock().unwrap();
187+
lock.push(StatsReportType::CertificateStats(stats));
188+
189+
drop(worker);
190+
}
191+
}
192+
164193
/*TODO:
165194
// CertificateFromX509 creates a new WebRTC Certificate from a given PrivateKey and Certificate
166195
//

src/peer_connection/peer_connection_internal.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,6 +1327,9 @@ impl PeerConnectionInternal {
13271327
self.ice_gatherer.collect_stats(&collector, wg.worker()),
13281328
self.ice_transport.collect_stats(&collector, wg.worker()),
13291329
self.sctp_transport.collect_stats(&collector, wg.worker()),
1330+
self.dtls_transport.collect_stats(&collector, wg.worker()),
1331+
// TODO: data channels
1332+
// TODO: media engine
13301333
);
13311334

13321335
wg.wait().await;

src/stats/mod.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pub enum SourceStatsType {
1717

1818
pub enum StatsReportType {
1919
CandidatePair(ICECandidatePairStats),
20+
CertificateStats(CertificateStats),
2021
LocalCandidate(ICECandidateStats),
2122
RemoteCandidate(ICECandidateStats),
2223
SCTPTransport(ICETransportStats),
@@ -150,8 +151,18 @@ pub struct ICETransportStats {
150151
impl ICETransportStats {
151152
pub(crate) fn new(id: String) -> Self {
152153
ICETransportStats {
154+
id,
153155
timestamp: Instant::now(),
154-
id: id,
155156
}
156157
}
157158
}
159+
160+
pub struct CertificateStats {
161+
pub timestamp: Instant,
162+
pub id: String,
163+
// base64_certificate: String,
164+
pub fingerprint: String,
165+
pub fingerprint_algorithm: String,
166+
// issuer_certificate_id: String,
167+
}
168+

0 commit comments

Comments
 (0)