diff --git a/crates/weaver_emit/src/lib.rs b/crates/weaver_emit/src/lib.rs index 943b6cea..3e5e64b4 100644 --- a/crates/weaver_emit/src/lib.rs +++ b/crates/weaver_emit/src/lib.rs @@ -163,6 +163,7 @@ mod tests { tags: None, value: None, annotations: None, + role: Default::default(), }], span_kind: Some(SpanKindSpec::Internal), events: vec![], diff --git a/crates/weaver_emit/src/spans.rs b/crates/weaver_emit/src/spans.rs index f240a9e8..6fe115ed 100644 --- a/crates/weaver_emit/src/spans.rs +++ b/crates/weaver_emit/src/spans.rs @@ -249,6 +249,7 @@ mod tests { tags: None, value: None, annotations: None, + role: Default::default(), } } diff --git a/crates/weaver_forge/expected_output/semconv_jq_fn/semconv_events.json b/crates/weaver_forge/expected_output/semconv_jq_fn/semconv_events.json index b3bb4021..087f09f8 100644 --- a/crates/weaver_forge/expected_output/semconv_jq_fn/semconv_events.json +++ b/crates/weaver_forge/expected_output/semconv_jq_fn/semconv_events.json @@ -176,6 +176,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "source_group": "registry.exception" @@ -185,6 +186,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -198,6 +200,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "source_group": "registry.exception" @@ -207,6 +210,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ diff --git a/crates/weaver_forge/src/extensions/otel.rs b/crates/weaver_forge/src/extensions/otel.rs index 06c3d609..70d5ed5a 100644 --- a/crates/weaver_forge/src/extensions/otel.rs +++ b/crates/weaver_forge/src/extensions/otel.rs @@ -781,6 +781,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }; otel::add_filters(&mut env); @@ -810,6 +811,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }; assert_eq!( @@ -997,6 +999,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "rec.b".into(), @@ -1013,6 +1016,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "crec.a".into(), @@ -1029,6 +1033,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "crec.b".into(), @@ -1045,6 +1050,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "rec.c".into(), @@ -1061,6 +1067,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "rec.d".into(), @@ -1077,6 +1084,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "opt.a".into(), @@ -1093,6 +1101,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "opt.b".into(), @@ -1109,6 +1118,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "req.a".into(), @@ -1125,6 +1135,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "req.b".into(), @@ -1141,6 +1152,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, ]; let json = @@ -1200,6 +1212,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "attr2".to_owned(), @@ -1216,6 +1229,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, Attribute { name: "attr3".to_owned(), @@ -1232,6 +1246,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }, ]; @@ -1523,6 +1538,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }; otel::add_filters(&mut env); @@ -1552,6 +1568,7 @@ mod tests { value: None, prefix: false, annotations: None, + role: Default::default(), }; otel::add_filters(&mut env); diff --git a/crates/weaver_live_check/src/live_checker.rs b/crates/weaver_live_check/src/live_checker.rs index 60284a64..6ea11f18 100644 --- a/crates/weaver_live_check/src/live_checker.rs +++ b/crates/weaver_live_check/src/live_checker.rs @@ -102,8 +102,8 @@ mod tests { use weaver_resolved_schema::attribute::Attribute; use weaver_semconv::{ attribute::{ - AttributeType, EnumEntriesSpec, Examples, PrimitiveOrArrayTypeSpec, RequirementLevel, - TemplateTypeSpec, ValueSpec, + AttributeRole, AttributeType, EnumEntriesSpec, Examples, PrimitiveOrArrayTypeSpec, + RequirementLevel, TemplateTypeSpec, ValueSpec, }, group::{GroupType, SpanKindSpec}, stability::Stability, @@ -320,6 +320,7 @@ mod tests { tags: None, value: None, annotations: None, + role: AttributeRole::Identifying, }, Attribute { name: "test.enum".to_owned(), @@ -358,6 +359,7 @@ mod tests { tags: None, value: None, annotations: None, + role: AttributeRole::Identifying, }, Attribute { name: "test.deprecated".to_owned(), @@ -381,6 +383,7 @@ mod tests { tags: None, value: None, annotations: None, + role: AttributeRole::Identifying, }, Attribute { name: "test.template".to_owned(), @@ -402,6 +405,7 @@ mod tests { tags: None, value: None, annotations: None, + role: AttributeRole::Identifying, }, ], span_kind: Some(SpanKindSpec::Internal), @@ -451,6 +455,7 @@ mod tests { tags: None, value: None, annotations: None, + role: AttributeRole::Identifying, }], span_kind: Some(SpanKindSpec::Internal), events: vec![], @@ -619,6 +624,7 @@ mod tests { tags: None, value: None, annotations: None, + role: AttributeRole::Identifying, }], span_kind: Some(SpanKindSpec::Internal), events: vec![], diff --git a/crates/weaver_resolved_schema/src/attribute.rs b/crates/weaver_resolved_schema/src/attribute.rs index 1455700d..83f404c3 100644 --- a/crates/weaver_resolved_schema/src/attribute.rs +++ b/crates/weaver_resolved_schema/src/attribute.rs @@ -13,7 +13,9 @@ use std::fmt::Display; use std::ops::Not; #[cfg(test)] use weaver_semconv::attribute::PrimitiveOrArrayTypeSpec; -use weaver_semconv::attribute::{AttributeSpec, AttributeType, Examples, RequirementLevel}; +use weaver_semconv::attribute::{ + AttributeRole, AttributeSpec, AttributeType, Examples, RequirementLevel, +}; use weaver_semconv::deprecated::Deprecated; use weaver_semconv::stability::Stability; use weaver_semconv::YamlValue; @@ -87,6 +89,10 @@ pub struct Attribute { /// Note: This is only used in a telemetry schema specification. #[serde(skip_serializing_if = "Option::is_none")] pub value: Option, + /// Whether the attribute is identifying or descriptive. + #[serde(default)] + #[serde(skip_serializing_if = "AttributeRole::is_identifying")] + pub role: AttributeRole, } /// An unresolved attribute definition. @@ -128,6 +134,7 @@ impl Attribute { tags: None, value: None, annotations: None, + role: Default::default(), } } @@ -150,6 +157,7 @@ impl Attribute { tags: None, value: None, annotations: None, + role: Default::default(), } } @@ -172,6 +180,7 @@ impl Attribute { tags: None, value: None, annotations: None, + role: Default::default(), } } @@ -198,6 +207,7 @@ impl Attribute { tags: None, value: None, annotations: None, + role: Default::default(), } } diff --git a/crates/weaver_resolved_schema/src/lineage.rs b/crates/weaver_resolved_schema/src/lineage.rs index 0b90265a..5b16be78 100644 --- a/crates/weaver_resolved_schema/src/lineage.rs +++ b/crates/weaver_resolved_schema/src/lineage.rs @@ -7,7 +7,7 @@ use std::collections::{BTreeMap, BTreeSet}; use serde::{Deserialize, Serialize}; -use weaver_semconv::attribute::{AttributeSpec, Examples, RequirementLevel}; +use weaver_semconv::attribute::{AttributeRole, AttributeSpec, Examples, RequirementLevel}; use weaver_semconv::deprecated::Deprecated; use weaver_semconv::provenance::Provenance; use weaver_semconv::stability::Stability; @@ -327,6 +327,47 @@ impl AttributeLineage { parent_value.clone() } } + /// Determines the value of the role field by evaluating the presence of + /// a local value. If a local value is provided, it is used, and the role + /// field's lineage is marked as local. Otherwise, the specified parent + /// value is used, and the role field's lineage is marked as inherited + /// from the parent. + pub fn optional_role( + &mut self, + local_value: &Option, + parent_value: &Option, + ) -> Option { + if local_value.is_some() { + _ = self.locally_overridden_fields.insert("role".to_owned()); + _ = self.inherited_fields.remove("role"); + local_value.clone() + } else { + if parent_value.is_some() { + _ = self.inherited_fields.insert("role".to_owned()); + } + parent_value.clone() + } + } + + /// Determines the value of the role field by evaluating the presence of + /// a local value. If a local value is provided, it is used, and the role + /// field's lineage is marked as local. Otherwise, the specified parent + /// value is used, and the role field's lineage is marked as inherited + /// from the parent. + pub fn role( + &mut self, + local_value: &Option, + parent_value: &AttributeRole, + ) -> AttributeRole { + if let Some(v) = local_value { + _ = self.locally_overridden_fields.insert("role".to_owned()); + _ = self.inherited_fields.remove("role"); + v.clone() + } else { + _ = self.inherited_fields.insert("role".to_owned()); + parent_value.clone() + } + } /// Determines the value of the deprecated field by evaluating the presence of /// a local value. If a local value is provided, it is used, and the deprecated diff --git a/crates/weaver_resolver/data/registry-test-1-single-attr-ref/expected-registry.json b/crates/weaver_resolver/data/registry-test-1-single-attr-ref/expected-registry.json index ad5db310..7f21e7f2 100644 --- a/crates/weaver_resolver/data/registry-test-1-single-attr-ref/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-1-single-attr-ref/expected-registry.json @@ -20,6 +20,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ diff --git a/crates/weaver_resolver/data/registry-test-10-prefix-refs/expected-registry.json b/crates/weaver_resolver/data/registry-test-10-prefix-refs/expected-registry.json index a1896676..c84ba012 100644 --- a/crates/weaver_resolver/data/registry-test-10-prefix-refs/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-10-prefix-refs/expected-registry.json @@ -22,6 +22,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -70,6 +71,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -83,6 +85,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] }, @@ -92,6 +95,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -105,6 +109,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } diff --git a/crates/weaver_resolver/data/registry-test-11-prefix-refs-extends/expected-registry.json b/crates/weaver_resolver/data/registry-test-11-prefix-refs-extends/expected-registry.json index 8aff74d9..14faa015 100644 --- a/crates/weaver_resolver/data/registry-test-11-prefix-refs-extends/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-11-prefix-refs-extends/expected-registry.json @@ -22,6 +22,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -71,6 +72,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -84,6 +86,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] }, @@ -93,6 +96,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -106,6 +110,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -136,6 +141,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -149,6 +155,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] }, @@ -158,6 +165,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -170,6 +178,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -183,6 +192,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } diff --git a/crates/weaver_resolver/data/registry-test-14-annotations/expected-registry.json b/crates/weaver_resolver/data/registry-test-14-annotations/expected-registry.json index 0ca92600..6f63749c 100644 --- a/crates/weaver_resolver/data/registry-test-14-annotations/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-14-annotations/expected-registry.json @@ -41,6 +41,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ diff --git a/crates/weaver_resolver/data/registry-test-15-attr-any/expected-registry.json b/crates/weaver_resolver/data/registry-test-15-attr-any/expected-registry.json index 76781633..6204a4b1 100644 --- a/crates/weaver_resolver/data/registry-test-15-attr-any/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-15-attr-any/expected-registry.json @@ -22,6 +22,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] }, @@ -32,6 +33,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } diff --git a/crates/weaver_resolver/data/registry-test-2-multi-attr-refs/expected-registry.json b/crates/weaver_resolver/data/registry-test-2-multi-attr-refs/expected-registry.json index 3ff70644..368d131f 100644 --- a/crates/weaver_resolver/data/registry-test-2-multi-attr-refs/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-2-multi-attr-refs/expected-registry.json @@ -21,6 +21,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -33,6 +34,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ diff --git a/crates/weaver_resolver/data/registry-test-3-extends/expected-registry.json b/crates/weaver_resolver/data/registry-test-3-extends/expected-registry.json index 4aee93a0..6addfa63 100644 --- a/crates/weaver_resolver/data/registry-test-3-extends/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-3-extends/expected-registry.json @@ -22,6 +22,7 @@ "source_group": "registry.error", "inherited_fields": [ "brief", + "role", "stability" ], "locally_overridden_fields": [ @@ -36,6 +37,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -48,6 +50,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -59,6 +62,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -72,6 +76,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -97,14 +102,15 @@ ], "lineage": { "provenance": { - "registry_id": "default", - "path": "data/registry-test-3-extends/registry/http-common.yaml" + "registry_id": "default", + "path": "data/registry-test-3-extends/registry/http-common.yaml" }, "attributes": { "error.type": { "source_group": "registry.error", "inherited_fields": [ "brief", + "role", "stability" ], "locally_overridden_fields": [ @@ -119,6 +125,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -131,6 +138,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -142,6 +150,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -155,6 +164,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -165,6 +175,7 @@ "source_group": "server", "inherited_fields": [ "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -178,6 +189,7 @@ "inherited_fields": [ "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -190,6 +202,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -225,6 +238,7 @@ "source_group": "registry.error", "inherited_fields": [ "brief", + "role", "stability" ], "locally_overridden_fields": [ @@ -239,6 +253,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -251,6 +266,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -263,6 +279,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -274,6 +291,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -287,6 +305,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -298,6 +317,7 @@ "inherited_fields": [ "examples", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -309,6 +329,7 @@ "source_group": "server", "inherited_fields": [ "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -321,6 +342,7 @@ "source_group": "registry.url", "inherited_fields": [ "brief", + "role", "stability" ], "locally_overridden_fields": [ @@ -355,6 +377,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -367,6 +390,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -379,6 +403,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -393,6 +418,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -404,6 +430,7 @@ "inherited_fields": [ "brief", "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -418,6 +445,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -449,6 +477,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -462,6 +491,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -474,6 +504,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -485,6 +516,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -497,6 +529,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -511,6 +544,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -522,6 +556,7 @@ "inherited_fields": [ "brief", "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -536,6 +571,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -571,6 +607,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -584,6 +621,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -596,6 +634,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -607,6 +646,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -619,6 +659,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -633,6 +674,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -644,6 +686,7 @@ "inherited_fields": [ "brief", "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -658,6 +701,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -684,8 +728,8 @@ "unit": "s", "lineage": { "provenance": { - "registry_id": "default", - "path": "data/registry-test-3-extends/registry/metrics-messaging.yaml" + "registry_id": "default", + "path": "data/registry-test-3-extends/registry/metrics-messaging.yaml" }, "attributes": { "error.type": { @@ -693,6 +737,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -706,6 +751,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -718,6 +764,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -729,6 +776,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -741,6 +789,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -755,6 +804,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -766,6 +816,7 @@ "inherited_fields": [ "brief", "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -780,6 +831,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -815,6 +867,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -828,6 +881,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -840,6 +894,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -851,6 +906,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -863,6 +919,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -877,6 +934,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -888,6 +946,7 @@ "inherited_fields": [ "brief", "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -902,6 +961,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -937,6 +997,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -950,6 +1011,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -962,6 +1024,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -973,6 +1036,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -985,6 +1049,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -999,6 +1064,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1010,6 +1076,7 @@ "inherited_fields": [ "brief", "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -1024,6 +1091,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -1059,6 +1127,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1072,6 +1141,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1084,6 +1154,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1095,6 +1166,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1107,6 +1179,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1121,6 +1194,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1132,6 +1206,7 @@ "inherited_fields": [ "brief", "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -1146,6 +1221,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -1181,6 +1257,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1194,6 +1271,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1206,6 +1284,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1217,6 +1296,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1229,6 +1309,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1243,6 +1324,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1254,6 +1336,7 @@ "inherited_fields": [ "brief", "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -1268,6 +1351,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -1305,8 +1389,8 @@ ], "lineage": { "provenance": { - "registry_id": "default", - "path": "data/registry-test-3-extends/registry/registry-http.yaml" + "registry_id": "default", + "path": "data/registry-test-3-extends/registry/registry-http.yaml" } } }, @@ -1409,8 +1493,8 @@ ], "lineage": { "provenance": { - "registry_id": "default", - "path": "data/registry-test-3-extends/registry/registry-url.yaml" + "registry_id": "default", + "path": "data/registry-test-3-extends/registry/registry-url.yaml" } } } diff --git a/crates/weaver_resolver/data/registry-test-4-events/expected-registry.json b/crates/weaver_resolver/data/registry-test-4-events/expected-registry.json index 67046855..9fdad425 100644 --- a/crates/weaver_resolver/data/registry-test-4-events/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-4-events/expected-registry.json @@ -12,8 +12,8 @@ "name": "some.event", "lineage": { "provenance": { - "path": "data/registry-test-4-events/registry/log-events.yaml", - "registry_id": "default" + "registry_id": "default", + "path": "data/registry-test-4-events/registry/log-events.yaml" }, "attributes": { "test_attr.event.attr": { @@ -23,6 +23,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -38,8 +39,8 @@ "name": "empty.event", "lineage": { "provenance": { - "path": "data/registry-test-4-events/registry/log-events.yaml", - "registry_id": "default" + "registry_id": "default", + "path": "data/registry-test-4-events/registry/log-events.yaml" } } }, @@ -67,6 +68,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] }, @@ -77,6 +79,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] }, @@ -87,6 +90,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] } @@ -500,6 +504,7 @@ "brief", "note", "requirement_level", + "role", "stability" ] }, @@ -509,6 +514,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -522,6 +528,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] }, @@ -531,6 +538,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -578,6 +586,7 @@ "inherited_fields": [ "brief", "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -608,6 +617,7 @@ "inherited_fields": [ "brief", "examples", + "role", "stability" ], "locally_overridden_fields": [ diff --git a/crates/weaver_resolver/data/registry-test-5-metrics/expected-registry.json b/crates/weaver_resolver/data/registry-test-5-metrics/expected-registry.json index eaebccc5..760925a6 100644 --- a/crates/weaver_resolver/data/registry-test-5-metrics/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-5-metrics/expected-registry.json @@ -41,6 +41,7 @@ "brief", "note", "requirement_level", + "role", "stability" ] } @@ -70,6 +71,7 @@ "brief", "note", "requirement_level", + "role", "stability" ] } @@ -99,6 +101,7 @@ "brief", "note", "requirement_level", + "role", "stability" ] } @@ -128,6 +131,7 @@ "brief", "note", "requirement_level", + "role", "stability" ] } @@ -157,6 +161,7 @@ "brief", "note", "requirement_level", + "role", "stability" ] } @@ -186,6 +191,7 @@ "brief", "note", "requirement_level", + "role", "stability" ] } @@ -215,6 +221,7 @@ "brief", "note", "requirement_level", + "role", "stability" ] } @@ -244,6 +251,7 @@ "brief", "note", "requirement_level", + "role", "stability" ] } @@ -273,6 +281,7 @@ "brief", "note", "requirement_level", + "role", "stability" ] } diff --git a/crates/weaver_resolver/data/registry-test-6-resources/expected-registry.json b/crates/weaver_resolver/data/registry-test-6-resources/expected-registry.json index 0a8d3278..822178b9 100644 --- a/crates/weaver_resolver/data/registry-test-6-resources/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-6-resources/expected-registry.json @@ -37,6 +37,7 @@ "source_group": "registry.user_agent", "inherited_fields": [ "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ diff --git a/crates/weaver_resolver/data/registry-test-7-spans/expected-registry.json b/crates/weaver_resolver/data/registry-test-7-spans/expected-registry.json index 2c89fc94..2ec5ff6b 100644 --- a/crates/weaver_resolver/data/registry-test-7-spans/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-7-spans/expected-registry.json @@ -176,6 +176,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -188,6 +189,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -202,6 +204,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -214,6 +217,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -227,6 +231,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -240,6 +245,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -252,6 +258,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -266,6 +273,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -279,6 +287,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -291,6 +300,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -305,6 +315,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -318,6 +329,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -330,6 +342,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -343,6 +356,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -389,6 +403,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -401,6 +416,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -415,6 +431,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -428,6 +445,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -440,6 +458,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -453,6 +472,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -466,6 +486,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -478,6 +499,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -492,6 +514,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -505,6 +528,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -517,6 +541,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -531,6 +556,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -544,6 +570,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -556,6 +583,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -569,6 +597,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -620,6 +649,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -633,6 +663,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -646,6 +677,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -658,6 +690,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -671,6 +704,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -684,6 +718,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -697,6 +732,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -710,6 +746,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -722,6 +759,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -736,6 +774,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -745,6 +784,7 @@ "db.name": { "source_group": "registry.db", "inherited_fields": [ + "role", "stability" ], "locally_overridden_fields": [ @@ -761,6 +801,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -774,6 +815,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -786,6 +828,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -800,6 +843,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -813,6 +857,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -825,6 +870,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -839,6 +885,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -852,6 +899,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -864,6 +912,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -877,6 +926,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -922,6 +972,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -934,6 +985,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -948,6 +1000,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -957,6 +1010,7 @@ "db.name": { "source_group": "registry.db", "inherited_fields": [ + "role", "stability" ], "locally_overridden_fields": [ @@ -973,6 +1027,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -986,6 +1041,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -998,6 +1054,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1012,6 +1069,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1025,6 +1083,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1037,6 +1096,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1051,6 +1111,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1064,6 +1125,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1076,6 +1138,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1089,6 +1152,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1134,6 +1198,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1146,6 +1211,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1160,6 +1226,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1172,6 +1239,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1182,6 +1250,7 @@ "db.operation": { "source_group": "registry.db", "inherited_fields": [ + "role", "stability" ], "locally_overridden_fields": [ @@ -1198,6 +1267,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1210,6 +1280,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1224,6 +1295,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1237,6 +1309,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1249,6 +1322,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1263,6 +1337,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1276,6 +1351,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1288,6 +1364,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1301,6 +1378,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1347,6 +1425,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1359,6 +1438,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1373,6 +1453,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1385,6 +1466,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1398,6 +1480,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1411,6 +1494,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1421,6 +1505,7 @@ "db.statement": { "source_group": "registry.db", "inherited_fields": [ + "role", "stability" ], "locally_overridden_fields": [ @@ -1436,6 +1521,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1450,6 +1536,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1463,6 +1550,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1475,6 +1563,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1489,6 +1578,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1502,6 +1592,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1514,6 +1605,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1527,6 +1619,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1573,6 +1666,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1585,6 +1679,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1599,6 +1694,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1611,6 +1707,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1624,6 +1721,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1637,6 +1735,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1650,6 +1749,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1662,6 +1762,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1676,6 +1777,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1689,6 +1791,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1701,6 +1804,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1715,6 +1819,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1728,6 +1833,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1740,6 +1846,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1753,6 +1860,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1803,6 +1911,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1815,6 +1924,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1828,6 +1938,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1841,6 +1952,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1854,6 +1966,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1868,6 +1981,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1880,6 +1994,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1891,6 +2006,7 @@ "source_group": "registry.db", "inherited_fields": [ "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1904,6 +2020,7 @@ "source_group": "registry.db", "inherited_fields": [ "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1918,6 +2035,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1932,6 +2050,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1944,6 +2063,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1958,6 +2078,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1970,6 +2091,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -1984,6 +2106,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -1997,6 +2120,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2009,6 +2133,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2022,6 +2147,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2034,6 +2160,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2081,6 +2208,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2093,6 +2221,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2107,6 +2236,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2119,6 +2249,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2132,6 +2263,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2146,6 +2278,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2158,6 +2291,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2170,6 +2304,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2184,6 +2319,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2197,6 +2333,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2209,6 +2346,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2223,6 +2361,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2236,6 +2375,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2248,6 +2388,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2261,6 +2402,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2315,6 +2457,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2328,6 +2471,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2339,6 +2483,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2352,6 +2497,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2364,6 +2510,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2377,6 +2524,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2390,6 +2538,7 @@ "brief", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2402,6 +2551,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2415,6 +2565,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2428,6 +2579,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2442,6 +2594,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2454,6 +2607,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2467,6 +2621,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2480,6 +2635,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2492,6 +2648,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2506,6 +2663,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2519,6 +2677,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2531,6 +2690,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2545,6 +2705,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2558,6 +2719,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2570,6 +2732,7 @@ "examples", "note", "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ @@ -2583,6 +2746,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -2594,6 +2758,7 @@ "source_group": "registry.user_agent", "inherited_fields": [ "requirement_level", + "role", "stability" ], "locally_overridden_fields": [ diff --git a/crates/weaver_resolver/data/registry-test-8-http/expected-registry.json b/crates/weaver_resolver/data/registry-test-8-http/expected-registry.json index 3ed49a87..bcfb9618 100644 --- a/crates/weaver_resolver/data/registry-test-8-http/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-8-http/expected-registry.json @@ -19,6 +19,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -48,6 +49,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -59,6 +61,7 @@ "source_group": "server", "inherited_fields": [ "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -89,6 +92,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -100,6 +104,7 @@ "source_group": "server", "inherited_fields": [ "examples", + "role", "stability" ], "locally_overridden_fields": [ @@ -134,6 +139,7 @@ "inherited_fields": [ "brief", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -145,6 +151,7 @@ "source_group": "server", "inherited_fields": [ "examples", + "role", "stability" ], "locally_overridden_fields": [ diff --git a/crates/weaver_resolver/data/registry-test-lineage-0/expected-registry.json b/crates/weaver_resolver/data/registry-test-lineage-0/expected-registry.json index bbade282..4c220942 100644 --- a/crates/weaver_resolver/data/registry-test-lineage-0/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-lineage-0/expected-registry.json @@ -53,6 +53,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -66,6 +67,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] }, @@ -75,6 +77,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ diff --git a/crates/weaver_resolver/data/registry-test-lineage-2/expected-registry.json b/crates/weaver_resolver/data/registry-test-lineage-2/expected-registry.json index d117280f..245519bf 100644 --- a/crates/weaver_resolver/data/registry-test-lineage-2/expected-registry.json +++ b/crates/weaver_resolver/data/registry-test-lineage-2/expected-registry.json @@ -83,6 +83,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -105,6 +106,7 @@ "brief", "examples", "note", + "role", "stability" ], "locally_overridden_fields": [ @@ -118,6 +120,7 @@ "examples", "note", "requirement_level", + "role", "stability" ] }, diff --git a/crates/weaver_resolver/data/registry-test-lineage-3/expected-attribute-catalog.json b/crates/weaver_resolver/data/registry-test-lineage-3/expected-attribute-catalog.json new file mode 100644 index 00000000..b92434cd --- /dev/null +++ b/crates/weaver_resolver/data/registry-test-lineage-3/expected-attribute-catalog.json @@ -0,0 +1,33 @@ +[ + { + "name": "host.name", + "type": "string", + "brief": "Name of the host", + "examples": [ + "localhost" + ], + "requirement_level": "recommended", + "stability": "stable" + }, + { + "name": "host.id", + "type": "string", + "brief": "Unique identifier for a host", + "examples": [ + "01556-1402034656" + ], + "requirement_level": "recommended", + "stability": "stable" + }, + { + "name": "host.name", + "type": "string", + "brief": "Name of the host", + "examples": [ + "localhost" + ], + "requirement_level": "recommended", + "stability": "stable", + "role": "descriptive" + } + ] \ No newline at end of file diff --git a/crates/weaver_resolver/data/registry-test-lineage-3/expected-registry.json b/crates/weaver_resolver/data/registry-test-lineage-3/expected-registry.json new file mode 100644 index 00000000..3740a533 --- /dev/null +++ b/crates/weaver_resolver/data/registry-test-lineage-3/expected-registry.json @@ -0,0 +1,63 @@ +{ + "registry_url": "https://127.0.0.1", + "groups": [ + { + "id": "registry.host", + "type": "attribute_group", + "brief": "Registry server", + "attributes": [ + 0, + 1 + ], + "lineage": { + "provenance": { + "registry_id": "default", + "path": "data/registry-test-lineage-3/registry/groups.yaml" + } + } + }, + { + "id": "entity.host", + "type": "entity", + "brief": "host entity", + "stability": "stable", + "attributes": [ + 1, + 2 + ], + "name": "host", + "lineage": { + "provenance": { + "registry_id": "default", + "path": "data/registry-test-lineage-3/registry/groups.yaml" + }, + "attributes": { + "host.id": { + "source_group": "registry.host", + "inherited_fields": [ + "brief", + "examples", + "note", + "requirement_level", + "role", + "stability" + ] + }, + "host.name": { + "source_group": "registry.host", + "inherited_fields": [ + "brief", + "examples", + "note", + "requirement_level", + "stability" + ], + "locally_overridden_fields": [ + "role" + ] + } + } + } + } + ] + } \ No newline at end of file diff --git a/crates/weaver_resolver/data/registry-test-lineage-3/registry/groups.yaml b/crates/weaver_resolver/data/registry-test-lineage-3/registry/groups.yaml new file mode 100644 index 00000000..1d4007bc --- /dev/null +++ b/crates/weaver_resolver/data/registry-test-lineage-3/registry/groups.yaml @@ -0,0 +1,24 @@ +groups: + - id: registry.host + type: attribute_group + brief: Registry server + attributes: + - id: host.name + stability: stable + type: string + brief: Name of the host + examples: ["localhost"] + - id: host.id + stability: stable + type: string + brief: Unique identifier for a host + examples: ["01556-1402034656"] + - id: entity.host + type: entity + name: host + brief: host entity + stability: stable + attributes: + - ref: host.name + role: descriptive + - ref: host.id \ No newline at end of file diff --git a/crates/weaver_resolver/src/attribute.rs b/crates/weaver_resolver/src/attribute.rs index 30200979..7b22fe1a 100644 --- a/crates/weaver_resolver/src/attribute.rs +++ b/crates/weaver_resolver/src/attribute.rs @@ -118,6 +118,7 @@ impl AttributeCatalog { deprecated, prefix, annotations, + role, } => { let name; let root_attr = self.root_attributes.get(r#ref); @@ -156,6 +157,7 @@ impl AttributeCatalog { tags: root_attr.attribute.tags.clone(), value: root_attr.attribute.value.clone(), prefix: *prefix, + role: attr_lineage.role(role, &root_attr.attribute.role), annotations: attr_lineage .annotations(annotations, &root_attr.attribute.annotations), }; @@ -197,6 +199,7 @@ impl AttributeCatalog { stability, deprecated, annotations, + role, } => { // Create a fully resolved attribute from an attribute spec (id), // and check if it already exists in the catalog. @@ -217,6 +220,7 @@ impl AttributeCatalog { value: None, prefix: false, annotations: annotations.clone(), + role: role.clone().unwrap_or_default(), }; _ = self.root_attributes.insert( diff --git a/crates/weaver_resolver/src/registry.rs b/crates/weaver_resolver/src/registry.rs index 1ceb4d09..5e9b76f2 100644 --- a/crates/weaver_resolver/src/registry.rs +++ b/crates/weaver_resolver/src/registry.rs @@ -614,6 +614,7 @@ fn resolve_inheritance_attr( deprecated, prefix, annotations, + role, } => { match parent_attr { AttributeSpec::Ref { @@ -627,6 +628,7 @@ fn resolve_inheritance_attr( deprecated: parent_deprecated, prefix: parent_prefix, annotations: parent_annotations, + role: parent_role, .. } => { // attr and attr_parent are both references. @@ -646,6 +648,7 @@ fn resolve_inheritance_attr( deprecated: lineage.deprecated(deprecated, parent_deprecated), prefix: lineage.prefix(prefix, parent_prefix), annotations: lineage.annotations(annotations, parent_annotations), + role: lineage.optional_role(role, parent_role), } } AttributeSpec::Id { @@ -659,6 +662,7 @@ fn resolve_inheritance_attr( stability: parent_stability, deprecated: parent_deprecated, annotations: parent_annotations, + role: parent_role, .. } => { // attr is a reference and attr_parent is an id. @@ -677,6 +681,7 @@ fn resolve_inheritance_attr( stability: lineage.stability(stability, parent_stability), deprecated: lineage.deprecated(deprecated, parent_deprecated), annotations: lineage.annotations(annotations, parent_annotations), + role: lineage.optional_role(role, parent_role), } } } @@ -688,6 +693,8 @@ fn resolve_inheritance_attr( #[cfg(test)] mod tests { use std::error::Error; + use std::fs::{File, OpenOptions}; + use std::io::Write; use std::path::PathBuf; use glob::glob; @@ -735,6 +742,13 @@ mod tests { // } println!("Testing `{}`", test_dir); + // Delete all the files in the observed_output/target directory + // before generating the new files. + std::fs::remove_dir_all(format!("observed_output/{}", test_dir)).unwrap_or_default(); + let observed_output_dir = PathBuf::from(format!("observed_output/{}", test_dir)); + std::fs::create_dir_all(observed_output_dir.clone()) + .expect("Failed to create observed output directory"); + let registry_id = "default"; let result = SemConvRegistry::try_from_path_pattern( registry_id, @@ -771,6 +785,8 @@ mod tests { let expected_errors: String = std::fs::read_to_string(&expected_errors_file) .expect("Failed to read expected errors file"); let observed_errors = serde_json::to_string(&observed_registry).unwrap(); + // TODO - Write observed errors. + assert_eq!( canonicalize_json_string(&observed_errors).unwrap(), canonicalize_json_string(&expected_errors).unwrap(), @@ -793,16 +809,21 @@ mod tests { ) .expect("Failed to deserialize expected attribute catalog"); + // Write observed output. + let observed_attr_catalog_file = OpenOptions::new() + .create(true) + .write(true) + .open(observed_output_dir.join("attribute-catalog.json")) + .expect("Failed to open observed output file"); + serde_json::to_writer_pretty(observed_attr_catalog_file, &observed_attr_catalog) + .expect("Failed to write observed ouptut."); + // Compare values assert_eq!( observed_attr_catalog, expected_attr_catalog, "Observed and expected attribute catalogs don't match for `{}`.\nDiff from expected:\n{}", test_dir, weaver_diff::diff_output(&to_json(&expected_attr_catalog), &to_json(&observed_attr_catalog)) ); - // let yaml = serde_yaml::to_string(&observed_attr_catalog).unwrap(); - //println!("{}", yaml); - // println!("Observed attribute catalog:\n{}", to_json(&observed_attr_catalog)); - // Check that the resolved registry matches the expected registry. let expected_registry: Registry = serde_json::from_reader( std::fs::File::open(format!("{}/expected-registry.json", test_dir)) @@ -810,6 +831,15 @@ mod tests { ) .expect("Failed to deserialize expected registry"); + // Write observed output. + let observed_registry_file = OpenOptions::new() + .create(true) + .write(true) + .open(observed_output_dir.join("registry.json")) + .expect("Failed to open observed output file"); + serde_json::to_writer_pretty(observed_registry_file, &observed_registry) + .expect("Failed to write observed ouptut."); + assert_eq!( observed_registry, expected_registry, diff --git a/crates/weaver_semconv/src/attribute.rs b/crates/weaver_semconv/src/attribute.rs index b3aa642d..b469fda3 100644 --- a/crates/weaver_semconv/src/attribute.rs +++ b/crates/weaver_semconv/src/attribute.rs @@ -84,6 +84,10 @@ pub enum AttributeSpec { prefix: bool, /// Annotations for the attribute. annotations: Option>, + /// Whether the attribute is identifying or descriptive. + #[serde(default)] + #[serde(skip_serializing_if = "Option::is_none")] + role: Option, }, /// Attribute definition. Id { @@ -138,6 +142,10 @@ pub enum AttributeSpec { deprecated: Option, /// Annotations for the attribute. annotations: Option>, + /// Whether the attribute is identifying or descriptive. + #[serde(default)] + #[serde(skip_serializing_if = "Option::is_none")] + role: Option, }, } @@ -233,6 +241,24 @@ impl Display for AttributeType { } } +/// The different roles for attributes in groups. +#[derive(Serialize, Deserialize, Debug, Default, Clone, Eq, PartialEq, Hash, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum AttributeRole { + /// The attribute is considered identifying for the signal it is associated with. + #[default] + Identifying, + /// The attribute is considered descriptive for the signal it is associated with. + Descriptive, +} +impl AttributeRole { + /// True if role is Identifying. + #[must_use] + pub fn is_identifying(&self) -> bool { + matches!(self, Self::Identifying) + } +} + /// Primitive or array types. #[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq, Hash, JsonSchema)] #[serde(rename_all = "snake_case")] @@ -948,6 +974,7 @@ mod tests { note: "".to_owned(), }), annotations: None, + role: Default::default(), }; assert_eq!(attr.id(), "id"); assert_eq!(attr.brief(), "brief"); @@ -969,6 +996,7 @@ mod tests { }), prefix: false, annotations: None, + role: Default::default(), }; assert_eq!(attr.id(), "ref"); assert_eq!(attr.brief(), "brief"); diff --git a/crates/weaver_semconv/src/group.rs b/crates/weaver_semconv/src/group.rs index 62187d8e..d7955c28 100644 --- a/crates/weaver_semconv/src/group.rs +++ b/crates/weaver_semconv/src/group.rs @@ -634,6 +634,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }], span_kind: Some(SpanKindSpec::Client), events: vec!["event".to_owned()], @@ -781,6 +782,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }], span_kind: Some(SpanKindSpec::Client), events: vec!["event".to_owned()], @@ -813,6 +815,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }]; let result = group.validate("").into_result_failing_non_fatal(); assert_eq!( @@ -841,6 +844,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }]; let result = group.validate("").into_result_failing_non_fatal(); assert_eq!( @@ -869,6 +873,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }]; let result = group.validate("").into_result_failing_non_fatal(); assert_eq!( @@ -896,6 +901,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }]; let result = group.validate("").into_result_failing_non_fatal(); assert_eq!( @@ -934,6 +940,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }]; let result = group.validate("").into_result_failing_non_fatal(); assert_eq!( @@ -971,6 +978,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }]; let result = group.validate("").into_result_failing_non_fatal(); assert_eq!( @@ -1014,6 +1022,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }], span_kind: Some(SpanKindSpec::Client), events: vec!["event".to_owned()], @@ -1056,6 +1065,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }]; let result = group.validate("").into_result_failing_non_fatal(); assert!(result.is_ok()); @@ -1442,6 +1452,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }], span_kind: None, events: vec![], @@ -1601,6 +1612,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }]; let mut group = GroupSpec { id: "test".to_owned(), @@ -1737,6 +1749,7 @@ mod tests { deprecated: None, prefix: false, annotations: None, + role: Default::default(), }, AttributeSpec::Ref { r#ref: "attribute".to_owned(), @@ -1750,6 +1763,7 @@ mod tests { deprecated: None, prefix: false, annotations: None, + role: Default::default(), }, ]; let mut group = GroupSpec { @@ -1820,6 +1834,7 @@ mod tests { sampling_relevant: None, note: "".to_owned(), annotations: None, + role: Default::default(), }], span_kind: None, events: vec![], diff --git a/crates/weaver_semconv/src/registry.rs b/crates/weaver_semconv/src/registry.rs index 99c04076..70b29323 100644 --- a/crates/weaver_semconv/src/registry.rs +++ b/crates/weaver_semconv/src/registry.rs @@ -320,6 +320,7 @@ mod tests { stability: None, deprecated: None, annotations: None, + role: Default::default(), }], span_kind: None, prefix: "".to_owned(),