diff --git a/Darling/Darling.Tests/packages.lock.json b/Darling/Darling.Tests/packages.lock.json index 44b120483f..51b3bf3d86 100644 --- a/Darling/Darling.Tests/packages.lock.json +++ b/Darling/Darling.Tests/packages.lock.json @@ -752,7 +752,10 @@ } }, "performancemonitor.analysis": { - "type": "Project" + "type": "Project", + "dependencies": { + "PerformanceMonitor.Common": "[3.10.0, )" + } }, "performancemonitor.collectors": { "type": "Project", diff --git a/Darling/PerformanceMonitor.Darling.Viewer/packages.lock.json b/Darling/PerformanceMonitor.Darling.Viewer/packages.lock.json index f724fedf34..fe12807f58 100644 --- a/Darling/PerformanceMonitor.Darling.Viewer/packages.lock.json +++ b/Darling/PerformanceMonitor.Darling.Viewer/packages.lock.json @@ -464,17 +464,20 @@ "performancemonitor.alerting": { "type": "Project", "dependencies": { - "PerformanceMonitor.Common": "[3.9.0, )", - "PerformanceMonitor.Notifications": "[3.9.0, )" + "PerformanceMonitor.Common": "[3.10.0, )", + "PerformanceMonitor.Notifications": "[3.10.0, )" } }, "performancemonitor.analysis": { - "type": "Project" + "type": "Project", + "dependencies": { + "PerformanceMonitor.Common": "[3.10.0, )" + } }, "performancemonitor.collectors": { "type": "Project", "dependencies": { - "PerformanceMonitor.Common": "[3.9.0, )" + "PerformanceMonitor.Common": "[3.10.0, )" } }, "performancemonitor.common": { @@ -491,45 +494,43 @@ "Microsoft.Data.SqlClient": "[7.1.1, )", "Microsoft.Data.SqlClient.Extensions.Azure": "[7.1.1, )", "ModelContextProtocol": "[2.2.0, )", - "PerformanceMonitor.Analysis": "[3.9.0, )", - "PerformanceMonitor.Collectors": "[3.9.0, )", - "PerformanceMonitor.Common": "[3.9.0, )", - "PerformanceMonitor.Darling.Storage": "[3.9.0, )", - "PerformanceMonitor.Notifications": "[3.9.0, )", - "PerformanceMonitor.PlanAnalysis": "[3.9.0, )", - "System.Security.Cryptography.ProtectedData": "[10.0.11, )" + "PerformanceMonitor.Analysis": "[3.10.0, )", + "PerformanceMonitor.Collectors": "[3.10.0, )", + "PerformanceMonitor.Common": "[3.10.0, )", + "PerformanceMonitor.Darling.Storage": "[3.10.0, )", + "PerformanceMonitor.Notifications": "[3.10.0, )", + "PerformanceMonitor.PlanAnalysis": "[3.10.0, )" } }, "performancemonitor.darling.storage": { "type": "Project", "dependencies": { "Npgsql": "[10.0.3, )", - "PerformanceMonitor.Analysis": "[3.9.0, )", - "PerformanceMonitor.Collectors": "[3.9.0, )", - "PerformanceMonitor.Common": "[3.9.0, )", - "PerformanceMonitor.PlanAnalysis": "[3.9.0, )" + "PerformanceMonitor.Analysis": "[3.10.0, )", + "PerformanceMonitor.Collectors": "[3.10.0, )", + "PerformanceMonitor.Common": "[3.10.0, )", + "PerformanceMonitor.PlanAnalysis": "[3.10.0, )" } }, "performancemonitor.notifications": { "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.12, )", - "PerformanceMonitor.Analysis": "[3.9.0, )" + "PerformanceMonitor.Analysis": "[3.10.0, )" } }, "performancemonitor.plananalysis": { "type": "Project", "dependencies": { "Microsoft.Data.SqlClient": "[7.1.1, )", - "PerformanceMonitor.Common": "[3.9.0, )", - "System.Security.Cryptography.ProtectedData": "[10.0.11, )" + "PerformanceMonitor.Common": "[3.10.0, )" } }, "performancemonitor.ui": { "type": "Project", "dependencies": { - "PerformanceMonitor.Common": "[3.9.0, )", - "PerformanceMonitor.PlanAnalysis": "[3.9.0, )", + "PerformanceMonitor.Common": "[3.10.0, )", + "PerformanceMonitor.PlanAnalysis": "[3.10.0, )", "ScottPlot.WPF": "[5.1.59, )" } }, @@ -599,12 +600,6 @@ "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "10.0.0" } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.11", - "contentHash": "PNoxCTPb+Tlux+GJyq4c89ddYdpioVSqfGx8pqOF6shCSKwUNNctXhQtRkCICjbJmGrJJsW8NY52kVYO/b8mlQ==" } } } diff --git a/Lite.Tests/QueryHashIdentityParityTests.cs b/Lite.Tests/QueryHashIdentityTests.cs similarity index 62% rename from Lite.Tests/QueryHashIdentityParityTests.cs rename to Lite.Tests/QueryHashIdentityTests.cs index bf183d219f..ed61b71b8c 100644 --- a/Lite.Tests/QueryHashIdentityParityTests.cs +++ b/Lite.Tests/QueryHashIdentityTests.cs @@ -17,80 +17,118 @@ namespace PerformanceMonitorLite.Tests; /// -/// #5711: an all-zero query_hash is "the engine did not say", never a query, and the two grouping sites over +/// #5711 / #5758: an all-zero query_hash is "the engine did not say", never a query, and the two grouping sites over /// query_snapshots.query_hash (the same-statement pileup detector and the long-running-query alert's incident /// key) must not pool unrelated requests under it. /// -/// The parity half. PerformanceMonitor.Analysis cannot reference PerformanceMonitor.Common -/// (a ProjectReference changes the committed lock files of the deprecated Dashboard projects too), so the detector -/// carries a copy of 's hash test and statement fingerprint. Two copies of one -/// definition fail only after BOTH drift (#3684) unless they are run over one corpus, which is what -/// does. +/// The rule has one definition, in PerformanceMonitor.Common; the detector's +/// calls it (#5758). These tests pin that definition's +/// cases (the corpus below, with each expected identity written out) and the detector's row path over the same corpus. /// -public class QueryHashIdentityParityTests +public class QueryHashIdentityTests { private const string Zero = "0x0000000000000000"; private const string RealHash = "0x8A2F19C4BE77D301"; private const string Marker = "-- statement text withheld (#4348)"; - /// Hashes: NULL, empty, blanks, the zero spellings, a real hash in two cases, padded. + /// + /// Hashes: NULL, empty, blanks, the zero spellings, a real hash in two cases, padded. Each with whether it is unknown + /// and, when known, its identity (trimmed, lower-cased). + /// public static IEnumerable Hashes() => - new[] { null, "", " ", "0", "00", "0x", "0X0", Zero, "0X0000000000000000", " 0x0000000000000000 ", RealHash, RealHash.ToLowerInvariant(), " " + RealHash + " ", "0x0000000000000001", "x0" } - .Select(h => new object?[] { h }); + [ + [null, true, null], + ["", true, null], + [" ", true, null], + ["0", true, null], + ["00", true, null], + ["0x", false, "0x"], + ["0X0", true, null], + [Zero, true, null], + ["0X0000000000000000", true, null], + [" 0x0000000000000000 ", true, null], + [RealHash, false, "0x8a2f19c4be77d301"], + [RealHash.ToLowerInvariant(), false, "0x8a2f19c4be77d301"], + [" " + RealHash + " ", false, "0x8a2f19c4be77d301"], + ["0x0000000000000001", false, "0x0000000000000001"], + ["x0", false, "x0"], + ]; - /// Statement text: whitespace, case, comments, literals, the withheld marker, empty. - public static readonly string?[] Texts = + /// + /// Statement text: whitespace, case, comments, literals, the withheld marker, empty; each with its fingerprint + /// (NULL for no usable text and for the marker). Texts that differ only in case or whitespace share a fingerprint. + /// + public static IEnumerable Texts() => [ - null, - "", - " \t\r\n ", - "select 1", - "SELECT 1", - "select\r\n1", - " select 1 ", - "select 2", - "SELECT * FROM dbo.Orders WHERE OrderId = 42", - "select * from dbo.orders where orderid = 43", - "select * from dbo.orders /* hint */ where orderid = 42", - "select 'A' + 'b'", - "select 'a' + 'B'", - Marker, - " " + Marker + " ", - Marker + " ", - "-- statement text withheld", - "BACKUP DATABASE [tenant_shared] TO DISK = N'nul'", - "DBCC CHECKDB (N'tenant_shared') WITH NO_INFOMSGS", - "café", - "CAFÉ", + [null, null], + ["", null], + [" \t\r\n ", null], + ["select 1", "text:822ae07d4783158b"], + ["SELECT 1", "text:822ae07d4783158b"], + ["select\r\n1", "text:822ae07d4783158b"], + [" select 1 ", "text:822ae07d4783158b"], + ["select 2", "text:3cf988cc782b44bc"], + ["SELECT * FROM dbo.Orders WHERE OrderId = 42", "text:d1b5d6fb3619562c"], + ["select * from dbo.orders where orderid = 43", "text:ead1ef3092666a9b"], + ["select * from dbo.orders /* hint */ where orderid = 42", "text:f6e81ab16a1fa8dd"], + ["select 'A' + 'b'", "text:f4150cb87bc18753"], + ["select 'a' + 'B'", "text:f4150cb87bc18753"], + [Marker, null], + [" " + Marker + " ", null], + [Marker + " ", null], + ["-- statement text withheld", "text:b269cb30b8cebcbd"], + ["BACKUP DATABASE [tenant_shared] TO DISK = N'nul'", "text:74738d493704fd0c"], + ["DBCC CHECKDB (N'tenant_shared') WITH NO_INFOMSGS", "text:41d3551a3531440e"], + ["café", "text:850f7dc43910ff89"], + ["CAFÉ", "text:850f7dc43910ff89"], ]; private static SameStatementPileupDetector.SnapshotRow Row(string? hash, string? text) => new(DateTime.UtcNow, 1, hash, text, "db", "running", null, null, 30_000, 100, 1_000, 0, text); + [Theory] + [MemberData(nameof(Hashes))] + public void IsUnknown_AndKnownHash_FollowTheHashCorpus(string? hash, bool unknown, string? identity) + { + Assert.Equal(unknown, QueryHashIdentity.IsUnknown(hash)); + Assert.Equal(unknown ? null : hash!.Trim(), QueryHashIdentity.KnownHash(hash)); + Assert.Equal(identity is null, unknown); + } + + [Theory] + [MemberData(nameof(Texts))] + public void StatementFingerprint_FollowsTheTextCorpus(string? text, string? fingerprint) => + Assert.Equal(fingerprint, QueryHashIdentity.StatementFingerprint(text)); + /// - /// Every (hash, text) pair in the corpus keys identically through the detector's copy and through - /// — which covers the hash test (IsUnknown against the detector's - /// IsUnknownHash) and the fingerprint (StatementFingerprint against the detector's text hash) at - /// once, including the shapes that mint NULL. + /// Every (hash, text) pair in the corpus has the expected identity through + /// and through the detector's row path: the real hash (trimmed, lower-cased) when the hash is known, else the + /// text fingerprint, else NULL (the shapes that mint NULL included). /// [Fact] - public void TheDetectorsCopy_AgreesWithTheCommonDefinition_OverOneCorpus() + public void Identity_AndTheDetectorsRowPath_FollowTheCorpus() { var compared = 0; foreach (var hashRow in Hashes()) { var hash = (string?)hashRow[0]; - foreach (var text in Texts) + var knownIdentity = (string?)hashRow[2]; + foreach (var textRow in Texts()) { + var text = (string?)textRow[0]; + var expected = knownIdentity ?? (string?)textRow[1]; + var identity = QueryHashIdentity.Identity(hash, text); var detector = SameStatementPileupDetector.StatementIdentity(Row(hash, text)); - var common = QueryHashIdentity.Identity(hash, text); - Assert.True(string.Equals(common, detector, StringComparison.Ordinal), - $"hash={hash ?? ""} text={text ?? ""}: Common says {common ?? ""}, the detector says {detector ?? ""}"); + var where = $"hash={hash ?? ""} text={text ?? ""}"; + Assert.True(string.Equals(expected, identity, StringComparison.Ordinal), + $"{where}: expected {expected ?? ""}, Identity says {identity ?? ""}"); + Assert.True(string.Equals(expected, detector, StringComparison.Ordinal), + $"{where}: expected {expected ?? ""}, the detector says {detector ?? ""}"); compared++; } } - Assert.Equal(Hashes().Count() * Texts.Length, compared); + Assert.Equal(Hashes().Count() * Texts().Count(), compared); } /// The corpus is not vacuous: it reaches a hash identity, a text fingerprint, and a NULL. @@ -98,7 +136,7 @@ public void TheDetectorsCopy_AgreesWithTheCommonDefinition_OverOneCorpus() public void TheCorpus_ReachesEveryOutcome() { var identities = Hashes() - .SelectMany(h => Texts.Select(t => SameStatementPileupDetector.StatementIdentity(Row((string?)h[0], t)))) + .SelectMany(h => Texts().Select(t => SameStatementPileupDetector.StatementIdentity(Row((string?)h[0], (string?)t[0])))) .ToList(); Assert.Contains(identities, i => i is null); diff --git a/Lite.Tests/packages.lock.json b/Lite.Tests/packages.lock.json index f0556e0f53..d8e5ebb261 100644 --- a/Lite.Tests/packages.lock.json +++ b/Lite.Tests/packages.lock.json @@ -746,7 +746,10 @@ } }, "performancemonitor.analysis": { - "type": "Project" + "type": "Project", + "dependencies": { + "PerformanceMonitor.Common": "[3.10.0, )" + } }, "performancemonitor.collectors": { "type": "Project", diff --git a/Lite/packages.lock.json b/Lite/packages.lock.json index aa2752229b..9efb2c391a 100644 --- a/Lite/packages.lock.json +++ b/Lite/packages.lock.json @@ -428,8 +428,7 @@ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", "Microsoft.Extensions.Logging": "10.0.12", "Microsoft.Extensions.Logging.Abstractions": "10.0.12", - "Microsoft.Extensions.Options": "10.0.12", - "System.Diagnostics.EventLog": "10.0.12" + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Logging.EventSource": { @@ -731,11 +730,6 @@ "System.Memory.Data": "10.0.1" } }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "sOZM+VyRj1pg/ItlHsvrSbjws6oGqZveTzTNBGZ9ziwRDyKsOF3ub6vhvOdxotCIqtlnyHAIwP5sLNvgiZC+pQ==" - }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", "resolved": "8.16.0", @@ -758,17 +752,20 @@ "performancemonitor.alerting": { "type": "Project", "dependencies": { - "PerformanceMonitor.Common": "[3.9.0, )", - "PerformanceMonitor.Notifications": "[3.9.0, )" + "PerformanceMonitor.Common": "[3.10.0, )", + "PerformanceMonitor.Notifications": "[3.10.0, )" } }, "performancemonitor.analysis": { - "type": "Project" + "type": "Project", + "dependencies": { + "PerformanceMonitor.Common": "[3.10.0, )" + } }, "performancemonitor.collectors": { "type": "Project", "dependencies": { - "PerformanceMonitor.Common": "[3.9.0, )" + "PerformanceMonitor.Common": "[3.10.0, )" } }, "performancemonitor.common": { @@ -783,22 +780,21 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.12, )", - "PerformanceMonitor.Analysis": "[3.9.0, )" + "PerformanceMonitor.Analysis": "[3.10.0, )" } }, "performancemonitor.plananalysis": { "type": "Project", "dependencies": { "Microsoft.Data.SqlClient": "[7.1.1, )", - "PerformanceMonitor.Common": "[3.9.0, )", - "System.Security.Cryptography.ProtectedData": "[10.0.11, )" + "PerformanceMonitor.Common": "[3.10.0, )" } }, "performancemonitor.ui": { "type": "Project", "dependencies": { - "PerformanceMonitor.Common": "[3.9.0, )", - "PerformanceMonitor.PlanAnalysis": "[3.9.0, )", + "PerformanceMonitor.Common": "[3.10.0, )", + "PerformanceMonitor.PlanAnalysis": "[3.10.0, )", "ScottPlot.WPF": "[5.1.59, )" } }, @@ -832,12 +828,6 @@ "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.11", - "contentHash": "PNoxCTPb+Tlux+GJyq4c89ddYdpioVSqfGx8pqOF6shCSKwUNNctXhQtRkCICjbJmGrJJsW8NY52kVYO/b8mlQ==" } }, "net10.0-windows7.0/win-x64": { @@ -908,11 +898,6 @@ "type": "Transitive", "resolved": "3.119.0", "contentHash": "IwC9yx36lOdXVT2DjgmWHl1qkVspfj8ctd4+li8CNnvqdfaTolXCOh6TLznURcPAvzatx9K/tLOB7zT6T8EA9w==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "sOZM+VyRj1pg/ItlHsvrSbjws6oGqZveTzTNBGZ9ziwRDyKsOF3ub6vhvOdxotCIqtlnyHAIwP5sLNvgiZC+pQ==" } } } diff --git a/PerformanceMonitor.Analysis/PerformanceMonitor.Analysis.csproj b/PerformanceMonitor.Analysis/PerformanceMonitor.Analysis.csproj index 8556b1fe6c..9f2f593e07 100644 --- a/PerformanceMonitor.Analysis/PerformanceMonitor.Analysis.csproj +++ b/PerformanceMonitor.Analysis/PerformanceMonitor.Analysis.csproj @@ -12,6 +12,12 @@ CA1849;CA2007;CA1508;CA1822;CA1805;CA1510;CA1816;CA1861;CA1845;CA2201;CA1848;CA1852;CA1305;CA1860;CA1707;CA1507;CA1806 + + + + + diff --git a/PerformanceMonitor.Analysis/SameStatementPileupDetector.cs b/PerformanceMonitor.Analysis/SameStatementPileupDetector.cs index 330dd51a79..2a91136e7c 100644 --- a/PerformanceMonitor.Analysis/SameStatementPileupDetector.cs +++ b/PerformanceMonitor.Analysis/SameStatementPileupDetector.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Security.Cryptography; using System.Text; +using PerformanceMonitor.Common; namespace PerformanceMonitor.Analysis; @@ -455,59 +456,15 @@ public static string DatabaseScope(SnapshotRow row) => /// leaves it out). The marker is what a collector stores for any statement it /// withheld, so a text hash over it would put every withheld statement in one group and fire a pileup /// on statements that have nothing in common. - /// #5711: an all-zero hash (0x0000000000000000) is "the engine did not say", not a query: the + /// #5711 / #5758: an all-zero hash (0x0000000000000000) is "the engine did not say", not a query: the /// DMV reports it for requests with no statement hash (BACKUP, DBCC, some maintenance commands), and keying /// on it pooled every such request in one database into one "statement". It takes the null-hash path, and - /// a row with no text has no identity (null) rather than a shared text:empty group. The rule is - /// QueryHashIdentity.Identity in PerformanceMonitor.Common, which this project cannot reference - /// (a ProjectReference changes the committed lock files of the deprecated projects too), so - /// and the fingerprint below are copies of it; QueryHashIdentityParityTests - /// runs both over one corpus and fails when they differ. + /// a row with no text has no identity (null) rather than a shared text:empty group. The rule has ONE + /// definition, QueryHashIdentity.Identity in PerformanceMonitor.Common, which this method calls; that + /// definition also returns null for the withheld marker (#4348), so no marker check lives here. /// - public static string? StatementIdentity(SnapshotRow row) - { - if (!IsUnknownHash(row.QueryHash)) - { - return row.QueryHash!.Trim().ToLowerInvariant(); - } - - if (WithheldStatementMarker.IsMarker(row.QueryText)) - { - return null; - } - - var text = NormalizeText(row.QueryText); - return text.Length == 0 ? null : "text:" + ShortHash(text); - } - - /// - /// #5711: NULL, empty, or all-zero (0, 0x0000000000000000) is no usable hash. A copy of - /// QueryHashIdentity.IsUnknown in PerformanceMonitor.Common (see for why - /// it is a copy); QueryHashIdentityParityTests pins the two equal. - /// - private static bool IsUnknownHash(string? hash) - { - if (string.IsNullOrWhiteSpace(hash)) - { - return true; - } - - var span = hash.AsSpan().Trim(); - if (span.Length > 2 && span[0] == '0' && (span[1] == 'x' || span[1] == 'X')) - { - span = span[2..]; - } - - foreach (var c in span) - { - if (c != '0') - { - return false; - } - } - - return true; - } + public static string? StatementIdentity(SnapshotRow row) => + QueryHashIdentity.Identity(row.QueryHash, row.QueryText); private static Detection BuildDetection( string serverName, @@ -717,8 +674,8 @@ private static bool IsIoClassWait(string? waitType) return false; } - /* The lower-case, whitespace-collapse step of QueryHashIdentity.StatementFingerprint in PerformanceMonitor.Common - (#5711); the pair is pinned equal by QueryHashIdentityParityTests. Change one, change the other. */ + /* Display-only: the preview text. The statement IDENTITY is QueryHashIdentity.Identity in PerformanceMonitor.Common + (#5758), not this. */ private static string NormalizeText(string? text) { if (string.IsNullOrWhiteSpace(text)) diff --git a/PerformanceMonitor.Common/QueryHashIdentity.cs b/PerformanceMonitor.Common/QueryHashIdentity.cs index 6596b37762..ab747d4922 100644 --- a/PerformanceMonitor.Common/QueryHashIdentity.cs +++ b/PerformanceMonitor.Common/QueryHashIdentity.cs @@ -26,10 +26,9 @@ namespace PerformanceMonitor.Common; /// (already scrubbed) statement text, else by nothing (NULL), so a row with neither stays out of every group rather /// than joining one. /// -/// Two copies live in PerformanceMonitor.Analysis.SameStatementPileupDetector (IsUnknownHash and the -/// text fingerprint behind StatementIdentity): Analysis cannot reference this project, because that would change -/// the committed packages.lock.json of the deprecated Dashboard projects as well. QueryHashIdentityParityTests -/// runs both over one corpus; change one definition and that test fails until the other follows. +/// #5758: this is the ONE definition. PerformanceMonitor.Analysis.SameStatementPileupDetector.StatementIdentity +/// calls (Analysis references this project), and QueryHashIdentityTests pins the rule's +/// cases, so there is no second copy to drift (#3684). /// public static class QueryHashIdentity { diff --git a/deprecated/Dashboard.Tests/packages.lock.json b/deprecated/Dashboard.Tests/packages.lock.json index acacd8dac7..6813a26313 100644 --- a/deprecated/Dashboard.Tests/packages.lock.json +++ b/deprecated/Dashboard.Tests/packages.lock.json @@ -729,7 +729,10 @@ } }, "performancemonitor.analysis": { - "type": "Project" + "type": "Project", + "dependencies": { + "PerformanceMonitor.Common": "[3.10.0, )" + } }, "performancemonitor.common": { "type": "Project", diff --git a/deprecated/Dashboard/packages.lock.json b/deprecated/Dashboard/packages.lock.json index 7e7eb019e2..858e999476 100644 --- a/deprecated/Dashboard/packages.lock.json +++ b/deprecated/Dashboard/packages.lock.json @@ -405,8 +405,7 @@ "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", "Microsoft.Extensions.Logging": "10.0.12", "Microsoft.Extensions.Logging.Abstractions": "10.0.12", - "Microsoft.Extensions.Options": "10.0.12", - "System.Diagnostics.EventLog": "10.0.12" + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Logging.EventSource": { @@ -708,11 +707,6 @@ "System.Memory.Data": "10.0.1" } }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "sOZM+VyRj1pg/ItlHsvrSbjws6oGqZveTzTNBGZ9ziwRDyKsOF3ub6vhvOdxotCIqtlnyHAIwP5sLNvgiZC+pQ==" - }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", "resolved": "8.16.0", @@ -742,12 +736,15 @@ "performancemonitor.alerting": { "type": "Project", "dependencies": { - "PerformanceMonitor.Common": "[3.9.0, )", - "PerformanceMonitor.Notifications": "[3.9.0, )" + "PerformanceMonitor.Common": "[3.10.0, )", + "PerformanceMonitor.Notifications": "[3.10.0, )" } }, "performancemonitor.analysis": { - "type": "Project" + "type": "Project", + "dependencies": { + "PerformanceMonitor.Common": "[3.10.0, )" + } }, "performancemonitor.common": { "type": "Project", @@ -761,22 +758,21 @@ "type": "Project", "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "[10.0.12, )", - "PerformanceMonitor.Analysis": "[3.9.0, )" + "PerformanceMonitor.Analysis": "[3.10.0, )" } }, "performancemonitor.plananalysis": { "type": "Project", "dependencies": { "Microsoft.Data.SqlClient": "[7.1.1, )", - "PerformanceMonitor.Common": "[3.9.0, )", - "System.Security.Cryptography.ProtectedData": "[10.0.11, )" + "PerformanceMonitor.Common": "[3.10.0, )" } }, "performancemonitor.ui": { "type": "Project", "dependencies": { - "PerformanceMonitor.Common": "[3.9.0, )", - "PerformanceMonitor.PlanAnalysis": "[3.9.0, )", + "PerformanceMonitor.Common": "[3.10.0, )", + "PerformanceMonitor.PlanAnalysis": "[3.10.0, )", "ScottPlot.WPF": "[5.1.59, )" } }, @@ -799,12 +795,6 @@ "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.11", - "contentHash": "PNoxCTPb+Tlux+GJyq4c89ddYdpioVSqfGx8pqOF6shCSKwUNNctXhQtRkCICjbJmGrJJsW8NY52kVYO/b8mlQ==" } } } diff --git a/tools/ui-smoke-wpf/packages.lock.json b/tools/ui-smoke-wpf/packages.lock.json index 920c3d8369..f6dcd807f0 100644 --- a/tools/ui-smoke-wpf/packages.lock.json +++ b/tools/ui-smoke-wpf/packages.lock.json @@ -768,7 +768,10 @@ } }, "performancemonitor.analysis": { - "type": "Project" + "type": "Project", + "dependencies": { + "PerformanceMonitor.Common": "[3.10.0, )" + } }, "performancemonitor.collectors": { "type": "Project",