greentic_component/
telemetry.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::manifest::ComponentManifest;
6
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
8pub struct TelemetrySpec {
9    pub span_prefix: String,
10    #[serde(default)]
11    pub attributes: BTreeMap<String, String>,
12    #[serde(default = "default_emit_node_spans")]
13    pub emit_node_spans: bool,
14}
15
16impl TelemetrySpec {
17    pub fn attribute(&self, key: &str) -> Option<&String> {
18        self.attributes.get(key)
19    }
20}
21
22fn default_emit_node_spans() -> bool {
23    true
24}
25
26pub fn span_name(component: &ComponentManifest, operation: &str) -> String {
27    let prefix = component
28        .telemetry
29        .as_ref()
30        .map(|spec| spec.span_prefix.as_str())
31        .unwrap_or_else(|| component.id.as_str());
32    format!("{prefix}/{operation}")
33}