#prometheus-metrics #prometheus #metrics #blocking-client #push-gateway #oberservability

prometheus_push

用于扩展带有pushgateway支持的prometheus crate的工具包

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

Download history 4/week @ 2024-05-06 16/week @ 2024-05-13 9/week @ 2024-05-20 25/week @ 2024-05-27 1/week @ 2024-06-03 3/week @ 2024-06-10 196/week @ 2024-06-17 100/week @ 2024-06-24 57/week @ 2024-07-01 32/week @ 2024-07-08 71/week @ 2024-07-15 3/week @ 2024-07-22 128/week @ 2024-07-29 381/week @ 2024-08-05 107/week @ 2024-08-12

每月下载量达619

MIT授权

55KB
846

Prometheus Push ⏫

prometheus_push作为扩展,可以与如prometheusprometheus-client这样的crate一起使用,以便将非阻塞(默认)或阻塞数据推送到您的Prometheus pushgateway,同时使用更轻量级的reqwest(例如,无需openssl)或使用您自己的http客户端或另一个prometheus crate – 此工具包完全通用,您可以自由地进行任何操作。

如果您想与reqwestprometheusprometheus-client crate一起使用,实际上您无需实现任何内容(参见下方的场景),因为这些通用用法已作为此crate中的特性实现。

在此工具包的精简版本中,您必须实现Push特性(见此处),才能与您选择的http客户端一起使用,或者——如前所述——您可以使用with_reqwestwith_reqwest_blocking特性。这些特性已经在底层使用reqwest实现了PushPushClient。在这种情况下,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. 我以 非阻塞 方式使用 reqwestprometheus 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. 我以 阻塞 方式使用 reqwestprometheus 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. 我以 非阻塞 方式使用 reqwestprometheus-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, &registry)?;

    metrics_pusher
        .push_all(
            "<your push jobs name>",
            &grouping,
            metrics,
        )
        .await?;

    Ok(())
}

4. 我以 阻塞 方式使用 reqwestprometheus-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, &registry)?;

    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:默认情况下启用异步功能,不启用 reqwest
  • non_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 的功能

许可证

MIT

依赖关系

~1–13MB
~171K SLoC