pub struct AnalyticsPlugin { /* private fields */ }Expand description
The analytics plugin. Carries no models, no persistent routes — just an
AnalyticsClient it installs as the ambient handle at boot so
capture / identify work anywhere in the process.
§Registration
App::builder()
.plugin(AnalyticsPlugin::new("phc_your_api_key"))
.build()
.await?;§Opt-in per-request pageview capture
AnalyticsPlugin::new("phc_your_api_key")
.capture_requests() // fires a $pageview event on every request§No-op when unconfigured
When the API key is absent (neither builder arg nor env var), the plugin
registers but the ambient client is not installed. Both capture and
identify are silent no-ops. A one-time warn! fires at boot so the
operator can diagnose misconfiguration without a runtime panic.
Implementations§
Source§impl AnalyticsPlugin
impl AnalyticsPlugin
Sourcepub fn new(api_key: impl Into<String>) -> Self
pub fn new(api_key: impl Into<String>) -> Self
Build the plugin with an explicit PostHog project API key.
The key wins over UMBRAL_POSTHOG_API_KEY / posthog_api_key in
settings. Use this for apps that keep secrets in code (not recommended
for production; prefer the env var and call AnalyticsPlugin::from_env).
Sourcepub fn from_env() -> Self
pub fn from_env() -> Self
Build the plugin reading configuration exclusively from environment
variables / umbral.toml settings. Equivalent to
AnalyticsPlugin::default() with no builder overrides.
Sourcepub fn host(self, host: impl Into<String>) -> Self
pub fn host(self, host: impl Into<String>) -> Self
Override the PostHog ingest host. Default: https://us.i.posthog.com.
Override for EU region (https://eu.i.posthog.com) or a self-hosted
instance.
Sourcepub fn capture_requests(self) -> Self
pub fn capture_requests(self) -> Self
Opt in to automatic per-request $pageview capture. Mounts a
from_fn middleware that fires one event per request (with path,
method, and status code in properties) without any handler
changes. Default OFF.
Sourcepub fn exclude_path_prefix(self, prefix: impl Into<String>) -> Self
pub fn exclude_path_prefix(self, prefix: impl Into<String>) -> Self
Exclude a request-path prefix from auto $pageview capture so its path
never ships to the analytics host (audit_2 plugin-observability #4).
Add every route whose path can carry a secret or PII — password-reset
and email-verification links, per-user resource paths, signed URLs, etc.
Call more than once to exclude several prefixes.
Trait Implementations§
Source§impl Default for AnalyticsPlugin
impl Default for AnalyticsPlugin
Source§impl Plugin for AnalyticsPlugin
impl Plugin for AnalyticsPlugin
Source§fn name(&self) -> &'static str
fn name(&self) -> &'static str
migrations/. Plugin names live in the same namespace as
migrate::APP_PLUGIN_NAME ("app"), so user crates must not
pick the name "app".Source§fn on_ready(&self, _ctx: &AppContext) -> Result<(), PluginError>
fn on_ready(&self, _ctx: &AppContext) -> Result<(), PluginError>
ctx.runtime() when the runtime handle lands.Source§fn wrap_router(&self, router: Router) -> Router
fn wrap_router(&self, router: Router) -> Router
Source§fn dependencies(&self) -> &'static [&'static str]
fn dependencies(&self) -> &'static [&'static str]
App::builder() topological sort uses this; cycles surface as
BuildError::PluginCycle. The default is no dependencies.Source§fn models(&self) -> Vec<ModelMeta>
fn models(&self) -> Vec<ModelMeta>
makemigrations. Read moreSource§fn routes(&self) -> Router
fn routes(&self) -> Router
AppBuilder::routes(). Plugins
choose their own path prefixes (spec 02 §“What a plugin can
contribute”: routes are flat, not auto-prefixed). Read moreSource§fn routes_builder(&self) -> Option<Routes>
fn routes_builder(&self) -> Option<Routes>
routes + route_paths
(gaps4 #31): mount routes through the recording Routes
builder and the framework takes BOTH the axum router and the
declared RouteSpecs from that ONE source, so the route
registry can never fall out of sync with what’s mounted. Read moreSource§fn route_paths(&self) -> Vec<RouteSpec>
fn route_paths(&self) -> Vec<RouteSpec>
routes used for surfacing route lists outside the request
flow (currently: the dev-mode default 404 page). axum doesn’t
expose its internal route table, so plugins report what they
declare here; the framework treats this as informational only
— not a source of truth for routing. Read moreSource§fn openapi_paths(&self) -> Vec<(String, Value)>
fn openapi_paths(&self) -> Vec<(String, Value)>
Vec<(path, value)> where path is the URL template
(/api/auth/login, /api/foo/{id}) and value is the
matching OpenAPI 3.0 Path Item Object serialised as
a serde_json::Value. Read moreSource§fn system_checks(&self) -> Vec<SystemCheck>
fn system_checks(&self) -> Vec<SystemCheck>
App::build() alongside the framework’s built-in checks.
Severity::Error blocks boot; Severity::Warning logs and
continues.Source§fn provides_storage(&self) -> bool
fn provides_storage(&self) -> bool
true if this plugin registers a Storage
backend (e.g. StoragePlugin, which calls
crate::storage::set_storage in Plugin::on_ready). Read moreSource§fn database(&self) -> Option<&'static str>
fn database(&self) -> Option<&'static str>
None to use the
"default" pool (the same one umbral::db::pool() returns). Read moreSource§fn templates_dirs(&self) -> Vec<PathBuf>
fn templates_dirs(&self) -> Vec<PathBuf>
Source§fn template_registrars(
&self,
) -> Vec<Box<dyn Fn(&mut Environment<'static>) + Send + Sync>>
fn template_registrars( &self, ) -> Vec<Box<dyn Fn(&mut Environment<'static>) + Send + Sync>>
Source§fn middleware(&self) -> Vec<Arc<dyn Middleware>>
fn middleware(&self) -> Vec<Arc<dyn Middleware>>
Source§fn static_files(&self) -> Vec<StaticFile>
fn static_files(&self) -> Vec<StaticFile>
Source§fn static_dirs(&self) -> Vec<StaticDir>
fn static_dirs(&self) -> Vec<StaticDir>
Source§fn static_root_dirs(&self) -> Vec<PathBuf>
fn static_root_dirs(&self) -> Vec<PathBuf>
static_url — with
no namespace segment. Read moreSource§fn commands(&self) -> Vec<Box<dyn PluginCommand>>
fn commands(&self) -> Vec<Box<dyn PluginCommand>>
Source§fn api_endpoints(&self) -> Vec<ApiEndpoint>
fn api_endpoints(&self) -> Vec<ApiEndpoint>
Auto Trait Implementations§
impl Freeze for AnalyticsPlugin
impl RefUnwindSafe for AnalyticsPlugin
impl Send for AnalyticsPlugin
impl Sync for AnalyticsPlugin
impl Unpin for AnalyticsPlugin
impl UnsafeUnpin for AnalyticsPlugin
impl UnwindSafe for AnalyticsPlugin
Blanket Implementations§
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
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> ⓘ
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> ⓘ
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 moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);