Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 73 additions & 93 deletions components/nimbus/src/metrics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,11 @@

use serde_derive::{Deserialize, Serialize};

use crate::EnrollmentStatus;
use crate::enrollment::ExperimentEnrollment;
use crate::{EnrolledFeature, EnrollmentStatus};

#[cfg(feature = "stateful")]
use crate::enrollment::PreviousGeckoPrefState;

#[uniffi::trait_interface]
pub trait MetricsHandler: Send + Sync {
#[cfg(feature = "stateful")]
fn record_enrollment_statuses(&self, enrollment_status_extras: Vec<EnrollmentStatusExtraDef>);

#[cfg(not(feature = "stateful"))]
fn record_enrollment_statuses_v2(
&self,
enrollment_status_extras: Vec<EnrollmentStatusExtraDef>,
nimbus_user_id: Option<String>,
);

#[cfg(feature = "stateful")]
fn record_feature_activation(&self, event: FeatureExposureExtraDef);

#[cfg(feature = "stateful")]
fn record_feature_exposure(&self, event: FeatureExposureExtraDef);

#[cfg(feature = "stateful")]
fn record_malformed_feature_config(&self, event: MalformedFeatureConfigExtraDef);

#[cfg(feature = "stateful")]
fn submit_targeting_context(&self);
}
pub use crate::metrics::detail::*;

#[derive(Serialize, Deserialize, Clone)]
pub struct EnrollmentStatusExtraDef {
Expand All @@ -50,38 +25,6 @@ pub struct EnrollmentStatusExtraDef {
pub prev_gecko_pref_states: Option<Vec<PreviousGeckoPrefState>>,
}

#[cfg(test)]
impl EnrollmentStatusExtraDef {
pub fn branch(&self) -> &str {
self.branch.as_ref().unwrap()
}

pub fn conflict_slug(&self) -> &str {
self.conflict_slug.as_ref().unwrap()
}

pub fn error_string(&self) -> &str {
self.error_string.as_ref().unwrap()
}

pub fn reason(&self) -> &str {
self.reason.as_ref().unwrap()
}

pub fn slug(&self) -> &str {
self.slug.as_ref().unwrap()
}

pub fn status(&self) -> &str {
self.status.as_ref().unwrap()
}

#[cfg(not(feature = "stateful"))]
pub fn user_id(&self) -> &str {
self.user_id.as_ref().unwrap()
}
}

impl From<ExperimentEnrollment> for EnrollmentStatusExtraDef {
fn from(enrollment: ExperimentEnrollment) -> Self {
let mut branch_value: Option<String> = None;
Expand Down Expand Up @@ -119,47 +62,84 @@ impl From<ExperimentEnrollment> for EnrollmentStatusExtraDef {
}
}

#[derive(Clone)]
pub struct FeatureExposureExtraDef {
pub branch: Option<String>,
pub slug: String,
pub feature_id: String,
}
#[cfg(feature = "stateful")]
mod detail {
use crate::EnrolledFeature;

impl From<EnrolledFeature> for FeatureExposureExtraDef {
fn from(value: EnrolledFeature) -> Self {
Self {
feature_id: value.feature_id,
branch: value.branch,
slug: value.slug,
}
use super::EnrollmentStatusExtraDef;

#[uniffi::trait_interface]
pub trait MetricsHandler: Send + Sync {
fn record_enrollment_statuses(
&self,
enrollment_status_extras: Vec<EnrollmentStatusExtraDef>,
);

fn record_feature_activation(&self, event: FeatureExposureExtraDef);

fn record_feature_exposure(&self, event: FeatureExposureExtraDef);

fn record_malformed_feature_config(&self, event: MalformedFeatureConfigExtraDef);

fn submit_targeting_context(&self);
}
}

#[derive(Clone, Debug, Default, PartialEq)]
pub struct MalformedFeatureConfigExtraDef {
pub slug: Option<String>,
pub branch: Option<String>,
pub feature_id: String,
pub part: String,
}
#[derive(Clone)]
pub struct FeatureExposureExtraDef {
pub branch: Option<String>,
pub slug: String,
pub feature_id: String,
}

#[cfg(feature = "stateful")]
impl MalformedFeatureConfigExtraDef {
pub(crate) fn from(value: EnrolledFeature, part: String) -> Self {
Self {
slug: Some(value.slug),
branch: value.branch,
feature_id: value.feature_id,
part,
impl From<EnrolledFeature> for FeatureExposureExtraDef {
fn from(value: EnrolledFeature) -> Self {
Self {
feature_id: value.feature_id,
branch: value.branch,
slug: value.slug,
}
}
}

pub(crate) fn new(feature_id: String, part: String) -> Self {
Self {
feature_id,
part,
..Default::default()
#[derive(Clone, Default)]
#[cfg_attr(test, derive(Debug, Eq, PartialEq))]
pub struct MalformedFeatureConfigExtraDef {
pub slug: Option<String>,
pub branch: Option<String>,
pub feature_id: String,
pub part: String,
}

impl MalformedFeatureConfigExtraDef {
pub(crate) fn from_feature_and_part(value: EnrolledFeature, part: String) -> Self {
Self {
slug: Some(value.slug),
branch: value.branch,
feature_id: value.feature_id,
part,
}
}

pub(crate) fn new(feature_id: String, part: String) -> Self {
Self {
feature_id,
part,
..Default::default()
}
}
}
}

#[cfg(not(feature = "stateful"))]
mod detail {
use super::EnrollmentStatusExtraDef;

#[uniffi::trait_interface]
pub trait MetricsHandler: Send + Sync {
fn record_enrollment_statuses_v2(
&self,
enrollment_status_extras: Vec<EnrollmentStatusExtraDef>,
nimbus_user_id: Option<String>,
);
}
}
2 changes: 1 addition & 1 deletion components/nimbus/src/stateful/nimbus_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -977,7 +977,7 @@ impl NimbusClient {
pub fn record_malformed_feature_config(&self, feature_id: String, part_id: String) {
let event = if let Ok(Some(f)) = self.database_cache.get_enrollment_by_feature(&feature_id)
{
MalformedFeatureConfigExtraDef::from(f, part_id)
MalformedFeatureConfigExtraDef::from_feature_and_part(f, part_id)
} else {
MalformedFeatureConfigExtraDef::new(feature_id, part_id)
};
Expand Down
Loading