Skip to main content

test_sdk/
test_sdk.rs

1use levelops_sdk::{Client, Config, Event, MeasureOpts};
2use std::collections::HashMap;
3use std::time::Duration;
4use tokio::time::sleep;
5
6const API_KEY: &str = "your-tenant-key";
7const SLI_ID: &str = "your-sli-id";
8const BASE_URL: &str = "http://localhost:8081";
9
10#[tokio::main]
11async fn main() {
12    let dimensions: HashMap<String, String> = [
13        ("service".into(), "api".into()),
14        ("region".into(), "eu".into()),
15    ]
16    .into();
17
18    let client = Client::new(Config {
19        api_key: API_KEY.into(),
20        sli_id: SLI_ID.into(),
21        base_url: BASE_URL.into(),
22        ..Default::default()
23    })
24    .unwrap();
25
26    println!("LevelOps SDK test — boucle toutes les secondes. Ctrl+C pour arrêter.");
27    let mut i = 0u64;
28    loop {
29        i += 1;
30        let latency = rand_range(20, 500);
31
32        // Usage direct
33        let mut fields = HashMap::new();
34        fields.insert("result".into(), serde_json::Value::String("ok".into()));
35        fields.insert("latency_ms".into(), serde_json::Value::Number(latency.into()));
36
37        client
38            .record(Event {
39                fields,
40                dimensions: dimensions.clone(),
41                ..Default::default()
42            })
43            .await
44            .unwrap();
45        println!("[{i}] record() envoyé");
46
47        // Usage measure (simulation latence)
48        let extra_fields: HashMap<String, serde_json::Value> =
49            [("service_version".into(), serde_json::Value::String("1.0".into()))].into();
50        client
51            .measure(
52                |ctx| async move {
53                    sleep(Duration::from_millis(rand_range(50, 300))).await;
54                    ctx.set_result(if rand_bool(0.9) { "ok" } else { "error" });
55                    Ok(())
56                },
57                MeasureOpts::new(dimensions.clone()).fields(extra_fields),
58            )
59            .await
60            .unwrap();
61        println!("[{i}] measure() terminé");
62
63        sleep(Duration::from_secs(1)).await;
64    }
65}
66
67fn rand_range(min: u64, max: u64) -> u64 {
68    use std::time::{SystemTime, UNIX_EPOCH};
69    let seed = SystemTime::now()
70        .duration_since(UNIX_EPOCH)
71        .unwrap_or_default()
72        .subsec_nanos() as u64;
73    min + seed % (max - min)
74}
75
76fn rand_bool(probability: f64) -> bool {
77    use std::time::{SystemTime, UNIX_EPOCH};
78    let seed = SystemTime::now()
79        .duration_since(UNIX_EPOCH)
80        .unwrap_or_default()
81        .subsec_nanos() as f64;
82    (seed / 1_000_000_000.0) < probability
83}