Skip to content

Commit fe3b916

Browse files
Added k8s ResourceDetector (#122)
1 parent be31dcb commit fe3b916

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use opentelemetry::sdk::resource::{Resource, ResourceDetector};
2+
use opentelemetry_semantic_conventions::resource;
3+
use std::env;
4+
use std::time::Duration;
5+
6+
/// A resource detector for Kubernetes environment variables.
7+
pub struct K8sResourceDetector;
8+
9+
impl ResourceDetector for K8sResourceDetector {
10+
/// Detect Kubernetes-related environment variables and return a Resource.
11+
fn detect(&self, _timeout: Duration) -> Resource {
12+
// Attempt to read Kubernetes-specific environment variables.
13+
let pod_name = env::var("K8S_POD_NAME").unwrap_or_else(|_| "unknown_pod".to_string());
14+
let namespace_name = env::var("K8S_NAMESPACE_NAME").unwrap_or_else(|_| "unknown_namespace".to_string());
15+
let node_name = env::var("K8S_NODE_NAME").unwrap_or_else(|_| "unknown_node".to_string());
16+
17+
// Create a Resource with Kubernetes attributes.
18+
Resource::new(vec![
19+
resource::K8S_POD_NAME.string(pod_name),
20+
resource::K8S_NAMESPACE_NAME.string(namespace_name),
21+
resource::K8S_NODE_NAME.string(node_name),
22+
])
23+
}
24+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#[cfg(test)]
2+
mod tests {
3+
use super::*;
4+
use std::time::Duration;
5+
use temp_env;
6+
7+
#[test]
8+
fn test_k8s_resource_detector_with_env_vars() {
9+
// Temporarily set environment variables for the test
10+
temp_env::with_vars(
11+
[
12+
("K8S_POD_NAME", Some("test-pod")),
13+
("K8S_NAMESPACE_NAME", Some("test-namespace")),
14+
("K8S_NODE_NAME", Some("test-node")),
15+
],
16+
|| {
17+
// Create the K8sResourceDetector
18+
let detector = K8sResourceDetector::new();
19+
// Use the detector to fetch the resources
20+
let resource = detector.detect(Duration::from_secs(5));
21+
22+
// Assert that the detected resource attributes match the expected values
23+
assert_eq!(
24+
resource,
25+
Resource::new(vec![
26+
KeyValue::new("k8s.pod.name", "test-pod"),
27+
KeyValue::new("k8s.namespace.name", "test-namespace"),
28+
KeyValue::new("k8s.node.name", "test-node"),
29+
])
30+
);
31+
},
32+
);
33+
}
34+
35+
#[test]
36+
fn test_k8s_resource_detector_with_missing_env_vars() {
37+
// Temporarily set only one environment variable to test defaults
38+
temp_env::with_vars(
39+
[("K8S_POD_NAME", Some("test-pod"))],
40+
|| {
41+
// Create the K8sResourceDetector
42+
let detector = K8sResourceDetector::new();
43+
// Use the detector to fetch the resources
44+
let resource = detector.detect(Duration::from_secs(5));
45+
46+
// Assert that missing values use the default "unknown" values
47+
assert_eq!(
48+
resource,
49+
Resource::new(vec![
50+
KeyValue::new("k8s.pod.name", "test-pod"),
51+
KeyValue::new("k8s.namespace.name", "unknown_namespace"),
52+
KeyValue::new("k8s.node.name", "unknown_node"),
53+
])
54+
);
55+
},
56+
);
57+
}
58+
}

0 commit comments

Comments
 (0)