#![allow(dead_code)]
use opentelemetry::KeyValue;
use opentelemetry_sdk::Resource;
use opentelemetry_semantic_conventions::resource as sc;
use crate::config::TelemetryConfig;
const DEPLOYMENT_ENVIRONMENT_NAME: &str = "deployment.environment.name";
pub(crate) fn build_resource(cfg: &TelemetryConfig) -> Resource {
Resource::builder()
.with_attribute(KeyValue::new(sc::SERVICE_NAME, cfg.service_name.clone()))
.with_attribute(KeyValue::new(sc::SERVICE_VERSION, cfg.version.clone()))
.with_attribute(KeyValue::new(
DEPLOYMENT_ENVIRONMENT_NAME,
cfg.environment.clone(),
))
.build()
}
#[cfg(test)]
mod tests {
use super::*;
use opentelemetry::Key;
fn attr_value(resource: &Resource, key: &str) -> Option<String> {
resource
.get(&Key::new(key.to_string()))
.map(|v| v.as_str().into_owned())
}
#[test]
fn resource_carries_service_identity_from_config() {
let cfg = TelemetryConfig {
service_name: "test-service".to_string(),
environment: "staging".to_string(),
version: "1.2.3".to_string(),
..TelemetryConfig::default()
};
let r = build_resource(&cfg);
assert_eq!(
attr_value(&r, sc::SERVICE_NAME),
Some("test-service".to_string()),
"service.name must come from config"
);
assert_eq!(
attr_value(&r, sc::SERVICE_VERSION),
Some("1.2.3".to_string()),
"service.version must come from config"
);
assert_eq!(
attr_value(&r, DEPLOYMENT_ENVIRONMENT_NAME),
Some("staging".to_string()),
"deployment.environment.name must come from config"
);
}
#[test]
fn resource_includes_telemetry_sdk_language() {
let r = build_resource(&TelemetryConfig::default());
assert_eq!(
attr_value(&r, "telemetry.sdk.language"),
Some("rust".to_string()),
);
}
}