mirror of
https://github.com/narrrl/proton-sdk-rs.git
synced 2026-11-03 16:41:26 +01:00
feat(sdk/telemetry): implemented client telemetry
This commit is contained in:
1 parent
20d9ed66c8
commit
5d4e20d4c2
1 file changed
+66
@@ -579,4 +579,70 @@ mod tests {
|
|||||||
fn disabled_policy_has_no_retries() {
|
fn disabled_policy_has_no_retries() {
|
||||||
assert_eq!(RetryPolicy::disabled().max_retries, 0);
|
assert_eq!(RetryPolicy::disabled().max_retries, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A telemetry sink that records every event for assertions.
|
||||||
|
struct Capture(std::sync::Mutex<Vec<crate::telemetry::TelemetryEvent>>);
|
||||||
|
|
||||||
|
impl Telemetry for Capture {
|
||||||
|
fn record(&self, event: &crate::telemetry::TelemetryEvent) {
|
||||||
|
self.0.lock().unwrap().push(event.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn http_request_records_telemetry_event() {
|
||||||
|
use crate::telemetry::Outcome;
|
||||||
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||||
|
|
||||||
|
// One-shot loopback server: read the request, reply with the success
|
||||||
|
// envelope, then close.
|
||||||
|
let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
|
||||||
|
let addr = listener.local_addr().unwrap();
|
||||||
|
let server = tokio::spawn(async move {
|
||||||
|
let (mut sock, _) = listener.accept().await.unwrap();
|
||||||
|
let mut buf = [0u8; 2048];
|
||||||
|
let _ = sock.read(&mut buf).await.unwrap();
|
||||||
|
let body = br#"{"Code":1000}"#;
|
||||||
|
let head = format!(
|
||||||
|
"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n",
|
||||||
|
body.len()
|
||||||
|
);
|
||||||
|
sock.write_all(head.as_bytes()).await.unwrap();
|
||||||
|
sock.write_all(body).await.unwrap();
|
||||||
|
sock.flush().await.unwrap();
|
||||||
|
});
|
||||||
|
|
||||||
|
let config = ProtonClientConfiguration::new("test@1.0")
|
||||||
|
.with_base_url(format!("http://{addr}/"))
|
||||||
|
.with_retry_policy(RetryPolicy::disabled());
|
||||||
|
let client = ApiHttpClient::new(
|
||||||
|
config,
|
||||||
|
SessionId::from("test-session"),
|
||||||
|
Tokens {
|
||||||
|
access_token: "access".into(),
|
||||||
|
refresh_token: "refresh".into(),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let capture = Arc::new(Capture(std::sync::Mutex::new(Vec::new())));
|
||||||
|
client.set_telemetry(capture.clone());
|
||||||
|
|
||||||
|
let _: ApiResponse = client.get("some/path").await.unwrap();
|
||||||
|
server.await.unwrap();
|
||||||
|
|
||||||
|
let events = capture.0.lock().unwrap();
|
||||||
|
assert_eq!(events.len(), 1, "exactly one http_request event");
|
||||||
|
let event = &events[0];
|
||||||
|
assert_eq!(event.operation, "http_request");
|
||||||
|
assert_eq!(event.outcome, Outcome::Success);
|
||||||
|
assert!(event
|
||||||
|
.attributes
|
||||||
|
.iter()
|
||||||
|
.any(|(k, v)| *k == "method" && v == "GET"));
|
||||||
|
assert!(event
|
||||||
|
.attributes
|
||||||
|
.iter()
|
||||||
|
.any(|(k, v)| *k == "status" && v == "200"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user