[−][src]Trait envoy_sdk::extension::factory::ExtensionFactory
An interface of the Envoy
Extension Factory
.
ExtensionFactory
is responsible for
- handling extension configuration,
- owning state shared by all extension instances,
- creating new instances of extension, injecting their dependencies and shared state.
At the moment, ExtensionFactory
can be used for HttpFilter
and NetworkFilter
extensions.
AccessLogger
extension has a different lifecycle and therefore manages its
configuration differently.
Examples
Basic ExtensionFactory
:
use envoy::extension::{ExtensionFactory, InstanceId, Result}; /// `ExtensionFactory` for `MyHttpFilter`. struct MyHttpFilterFactory; impl ExtensionFactory for MyHttpFilterFactory { type Extension = MyHttpFilter; const NAME: &'static str = "my_http_filter"; fn new_extension(&mut self, _instance_id: InstanceId) -> Result<Self::Extension> { Ok(MyHttpFilter) } }
Handling extension configuration:
use std::rc::Rc; use envoy::extension::{factory, ConfigStatus, ExtensionFactory, InstanceId, Result}; /// `ExtensionFactory` for `MyHttpFilter`. struct MyHttpFilterFactory { // This example shows how multiple filter instances could share // the same configuration. config: Rc<String>, } impl ExtensionFactory for MyHttpFilterFactory { type Extension = MyHttpFilter; const NAME: &'static str = "my_http_filter"; /// Called when extension is being (re-)configured on `Envoy Listener` update. fn on_configure(&mut self, _configuration_size: usize, ops: &dyn factory::ConfigureOps) -> Result<ConfigStatus> { let config = match ops.configuration()? { Some(bytes) => String::from_utf8(bytes)?, None => String::default(), }; self.config = Rc::new(config); Ok(ConfigStatus::Accepted) } fn new_extension(&mut self, _instance_id: InstanceId) -> Result<Self::Extension> { Ok(MyHttpFilter::new(Rc::clone(&self.config))) } }
Sharing Stats
between filter instances:
use std::rc::Rc; use envoy::extension::{factory, ConfigStatus, ExtensionFactory, InstanceId, Result}; use envoy::host::stats::{Counter, Stats}; /// Stats shared between multiple filter instances. pub struct MyStats { requests_total: Box<dyn Counter>, } /// `ExtensionFactory` for `MyHttpFilter`. struct MyHttpFilterFactory { // This example shows how multiple filter instances could share stats. stats: Rc<MyStats>, } impl ExtensionFactory for MyHttpFilterFactory { type Extension = MyHttpFilter; const NAME: &'static str = "my_http_filter"; fn new_extension(&mut self, _instance_id: InstanceId) -> Result<Self::Extension> { Ok(MyHttpFilter::new(Rc::clone(&self.stats))) } } impl MyHttpFilterFactory { /// Creates a new factory. pub fn new(stats: &dyn Stats) -> Result<Self> { let my_stats = MyStats{ requests_total: stats.counter("examples.http_filter.requests_total")?, }; Ok(MyHttpFilterFactory { stats: Rc::new(my_stats), }) } /// Creates a new factory bound to the actual `Envoy` `ABI`. pub fn default() -> Result<Self> { Self::new(Stats::default()) } }
Associated Types
type Extension
Associated Constants
Loading content...Required methods
fn new_extension(&mut self, _instance_id: InstanceId) -> Result<Self::Extension>
Called to create a new instance of the extension, e.g. HttpFilter
or NetworkFilter
.
Arguments
instance_id
- opaque identifier of the extension instance.
Return value
a new instance of the extension.
Provided methods
fn on_configure(
&mut self,
_configuration_size: usize,
_ops: &dyn ConfigureOps
) -> Result<ConfigStatus>
&mut self,
_configuration_size: usize,
_ops: &dyn ConfigureOps
) -> Result<ConfigStatus>
Called when extension is being (re-)configured on Envoy Listener
update.
Arguments
_configuration_size
- size of configuration data._ops
- atrait object
through whichExtensionFactory
can access extension configuration.
Return value
ConfigStatus
telling Envoy
whether configuration has been successfully applied.
fn on_drain(&mut self) -> Result<DrainStatus>
Called when ExtensionFactory
is about to be destroyed.
Return value
DrainStatus
telling Envoy
whether ExtensionFactory
has already been drained
and can be now removed safely.