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 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 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}