8个版本
0.4.5 | 2024年6月23日 |
---|---|
0.4.4 | 2024年4月20日 |
0.4.3 | 2023年11月24日 |
0.3.0 | 2023年11月18日 |
0.2.1 | 2023年11月16日 |
在HTTP客户端分类中排名第63
每月下载量达619次
55KB
846 行
Prometheus Push ⏫
prometheus_push
作为扩展,可以与如prometheus或prometheus-client这样的crate一起使用,以便将非阻塞(默认)或阻塞数据推送到您的Prometheus pushgateway,同时使用更轻量级的reqwest
(例如,无需openssl
)或使用您自己的http客户端或另一个prometheus
crate – 此工具包完全通用,您可以自由地进行任何操作。
如果您想与reqwest
、prometheus
或prometheus-client
crate一起使用,实际上您无需实现任何内容(参见下方的场景),因为这些通用用法已作为此crate中的特性实现。
在此工具包的精简版本中,您必须实现Push
特性(见此处),才能与您选择的http客户端一起使用,或者——如前所述——您可以使用with_reqwest
或with_reqwest_blocking
特性。这些特性已经在底层使用reqwest
实现了Push
的PushClient
。在这种情况下,reqwest
未启用默认特性(最小集合),因此它不应干扰您自己的应用程序的reqwest
设置(例如rust-tls
)。
异步功能(特性non_blocking
)在此crate中被视为标准,但您可以通过启用blocking
特性来获取不带异步的实现。您可以通过启用with_reqwest_blocking
特性来启用相应的阻塞reqwest
实现,在这种情况下,您将启用reqwest
crate的blocking
特性。
在底层 Prometheus 功能方面,您必须自己实现 ConvertMetrics
特性(参见此处)或者使用已经实现的特性 prometheus_crate
,该特性利用了 prometheus crate 或 prometheus_client_crate
,后者使用了 prometheus-client crate。
场景
1. 我以 非阻塞 方式使用 reqwest
和 prometheus
crate
在您的 Cargo.toml
[dependencies]
prometheus_push = { version = "<version>", default-features = false, features = ["with_reqwest", "prometheus_crate"] }
use prometheus::labels;
use prometheus_push::prometheus_crate::PrometheusMetricsPusher;
use reqwest::Client;
use url::Url;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let push_gateway: Url = Url::parse("<address to pushgateway>")?;
let client = Client::new();
let metrics_pusher = PrometheusMetricsPusher::from(client, &push_gateway)?;
metrics_pusher
.push_all(
"<your push jobs name>",
&labels! { "<label_name>" => "<label_value>" },
prometheus::gather(),
)
.await?;
Ok(())
}
2. 我以 阻塞 方式使用 reqwest
和 prometheus
crate
在您的 Cargo.toml
[dependencies]
prometheus_push = { version = "<version>", default-features = false, features = ["with_reqwest_blocking", "prometheus_crate"] }
use prometheus::labels;
use prometheus_push::prometheus_crate::PrometheusMetricsPusherBlocking;
use reqwest::blocking::Client;
use url::Url;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let push_gateway: Url = Url::parse("<address to pushgateway>")?;
let client = Client::new();
let metrics_pusher = PrometheusMetricsPusherBlocking::from(client, &push_gateway)?;
metrics_pusher
.push_all(
"<your push jobs name>",
&labels! { "<label_name>" => "<label_value>" },
prometheus::gather(),
)?;
Ok(())
}
3. 我以 非阻塞 方式使用 reqwest
和 prometheus-client
crate
在您的 Cargo.toml
[dependencies]
prometheus_push = { version = "<version>", default-features = false, features = ["with_reqwest", "prometheus_client_crate"] }
use prometheus_client::encoding::text::encode;
use prometheus_push::prometheus_client_crate::PrometheusClientMetricsPusher;
use reqwest::Client;
use url::Url;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let push_gateway: Url = Url::parse("<address to pushgateway>")?;
let client = Client::new();
let metrics_pusher = PrometheusClientMetricsPusher::create(client, &push_gateway)?;
let grouping: HashMap<&str, &str> = HashMap::from([("<label_name>", "<label_value>")]);
let mut metrics = String::new();
encode(&mut metrics, ®istry)?;
metrics_pusher
.push_all(
"<your push jobs name>",
&grouping,
metrics,
)
.await?;
Ok(())
}
4. 我以 阻塞 方式使用 reqwest
和 prometheus-client
crate
在您的 Cargo.toml
[dependencies]
prometheus_push = { version = "<version>", default-features = false, features = ["with_reqwest_blocking", "prometheus_client_crate"] }
use prometheus_client::encoding::text::encode;
use prometheus_push::prometheus_client_crate::PrometheusClientMetricsPusherBlocking;
use reqwest::blocking::Client;
use url::Url;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let push_gateway: Url = Url::parse("<address to pushgateway>")?;
let client = Client::new();
let metrics_pusher = PrometheusClientMetricsPusherBlocking::create(client, &push_gateway)?;
let grouping: HashMap<&str, &str> = HashMap::from([("<label_name>", "<label_value>")]);
let mut metrics = String::new();
encode(&mut metrics, ®istry)?;
metrics_pusher
.push_all(
"<your push jobs name>",
&grouping,
metrics,
)?;
Ok(())
}
5. 我想要自己实现一切
如果您想要自己实现一切,可以通过实现 Push
特性和 ConvertMetrics
特性来实现。
自己实现 Push
如果您不使用 reqwest 作为 http 客户端,您可以选择自己实现 Push
特性的两个方法。作为一个指南,您可以参考 with_reqwest
功能的实现(参见 此处)。基本上,它就是这样简单。
use prometheus_push::Push;
pub struct YourPushClient;
impl Push<Vec<u8>> for YourPushClient {
async fn push_all(&self, url: &Url, body: Vec<u8>, content_type: &str) -> Result<()> {
// implement a PUT request with your client with this body and `content_type` in header
}
async fn push_add(&self, url: &Url, body: Vec<u8>, content_type: &str) -> Result<()> {
// implement a POST request with your client with this body and `content_type` in header
}
}
自己实现 ConvertMetrics
如果您想要使用另一个 Prometheus 客户端实现,您可以实现自己的类型,该类型实现了 ConvertMetrics
特性,并将其注入到您的 MetricsPusher
实例中。
impl ConvertMetrics<Vec<YourMetricFamily>, Vec<Box<dyn YourCollector>>, Vec<u8>> for YourMetricsConverter {
fn metric_families_from(
&self,
collectors: Vec<Box<dyn YourCollector>>,
) -> Result<Vec<YourMetricFamily>> {
// implement the conversion from your Collectors to your MetricsFamilies, or whatever
// your generic `MF` type stands for
}
fn create_push_details(
&self,
job: &str,
url: &Url,
grouping: &HashMap<&str, &str>,
metric_families: Vec<YourMetricFamily>,
) -> Result<(Url, Vec<u8>, String)> {
// create your push details for the `Push` methods: Url, body and content type
}
}
特性
default
:默认情况下启用异步功能,不启用 reqwestnon_blocking
:此特性启用异步功能blocking
:在默认功能的基础上,以阻塞方式获得相同的功能with_reqwest
:此特性同时启用non_blocking
特性和配置最少的reqwest
,并启用已实现的PushClient
with_reqwest_blocking
:与with_reqwest
类似,但包括blocking
而不是non_blocking
prometheus_crate
:启用 prometheus crate 的功能prometheus_client_crate
:启用 prometheus-client crate 的功能
许可证
依赖关系
~1–13MB
~171K SLoC