4 个版本 (2 个重大更新)

0.3.1 2020 年 10 月 24 日
0.3.0 2020 年 10 月 24 日
0.2.0 2019 年 12 月 23 日
0.0.1 2019 年 8 月 23 日

#12 in #statsd

MIT/Apache

330KB
417

actix-web-metrics-mw

适用于 actix-web 指标聚合的通用中间件库,可以将指标发送到各种出口。

![构建状态](https://github.com/Igosuki/actix-web-metrics-mw/workflows/build.yml/badge.svg docs.rs crates.io MIT licensed

使用 metrics-rscrate 对 actix-web 进行指标中间件配置。

默认跟踪两个指标(假设命名空间为 actix_web_metrics_mw

可用的导出器

  • Statsd:使用 statsd rust 客户端通过 UDP 缓存指标,支持 dogstats 格式作为指标标签

默认指标

  • http_requests_total(标签:endpoint、method、status):每个端点和方法的请求计数器。
  • http_requests_duration(标签:endpoint、method、status):每个端点的请求持续时间的直方图。

依赖项

  • actix 2
  • futures 0.3
  • metrics 0.12

问题

请随时提交您认为必要的进化问题。

使用方法

首先将 actix_web_metrics_mw 添加到您的 Cargo.toml

[dependencies]
actix_web_metrics_mw = "0.2.0"

然后实例化 Prometheus 中间件并将其传递给 .wrap()

use actix_web::{web, App, HttpResponse, HttpServer};
use actix_web_metrics_mw::Metrics;

fn health() -> HttpResponse {
    HttpResponse::Ok().finish()
}

fn main() -> std::io::Result<()> {
    let metrics = Metrics::new("/metrics", "actix_web_mw_test");
    HttpServer::new(move || {
        App::new()
            .wrap(metrics.clone())
            .service(web::resource("/health").to(health))
    })
    .bind("127.0.0.1:8080")?
    .run();
    Ok(())
}

以上为例,有几件事情需要说明

  • api 是指标命名空间
  • /metrics 将自动公开(仅支持 GET 请求)

调用 /metrics 端点将公开您的指标

$ curl https://127.0.0.1:8080/metrics
{"http_requests_total":"1570","http_requests_duration":"[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]"}

自定义指标

您可以实例化 Metrics 并使用其 sink 注册您的自定义指标。

您还可以使用 metrics 库宏或整个 metrics 运行时来添加新的指标和标签,以满足您的需求。

use actix_web::{web, App, HttpResponse, HttpServer};
use actix_web_metrics_mw::Metrics;

fn health() -> HttpResponse {
    counter!("endpoint.method.status", 1);
    HttpResponse::Ok().finish()
}

fn main() -> std::io::Result<()> {
    let metrics = Metrics::new("/metrics", "actix_web_mw_test");

    HttpServer::new(move || {
        App::new()
            .wrap(metrics.clone())
            .service(web::resource("/health").to(health))
    })
    .bind("127.0.0.1:8080")?
    .run();
    Ok(())
}

实时功能测试

使用docker-compose文件。实际结果

Alt text

特别感谢

依赖项

~30MB
~621K SLoC