spin_telemetry/
detector.rs1use std::env;
2
3use opentelemetry::{Key, KeyValue, Value};
4use opentelemetry_sdk::{
5 Resource,
6 resource::{EnvResourceDetector, ResourceDetector},
7};
8use opentelemetry_semantic_conventions::attribute as otel_attribute;
9
10const OTEL_SERVICE_NAME: &str = "OTEL_SERVICE_NAME";
11
12#[derive(Debug)]
20pub struct SpinResourceDetector {
21 spin_version: String,
22}
23
24impl SpinResourceDetector {
25 pub fn new(spin_version: String) -> Self {
27 SpinResourceDetector { spin_version }
28 }
29}
30
31impl ResourceDetector for SpinResourceDetector {
32 fn detect(&self) -> Resource {
33 let service_name = env::var(OTEL_SERVICE_NAME)
34 .ok()
35 .filter(|s| !s.is_empty())
36 .map(Value::from)
37 .or_else(|| {
38 EnvResourceDetector::new()
39 .detect()
40 .get(&Key::new(otel_attribute::SERVICE_NAME))
41 })
42 .unwrap_or_else(|| "spin".into());
43 Resource::builder()
44 .with_attributes(vec![
45 KeyValue::new(otel_attribute::SERVICE_NAME, service_name),
46 KeyValue::new(otel_attribute::SERVICE_VERSION, self.spin_version.clone()),
47 ])
48 .build()
49 }
50}