Skip to content
Merged
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
b3b7520
checkpoint: manifest renames
lmolkova Feb 13, 2026
148bd04
another checkpoint
lmolkova Feb 14, 2026
ba91924
mostly ready
lmolkova Feb 14, 2026
a42f7c8
cleanup
lmolkova Feb 14, 2026
4ee4cd5
cleanup
lmolkova Feb 14, 2026
afd3cd6
cleanup
lmolkova Feb 14, 2026
4d8b90f
checkpoint: manifest renames
lmolkova Feb 13, 2026
c9fdf1c
another checkpoint
lmolkova Feb 14, 2026
9be8d84
mostly ready
lmolkova Feb 14, 2026
db3b09b
cleanup
lmolkova Feb 14, 2026
84c81c1
cleanup
lmolkova Feb 14, 2026
a7735b9
cleanup
lmolkova Feb 14, 2026
c87f4e0
Merge branch 'main' into manifest-renames
lmolkova Feb 14, 2026
404d05a
Update crates/weaver_resolver/data/circular-registry-test/registry_b/…
lmolkova Feb 14, 2026
29d557b
Update crates/weaver_resolver/data/registry-test-published-1/registry…
lmolkova Feb 14, 2026
90a8b60
cleanup
lmolkova Feb 14, 2026
f51b74a
Merge branch 'manifest-renames' of https://github.com/lmolkova/weaver…
lmolkova Feb 14, 2026
a47c54b
cleanup
lmolkova Feb 14, 2026
c4b60b2
cleanup
lmolkova Feb 15, 2026
9eba7c6
changelog
lmolkova Feb 15, 2026
ed45560
review
lmolkova Feb 15, 2026
4f6d544
try_into
lmolkova Feb 18, 2026
4688453
warning/error in the future, remove deprecated properties from the API
lmolkova Feb 18, 2026
587c0c9
unbox, private url
lmolkova Feb 18, 2026
1428955
remove some boxing
lmolkova Feb 18, 2026
2ec64fa
up
lmolkova Feb 18, 2026
99f03fb
tests
lmolkova Feb 18, 2026
8677b1b
Merge branch 'main' into manifest-renames
lmolkova Feb 18, 2026
95e350e
box and doc
lmolkova Feb 18, 2026
c492204
Merge branch 'main' into manifest-renames
lmolkova Feb 18, 2026
6a254f2
Merge branch 'main' into manifest-renames
lmolkova Feb 21, 2026
4134bf7
feedback
lmolkova Feb 21, 2026
09721d2
Merge branch 'main' into manifest-renames
jsuereth Feb 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ All notable changes to this project will be documented in this file.
- New feature ([#1100](https://github.com/open-telemetry/weaver/issues/1100)) - Set `--output=http` to have live-check send its report as the response to `/stop`. ([#1193](https://github.com/open-telemetry/weaver/pull/1193) by @jerbly)
- Unified output handling across all registry subcommands. Builtin output formats (json, yaml, jsonl) are now available in `registry stats`, `registry diff`, and `registry resolve`. `registry stats` also supports `--templates` for custom text output templates. ([#1200](https://github.com/open-telemetry/weaver/pull/1200) by @jerbly)
- New feature ([#1152](https://github.com/open-telemetry/weaver/issues/1152)) - Live-check with `--emit-otlp-logs` will now include the attributes from the resource in the emitted log record, this helps to identify the source of the finding in a multi-source environment. ([#1206](https://github.com/open-telemetry/weaver/pull/1206) by @jerbly)
- Use `schema_url` in registry manifest, dependencies, and resolved schema instead of `registry_url`. Parse registry name and version
from it. ([#1202](https://github.com/open-telemetry/weaver/pull/1202) by @lmolkova)
- Default to `manifest.yaml` for registry manifest file, deprecate `registry_manifest.yaml` and add warning when it's used. ([#1202](https://github.com/open-telemetry/weaver/pull/1202) by @lmolkova)


# [0.21.2] - 2026-02-03

Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions crates/weaver_codegen_test/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ fn main() {
let registry_path = VirtualDirectoryPath::LocalFolder {
path: SEMCONV_REGISTRY_PATH.into(),
};
let registry_repo =
RegistryRepo::try_new("main", &registry_path).unwrap_or_else(|e| process_error(&logger, e));
let registry_repo = RegistryRepo::try_new(None, &registry_path, &mut vec![])
.unwrap_or_else(|e| process_error(&logger, e));
let loaded = SchemaResolver::load_semconv_repository(registry_repo, FOLLOW_SYMLINKS)
.ignore(|e| matches!(e.severity(), Some(miette::Severity::Warning)))
.into_result_failing_non_fatal()
Expand Down
2 changes: 1 addition & 1 deletion crates/weaver_emit/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -590,7 +590,7 @@ mod tests {
};

let registry = ForgeResolvedRegistry {
registry_url: "TEST_V2".to_owned(),
schema_url: "https://example.com/schemas/1.2.3".try_into().unwrap(),
registry: Registry {
attributes: vec![],
attribute_groups: vec![],
Expand Down
29 changes: 20 additions & 9 deletions crates/weaver_forge/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -842,6 +842,7 @@ mod tests {
use weaver_diff::diff_dir;
use weaver_resolver::{LoadedSemconvRegistry, SchemaResolver};
use weaver_semconv::registry_repo::RegistryRepo;
use weaver_semconv::schema_url::SchemaUrl;

use crate::config::{ApplicationMode, CaseConvention, Params, TemplateConfig, WeaverConfig};
use crate::debug::print_dedup_errors;
Expand All @@ -855,12 +856,16 @@ mod tests {
cli_params: Params,
ignore_non_fatal_errors: bool,
) -> (TemplateEngine, ResolvedRegistry, PathBuf, PathBuf) {
let registry_id = "default";
let schema_url: Option<SchemaUrl> = Some(
"https://default/1.0.0"
.try_into()
.expect("Should be valid schema url"),
);
let path: VirtualDirectoryPath = "data/registry"
.try_into()
.expect("Invalid virtual directory path string");
let repo =
RegistryRepo::try_new(registry_id, &path).expect("Failed to construct repository");
let repo = RegistryRepo::try_new(schema_url, &path, &mut vec![])
.expect("Failed to construct repository");
let registry_result = SchemaResolver::load_semconv_repository(repo, false);
// SemConvRegistry::try_from_path_pattern(registry_id, "data/*.yaml");
let registry = if ignore_non_fatal_errors {
Expand Down Expand Up @@ -1056,12 +1061,16 @@ mod tests {
});
engine.target_config.templates = Some(templates);

let registry_id = "default";
let path: VirtualDirectoryPath = "data/registry"
.try_into()
.expect("Invalid virtual directory path string");
let repo =
RegistryRepo::try_new(registry_id, &path).expect("Failed to construct repository");
let schema_url: Option<SchemaUrl> = Some(
"https://default/1.0.0"
.try_into()
.expect("Should be valid schema url"),
);
let repo = RegistryRepo::try_new(schema_url, &path, &mut vec![])
.expect("Failed to construct repository");
let loaded = SchemaResolver::load_semconv_repository(repo, false)
.into_result_with_non_fatal()
.expect("Failed to load registry")
Expand Down Expand Up @@ -1186,12 +1195,14 @@ mod tests {

#[test]
fn test_comment_format() {
let registry_id = "default";
let path: VirtualDirectoryPath = "data/mini_registry_for_comments"
.try_into()
.expect("Invalid virtual directory path string");
let repo =
RegistryRepo::try_new(registry_id, &path).expect("Failed to construct repository");
let schema_url: SchemaUrl = "https://default/1.0.0"
.try_into()
.expect("Should be valid schema url");
let repo = RegistryRepo::try_new(Some(schema_url), &path, &mut vec![])
.expect("Failed to construct repository");
let loaded = SchemaResolver::load_semconv_repository(repo, false)
.into_result_with_non_fatal()
.expect("Failed to load registry")
Expand Down
16 changes: 5 additions & 11 deletions crates/weaver_forge/src/v2/registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use weaver_resolved_schema::{attribute::AttributeRef, v2::catalog::AttributeCatalog};
use weaver_semconv::schema_url::SchemaUrl;

use crate::{
error::Error,
Expand All @@ -24,8 +25,7 @@ use crate::{
#[serde(deny_unknown_fields)]
pub struct ForgeResolvedRegistry {
/// The semantic convention registry url.
#[serde(skip_serializing_if = "String::is_empty")]
pub registry_url: String,
pub schema_url: SchemaUrl,
// TODO - Attribute Groups
/// The signals defined in this registry.
pub registry: Registry,
Expand Down Expand Up @@ -413,7 +413,7 @@ impl ForgeResolvedRegistry {
}

Ok(Self {
registry_url: schema.schema_url.clone(),
schema_url: schema.schema_url.clone(),
registry: Registry {
attributes,
attribute_groups,
Expand Down Expand Up @@ -448,16 +448,14 @@ mod tests {
fn test_try_from_resolved_schema() {
let resolved_schema = ResolvedTelemetrySchema {
file_format: "2.0.0".to_owned(),
schema_url: "https://example.com/schema".to_owned(),
registry_id: "my-registry".to_owned(),
schema_url: "https://example.com/schema".try_into().unwrap(),
attribute_catalog: vec![attribute::Attribute {
key: "test.attr".to_owned(),
r#type: AttributeType::PrimitiveOrArray(PrimitiveOrArrayTypeSpec::String),
examples: None,
common: CommonFields::default(),
}],
registry: v2::registry::Registry {
registry_url: "https://example.com/registry".to_owned(),
attributes: vec![attribute::AttributeRef(0)],
spans: vec![span::Span {
r#type: SignalId::from("my-span".to_owned()),
Expand Down Expand Up @@ -563,7 +561,6 @@ mod tests {
},
}],
},
registry_manifest: None,
};

let forge_registry =
Expand Down Expand Up @@ -613,11 +610,9 @@ mod tests {
fn test_try_from_resolved_schema_with_missing_attribute() {
let resolved_schema = ResolvedTelemetrySchema {
file_format: "2.0.0".to_owned(),
schema_url: "https://example.com/schema".to_owned(),
registry_id: "my-registry".to_owned(),
schema_url: "https://example.com/schema".try_into().unwrap(),
attribute_catalog: vec![],
registry: v2::registry::Registry {
registry_url: "https://example.com/registry".to_owned(),
attributes: vec![], // No attributes - This is the logic bug.
spans: vec![span::Span {
r#type: SignalId::from("my-span".to_owned()),
Expand Down Expand Up @@ -645,7 +640,6 @@ mod tests {
metrics: vec![],
events: vec![],
},
registry_manifest: None,
};

let result = ForgeResolvedRegistry::try_from(resolved_schema);
Expand Down
2 changes: 1 addition & 1 deletion crates/weaver_live_check/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ pub enum VersionedRegistry {
/// v1 ResolvedRegistry
V1(ResolvedRegistry),
/// v2 ForgeResolvedRegistry
V2(ForgeResolvedRegistry),
V2(Box<ForgeResolvedRegistry>),
}

/// Versioned enum for the attribute
Expand Down
33 changes: 20 additions & 13 deletions crates/weaver_live_check/src/live_checker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -507,8 +507,10 @@ mod tests {

fn make_registry(use_v2: bool) -> VersionedRegistry {
if use_v2 {
VersionedRegistry::V2(ForgeResolvedRegistry {
registry_url: "TEST".to_owned(),
VersionedRegistry::V2(Box::new(ForgeResolvedRegistry {
schema_url: "https://example.com/schemas/1.2.3"
.try_into()
.expect("Should be valid schema url"),
registry: Registry {
attributes: vec![
V2Attribute {
Expand Down Expand Up @@ -609,7 +611,7 @@ mod tests {
spans: vec![],
events: vec![],
},
})
}))
} else {
VersionedRegistry::V1(ResolvedRegistry {
registry_url: "TEST".to_owned(),
Expand Down Expand Up @@ -793,8 +795,10 @@ mod tests {
},
};

VersionedRegistry::V2(ForgeResolvedRegistry {
registry_url: "TEST_METRICS".to_owned(),
VersionedRegistry::V2(Box::new(ForgeResolvedRegistry {
schema_url: "https://example.com/schemas/1.2.3"
.try_into()
.expect("Should be valid schema url"),
registry: Registry {
attributes: vec![memory_state_attr.clone()],
attribute_groups: vec![],
Expand Down Expand Up @@ -842,7 +846,7 @@ mod tests {
spans: vec![],
events: vec![],
},
})
}))
} else {
VersionedRegistry::V1(ResolvedRegistry {
registry_url: "TEST_METRICS".to_owned(),
Expand Down Expand Up @@ -1001,9 +1005,10 @@ mod tests {
},
};

VersionedRegistry::V2(ForgeResolvedRegistry {
registry_url: "TEST".to_owned(),

VersionedRegistry::V2(Box::new(ForgeResolvedRegistry {
schema_url: "https://example.com/schemas/1.2.3"
.try_into()
.expect("Should be valid schema url"),
registry: Registry {
attributes: vec![custom_string_attr.clone()],
attribute_groups: vec![],
Expand Down Expand Up @@ -1038,7 +1043,7 @@ mod tests {
spans: vec![],
events: vec![],
},
})
}))
} else {
VersionedRegistry::V1(ResolvedRegistry {
registry_url: "TEST".to_owned(),
Expand Down Expand Up @@ -1516,8 +1521,10 @@ mod tests {
},
};

VersionedRegistry::V2(ForgeResolvedRegistry {
registry_url: "TEST_EVENTS".to_owned(),
VersionedRegistry::V2(Box::new(ForgeResolvedRegistry {
schema_url: "https://example.com/schemas/1.2.3"
.try_into()
.expect("Should be valid schema url"),
registry: Registry {
attributes: vec![session_id_attr.clone(), session_previous_id_attr.clone()],
attribute_groups: vec![],
Expand Down Expand Up @@ -1591,7 +1598,7 @@ mod tests {
spans: vec![],
events: vec![],
},
})
}))
} else {
VersionedRegistry::V1(ResolvedRegistry {
registry_url: "TEST_EVENTS".to_owned(),
Expand Down
4 changes: 2 additions & 2 deletions crates/weaver_mcp/src/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ impl WeaverMcpService {
let search_context = Arc::new(SearchContext::from_registry(&registry));

// Create versioned registry wrapper once for live check
let versioned_registry = Arc::new(VersionedRegistry::V2((*registry).clone()));
let versioned_registry = Arc::new(VersionedRegistry::V2(Box::new((*registry).clone())));

Self {
search_context,
Expand Down Expand Up @@ -392,7 +392,7 @@ mod tests {

fn make_test_registry() -> ForgeResolvedRegistry {
ForgeResolvedRegistry {
registry_url: "test".to_owned(),
schema_url: "https://todo/1.0.0".try_into().unwrap(),
registry: Registry {
attributes: vec![Attribute {
key: "http.request.method".to_owned(),
Expand Down
13 changes: 12 additions & 1 deletion crates/weaver_resolved_schema/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
use serde::{Deserialize, Serialize};

use crate::attribute::AttributeRef;
use crate::error::Error::{AttributeNotFound, CompoundError, EventNameNotFound};
use crate::error::Error::{AttributeNotFound, CompoundError, EventNameNotFound, InvalidSchemaUrl};

/// Errors emitted by this crate.
#[derive(thiserror::Error, Debug, Clone, Deserialize, Serialize)]
Expand All @@ -26,6 +26,16 @@ pub enum Error {
group_id: String,
},

/// Cannot convert from V1 to V2 schema due to invalid schema URL.
#[error("Failed to convert from V1 to V2 schema, invalid schema URL: {url}, error: {error}")]
InvalidSchemaUrl {
/// The invalid schema URL.
url: String,

/// The error message from the URL validation.
error: String,
},

/// A generic container for multiple errors.
#[error("Errors:\n{0:#?}")]
CompoundError(Vec<Error>),
Expand Down Expand Up @@ -53,6 +63,7 @@ impl Error {
CompoundError(errors) => errors,
e @ AttributeNotFound { .. } => vec![e],
e @ EventNameNotFound { .. } => vec![e],
e @ InvalidSchemaUrl { .. } => vec![e],
})
.collect(),
)
Expand Down
12 changes: 6 additions & 6 deletions crates/weaver_resolved_schema/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -298,13 +298,13 @@ impl ResolvedTelemetrySchema {

if let Some(ref manifest) = self.registry_manifest {
changes.set_head_manifest(weaver_version::schema_changes::RegistryManifest {
semconv_version: manifest.version.clone(),
semconv_version: manifest.version().to_owned(),
});
}

if let Some(ref manifest) = baseline_schema.registry_manifest {
changes.set_baseline_manifest(weaver_version::schema_changes::RegistryManifest {
semconv_version: manifest.version.clone(),
semconv_version: manifest.version().to_owned(),
});
}

Expand Down Expand Up @@ -645,7 +645,7 @@ mod tests {

#[test]
fn detect_2_renamed_registry_attributes() {
let mut prior_schema = ResolvedTelemetrySchema::new("1.0", "", "");
let mut prior_schema = ResolvedTelemetrySchema::new("http://test/schemas/1.0", "", "");
prior_schema.add_attribute_group(
"registry.group1",
[
Expand All @@ -659,7 +659,7 @@ mod tests {
// 2 new attributes are added: attr2_bis and attr3_bis
// attr2 is renamed attr2_bis
// attr3 is renamed attr3_bis
let mut latest_schema = ResolvedTelemetrySchema::new("1.0", "", "");
let mut latest_schema = ResolvedTelemetrySchema::new("http://test/schemas/2.0", "", "");
latest_schema.add_attribute_group(
"registry.group1",
[
Expand Down Expand Up @@ -805,9 +805,9 @@ mod tests {
// TODO add many more group diff checks for various capabilities.
#[test]
fn detect_metric_name_change() {
let mut prior_schema = ResolvedTelemetrySchema::new("1.0", "test/base_version", "");
let mut prior_schema = ResolvedTelemetrySchema::new("http://test/schemas/1.0", "", "");
prior_schema.add_metric_group("metrics.cpu.time", "cpu.time", [], None);
let mut latest_schema = ResolvedTelemetrySchema::new("1.0", "test/new_version", "");
let mut latest_schema = ResolvedTelemetrySchema::new("http://test/schemas/2.0", "", "");
latest_schema.add_metric_group(
"metrics.cpu.time",
"cpu.time",
Expand Down
Loading