use schemars::JsonSchema;
use serde::Deserialize;
use super::connector::spans::ConnectorSpans;
use super::http_client::spans::HttpClientSpans;
use super::router::spans::RouterSpans;
use super::subgraph::spans::SubgraphSpans;
use super::supergraph::spans::SupergraphSpans;
use crate::plugins::telemetry::config_new::DefaultForLevel;
use crate::plugins::telemetry::config_new::attributes::DefaultAttributeRequirementLevel;
use crate::plugins::telemetry::otlp::TelemetryDataKind;
#[derive(Deserialize, JsonSchema, Clone, Default, Debug)]
#[serde(deny_unknown_fields, default)]
pub(crate) struct Spans {
pub(crate) default_attribute_requirement_level: DefaultAttributeRequirementLevel,
pub(crate) router: RouterSpans,
pub(crate) supergraph: SupergraphSpans,
pub(crate) subgraph: SubgraphSpans,
pub(crate) connector: ConnectorSpans,
pub(crate) http_client: HttpClientSpans,
}
impl Spans {
pub(crate) fn update_defaults(&mut self) {
self.router.defaults_for_levels(
self.default_attribute_requirement_level,
TelemetryDataKind::Traces,
);
self.supergraph.defaults_for_levels(
self.default_attribute_requirement_level,
TelemetryDataKind::Traces,
);
self.subgraph.defaults_for_levels(
self.default_attribute_requirement_level,
TelemetryDataKind::Traces,
);
self.http_client.defaults_for_levels(
self.default_attribute_requirement_level,
TelemetryDataKind::Traces,
);
}
pub(crate) fn validate(&self) -> Result<(), String> {
for (name, custom) in &self.router.attributes.custom {
custom
.validate()
.map_err(|err| format!("error for router span attribute {name:?}: {err}"))?;
}
for (name, custom) in &self.supergraph.attributes.custom {
custom
.validate()
.map_err(|err| format!("error for supergraph span attribute {name:?}: {err}"))?;
}
for (name, custom) in &self.subgraph.attributes.custom {
custom
.validate()
.map_err(|err| format!("error for subgraph span attribute {name:?}: {err}"))?;
}
for (name, custom) in &self.http_client.attributes.custom {
custom
.validate()
.map_err(|err| format!("error for http_client span attribute {name:?}: {err}"))?;
}
Ok(())
}
}