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 在 调试 中
85,216 每月下载次数
在 3 个 crate 中使用 (2 个直接使用)
250KB
4.5K SLoC
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
- Discord服务器用于项目讨论。
- 关注@getsentry以获取更新
依赖关系
~3–5MB
~120K SLoC