From e2d603790140a41ee37e1ed65c019c9bbf688de3 Mon Sep 17 00:00:00 2001 From: James Thompson Date: Wed, 16 Jul 2025 18:33:56 +1000 Subject: [PATCH 1/2] Introduce the ability to define namespaces #802 --- crates/weaver_forge/src/registry.rs | 12 ++++ crates/weaver_resolved_schema/src/registry.rs | 22 +++++- crates/weaver_resolver/src/registry.rs | 2 + crates/weaver_semconv/data/gen-ai.yaml | 12 ++++ crates/weaver_semconv/src/footer.rs | 38 ++++++++++ crates/weaver_semconv/src/group.rs | 67 ++++++++++++++++-- crates/weaver_semconv/src/header.rs | 38 ++++++++++ crates/weaver_semconv/src/lib.rs | 3 + crates/weaver_semconv/src/registry.rs | 4 ++ crates/weaver_semconv/src/style.rs | 69 +++++++++++++++++++ src/registry/stats.rs | 3 + 11 files changed, 265 insertions(+), 5 deletions(-) create mode 100644 crates/weaver_semconv/data/gen-ai.yaml create mode 100644 crates/weaver_semconv/src/footer.rs create mode 100644 crates/weaver_semconv/src/header.rs create mode 100644 crates/weaver_semconv/src/style.rs diff --git a/crates/weaver_forge/src/registry.rs b/crates/weaver_forge/src/registry.rs index f44ec30c..711a52a5 100644 --- a/crates/weaver_forge/src/registry.rs +++ b/crates/weaver_forge/src/registry.rs @@ -14,7 +14,9 @@ use weaver_resolved_schema::lineage::GroupLineage; use weaver_resolved_schema::registry::{Group, Registry}; use weaver_semconv::any_value::AnyValueSpec; use weaver_semconv::deprecated::Deprecated; +use weaver_semconv::footer::FooterSpec; use weaver_semconv::group::{GroupType, InstrumentSpec, SpanKindSpec}; +use weaver_semconv::header::HeaderSpec; use weaver_semconv::stability::Stability; use weaver_semconv::YamlValue; @@ -116,6 +118,12 @@ pub struct ResolvedGroup { #[serde(default)] #[serde(skip_serializing_if = "Vec::is_empty")] pub entity_associations: Vec, + /// Header for the namespace/page. + #[serde(skip_serializing_if = "Option::is_none")] + pub header: Option, + /// Footer for the namespace/page. + #[serde(skip_serializing_if = "Option::is_none")] + pub footer: Option, /// Annotations for the group. #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] @@ -172,6 +180,8 @@ impl ResolvedGroup { lineage, display_name: group.display_name.clone(), body: group.body.clone(), + footer: group.footer.clone(), + header: group.header.clone(), entity_associations: group.entity_associations.clone(), annotations: group.annotations.clone(), }) @@ -233,6 +243,8 @@ impl ResolvedRegistry { lineage, display_name: group.display_name.clone(), body: group.body.clone(), + footer: group.footer.clone(), + header: group.header.clone(), entity_associations: group.entity_associations.clone(), annotations: group.annotations.clone(), } diff --git a/crates/weaver_resolved_schema/src/registry.rs b/crates/weaver_resolved_schema/src/registry.rs index 52eff43d..7547388a 100644 --- a/crates/weaver_resolved_schema/src/registry.rs +++ b/crates/weaver_resolved_schema/src/registry.rs @@ -13,10 +13,12 @@ use crate::catalog::Catalog; use crate::error::{handle_errors, Error}; use crate::lineage::GroupLineage; use crate::registry::GroupStats::{ - AttributeGroup, Entity, Event, Metric, MetricGroup, Scope, Span, Undefined, + AttributeGroup, Entity, Event, Metric, MetricGroup, Scope, Span, Undefined, NameSpace }; use serde::{Deserialize, Serialize}; use weaver_semconv::deprecated::Deprecated; +use weaver_semconv::footer::FooterSpec; +use weaver_semconv::header::HeaderSpec; use weaver_semconv::group::{GroupType, InstrumentSpec, SpanKindSpec}; use weaver_semconv::provenance::Provenance; use weaver_semconv::stability::Stability; @@ -127,6 +129,12 @@ pub struct Group { /// This fields is only used for event groups. #[serde(skip_serializing_if = "Option::is_none")] pub body: Option, + /// Header for the namespace/page. + #[serde(skip_serializing_if = "Option::is_none")] + pub header: Option, + /// Footer for the namespace/page. + #[serde(skip_serializing_if = "Option::is_none")] + pub footer: Option, /// Annotations for the group. #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] @@ -155,6 +163,7 @@ impl Group { GroupType::MetricGroup => None, GroupType::Entity => self.name.as_deref(), GroupType::Scope => None, + GroupType::NameSpace => self.name.as_deref(), GroupType::Undefined => None, } } @@ -218,6 +227,11 @@ pub enum GroupStats { /// Common statistics for this type of group. common_stats: CommonGroupStats, }, + /// Statistics for a namespace. + NameSpace { + /// Common statistics for this type of group. + common_stats: CommonGroupStats, + }, /// Statistics for a span. Span { /// Common statistics for this type of group. @@ -307,6 +321,9 @@ impl Registry { GroupType::Scope => Scope { common_stats: CommonGroupStats::default(), }, + GroupType::NameSpace => NameSpace { + common_stats: CommonGroupStats::default(), + }, GroupType::Span => Span { common_stats: CommonGroupStats::default(), span_kind_breakdown: HashMap::new(), @@ -359,6 +376,9 @@ impl Registry { Scope { common_stats } => { common_stats.update_stats(group); } + NameSpace { common_stats } => { + common_stats.update_stats(group); + } Span { common_stats, span_kind_breakdown, diff --git a/crates/weaver_resolver/src/registry.rs b/crates/weaver_resolver/src/registry.rs index 8123bf6f..172041aa 100644 --- a/crates/weaver_resolver/src/registry.rs +++ b/crates/weaver_resolver/src/registry.rs @@ -397,6 +397,8 @@ fn group_from_spec(group: GroupSpecWithProvenance) -> UnresolvedGroup { lineage: Some(GroupLineage::new(group.provenance.clone())), display_name: group.spec.display_name, body: group.spec.body, + header: group.spec.header, + footer: group.spec.footer, annotations: group.spec.annotations, entity_associations: group.spec.entity_associations, }, diff --git a/crates/weaver_semconv/data/gen-ai.yaml b/crates/weaver_semconv/data/gen-ai.yaml new file mode 100644 index 00000000..4030089f --- /dev/null +++ b/crates/weaver_semconv/data/gen-ai.yaml @@ -0,0 +1,12 @@ +groups: + - id: namespace.gen-ai + type: namespace + name: gen-ai + note: This is a description of the gen ai namespace + brief: This is a summary of the gen ai namespace + header: + title: Migration strategy + content: To protect personl information the following document should be followed. + style: warning + footer: + content: Footer \ No newline at end of file diff --git a/crates/weaver_semconv/src/footer.rs b/crates/weaver_semconv/src/footer.rs new file mode 100644 index 00000000..807308a2 --- /dev/null +++ b/crates/weaver_semconv/src/footer.rs @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: Apache-2.0 + +//! Stability specification. + +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use crate::style::Style; + +/// A header specification +#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)] +#[serde(deny_unknown_fields)] +pub struct FooterSpec { + + /// The title of the footer. + pub title: Option, + /// The content in the footer. + pub content: String, + /// The style of the footer. + pub style: Option