#metrics #cloud-watch #aws #aws-lambda

metrics_cloudwatch_embedded

CloudWatch嵌入式度量格式发射器,用于metrics crate

9个不稳定版本 (4个破坏性)

0.5.0 2024年4月5日
0.4.3 2024年1月13日
0.4.2 2023年7月31日
0.3.1 2023年6月30日
0.1.0 2023年6月26日

#729 in 网络编程

Download history 48/week @ 2024-03-13 2/week @ 2024-03-20 6/week @ 2024-03-27 196/week @ 2024-04-03 57/week @ 2024-04-10 8/week @ 2024-04-17 19/week @ 2024-04-24 130/week @ 2024-05-01 48/week @ 2024-05-08 63/week @ 2024-05-15 71/week @ 2024-05-22 92/week @ 2024-05-29 171/week @ 2024-06-05 158/week @ 2024-06-12 138/week @ 2024-06-19 95/week @ 2024-06-26

每月580次下载

Apache-2.0

57KB
773

metrics_cloudwatch_embedded

Crates.io version shield Crates.io license shield

目的

metrics界面crate提供后端,以CloudWatch嵌入式度量格式发出度量

简单示例

let metrics = metrics_cloudwatch_embedded::Builder::new()
    .cloudwatch_namespace("MyApplication")
    .init()
    .unwrap();

metrics::counter!("requests", "Method" => "Default").increment(1);

metrics
    .set_property("RequestId", "ABC123")
    .flush(std::io::stdout());

AWS Lambda示例

Lambda Runtime集成功能通过run()或其他替代方案或实现tower::Service特质的MetricService在每次调用后处理刷新度量。

它还提供可选的辅助功能

  • 在冷启动时发出度量
  • 将冷启动包装在tracing跨度中
  • 用请求ID和/或X-Ray跟踪ID装饰度量文档

在您的Cargo.toml中添加

metrics = "0.22.3"
metrics_cloudwatch_embedded = {  version = "0.5.0", features = ["lambda"] }
tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "env-filter", "json"] }

main.rs

use lambda_runtime::{Error, LambdaEvent};
use metrics_cloudwatch_embedded::lambda::handler::run;
use serde::{Deserialize, Serialize};
use tracing::{info, info_span};

#[derive(Deserialize)]
struct Request {}

#[derive(Serialize)]
struct Response {
    req_id: String,
}

async fn function_handler(event: LambdaEvent<Request>) -> Result<Response, Error> {
    let resp = Response {
        req_id: event.context.request_id.clone(),
    };

    info!("Hello from function_handler");

    metrics::counter!("requests", "Method" => "Default").increment(1);

    Ok(resp)
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .json()
        .with_env_filter(tracing_subscriber::filter::EnvFilter::from_default_env())
        .with_target(false)
        .with_current_span(false)
        .without_time()
        .init();

    let metrics = metrics_cloudwatch_embedded::Builder::new()
        .cloudwatch_namespace("MetricsTest")
        .with_dimension("function", std::env::var("AWS_LAMBDA_FUNCTION_NAME").unwrap())
        .lambda_cold_start_span(info_span!("cold start").entered())
        .lambda_cold_start_metric("ColdStart")
        .with_lambda_request_id("RequestId")
        .init()
        .unwrap();

    info!("Hello from main");

    run(metrics, function_handler).await
}

单次调用(冷启动)后的CloudWatch日志

INIT_START Runtime Version: provided:al2.v19	Runtime Version ARN: arn:aws:lambda:us-west-2::runtime:d1007133cb0d993d9a42f9fc10442cede0efec65d732c7943b51ebb979b8f3f8
{"level":"INFO","fields":{"message":"Hello from main"},"spans":[{"name":"cold start"}]}
START RequestId: fce53486-160d-41e8-b8c3-8ef0fd0f4051 Version: $LATEST
{"_aws":{"Timestamp":1688294472338,"CloudWatchMetrics":[{"Namespace":"MetricsTest","Dimensions":[["Function"]],"Metrics":[{"Name":"ColdStart","Unit":"Count"}]}]},"Function":"MetricsTest","RequestId":"fce53486-160d-41e8-b8c3-8ef0fd0f4051","ColdStart":1}
{"level":"INFO","fields":{"message":"Hello from function_handler"},"spans":[{"name":"cold start"},{"requestId":"fce53486-160d-41e8-b8c3-8ef0fd0f4051","xrayTraceId":"Root=1-64a15448-4aa914a00d66aa066325d7e3;Parent=60a7d0c22fb2f001;Sampled=0;Lineage=16f3a795:0","name":"Lambda runtime invoke"}]}
{"_aws":{"Timestamp":1688294472338,"CloudWatchMetrics":[{"Namespace":"MetricsTest","Dimensions":[["Function","Method"]],"Metrics":[{"Name":"requests"}]}]},"Function":"MetricsTest","Method":"Default","RequestId":"fce53486-160d-41e8-b8c3-8ef0fd0f4051","requests":1}
END RequestId: fce53486-160d-41e8-b8c3-8ef0fd0f4051
REPORT RequestId: fce53486-160d-41e8-b8c3-8ef0fd0f4051 Duration: 1.22 ms Billed Duration: 11 ms Memory Size: 128 MB Max Memory Used: 13 MB Init Duration: 8.99 ms

限制

  • 直方图在调用collector::Collector::flush之间保留最多100个值(单个度量文档的最大值),溢出将通过tracing crate报告错误
  • 通过Builder::with_dimension(...)在初始化时设置的维度可能与度量labels不重叠
  • 仅支持metrics::Unit中的度量单位子集 https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html
  • 使用相同的 metrics::Key 注册不同的指标类型将通过 tracing 库报错。
  • 嵌入式指标格式支持每个指标最多30个维度,尝试注册超过30个维度/标签的指标将通过 tracing 库报错。

支持的Rust版本(MSRV)

此库至少需要Rust 1.65,并且无法保证在更早的编译器版本上构建。

当异步特性发布到稳定版时,这可能会发生变化,具体取决于对生态系统的连锁反应。

许可证

本项目采用Apache-2.0许可证。选择Apache-2.0是为了与Lambda Runtime相匹配。

贡献

除非您明确声明,否则您提交的任何有意包含在作品中的贡献,如Apache-2.0许可证所定义,应按上述方式许可,不附加任何额外条款或条件。

反馈

您的反馈非常重要,如果您评估或使用此库,请在我们的Github反馈讨论中留下帖子。

谢谢

  • Simon Andersson (ramn) 和贡献者 - 为metrics_cloudwatch库,我将其用作参考
  • Toby Lawrence (tobz) - 在我甚至还没有完成任何工作之前,就回答了我的指标库问题

依赖项

~3–17MB
~183K SLoC