proxy_agent_shared/src/telemetry/span.rs (92 lines of code) (raw):
use std::fmt::{Display, Formatter};
// Copyright (c) Microsoft Corporation
// SPDX-License-Identifier: MIT
use super::event_logger;
use serde_derive::{Deserialize, Serialize};
use std::time::Instant;
pub struct SimpleSpan {
start: Instant,
}
#[derive(Serialize, Deserialize)]
struct ElapsedMessage {
elapsed: u128,
message: String,
}
impl ElapsedMessage {
fn new(elapsed: u128, message: String) -> Self {
ElapsedMessage { elapsed, message }
}
fn to_json_string(&self) -> String {
format!(
"{{\"elapsed\":{}, \"message\":\"{}\"}}",
self.elapsed, self.message
)
}
}
impl Display for ElapsedMessage {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
write!(f, "{} - {}", self.message, self.elapsed)
}
}
impl Default for SimpleSpan {
fn default() -> Self {
Self::new()
}
}
impl SimpleSpan {
pub fn new() -> Self {
SimpleSpan {
start: Instant::now(),
}
}
pub fn start_new(&mut self) {
self.start = Instant::now();
}
pub fn get_elapsed_time_in_millisec(&self) -> u128 {
self.start.elapsed().as_millis()
}
pub fn get_elapsed_json_message(&self, message: &str) -> String {
let elapsed_massage =
ElapsedMessage::new(self.get_elapsed_time_in_millisec(), message.to_string());
elapsed_massage.to_json_string()
}
pub fn write_event(
&self,
message: &str,
method_name: &str,
module_name: &str,
logger_key: &str,
) -> String {
let elapsed_massage =
ElapsedMessage::new(self.get_elapsed_time_in_millisec(), message.to_string());
event_logger::write_event(
log::Level::Info,
elapsed_massage.to_json_string(),
method_name,
module_name,
logger_key,
);
elapsed_massage.to_string()
}
}
#[cfg(test)]
mod tests {
use std::time::Duration;
use tokio::time::sleep;
#[tokio::test]
async fn span_test() {
let mut span = super::SimpleSpan::new();
sleep(Duration::from_millis(1)).await;
let elapsed = span.get_elapsed_time_in_millisec();
assert!(elapsed > 0);
let duration = Duration::from_millis(100);
sleep(duration).await;
let message: String = span.get_elapsed_json_message("test");
let elapsed_message: super::ElapsedMessage = serde_json::from_str(&message).unwrap();
assert_eq!(elapsed_message.message, "test");
assert!(elapsed_message.elapsed > duration.as_millis());
span.start_new();
sleep(Duration::from_millis(1)).await;
let elapsed = span.get_elapsed_time_in_millisec();
assert!(elapsed > 0);
assert!(elapsed < duration.as_millis());
}
}