pub struct FeatureUsage {
pub id: Uuid,
pub org_id: Uuid,
pub user_id: Option<Uuid>,
pub feature: FeatureType,
pub metadata: Option<Value>,
pub created_at: DateTime<Utc>,
}Expand description
Feature usage event
Fields§
§id: Uuid§org_id: Uuid§user_id: Option<Uuid>§feature: FeatureType§metadata: Option<Value>§created_at: DateTime<Utc>Implementations§
Source§impl FeatureUsage
impl FeatureUsage
Sourcepub async fn record(
pool: &Pool<Postgres>,
org_id: Uuid,
user_id: Option<Uuid>,
feature: FeatureType,
metadata: Option<Value>,
) -> Result<(), Error>
pub async fn record( pool: &Pool<Postgres>, org_id: Uuid, user_id: Option<Uuid>, feature: FeatureType, metadata: Option<Value>, ) -> Result<(), Error>
Record a feature usage event
Sourcepub async fn count_by_org(
pool: &Pool<Postgres>,
org_id: Uuid,
feature: FeatureType,
days: i64,
) -> Result<i64, Error>
pub async fn count_by_org( pool: &Pool<Postgres>, org_id: Uuid, feature: FeatureType, days: i64, ) -> Result<i64, Error>
Count feature usage for an org in a time period
Sourcepub async fn get_global_stats(
pool: &Pool<Postgres>,
feature: FeatureType,
days: i64,
) -> Result<(i64, i64), Error>
pub async fn get_global_stats( pool: &Pool<Postgres>, feature: FeatureType, days: i64, ) -> Result<(i64, i64), Error>
Get feature usage stats across all orgs
Sourcepub async fn get_adoption_timeline(
pool: &Pool<Postgres>,
feature: FeatureType,
days: i64,
) -> Result<Vec<(NaiveDate, i64)>, Error>
pub async fn get_adoption_timeline( pool: &Pool<Postgres>, feature: FeatureType, days: i64, ) -> Result<Vec<(NaiveDate, i64)>, Error>
Get feature adoption timeline (daily counts)
Sourcepub async fn cleanup_old(pool: &Pool<Postgres>, days: i64) -> Result<u64, Error>
pub async fn cleanup_old(pool: &Pool<Postgres>, days: i64) -> Result<u64, Error>
Clean up old feature usage events (older than N days)
Sourcepub async fn aggregate_plugin_invoke_ms_by_deployment(
pool: &Pool<Postgres>,
org_id: Uuid,
deployment_id: Uuid,
since: DateTime<Utc>,
) -> Result<Vec<PluginInvokeAggregateRow>, Error>
pub async fn aggregate_plugin_invoke_ms_by_deployment( pool: &Pool<Postgres>, org_id: Uuid, deployment_id: Uuid, since: DateTime<Utc>, ) -> Result<Vec<PluginInvokeAggregateRow>, Error>
Aggregate plugin_invoke_ms rows for a deployment within a time
window, grouped by attachment.
Each plugin_invoke_ms row is a bucket emitted by the OTLP
aggregator (see migration 20250101000074); its metadata JSONB
is expected to carry:
{
"deployment_id": "uuid",
"attachment_id": "uuid",
"plugin_id": "uuid",
"plugin_name": "string",
"plugin_version": "string",
"invoke_ms": 12345,
"memory_peak_mb": 42 // optional
}SUMs invoke_ms, MAXes memory_peak_mb (peak across buckets),
and ORDERs by total invoke_ms descending so the heaviest plugin
surfaces first in the UI. Returns an empty Vec when the OTLP
pipeline hasn’t populated any rows yet.
Trait Implementations§
Source§impl Clone for FeatureUsage
impl Clone for FeatureUsage
Source§fn clone(&self) -> FeatureUsage
fn clone(&self) -> FeatureUsage
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for FeatureUsage
impl Debug for FeatureUsage
Source§impl<'de> Deserialize<'de> for FeatureUsage
impl<'de> Deserialize<'de> for FeatureUsage
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<FeatureUsage, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<FeatureUsage, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Source§impl<'a, R> FromRow<'a, R> for FeatureUsagewhere
R: Row,
&'a str: ColumnIndex<R>,
Uuid: Decode<'a, <R as Row>::Database> + Type<<R as Row>::Database>,
Option<Uuid>: Decode<'a, <R as Row>::Database> + Type<<R as Row>::Database>,
FeatureType: Decode<'a, <R as Row>::Database> + Type<<R as Row>::Database>,
Option<Value>: Decode<'a, <R as Row>::Database> + Type<<R as Row>::Database>,
DateTime<Utc>: Decode<'a, <R as Row>::Database> + Type<<R as Row>::Database>,
impl<'a, R> FromRow<'a, R> for FeatureUsagewhere
R: Row,
&'a str: ColumnIndex<R>,
Uuid: Decode<'a, <R as Row>::Database> + Type<<R as Row>::Database>,
Option<Uuid>: Decode<'a, <R as Row>::Database> + Type<<R as Row>::Database>,
FeatureType: Decode<'a, <R as Row>::Database> + Type<<R as Row>::Database>,
Option<Value>: Decode<'a, <R as Row>::Database> + Type<<R as Row>::Database>,
DateTime<Utc>: Decode<'a, <R as Row>::Database> + Type<<R as Row>::Database>,
Source§impl Serialize for FeatureUsage
impl Serialize for FeatureUsage
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Serialize this value into the given Serde serializer. Read more
Auto Trait Implementations§
impl Freeze for FeatureUsage
impl RefUnwindSafe for FeatureUsage
impl Send for FeatureUsage
impl Sync for FeatureUsage
impl Unpin for FeatureUsage
impl UnsafeUnpin for FeatureUsage
impl UnwindSafe for FeatureUsage
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreCreates a shared type from an unshared type.