use std::time::Duration;
use metrics::{CounterBuilder, GaugeBuilder, HistogramBuilder, SummaryBuilder};
use {default_registry, Registry};
#[derive(Debug, Clone)]
pub struct MetricBuilder {
namespace: Option<String>,
subsystem: Option<String>,
labels: Vec<(String, String)>,
registries: Vec<Registry>,
}
impl MetricBuilder {
pub fn new() -> Self {
Self::with_registry(default_registry())
}
pub fn with_registry(registry: Registry) -> Self {
MetricBuilder {
namespace: None,
subsystem: None,
labels: Vec::new(),
registries: vec![registry],
}
}
pub fn without_registry() -> Self {
MetricBuilder {
namespace: None,
subsystem: None,
labels: Vec::new(),
registries: Vec::new(),
}
}
pub fn namespace(&mut self, namespace: &str) -> &mut Self {
self.namespace = Some(namespace.to_owned());
self
}
pub fn subsystem(&mut self, subsystem: &str) -> &mut Self {
self.subsystem = Some(subsystem.to_owned());
self
}
pub fn label(&mut self, name: &str, value: &str) -> &mut Self {
self.labels.push((name.to_owned(), value.to_owned()));
self
}
pub fn registry(&mut self, registry: Registry) -> &mut Self {
self.registries.push(registry);
self
}
pub fn set_registry(&mut self, registry: Registry) -> &mut Self {
self.registries = vec![registry];
self
}
pub fn counter(&self, name: &str) -> CounterBuilder {
let mut builder = CounterBuilder::new(name);
if let Some(ref namespace) = self.namespace {
builder.namespace(namespace);
}
if let Some(ref subsystem) = self.subsystem {
builder.subsystem(subsystem);
}
for &(ref k, ref v) in &self.labels {
builder.label(k, v);
}
for r in &self.registries {
builder.registry(r.clone());
}
builder
}
pub fn gauge(&self, name: &str) -> GaugeBuilder {
let mut builder = GaugeBuilder::new(name);
if let Some(ref namespace) = self.namespace {
builder.namespace(namespace);
}
if let Some(ref subsystem) = self.subsystem {
builder.subsystem(subsystem);
}
for &(ref k, ref v) in &self.labels {
builder.label(k, v);
}
for r in &self.registries {
builder.registry(r.clone());
}
builder
}
pub fn histogram(&self, name: &str) -> HistogramBuilder {
let mut builder = HistogramBuilder::new(name);
if let Some(ref namespace) = self.namespace {
builder.namespace(namespace);
}
if let Some(ref subsystem) = self.subsystem {
builder.subsystem(subsystem);
}
for &(ref k, ref v) in &self.labels {
builder.label(k, v);
}
for r in &self.registries {
builder.registry(r.clone());
}
builder
}
pub fn summary(&self, name: &str, window: Duration) -> SummaryBuilder {
let mut builder = SummaryBuilder::new(name, window);
if let Some(ref namespace) = self.namespace {
builder.namespace(namespace);
}
if let Some(ref subsystem) = self.subsystem {
builder.subsystem(subsystem);
}
for &(ref k, ref v) in &self.labels {
builder.label(k, v);
}
for r in &self.registries {
builder.registry(r.clone());
}
builder
}
}
impl Default for MetricBuilder {
fn default() -> Self {
Self::new()
}
}