Skip to content

Commit f38718b

Browse files
authored
[rust] Selenium Manager decrease frequency of statistics reporting (#13555)
1 parent a6da4aa commit f38718b

File tree

3 files changed

+62
-6
lines changed

3 files changed

+62
-6
lines changed

rust/src/lib.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ use crate::grid::GRID_NAME;
3131
use crate::iexplorer::{IExplorerManager, IEDRIVER_NAME, IE_NAMES};
3232
use crate::logger::Logger;
3333
use crate::metadata::{
34-
create_browser_metadata, get_browser_version_from_metadata, get_metadata, write_metadata,
34+
create_browser_metadata, create_stats_metadata, get_browser_version_from_metadata,
35+
get_metadata, is_stats_in_metadata, write_metadata,
3536
};
3637
use crate::safari::{SafariManager, SAFARIDRIVER_NAME, SAFARI_NAME};
3738
use crate::safaritp::{SafariTPManager, SAFARITP_NAMES};
@@ -846,9 +847,22 @@ pub trait SeleniumManager {
846847
};
847848
let http_client = self.get_http_client().to_owned();
848849
let sender = self.get_sender().to_owned();
849-
thread::spawn(move || {
850-
send_stats_to_plausible(http_client, props, sender);
851-
});
850+
let cache_path = self.get_cache_path()?;
851+
let mut metadata = get_metadata(self.get_logger(), &cache_path);
852+
if !is_stats_in_metadata(&metadata.stats, &props) {
853+
self.get_logger()
854+
.debug(format!("Sending stats to Plausible: {:?}", props,));
855+
let stats_ttl = self.get_ttl();
856+
if stats_ttl > 0 {
857+
metadata
858+
.stats
859+
.push(create_stats_metadata(&props, stats_ttl));
860+
write_metadata(&metadata, self.get_logger(), cache_path);
861+
}
862+
thread::spawn(move || {
863+
send_stats_to_plausible(http_client, props, sender);
864+
});
865+
}
852866
}
853867
Ok(())
854868
}

rust/src/metadata.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18+
use crate::stats::Props;
1819
use crate::Logger;
1920
use serde::{Deserialize, Serialize};
2021
use std::fs;
@@ -25,6 +26,17 @@ use std::time::{SystemTime, UNIX_EPOCH};
2526
const METADATA_FILE_OLD: &str = "selenium-manager.json";
2627
const METADATA_FILE: &str = "se-metadata.json";
2728

29+
#[derive(Serialize, Deserialize)]
30+
pub struct Stats {
31+
pub browser: String,
32+
pub browser_version: String,
33+
pub os: String,
34+
pub arch: String,
35+
pub lang: String,
36+
pub selenium_version: String,
37+
pub stats_ttl: u64,
38+
}
39+
2840
#[derive(Serialize, Deserialize)]
2941
pub struct Browser {
3042
pub browser_name: String,
@@ -45,6 +57,7 @@ pub struct Driver {
4557
pub struct Metadata {
4658
pub browsers: Vec<Browser>,
4759
pub drivers: Vec<Driver>,
60+
pub stats: Vec<Stats>,
4861
}
4962

5063
fn get_metadata_path(cache_path: PathBuf) -> PathBuf {
@@ -67,6 +80,7 @@ fn new_metadata(log: &Logger) -> Metadata {
6780
Metadata {
6881
browsers: Vec::new(),
6982
drivers: Vec::new(),
83+
stats: Vec::new(),
7084
}
7185
}
7286

@@ -82,6 +96,7 @@ pub fn get_metadata(log: &Logger, cache_path: &Option<PathBuf>) -> Metadata {
8296
let now = now_unix_timestamp();
8397
meta.browsers.retain(|b| b.browser_ttl > now);
8498
meta.drivers.retain(|d| d.driver_ttl > now);
99+
meta.stats.retain(|s| s.stats_ttl > now);
85100
meta
86101
}
87102
Err(_e) => new_metadata(log), // Empty metadata
@@ -128,6 +143,21 @@ pub fn get_driver_version_from_metadata(
128143
}
129144
}
130145

146+
pub fn is_stats_in_metadata(stats_metadata: &[Stats], props: &Props) -> bool {
147+
let props: Vec<&Stats> = stats_metadata
148+
.iter()
149+
.filter(|p| {
150+
p.browser.eq(&props.browser)
151+
&& p.browser_version.eq(&props.browser_version)
152+
&& p.os.eq(&props.os)
153+
&& p.arch.eq(&props.arch)
154+
&& p.lang.eq(&props.lang)
155+
&& p.selenium_version.eq(&props.selenium_version)
156+
})
157+
.collect();
158+
!props.is_empty()
159+
}
160+
131161
pub fn create_browser_metadata(
132162
browser_name: &str,
133163
major_browser_version: &str,
@@ -156,6 +186,18 @@ pub fn create_driver_metadata(
156186
}
157187
}
158188

189+
pub fn create_stats_metadata(props: &Props, stats_ttl: u64) -> Stats {
190+
Stats {
191+
browser: props.browser.to_string(),
192+
browser_version: props.browser_version.to_string(),
193+
os: props.os.to_string(),
194+
arch: props.arch.to_string(),
195+
lang: props.lang.to_string(),
196+
selenium_version: props.selenium_version.to_string(),
197+
stats_ttl: now_unix_timestamp() + stats_ttl,
198+
}
199+
}
200+
159201
pub fn write_metadata(metadata: &Metadata, log: &Logger, cache_path: Option<PathBuf>) {
160202
if let Some(cache) = cache_path {
161203
let metadata_path = get_metadata_path(cache.clone());

rust/src/stats.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ const SM_USER_AGENT: &str = "Selenium Manager {}";
2828
const APP_JSON: &str = "application/json";
2929
const PAGE_VIEW: &str = "pageview";
3030
const SELENIUM_DOMAIN: &str = "manager.selenium.dev";
31-
const SM_STATS_URL: &str = "https://{}/sm-stats";
31+
const SM_STATS_URL: &str = "https://{}/sm-usage";
3232
const REQUEST_TIMEOUT_SEC: u64 = 3;
3333

3434
#[derive(Default, Serialize, Deserialize)]
@@ -39,7 +39,7 @@ pub struct Data {
3939
pub props: Props,
4040
}
4141

42-
#[derive(Default, Serialize, Deserialize)]
42+
#[derive(Default, Debug, Serialize, Deserialize)]
4343
pub struct Props {
4444
pub browser: String,
4545
pub browser_version: String,

0 commit comments

Comments
 (0)