27 个版本

0.34.0 2024 年 6 月 5 日
0.32.3 2024 年 4 月 16 日
0.32.2 2024 年 1 月 30 日
0.32.1 2023 年 12 月 18 日
0.25.0 2022 年 3 月 2 日

#392调试

Download history 16769/week @ 2024-05-02 14581/week @ 2024-05-09 30233/week @ 2024-05-16 30339/week @ 2024-05-23 17910/week @ 2024-05-30 29548/week @ 2024-06-06 22120/week @ 2024-06-13 23645/week @ 2024-06-20 27907/week @ 2024-06-27 21054/week @ 2024-07-04 17421/week @ 2024-07-11 18341/week @ 2024-07-18 18703/week @ 2024-07-25 20721/week @ 2024-08-01 28345/week @ 2024-08-08 13892/week @ 2024-08-15

85,216 每月下载次数
3 个 crate 中使用 (2 个直接使用)

Apache-2.0

250KB
4.5K SLoC

Sentry

Sentry Rust SDK: sentry-tower

为 Tower 服务器(或客户端)接收到的每个请求添加对自动 hub 绑定的支持(尽管在这种情况下用途有限)。

这允许在请求处理过程中收集的面包屑落在特定的 hub 中,并在每次请求绑定新的 hub 时避免它们在请求之间混合。

示例

use sentry_tower::NewSentryLayer;

// Compose a Tower service where each request gets its own Sentry hub
let service = ServiceBuilder::new()
    .layer(NewSentryLayer::<Request>::new_from_top())
    .timeout(Duration::from_secs(30))
    .service(tower::service_fn(|req: Request| format!("hello {}", req)));

可以通过 new 函数实现更多定制,例如直接传递 [Hub]。

use sentry::Hub;
use sentry_tower::SentryLayer;

// Create a hub dedicated to web requests
let hub = Arc::new(Hub::with(|hub| Hub::new_from_top(hub)));

// Compose a Tower service
let service = ServiceBuilder::new()
    .layer(SentryLayer::<_, _, Request>::new(hub))
    .timeout(Duration::from_secs(30))
    .service(tower::service_fn(|req: Request| format!("hello {}", req)));

层也可以接受一个闭包,根据传入的请求返回一个 hub。

use sentry::Hub;
use sentry_tower::SentryLayer;

// Compose a Tower service
let hello = Arc::new(Hub::with(|hub| Hub::new_from_top(hub)));
let other = Arc::new(Hub::with(|hub| Hub::new_from_top(hub)));

let service = ServiceBuilder::new()
    .layer(SentryLayer::new(|req: &Request| match req.as_str() {
        "hello" => hello.clone(),
        _ => other.clone(),
    }))
    .timeout(Duration::from_secs(30))
    .service(tower::service_fn(|req: Request| format!("{} world", req)));

当使用 Tonic 时,可以直接通过 Tonic 栈使用该层

use hello_world::{greeter_server::*, *};
use sentry_tower::NewSentryLayer;

struct GreeterService;

#[tonic::async_trait]
impl Greeter for GreeterService {
    async fn say_hello(
        &self,
        req: Request<HelloRequest>,
    ) -> Result<Response<HelloReply>, Status> {
        let HelloRequest { name } = req.into_inner();
        if name == "world" {
            capture_anyhow(&anyhow!("Trying to greet a planet"));
            return Err(Status::invalid_argument("Cannot greet a planet"));
        }
        Ok(Response::new(HelloReply {
            message: format!("Hello {}", name),
        }))
    }
}

Server::builder()
    .layer(NewSentryLayer::new_from_top())
    .add_service(GreeterServer::new(GreeterService))
    .serve("127.0.0.1:50051".parse().unwrap())
    .await?;

使用 tower-http

http功能是sentry-tower库提供的一个额外层,该层会将请求详细信息附加到捕获的事件上,并根据传入的HTTP头信息可选地启动一个新的性能监控事务。当通过sentry::integrations::tower使用tower集成时,可以通过tower-http功能来启用此功能,而不是使用tower功能。

创建的事务将自动使用请求URI作为其名称。如果请求URI包含唯一ID或其他内容,这有时可能不是期望的结果。在这种情况下,用户应使用Scope::set_transaction方法在请求处理程序中手动覆盖事务名称。

结合这两个层时,要注意它们的顺序。例如,在tower::ServiceBuilder中,始终在定义Http层之前定义Hub层,如下所示

let layer = tower::ServiceBuilder::new()
    .layer(sentry_tower::NewSentryLayer::<Request>::new_from_top())
    .layer(sentry_tower::SentryHttpLayer::with_transaction());

资源

许可证:Apache-2.0

依赖关系

~3–5MB
~120K SLoC