From 9ba3f7539ee0b4dadb937dd47069f7c9a935ea4c Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 3 May 2023 23:00:55 +0000 Subject: [PATCH 01/39] Initial commit (#3826) --- .../src/Linq/TranslationContext.cs | 6 +++ .../BaselineTest/BaselineTests.cs | 4 +- ...nqGeneralBaselineTests.TestLambdaReuse.xml | 38 +++++++++++++++++++ .../LinqGeneralBaselineTests.cs | 21 +++++++++- ...icrosoft.Azure.Cosmos.EmulatorTests.csproj | 6 +++ 5 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqGeneralBaselineTests.TestLambdaReuse.xml diff --git a/Microsoft.Azure.Cosmos/src/Linq/TranslationContext.cs b/Microsoft.Azure.Cosmos/src/Linq/TranslationContext.cs index 9205052604..8fc95d8701 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/TranslationContext.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/TranslationContext.cs @@ -119,6 +119,7 @@ public void PopParameter() { ParameterExpression last = this.lambdaParametersStack[this.lambdaParametersStack.Count - 1]; this.lambdaParametersStack.RemoveAt(this.lambdaParametersStack.Count - 1); + this.substitutions.Remove(last); } /// @@ -337,6 +338,11 @@ public Expression Lookup(ParameterExpression parameter) return null; } + internal void Remove(ParameterExpression parameter) + { + this.substitutionTable.Remove(parameter); + } + public const string InputParameterName = "root"; } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/BaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/BaselineTests.cs index e9fbc54267..62f20f1fe4 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/BaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/BaselineTests.cs @@ -153,8 +153,8 @@ public void ExecuteTestSuite(IEnumerable inputs, [CallerMemberName] stri Please run the ..\azure-cosmos-dotnet-v3\UpdateContracts.ps1 script to update the baselines. Expected: {baselineTextSuffix}, Actual: {outputTextSuffix}, - OutputPath: {outputPath}, - BaselinePath: {baselinePath}"); + OutputPath: {Path.GetFullPath(outputPath)}, + BaselinePath: {Path.GetFullPath(baselinePath)}"); } /// diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqGeneralBaselineTests.TestLambdaReuse.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqGeneralBaselineTests.TestLambdaReuse.xml new file mode 100644 index 0000000000..bd2e168e76 --- /dev/null +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqGeneralBaselineTests.TestLambdaReuse.xml @@ -0,0 +1,38 @@ + + + + Where with same predicate instance]]> + + + + + + + + + Select with same predicate instance]]> + + + + + + + + + Select -> Where with same predicate instance]]> + new AnonymousType(Int = 10, Result = c)).Where(DisplayClass.predicate2)]]> + + + + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqGeneralBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqGeneralBaselineTests.cs index a9782bb26b..3fc3aff900 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqGeneralBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqGeneralBaselineTests.cs @@ -1272,6 +1272,25 @@ orderby f.FamilyId descending this.ExecuteTestSuite(inputs); } + [TestMethod] + public void TestLambdaReuse() + { + List inputs = new List(); + + System.Linq.Expressions.Expression> predicate = f => f.Int == 5; + inputs.Add(new LinqTestInput("Where -> Where with same predicate instance", b => getQuery(b).Where(predicate).Where(predicate))); + inputs.Add(new LinqTestInput("Where -> Select with same predicate instance", b => getQuery(b).Where(predicate).Select(predicate))); + + System.Linq.Expressions.Expression> predicate2 = f => f.ToString() == "a"; + inputs.Add(new LinqTestInput("Where -> Select -> Where with same predicate instance", + b => getQuery(b) + .Where(predicate2) + .Select(c => new { Int = 10, Result = c }) + .Where(predicate2))); + + this.ExecuteTestSuite(inputs); + } + [TestMethod] public void TestThenByTranslation() { @@ -1922,7 +1941,7 @@ public async Task ValidateLinqQueries() Gender = "female", Grade = 1, Pets = new List() { pet, new Pet() { GivenName = "koko" } }, - Things = new Dictionary() { { "A", "B" }, { "C", "D" } }, + Things = new Dictionary() { { "A", "B" }, { "C", "D" } } }; Address address = new Address { State = "NY", County = "Manhattan", City = "NY" }; diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj index a504adc855..51891d7e3f 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj @@ -35,6 +35,7 @@ + @@ -283,6 +284,11 @@ + + + PreserveNewest + + PreserveNewest From 17203a5966e906e0d66d52a95cf4d482add3c51e Mon Sep 17 00:00:00 2001 From: Aditya Date: Thu, 4 May 2023 03:54:27 +0000 Subject: [PATCH 02/39] Query: Adds Computed Property SDK Support (#3761) * Initial commit * Restored settings.json changes. * Update * Addressed comments; still need to be tested using Emulator. * Fixes after test run. * Ignored the computed property tests based on the sync this morning (to allow for preview release). * Suite0 fixes. * Test update. * Suite0 fixes --- .../Settings/ComputedPropertiesDefinition.cs | 60 ++ .../Fluent/Settings/ContainerDefinition.cs | 35 ++ .../src/Resource/Settings/ComputedProperty.cs | 53 ++ .../Resource/Settings/ContainerProperties.cs | 45 ++ .../ComputedPropertyComparer.cs | 45 ++ .../ComputedPropertyTests.cs | 549 ++++++++++++++++++ .../Fluent/ContainerSettingsTests.cs | 188 ++++++ .../Contracts/DotNetPreviewSDKAPI.json | 97 ++++ .../CosmosContainerSettingsTests.cs | 3 + .../ContainerDefinitionForCreateTests.cs | 50 ++ .../SettingsContractTests.cs | 63 +- 11 files changed, 1162 insertions(+), 26 deletions(-) create mode 100644 Microsoft.Azure.Cosmos/src/Fluent/Settings/ComputedPropertiesDefinition.cs create mode 100644 Microsoft.Azure.Cosmos/src/Resource/Settings/ComputedProperty.cs create mode 100644 Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ComputedPropertyComparer.cs create mode 100644 Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ComputedPropertyTests.cs diff --git a/Microsoft.Azure.Cosmos/src/Fluent/Settings/ComputedPropertiesDefinition.cs b/Microsoft.Azure.Cosmos/src/Fluent/Settings/ComputedPropertiesDefinition.cs new file mode 100644 index 0000000000..41a6db5168 --- /dev/null +++ b/Microsoft.Azure.Cosmos/src/Fluent/Settings/ComputedPropertiesDefinition.cs @@ -0,0 +1,60 @@ +//------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +//------------------------------------------------------------ +namespace Microsoft.Azure.Cosmos.Fluent +{ + using System; + using System.Collections.ObjectModel; + + /// + /// Computed Properties fluent definition. + /// + /// +#if PREVIEW + public +#else + internal +#endif + class ComputedPropertiesDefinition + { + private readonly Collection computedProperties = new Collection(); + private readonly T parent; + private readonly Action> attachCallback; + + internal ComputedPropertiesDefinition( + T parent, + Action> attachCallback) + { + this.parent = parent; + this.attachCallback = attachCallback; + } + + /// + /// Adds a computed property to the current + /// + /// Name of the computed property + /// Query for the computed property values + /// An instance of the current + public ComputedPropertiesDefinition WithComputedProperty(string name, string query) + { + this.computedProperties.Add( + new ComputedProperty + { + Name = name, + Query = query + }); + + return this; + } + + /// + /// Applies the current definition to the parent. + /// + /// An instance of the parent. + public T Attach() + { + this.attachCallback(this.computedProperties); + return this.parent; + } + } +} diff --git a/Microsoft.Azure.Cosmos/src/Fluent/Settings/ContainerDefinition.cs b/Microsoft.Azure.Cosmos/src/Fluent/Settings/ContainerDefinition.cs index a1141fc3f0..1678688c41 100644 --- a/Microsoft.Azure.Cosmos/src/Fluent/Settings/ContainerDefinition.cs +++ b/Microsoft.Azure.Cosmos/src/Fluent/Settings/ContainerDefinition.cs @@ -4,6 +4,8 @@ namespace Microsoft.Azure.Cosmos.Fluent { using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; /// /// Azure Cosmos container fluent definition. @@ -18,6 +20,7 @@ public abstract class ContainerDefinition private IndexingPolicy indexingPolicy; private string timeToLivePropertyPath; private PartitionKeyDefinitionVersion? partitionKeyDefinitionVersion = null; + private Collection computedProperties; /// /// Creates an instance for unit-testing @@ -123,6 +126,28 @@ public IndexingPolicyDefinition WithIndexingPolicy() (indexingPolicy) => this.WithIndexingPolicy(indexingPolicy)); } + /// + /// definition for Azure Cosmos container. + /// + /// An instance of . +#if PREVIEW + public +#else + internal +#endif + ComputedPropertiesDefinition WithComputedProperties() + { + if (this.computedProperties != null) + { + // Overwrite + throw new NotSupportedException(); + } + + return new ComputedPropertiesDefinition( + (T)this, + (computedProperties) => this.WithComputedProperties(computedProperties)); + } + /// /// Applies the current Fluent definition and creates a container configuration. /// @@ -152,6 +177,11 @@ public ContainerProperties Build() containerProperties.PartitionKeyDefinitionVersion = this.partitionKeyDefinitionVersion.Value; } + if (this.computedProperties != null) + { + containerProperties.ComputedProperties = this.computedProperties; + } + containerProperties.ValidateRequiredProperties(); return containerProperties; @@ -161,5 +191,10 @@ private void WithIndexingPolicy(IndexingPolicy indexingPolicy) { this.indexingPolicy = indexingPolicy; } + + private void WithComputedProperties(Collection computedProperties) + { + this.computedProperties = computedProperties; + } } } diff --git a/Microsoft.Azure.Cosmos/src/Resource/Settings/ComputedProperty.cs b/Microsoft.Azure.Cosmos/src/Resource/Settings/ComputedProperty.cs new file mode 100644 index 0000000000..9eaf5f806b --- /dev/null +++ b/Microsoft.Azure.Cosmos/src/Resource/Settings/ComputedProperty.cs @@ -0,0 +1,53 @@ +//------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +//------------------------------------------------------------ + +namespace Microsoft.Azure.Cosmos +{ + using System.Collections.Generic; + using Newtonsoft.Json; + using Newtonsoft.Json.Linq; + + /// + /// Represents a computed property definition in a Cosmos DB collection. + /// +#if PREVIEW + public +#else + internal +#endif + sealed class ComputedProperty + { + /// + /// Gets or sets the name of the computed property. + /// + /// + /// The name of the computed property. + /// + /// + /// Name of the computed property should be chosen such that it does not collide with any existing or future document properties. + /// + [JsonProperty(PropertyName = "name")] + public string Name { get; set; } + + /// + /// Gets or sets the query for the computed property. + /// + /// + /// The query used to evaluate the value for the computed property. + /// + /// + /// For example: + /// SELECT VALUE LOWER(c.firstName) FROM c + /// + [JsonProperty(PropertyName = "query")] + public string Query { get; set; } + + /// + /// This contains additional values for scenarios where the SDK is not aware of new fields. + /// This ensures that if resource is read and updated none of the fields will be lost in the process. + /// + [JsonExtensionData] + internal IDictionary AdditionalProperties { get; private set; } + } +} diff --git a/Microsoft.Azure.Cosmos/src/Resource/Settings/ContainerProperties.cs b/Microsoft.Azure.Cosmos/src/Resource/Settings/ContainerProperties.cs index 94cb93cff5..534f4f033d 100644 --- a/Microsoft.Azure.Cosmos/src/Resource/Settings/ContainerProperties.cs +++ b/Microsoft.Azure.Cosmos/src/Resource/Settings/ContainerProperties.cs @@ -78,6 +78,9 @@ public class ContainerProperties [JsonProperty(PropertyName = "clientEncryptionPolicy", NullValueHandling = NullValueHandling.Ignore)] private ClientEncryptionPolicy clientEncryptionPolicyInternal; + [JsonProperty(PropertyName = "computedProperties", NullValueHandling = NullValueHandling.Ignore)] + private Collection computedProperties; + /// /// This contains additional values for scenarios where the SDK is not aware of new fields. /// This ensures that if resource is read and updated none of the fields will be lost in the process. @@ -286,6 +289,48 @@ public IndexingPolicy IndexingPolicy } } + /// + /// Gets or sets the collection containing objects in the container. + /// + /// + /// The collection containing objects associated with the container. + /// + + /// + /// Gets or sets the collection containing objects in the container. + /// + /// + /// The collection containing objects associated with the container. + /// + [JsonIgnore] +#if PREVIEW + public +#else + internal +#endif + Collection ComputedProperties + { + get + { + if (this.computedProperties == null) + { + this.computedProperties = new Collection(); + } + + return this.computedProperties; + } + + set + { + if (value == null) + { + throw new ArgumentException($"{nameof(value)}"); + } + + this.computedProperties = value; + } + } + /// /// Gets the associated with the container from the Azure Cosmos DB service. /// diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ComputedPropertyComparer.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ComputedPropertyComparer.cs new file mode 100644 index 0000000000..486e785978 --- /dev/null +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ComputedPropertyComparer.cs @@ -0,0 +1,45 @@ +namespace Microsoft.Azure.Cosmos +{ + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Diagnostics.CodeAnalysis; + using Microsoft.VisualStudio.TestTools.UnitTesting; + + class ComputedPropertyComparer : IEqualityComparer + { + public static void AssertAreEqual(Collection expected, Collection actual) + { + int expectedCount = expected?.Count ?? 0; + int actualCount = actual?.Count ?? 0; + Assert.AreEqual(expectedCount, actualCount); + + for (int i = 0; i < expectedCount; i++) + { + AssertAreEqual(expected[i], actual[i]); + } + } + + public static void AssertAreEqual(ComputedProperty expected, ComputedProperty actual) + { + ComputedPropertyComparer comparer = new ComputedPropertyComparer(); + Assert.IsTrue(comparer.Equals(expected, actual), $"Expected: {ToString(expected)}{Environment.NewLine}Actual:{ToString(actual)}"); + } + + private static string ToString(ComputedProperty computedProperty) => $@"""Name"":""{computedProperty.Name}"", ""Query"":""{computedProperty.Query}"""; + + public bool Equals(ComputedProperty x, ComputedProperty y) + { + if (x == null) return y == null; + if (y == null) return false; + + return (x.Name?.Equals(y.Name) == true) && + (x.Query?.Equals(y.Query) == true); + } + + public int GetHashCode([DisallowNull] ComputedProperty obj) + { + return obj.GetHashCode(); + } + } +} diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ComputedPropertyTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ComputedPropertyTests.cs new file mode 100644 index 0000000000..a2c7f552ee --- /dev/null +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ComputedPropertyTests.cs @@ -0,0 +1,549 @@ +namespace Microsoft.Azure.Cosmos.SDK.EmulatorTests +{ + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Diagnostics; + using System.Linq; + using System.Text; + using System.Threading.Tasks; + using global::Azure; + using Microsoft.Azure.Cosmos.CosmosElements; + using Microsoft.VisualStudio.TestTools.UnitTesting; + + [TestClass] + public class ComputedPropertyTests + { + private static readonly CosmosClient cosmosClient; + private static readonly Database database; + + private static readonly ComputedProperty LowerName; + private static readonly ComputedProperty ParentsFullName; + private static readonly Collection AllComputedProperties; + + private static readonly IndexingPolicy IndexAllComputedProperties_IncludeAll; + private static readonly IndexingPolicy IndexAllComputedProperties_ExcludeAll; + private static readonly IndexingPolicy IndexDefault_IncludeAll; + private static readonly IndexingPolicy IndexDefault_ExcludeAll; + + private static readonly string SelectAllComputedPropertiesQuery; + private static readonly List AllComputedPropertiesResult; + private static readonly List EmptyResult; + + static ComputedPropertyTests() + { + cosmosClient = TestCommon.CreateCosmosClient(); + database = cosmosClient.CreateDatabaseAsync(Guid.NewGuid().ToString()).Result; + + LowerName = new ComputedProperty + { + Name = "lowerLastName", + Query = "SELECT VALUE LOWER(IS_DEFINED(c.lastName) ? c.lastName : c.parents[0].familyName) FROM c" + }; + ParentsFullName = new ComputedProperty + { + Name = "parentsFullName", + Query = "SELECT VALUE CONCAT(CONCAT(c.parents[0].firstName, ' ', c.lastName), ' & ', CONCAT(c.parents[1].firstName, ' ', c.lastName)) FROM c" + }; + AllComputedProperties = new Collection { { LowerName }, { ParentsFullName } }; + + IndexAllComputedProperties_IncludeAll = new IndexingPolicy + { + IncludedPaths = new Collection + { + { new IncludedPath { Path = $"/{LowerName.Name}/*" } }, + { new IncludedPath { Path = $"/{ParentsFullName.Name}/*" } }, + { new IncludedPath { Path = $"/*" } }, + } + }; + IndexAllComputedProperties_ExcludeAll = new IndexingPolicy + { + IncludedPaths = new Collection + { + { new IncludedPath { Path = $"/{LowerName.Name}/*" } }, + { new IncludedPath { Path = $"/{ParentsFullName.Name}/*" } }, + }, + ExcludedPaths = new Collection + { + { new ExcludedPath { Path = $"/*" } } + } + }; + IndexDefault_IncludeAll = new IndexingPolicy + { + IncludedPaths = new Collection + { + { new IncludedPath { Path = $"/*" } }, + } + }; + IndexDefault_ExcludeAll = new IndexingPolicy + { + ExcludedPaths = new Collection + { + { new ExcludedPath { Path = $"/*" } } + } + }; + + SelectAllComputedPropertiesQuery = @"SELECT c.lowerLastName, c.parentsFullName FROM c"; + AllComputedPropertiesResult = new List + { + $@"{{{Environment.NewLine} ""lowerLastName"": ""andersen"",{Environment.NewLine} ""parentsFullName"": ""Thomas Andersen & Mary Kay Andersen""{Environment.NewLine}}}", + $@"{{{Environment.NewLine} ""lowerLastName"": ""wakefield""{Environment.NewLine}}}" + }; + EmptyResult = new List + { + @"{}", + @"{}" + }; + } + + [ClassCleanup] + public static async Task Cleanup() + { + await database?.DeleteAsync(); + } + + [Ignore] + [TestMethod] + public async Task TestComputedProperties() + { + TestVariation[] variations = new TestVariation[] + { + ///////////////// + // Create tests + ///////////////// + new TestVariation + { + Description = "V1: null; V2: Empty", + V1 = new ContainerState + { + ComputedProperties = null, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = EmptyResult + }, + V2 = new ContainerState + { + ComputedProperties = new Collection(), + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = EmptyResult + } + }, + new TestVariation + { + Description = "V1: default; V2: All computed properties, no indexing", + V1 = new ContainerState(), + V2 = new ContainerState + { + ComputedProperties = AllComputedProperties, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + } + }, + new TestVariation + { + Description = "V1: default; V2: All computed properties, indexed, exclude /*", + V1 = new ContainerState(), + V2 = new ContainerState + { + ComputedProperties = AllComputedProperties, + IndexingPolicy = IndexAllComputedProperties_ExcludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + } + }, + new TestVariation + { + Description = "V1: default; V2: All computed properties, indexed, include /*", + V1 = new ContainerState(), + V2 = new ContainerState + { + ComputedProperties = AllComputedProperties, + IndexingPolicy = IndexAllComputedProperties_IncludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + }, + }, + new TestVariation + { + Description = "V1: default; V2: All computed properties, not indexed, exclude /*", + V1 = new ContainerState(), + V2 = new ContainerState + { + ComputedProperties = AllComputedProperties, + IndexingPolicy = IndexDefault_ExcludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + }, + }, + new TestVariation + { + Description = "V1: default; V2: All computed properties, not indexed, include /*", + V1 = new ContainerState(), + V2 = new ContainerState + { + ComputedProperties = AllComputedProperties, + IndexingPolicy = IndexDefault_IncludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + } + }, + new TestVariation + { + Description = "V1: one computed property; V2: All computed properties, not indexed, include /*", + V1 = new ContainerState() + { + ComputedProperties = new Collection{ LowerName }, + IndexingPolicy = IndexDefault_IncludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = new List + { + $@"{{{Environment.NewLine} ""lowerLastName"": ""andersen""{Environment.NewLine}}}", + $@"{{{Environment.NewLine} ""lowerLastName"": ""wakefield""{Environment.NewLine}}}" + } + }, + V2 = new ContainerState + { + ComputedProperties = AllComputedProperties, + IndexingPolicy = IndexDefault_IncludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + } + }, + + ///////////////// + // Replace tests + ///////////////// + new TestVariation + { + Description = "V1: one computed property; V2: other computed property, not indexed, include /*", + V1 = new ContainerState() + { + ComputedProperties = new Collection{ LowerName }, + IndexingPolicy = IndexDefault_IncludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = new List + { + $@"{{{Environment.NewLine} ""lowerLastName"": ""andersen""{Environment.NewLine}}}", + $@"{{{Environment.NewLine} ""lowerLastName"": ""wakefield""{Environment.NewLine}}}" + } + }, + V2 = new ContainerState + { + ComputedProperties = new Collection{ ParentsFullName }, + IndexingPolicy = IndexDefault_IncludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = new List + { + $@"{{{Environment.NewLine} ""parentsFullName"": ""Thomas Andersen & Mary Kay Andersen""{Environment.NewLine}}}", + @"{}" + } + } + }, + new TestVariation + { + Description = "V1: one computed property; V2: updated computed property definition, not indexed, include /*", + V1 = new ContainerState() + { + ComputedProperties = new Collection{ LowerName }, + IndexingPolicy = IndexDefault_IncludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = new List + { + $@"{{{Environment.NewLine} ""lowerLastName"": ""andersen""{Environment.NewLine}}}", + $@"{{{Environment.NewLine} ""lowerLastName"": ""wakefield""{Environment.NewLine}}}" + } + }, + V2 = new ContainerState + { + ComputedProperties = new Collection + { + new ComputedProperty + { + Name = "lowerLastName", + Query = "SELECT VALUE LOWER(c.lastName) FROM c" + } + }, + IndexingPolicy = IndexDefault_IncludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = new List + { + $@"{{{Environment.NewLine} ""lowerLastName"": ""andersen""{Environment.NewLine}}}", + @"{}" + } + } + }, + + ///////////////// + // Drop tests + ///////////////// + new TestVariation + { + Description = "V1: All computed properties; V2: null", + V1 = new ContainerState + { + ComputedProperties = AllComputedProperties, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + }, + V2 = new ContainerState + { + ComputedProperties = null, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = EmptyResult + } + }, + new TestVariation + { + Description = "V1: All computed properties; V2: only 1 computed property", + V1 = new ContainerState + { + ComputedProperties = AllComputedProperties, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + }, + V2 = new ContainerState + { + ComputedProperties = new Collection{ LowerName }, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = new List + { + $@"{{{Environment.NewLine} ""lowerLastName"": ""andersen""{Environment.NewLine}}}", + $@"{{{Environment.NewLine} ""lowerLastName"": ""wakefield""{Environment.NewLine}}}" + } + } + }, + new TestVariation + { + Description = "V1: All computed properties, indexed, exclude /*; V2: null", + V1 = new ContainerState + { + ComputedProperties = AllComputedProperties, + IndexingPolicy = IndexAllComputedProperties_ExcludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + }, + V2 = new ContainerState + { + ComputedProperties = null, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = EmptyResult + } + }, + new TestVariation + { + Description = "V1: All computed properties, indexed, include /*; V2: null", + V1 = new ContainerState + { + ComputedProperties = AllComputedProperties, + IndexingPolicy = IndexAllComputedProperties_IncludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + }, + V2 = new ContainerState + { + ComputedProperties = null, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = EmptyResult + } + }, + new TestVariation + { + Description = "V1: All computed properties, not indexed, exclude /*; V2: null", + V1 = new ContainerState + { + ComputedProperties = AllComputedProperties, + IndexingPolicy = IndexDefault_ExcludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + }, + V2 = new ContainerState + { + ComputedProperties = null, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = EmptyResult + } + }, + new TestVariation + { + Description = "V1: All computed properties, not indexed, include /*; V2: null", + V1 = new ContainerState + { + ComputedProperties = AllComputedProperties, + IndexingPolicy = IndexDefault_IncludeAll, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = AllComputedPropertiesResult + }, + V2 = new ContainerState + { + ComputedProperties = null, + Query = SelectAllComputedPropertiesQuery, + ExpectedDocuments = EmptyResult + } + } + }; + + int i = 0; + foreach (TestVariation variation in variations) + { + Console.WriteLine($"Variation {i++} : {variation.Description}"); + await this.RunTest(variation); + } + } + + private async Task RunTest(TestVariation variation) + { + Container container = await this.CreateOrReplace(container: null, containerState: variation.V1); + return await this.CreateOrReplace(container, containerState: variation.V2); + } + + private async Task CreateOrReplace(Container container, ContainerState containerState) + { + ContainerProperties containerProperties = new ContainerProperties(container?.Id ?? Guid.NewGuid().ToString(), "/id") + { + IndexingPolicy = containerState.IndexingPolicy ?? new IndexingPolicy(), + ComputedProperties = containerState.ComputedProperties ?? new Collection(), + }; + + ContainerResponse response = container == null ? + await database.CreateContainerAsync(containerProperties) : + await container.ReplaceContainerAsync(containerProperties); + + this.ValidateComputedProperties(containerState.ComputedProperties, response.Resource.ComputedProperties); + + if (container == null) + { + await this.InsertDocuments(response.Container); + } + else + { + // Sometimes the container changes are not immediately reflected in the query. + // We force a insert-delete after container replacement, which seems to help with this problem. + // If this still doesn't help with the flakiness, we need to find other ways of running the query scenario. + // One alternative is to wait for V2 for all test variations to take effect + // and then run queries separately on each container. + await this.DeleteReinsertDocuments(response.Container); + } + + if (!string.IsNullOrEmpty(containerState.Query)) + { + List results = await this.QueryItems(response.Container, containerState.Query); + + Assert.AreEqual(containerState.ExpectedDocuments.Count, results.Count); + for (int i = 0; i < containerState.ExpectedDocuments.Count; i++) + { + Assert.AreEqual(containerState.ExpectedDocuments[i], results[i]); + } + } + + return response.Container; + } + + private async Task DeleteReinsertDocuments(Container container) + { + foreach (CosmosObject document in Documents) + { + string id = ((CosmosString)document["id"]).Value; + await container.DeleteItemAsync(id, new PartitionKey(id)); + } + + await this.InsertDocuments(container); + } + + private async Task InsertDocuments(Container container) + { + foreach(CosmosObject document in Documents) + { + await container.CreateItemAsync(document); + } + } + + private async Task> QueryItems(Container container, string query) + { + List results = new List(); + FeedIterator iterator = container.GetItemQueryIterator(query); + do + { + FeedResponse page = await iterator.ReadNextAsync(); + results.AddRange(page.Select(item => item.ToString())); + } while (iterator.HasMoreResults); + + return results; + } + + private void ValidateComputedProperties(Collection expected, Collection actual) + { + ComputedPropertyComparer.AssertAreEqual(expected, actual); + } + + private class TestVariation + { + public string Description { get; set; } + public ContainerState V1 { get; set; } + public ContainerState V2 { get; set; } + } + + private class ContainerState + { + public Collection ComputedProperties { get; set; } + public IndexingPolicy IndexingPolicy { get; set; } + public List ExpectedDocuments { get; set; } + public string Query { get; set; } + } + + private static readonly CosmosObject AndersenFamily = CosmosObject.Parse(@" + { + ""id"": ""AndersenFamily"", + ""lastName"": ""Andersen"", + ""parents"": [ + { ""firstName"": ""Thomas"" }, + { ""firstName"": ""Mary Kay""} + ], + ""children"": [ + { + ""firstName"": ""Henriette Thaulow"", + ""gender"": ""female"", + ""grade"": 5, + ""pets"": [{ ""givenName"": ""Fluffy"" }] + } + ], + ""address"": { ""state"": ""WA"", ""county"": ""King"", ""city"": ""seattle"" }, + ""creationDate"": 1431620472, + ""isRegistered"": true, + ""_rid"": ""0fomAIxnukU1AQAAAAAAAA=="" + }"); + + private static readonly CosmosObject WakefieldFamily = CosmosObject.Parse(@" + { + ""id"": ""WakefieldFamily"", + ""parents"": [ + { ""familyName"": ""Wakefield"", ""givenName"": ""Robin"" }, + { ""familyName"": ""Miller"", ""givenName"": ""Ben"" } + ], + ""children"": [ + { + ""familyName"": ""Merriam"", + ""givenName"": ""Jesse"", + ""gender"": ""female"", ""grade"": 1, + ""pets"": [ + { ""givenName"": ""Goofy"" }, + { ""givenName"": ""Shadow"" } + ] + }, + { + ""familyName"": ""Miller"", + ""givenName"": ""Lisa"", + ""gender"": ""female"", + ""grade"": 8 } + ], + ""address"": { ""state"": ""NY"", ""county"": ""Manhattan"", ""city"": ""NY"" }, + ""creationDate"": 1431620462, + ""isRegistered"": false, + ""_rid"": ""0fomAIxnukU1AQAAAAAAAB=="" + }"); + + private static readonly CosmosElement[] Documents = new CosmosElement[] + { + AndersenFamily, + WakefieldFamily, + }; + } +} diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Fluent/ContainerSettingsTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Fluent/ContainerSettingsTests.cs index 9de85f9f7e..8eb72cac25 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Fluent/ContainerSettingsTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Fluent/ContainerSettingsTests.cs @@ -7,6 +7,7 @@ namespace Microsoft.Azure.Cosmos.SDK.EmulatorTests using Microsoft.VisualStudio.TestTools.UnitTesting; using Newtonsoft.Json.Linq; using System; + using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; @@ -98,6 +99,11 @@ public async Task ContainerContractTest() } } }, + // ComputedProperties = new Collection + // { + // { new ComputedProperty{ Name = "lowerName", Query = "SELECT VALUE LOWER(c.Name) FROM c" } }, + // { new ComputedProperty{ Name = "fullName", Query = "SELECT VALUE CONCAT(c.Name, ' ', c.LastName) FROM c" } } + // }, ClientEncryptionPolicy = new ClientEncryptionPolicy(paths) }; @@ -140,6 +146,129 @@ public async Task ContainerContractTest() Assert.IsTrue(responseProperties.ClientEncryptionPolicy.PolicyFormatVersion <= 2); ClientEncryptionIncludedPath clientEncryptionIncludedPath = responseProperties.ClientEncryptionPolicy.IncludedPaths.First(); Assert.IsTrue(this.VerifyClientEncryptionIncludedPath(clientEncryptionIncludedPath1, clientEncryptionIncludedPath)); + + ComputedPropertyComparer.AssertAreEqual(containerProperties.ComputedProperties, responseProperties.ComputedProperties); + ComputedPropertyComparer.AssertAreEqual(containerProperties.ComputedProperties, deserialziedTest.ComputedProperties); + } + + [Ignore] + [TestMethod] + public async Task ContainerNegativeComputedPropertyTest() + { + string query = "SELECT VALUE LOWER(c.name) FROM c"; + var variations = new[] + { + new + { + ComputedProperties = new Collection + { + new ComputedProperty {Name = "lowerName", Query = @"SELECT VALUE LOWER(c.name) FROM c"}, + new ComputedProperty {Name = "lowerName", Query = @"SELECT VALUE LOWER(c.lastName) FROM c"} + }, + Error = @"""Errors"":[""Computed property name 'lowerName' cannot be used in multiple definitions.""]" + }, + new + { + ComputedProperties = new Collection{ new ComputedProperty { Query = query } }, + Error = @"""Errors"":[""One of the specified inputs is invalid""]" + }, + new + { + ComputedProperties = new Collection{ new ComputedProperty { Name = "", Query = query } }, + Error = @"""Errors"":[""Computed property 'name' is either empty or unspecified.""]" + }, + new + { + ComputedProperties = new Collection{ new ComputedProperty { Name = "lowerName" } }, + Error = @"""Errors"":[""One of the specified inputs is invalid""]" + }, + new + { + ComputedProperties = new Collection{ new ComputedProperty { Name = "lowerName", Query = "" } }, + Error = @"""Errors"":[""Computed property 'query' is either empty or unspecified.""]" + }, + new + { + ComputedProperties = new Collection{ new ComputedProperty { Name = "id", Query = query } }, + Error = @"""Errors"":[""The system property name 'id' cannot be used as a computed property name.""]" + }, + new + { + ComputedProperties = new Collection{ new ComputedProperty { Name = "spatial", Query = query } }, + Error = @"""Errors"":[""Computed property 'spatial' at index (0) has a spatial index. Remove the spatial index on this path.""]" + }, + new + { + ComputedProperties = new Collection{ new ComputedProperty {Name = "lowerName", Query = @"SELECT LOWER(c.name) FROM c"} }, + Error = @"""Errors"":[""Required VALUE expression missing from computed property query 'SELECT LOWER(c.name) FROM c' at index (0).""]" + }, + new + { + ComputedProperties = new Collection{ new ComputedProperty {Name = "lowerName", Query = @"SELECT LOWER(c.name) FROM r"} }, + Error = @"""Errors"":[""Computed property at index (0) has a malformed query: 'SELECT LOWER(c.name) FROM r' Error details: '{\""errors\"":[{\""severity\"":\""Error\"",\""code\"":2001,\""message\"":\""Identifier 'c' could not be resolved.\""}]}'""]" + }, + }; + + IndexingPolicy indexingPolicy = new IndexingPolicy + { + SpatialIndexes = new Collection + { + new SpatialPath + { + Path = "/spatial/*", + SpatialTypes = new Collection() + { + Cosmos.SpatialType.LineString, + Cosmos.SpatialType.MultiPolygon, + Cosmos.SpatialType.Point, + Cosmos.SpatialType.Polygon, + } + } + } + }; + + // Create + foreach (var variation in variations) + { + ContainerProperties containerProperties = new ContainerProperties(Guid.NewGuid().ToString(), "/users") + { + IndexingPolicy = indexingPolicy, + GeospatialConfig = new GeospatialConfig(GeospatialType.Geography), + ComputedProperties = variation.ComputedProperties + }; + + try + { + ContainerResponse response = await this.database.CreateContainerAsync(containerProperties); + Assert.Fail($@"Computed Property '{variation.ComputedProperties.Last().Name}' Query '{variation.ComputedProperties.Last().Query}' was expected to fail with error '{variation.Error}'."); + } + catch (CosmosException ce) when (ce.StatusCode == HttpStatusCode.BadRequest) + { + Assert.IsTrue(ce.Message.Contains(variation.Error), $"Message expected to contain:'{variation.Error}'{Environment.NewLine}Actual Message: '{ce.Message}'"); + } + } + + // Replace + Container containerToReplace = await this.database.CreateContainerAsync(new ContainerProperties(Guid.NewGuid().ToString(), "/users")); + foreach (var variation in variations) + { + ContainerProperties containerProperties = new ContainerProperties(Guid.NewGuid().ToString(), "/users") + { + IndexingPolicy = indexingPolicy, + GeospatialConfig = new GeospatialConfig(GeospatialType.Geography), + ComputedProperties = variation.ComputedProperties + }; + + try + { + ContainerResponse response = await containerToReplace.ReplaceContainerAsync(containerProperties); + Assert.Fail($@"Computed Property '{variation.ComputedProperties.Last().Name}' Query '{variation.ComputedProperties.Last().Query}' was expected to fail with error '{variation.Error}'."); + } + catch (CosmosException ce) when (ce.StatusCode == HttpStatusCode.BadRequest) + { + Assert.IsTrue(ce.Message.Contains(variation.Error), $"Message expected to contain:'{variation.Error}'{Environment.NewLine}Actual Message: '{ce.Message}'"); + } + } } [TestMethod] @@ -230,6 +359,17 @@ public async Task ContainerMigrationTest() SpatialTypes = new Collection() { SpatialType.Point } }); + // List computedProperties = new List + // { + // new ComputedProperty() { Name = "lowerName", Query = "SELECT VALUE LOWER(c.name) FROM c" }, + // new ComputedProperty() { Name = "estimatedTax", Query = "SELECT VALUE c.salary * 0.2 FROM c" } + // }; + + // foreach (ComputedProperty computedProperty in computedProperties) + // { + // containerProperties.ComputedProperties.Add(computedProperty); + // } + ContainerProperties propertiesAfterReplace = await container.ReplaceContainerAsync(containerProperties); Assert.AreEqual(0, propertiesAfterReplace.IndexingPolicy.IncludedPaths.First().Indexes.Count); Assert.AreEqual(1, propertiesAfterReplace.IndexingPolicy.CompositeIndexes.Count); @@ -242,6 +382,8 @@ public async Task ContainerMigrationTest() Assert.AreEqual(1, propertiesAfterReplace.IndexingPolicy.SpatialIndexes.Count); Assert.AreEqual("/address/test/*", propertiesAfterReplace.IndexingPolicy.SpatialIndexes.First().Path); + + ComputedPropertyComparer.AssertAreEqual(containerProperties.ComputedProperties, propertiesAfterReplace.ComputedProperties); } [TestMethod] @@ -449,6 +591,52 @@ await this.database.DefineContainer(containerName, partitionKeyPath) Assert.AreEqual(HttpStatusCode.NoContent, containerResponse.StatusCode); } + [Ignore] + [TestMethod] + public async Task WithComputedProperties() + { + string containerName = Guid.NewGuid().ToString(); + string partitionKeyPath = "/users"; + + var definitions = new[] + { + new { Name = "lowerName", Query = "SELECT VALUE LOWER(c.name) FROM c" }, + new { Name = "estimatedTax", Query = "SELECT VALUE c.salary * 0.2 FROM c" } + }; + ContainerResponse containerResponse = + await this.database.DefineContainer(containerName, partitionKeyPath) + .WithComputedProperties() + .WithComputedProperty(definitions[0].Name, definitions[0].Query) + .WithComputedProperty(definitions[1].Name, definitions[1].Query) + .Attach() + .CreateAsync(); + + Assert.AreEqual(HttpStatusCode.Created, containerResponse.StatusCode); + Assert.AreEqual(containerName, containerResponse.Resource.Id); + Assert.AreEqual(partitionKeyPath, containerResponse.Resource.PartitionKey.Paths.First()); + + Assert.AreEqual(2, containerResponse.Resource.ComputedProperties.Count); + Assert.AreEqual(definitions[0].Name, containerResponse.Resource.ComputedProperties[0].Name); + Assert.AreEqual(definitions[0].Query, containerResponse.Resource.ComputedProperties[0].Query); + Assert.AreEqual(definitions[1].Name, containerResponse.Resource.ComputedProperties[1].Name); + Assert.AreEqual(definitions[1].Query, containerResponse.Resource.ComputedProperties[1].Query); + + Container container = containerResponse; + containerResponse = await container.ReadContainerAsync(); + Assert.AreEqual(HttpStatusCode.OK, containerResponse.StatusCode); + Assert.AreEqual(containerName, containerResponse.Resource.Id); + Assert.AreEqual(partitionKeyPath, containerResponse.Resource.PartitionKey.Paths.First()); + + Assert.AreEqual(2, containerResponse.Resource.ComputedProperties.Count); + Assert.AreEqual(definitions[0].Name, containerResponse.Resource.ComputedProperties[0].Name); + Assert.AreEqual(definitions[0].Query, containerResponse.Resource.ComputedProperties[0].Query); + Assert.AreEqual(definitions[1].Name, containerResponse.Resource.ComputedProperties[1].Name); + Assert.AreEqual(definitions[1].Query, containerResponse.Resource.ComputedProperties[1].Query); + + containerResponse = await containerResponse.Container.DeleteContainerAsync(); + Assert.AreEqual(HttpStatusCode.NoContent, containerResponse.StatusCode); + } + [TestMethod] public async Task ThroughputTest() { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json index 8a3d326d50..ab29c95bf0 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json @@ -253,6 +253,59 @@ }, "NestedTypes": {} }, + "Microsoft.Azure.Cosmos.ComputedProperty;System.Object;IsAbstract:False;IsSealed:True;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { + "Subclasses": {}, + "Members": { + "System.String get_Name()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "System.String get_Name();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "System.String get_Query()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "System.String get_Query();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "System.String Name[Newtonsoft.Json.JsonPropertyAttribute(PropertyName = \"name\")]": { + "Type": "Property", + "Attributes": [ + "JsonPropertyAttribute" + ], + "MethodInfo": "System.String Name;CanRead:True;CanWrite:True;System.String get_Name();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_Name(System.String);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "System.String Query[Newtonsoft.Json.JsonPropertyAttribute(PropertyName = \"query\")]": { + "Type": "Property", + "Attributes": [ + "JsonPropertyAttribute" + ], + "MethodInfo": "System.String Query;CanRead:True;CanWrite:True;System.String get_Query();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_Query(System.String);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Void .ctor()": { + "Type": "Constructor", + "Attributes": [], + "MethodInfo": "[Void .ctor(), Void .ctor()]" + }, + "Void set_Name(System.String)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Void set_Name(System.String);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Void set_Query(System.String)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Void set_Query(System.String);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + } + }, + "NestedTypes": {} + }, "Microsoft.Azure.Cosmos.Container;System.Object;IsAbstract:True;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, "Members": { @@ -284,10 +337,27 @@ "Attributes": [], "MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedPolicy get_ChangeFeedPolicy();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, + "System.Collections.ObjectModel.Collection`1[Microsoft.Azure.Cosmos.ComputedProperty] ComputedProperties[Newtonsoft.Json.JsonIgnoreAttribute()]": { + "Type": "Property", + "Attributes": [ + "JsonIgnoreAttribute" + ], + "MethodInfo": "System.Collections.ObjectModel.Collection`1[Microsoft.Azure.Cosmos.ComputedProperty] ComputedProperties;CanRead:True;CanWrite:True;System.Collections.ObjectModel.Collection`1[Microsoft.Azure.Cosmos.ComputedProperty] get_ComputedProperties();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_ComputedProperties(System.Collections.ObjectModel.Collection`1[Microsoft.Azure.Cosmos.ComputedProperty]);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "System.Collections.ObjectModel.Collection`1[Microsoft.Azure.Cosmos.ComputedProperty] get_ComputedProperties()": { + "Type": "Method", + "Attributes": [], + "MethodInfo": "System.Collections.ObjectModel.Collection`1[Microsoft.Azure.Cosmos.ComputedProperty] get_ComputedProperties();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Void set_ChangeFeedPolicy(Microsoft.Azure.Cosmos.ChangeFeedPolicy)": { "Type": "Method", "Attributes": [], "MethodInfo": "Void set_ChangeFeedPolicy(Microsoft.Azure.Cosmos.ChangeFeedPolicy);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Void set_ComputedProperties(System.Collections.ObjectModel.Collection`1[Microsoft.Azure.Cosmos.ComputedProperty])": { + "Type": "Method", + "Attributes": [], + "MethodInfo": "Void set_ComputedProperties(System.Collections.ObjectModel.Collection`1[Microsoft.Azure.Cosmos.ComputedProperty]);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" } }, "NestedTypes": {} @@ -328,6 +398,22 @@ }, "NestedTypes": {} }, + "Microsoft.Azure.Cosmos.Fluent.ComputedPropertiesDefinition`1;System.Object;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:True;IsSerializable:False": { + "Subclasses": {}, + "Members": { + "Microsoft.Azure.Cosmos.Fluent.ComputedPropertiesDefinition`1[T] WithComputedProperty(System.String, System.String)": { + "Type": "Method", + "Attributes": [], + "MethodInfo": "Microsoft.Azure.Cosmos.Fluent.ComputedPropertiesDefinition`1[T] WithComputedProperty(System.String, System.String);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "T Attach()": { + "Type": "Method", + "Attributes": [], + "MethodInfo": "T Attach();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + } + }, + "NestedTypes": {} + }, "Microsoft.Azure.Cosmos.Fluent.ContainerBuilder;Microsoft.Azure.Cosmos.Fluent.ContainerDefinition`1[[Microsoft.Azure.Cosmos.Fluent.ContainerBuilder, ]];IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, "Members": { @@ -339,6 +425,17 @@ }, "NestedTypes": {} }, + "Microsoft.Azure.Cosmos.Fluent.ContainerDefinition`1;System.Object;IsAbstract:True;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:True;IsSerializable:False": { + "Subclasses": {}, + "Members": { + "Microsoft.Azure.Cosmos.Fluent.ComputedPropertiesDefinition`1[T] WithComputedProperties()": { + "Type": "Method", + "Attributes": [], + "MethodInfo": "Microsoft.Azure.Cosmos.Fluent.ComputedPropertiesDefinition`1[T] WithComputedProperties();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + } + }, + "NestedTypes": {} + }, "Microsoft.Azure.Cosmos.Fluent.CosmosClientBuilder;System.Object;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, "Members": { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/CosmosContainerSettingsTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/CosmosContainerSettingsTests.cs index 865bb71d18..bda132d6a3 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/CosmosContainerSettingsTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/CosmosContainerSettingsTests.cs @@ -33,6 +33,9 @@ public void DefaultIncludesPopulated() Cosmos.IncludedPath defaultEntry = containerSettings.IndexingPolicy.IncludedPaths[0]; Assert.AreEqual(Cosmos.IndexingPolicy.DefaultPath, defaultEntry.Path); Assert.AreEqual(0, defaultEntry.Indexes.Count); + + Assert.IsNotNull(containerSettings.ComputedProperties); + Assert.AreEqual(0, containerSettings.ComputedProperties.Count); } [TestMethod] diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Fluent/ContainerDefinitionForCreateTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Fluent/ContainerDefinitionForCreateTests.cs index 58361f89bb..d94aed92a4 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Fluent/ContainerDefinitionForCreateTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Fluent/ContainerDefinitionForCreateTests.cs @@ -251,6 +251,56 @@ await containerFluentDefinitionForCreate It.IsAny()), Times.Once); } + [Ignore] + [TestMethod] + public async Task WithComputedProperties() + { + Mock mockContainerResponse = new Mock(MockBehavior.Strict); + Mock mockDatabase = new Mock(MockBehavior.Strict); + Mock mockClient = new Mock(MockBehavior.Strict); + mockDatabase.Setup(m => m.Client).Returns(mockClient.Object); + mockDatabase + .Setup(c => c.CreateContainerAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(mockContainerResponse.Object); + mockDatabase + .Setup(c => c.Id) + .Returns(Guid.NewGuid().ToString()); + + ContainerBuilder containerFluentDefinitionForCreate = new ContainerBuilder( + mockDatabase.Object, + containerName, + partitionKey); + + var definitions = new[] + { + new { Name = "lowerName", Query = "SELECT VALUE LOWER(c.name) FROM c" }, + new { Name = "estimatedTax", Query = "SELECT VALUE c.salary * 0.2 FROM c" } + }; + await containerFluentDefinitionForCreate + .WithComputedProperties() + .WithComputedProperty(definitions[0].Name, definitions[0].Query) + .WithComputedProperty(definitions[1].Name, definitions[1].Query) + .Attach() + .CreateAsync(); + + mockDatabase.Verify(c => c.CreateContainerAsync( + It.Is((settings) => + settings.ComputedProperties.Count == 2 && + definitions[0].Name.Equals(settings.ComputedProperties[0].Name) && + definitions[0].Query.Equals(settings.ComputedProperties[0].Query) && + definitions[1].Name.Equals(settings.ComputedProperties[1].Name) && + definitions[1].Query.Equals(settings.ComputedProperties[1].Query) + ), + It.IsAny(), + It.IsAny(), + It.IsAny()), + Times.Once); + } + [TestMethod] public async Task WithUniqueKey() { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SettingsContractTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SettingsContractTests.cs index 239de170de..2e8df92318 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SettingsContractTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SettingsContractTests.cs @@ -339,7 +339,7 @@ public void AccountPropertiesDeserializeWithAdditionalDataTest() [TestMethod] public void ContainerPropertiesDeserializeWithAdditionalDataTest() { - string cosmosSerialized = "{\"indexingPolicy\":{\"automatic\":true,\"indexingMode\":\"Consistent\",\"additionalIndexPolicy\":\"indexpolicyvalue\",\"includedPaths\":[{\"path\":\"/included/path\",\"additionalIncludedPath\":\"includedPathValue\",\"indexes\":[]}],\"excludedPaths\":[{\"path\":\"/excluded/path\",\"additionalExcludedPath\":\"excludedPathValue\"}],\"compositeIndexes\":[[{\"path\":\"/composite/path\",\"additionalCompositeIndex\":\"compositeIndexValue\",\"order\":\"ascending\"}]],\"spatialIndexes\":[{\"path\":\"/spatial/path\",\"additionalSpatialIndexes\":\"spatialIndexValue\",\"types\":[]}]},\"geospatialConfig\":{\"type\":\"Geography\",\"additionalGeospatialConfig\":\"geospatialConfigValue\"},\"uniqueKeyPolicy\":{\"additionalUniqueKeyPolicy\":\"uniqueKeyPolicyValue\",\"uniqueKeys\":[{\"paths\":[\"/unique/key/path/1\",\"/unique/key/path/2\"]}]},\"conflictResolutionPolicy\":{\"mode\":\"LastWriterWins\",\"additionalConflictResolutionPolicy\":\"conflictResolutionValue\"},\"clientEncryptionPolicy\":{\"includedPaths\":[{\"path\":\"/path\",\"clientEncryptionKeyId\":\"clientEncryptionKeyId\",\"encryptionType\":\"Randomized\",\"additionalIncludedPath\":\"includedPathValue\",\"encryptionAlgorithm\":\"AEAD_AES_256_CBC_HMAC_SHA256\"}],\"policyFormatVersion\":1,\"additionalEncryptionPolicy\":\"clientEncryptionpolicyValue\"},\"id\":\"2a9f501b-6948-4795-8fd1-797defb5c466\",\"partitionKey\":{\"paths\":[],\"kind\":\"Hash\"}}"; + string cosmosSerialized = "{\"indexingPolicy\":{\"automatic\":true,\"indexingMode\":\"Consistent\",\"additionalIndexPolicy\":\"indexpolicyvalue\",\"includedPaths\":[{\"path\":\"/included/path\",\"additionalIncludedPath\":\"includedPathValue\",\"indexes\":[]}],\"excludedPaths\":[{\"path\":\"/excluded/path\",\"additionalExcludedPath\":\"excludedPathValue\"}],\"compositeIndexes\":[[{\"path\":\"/composite/path\",\"additionalCompositeIndex\":\"compositeIndexValue\",\"order\":\"ascending\"}]],\"spatialIndexes\":[{\"path\":\"/spatial/path\",\"additionalSpatialIndexes\":\"spatialIndexValue\",\"types\":[]}]},\"computedProperties\":[{\"name\":\"lowerName\",\"query\":\"SELECT VALUE LOWER(c.name) FROM c\"},{\"name\":\"estimatedTax\",\"query\":\"SELECT VALUE c.salary * 0.2 FROM c\"}],\"geospatialConfig\":{\"type\":\"Geography\",\"additionalGeospatialConfig\":\"geospatialConfigValue\"},\"uniqueKeyPolicy\":{\"additionalUniqueKeyPolicy\":\"uniqueKeyPolicyValue\",\"uniqueKeys\":[{\"paths\":[\"/unique/key/path/1\",\"/unique/key/path/2\"]}]},\"conflictResolutionPolicy\":{\"mode\":\"LastWriterWins\",\"additionalConflictResolutionPolicy\":\"conflictResolutionValue\"},\"clientEncryptionPolicy\":{\"includedPaths\":[{\"path\":\"/path\",\"clientEncryptionKeyId\":\"clientEncryptionKeyId\",\"encryptionType\":\"Randomized\",\"additionalIncludedPath\":\"includedPathValue\",\"encryptionAlgorithm\":\"AEAD_AES_256_CBC_HMAC_SHA256\"}],\"policyFormatVersion\":1,\"additionalEncryptionPolicy\":\"clientEncryptionpolicyValue\"},\"id\":\"2a9f501b-6948-4795-8fd1-797defb5c466\",\"partitionKey\":{\"paths\":[],\"kind\":\"Hash\"}}"; JObject complexObject = JObject.FromObject(new { id = 1, name = new { fname = "fname", lname = "lname" } }); @@ -351,43 +351,49 @@ public void ContainerPropertiesDeserializeWithAdditionalDataTest() // Serialized string cosmosSerialized = SettingsContractTests.CosmosSerialize(jobject); - ContainerProperties containerDeserSettings = SettingsContractTests.CosmosDeserialize(cosmosSerialized); + ContainerProperties containerProperties = SettingsContractTests.CosmosDeserialize(cosmosSerialized); - Assert.AreEqual("2a9f501b-6948-4795-8fd1-797defb5c466", containerDeserSettings.Id); + Assert.AreEqual("2a9f501b-6948-4795-8fd1-797defb5c466", containerProperties.Id); - Assert.AreEqual(2, containerDeserSettings.AdditionalProperties.Count); - Assert.AreEqual("policy value", (string)containerDeserSettings.AdditionalProperties["simple string"]); - Assert.AreEqual(complexObject.ToString(), JObject.FromObject(containerDeserSettings.AdditionalProperties["complex object"]).ToString()); + Assert.AreEqual(2, containerProperties.AdditionalProperties.Count); + Assert.AreEqual("policy value", (string)containerProperties.AdditionalProperties["simple string"]); + Assert.AreEqual(complexObject.ToString(), JObject.FromObject(containerProperties.AdditionalProperties["complex object"]).ToString()); + + Assert.AreEqual(1, containerProperties.IndexingPolicy.AdditionalProperties.Count); + Assert.AreEqual("indexpolicyvalue", containerProperties.IndexingPolicy.AdditionalProperties["additionalIndexPolicy"]); - Assert.AreEqual(1, containerDeserSettings.IndexingPolicy.AdditionalProperties.Count); - Assert.AreEqual("indexpolicyvalue", containerDeserSettings.IndexingPolicy.AdditionalProperties["additionalIndexPolicy"]); + Assert.AreEqual(1, containerProperties.IndexingPolicy.SpatialIndexes[0].AdditionalProperties.Count); + Assert.AreEqual("spatialIndexValue", containerProperties.IndexingPolicy.SpatialIndexes[0].AdditionalProperties["additionalSpatialIndexes"]); - Assert.AreEqual(1, containerDeserSettings.IndexingPolicy.SpatialIndexes[0].AdditionalProperties.Count); - Assert.AreEqual("spatialIndexValue", containerDeserSettings.IndexingPolicy.SpatialIndexes[0].AdditionalProperties["additionalSpatialIndexes"]); + Assert.AreEqual(1, containerProperties.IndexingPolicy.CompositeIndexes[0][0].AdditionalProperties.Count); + Assert.AreEqual("compositeIndexValue", containerProperties.IndexingPolicy.CompositeIndexes[0][0].AdditionalProperties["additionalCompositeIndex"]); - Assert.AreEqual(1, containerDeserSettings.IndexingPolicy.CompositeIndexes[0][0].AdditionalProperties.Count); - Assert.AreEqual("compositeIndexValue", containerDeserSettings.IndexingPolicy.CompositeIndexes[0][0].AdditionalProperties["additionalCompositeIndex"]); + Assert.AreEqual(1, containerProperties.IndexingPolicy.IncludedPaths[0].AdditionalProperties.Count); + Assert.AreEqual("includedPathValue", containerProperties.IndexingPolicy.IncludedPaths[0].AdditionalProperties["additionalIncludedPath"]); - Assert.AreEqual(1, containerDeserSettings.IndexingPolicy.IncludedPaths[0].AdditionalProperties.Count); - Assert.AreEqual("includedPathValue", containerDeserSettings.IndexingPolicy.IncludedPaths[0].AdditionalProperties["additionalIncludedPath"]); + Assert.AreEqual(1, containerProperties.IndexingPolicy.ExcludedPaths[0].AdditionalProperties.Count); + Assert.AreEqual("excludedPathValue", containerProperties.IndexingPolicy.ExcludedPaths[0].AdditionalProperties["additionalExcludedPath"]); - Assert.AreEqual(1, containerDeserSettings.IndexingPolicy.ExcludedPaths[0].AdditionalProperties.Count); - Assert.AreEqual("excludedPathValue", containerDeserSettings.IndexingPolicy.ExcludedPaths[0].AdditionalProperties["additionalExcludedPath"]); + Assert.AreEqual(1, containerProperties.GeospatialConfig.AdditionalProperties.Count); + Assert.AreEqual("geospatialConfigValue", containerProperties.GeospatialConfig.AdditionalProperties["additionalGeospatialConfig"]); - Assert.AreEqual(1, containerDeserSettings.GeospatialConfig.AdditionalProperties.Count); - Assert.AreEqual("geospatialConfigValue", containerDeserSettings.GeospatialConfig.AdditionalProperties["additionalGeospatialConfig"]); + Assert.AreEqual(1, containerProperties.UniqueKeyPolicy.AdditionalProperties.Count); + Assert.AreEqual("uniqueKeyPolicyValue", containerProperties.UniqueKeyPolicy.AdditionalProperties["additionalUniqueKeyPolicy"]); - Assert.AreEqual(1, containerDeserSettings.UniqueKeyPolicy.AdditionalProperties.Count); - Assert.AreEqual("uniqueKeyPolicyValue", containerDeserSettings.UniqueKeyPolicy.AdditionalProperties["additionalUniqueKeyPolicy"]); + Assert.AreEqual(1, containerProperties.ConflictResolutionPolicy.AdditionalProperties.Count); + Assert.AreEqual("conflictResolutionValue", containerProperties.ConflictResolutionPolicy.AdditionalProperties["additionalConflictResolutionPolicy"]); - Assert.AreEqual(1, containerDeserSettings.ConflictResolutionPolicy.AdditionalProperties.Count); - Assert.AreEqual("conflictResolutionValue", containerDeserSettings.ConflictResolutionPolicy.AdditionalProperties["additionalConflictResolutionPolicy"]); + Assert.AreEqual(1, containerProperties.ClientEncryptionPolicy.AdditionalProperties.Count); + Assert.AreEqual("clientEncryptionpolicyValue", containerProperties.ClientEncryptionPolicy.AdditionalProperties["additionalEncryptionPolicy"]); - Assert.AreEqual(1, containerDeserSettings.ClientEncryptionPolicy.AdditionalProperties.Count); - Assert.AreEqual("clientEncryptionpolicyValue", containerDeserSettings.ClientEncryptionPolicy.AdditionalProperties["additionalEncryptionPolicy"]); + Assert.AreEqual(1, containerProperties.ClientEncryptionPolicy.IncludedPaths.First().AdditionalProperties.Count); + Assert.AreEqual("includedPathValue", containerProperties.ClientEncryptionPolicy.IncludedPaths.First().AdditionalProperties["additionalIncludedPath"]); - Assert.AreEqual(1, containerDeserSettings.ClientEncryptionPolicy.IncludedPaths.First().AdditionalProperties.Count); - Assert.AreEqual("includedPathValue", containerDeserSettings.ClientEncryptionPolicy.IncludedPaths.First().AdditionalProperties["additionalIncludedPath"]); + Assert.AreEqual(2, containerProperties.ComputedProperties.Count); + Assert.AreEqual("lowerName", containerProperties.ComputedProperties[0].Name); + Assert.AreEqual("SELECT VALUE LOWER(c.name) FROM c", containerProperties.ComputedProperties[0].Query); + Assert.AreEqual("estimatedTax", containerProperties.ComputedProperties[1].Name); + Assert.AreEqual("SELECT VALUE c.salary * 0.2 FROM c", containerProperties.ComputedProperties[1].Query); } [TestMethod] @@ -724,6 +730,7 @@ public void ContainerSettingsDefaults() "TimeToLivePropertyPath", "PartitionKeyPath", "PartitionKeyDefinitionVersion", + "ComputedProperties", "ConflictResolutionPolicy", "ChangeFeedPolicy", "ClientEncryptionPolicy", @@ -762,6 +769,10 @@ public void ContainerSettingsDefaults() Assert.IsNotNull(cosmosContainerSettings.IndexingPolicy.IncludedPaths); Assert.IsTrue(object.ReferenceEquals(cosmosContainerSettings.IndexingPolicy.IncludedPaths, cosmosContainerSettings.IndexingPolicy.IncludedPaths)); + Assert.IsNotNull(cosmosContainerSettings.ComputedProperties); + Assert.AreEqual(0, cosmosContainerSettings.ComputedProperties.Count); + Assert.IsTrue(object.ReferenceEquals(cosmosContainerSettings.ComputedProperties, cosmosContainerSettings.ComputedProperties)); + Cosmos.IncludedPath ip = new Cosmos.IncludedPath(); Assert.IsNotNull(ip.Indexes); From 033e883d2f0ae6187e7227d9b86fe6539ca3ee58 Mon Sep 17 00:00:00 2001 From: Justine Cocchi Date: Fri, 5 May 2023 07:47:06 -0700 Subject: [PATCH 03/39] [Internal] Samples: Adds OpenTelemetry and Application Insights samples (#3818) * add opentelemetry and application insights samples * address pr comments --- .../ApplicationInsights/AppSettings.json | 5 + .../ApplicationInsights.csproj | 25 ++++ .../Usage/ApplicationInsights/Program.cs | 118 +++++++++++++++ .../Usage/Cosmos.Samples.Usage.sln | 12 ++ .../Usage/OpenTelemetry/AppSettings.json | 10 ++ .../Usage/OpenTelemetry/OpenTelemetry.csproj | 28 ++++ .../Usage/OpenTelemetry/Program.cs | 138 ++++++++++++++++++ 7 files changed, 336 insertions(+) create mode 100644 Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/AppSettings.json create mode 100644 Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/ApplicationInsights.csproj create mode 100644 Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/Program.cs create mode 100644 Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/AppSettings.json create mode 100644 Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj create mode 100644 Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/AppSettings.json b/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/AppSettings.json new file mode 100644 index 0000000000..028030099b --- /dev/null +++ b/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/AppSettings.json @@ -0,0 +1,5 @@ +{ + "CosmosDBEndPointUrl": "https://localhost:8081", + "CosmosDBAuthorizationKey": "Super secret key", + "ApplicationInsightsConnectionString": "Super secret connection string" +} \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/ApplicationInsights.csproj b/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/ApplicationInsights.csproj new file mode 100644 index 0000000000..cee6d0a6e3 --- /dev/null +++ b/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/ApplicationInsights.csproj @@ -0,0 +1,25 @@ + + + + Exe + net6.0 + Cosmos.Samples.ApplicationInsights + Cosmos.Samples.ApplicationInsights + latest + + + + + + + + + + + + + PreserveNewest + + + + diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/Program.cs b/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/Program.cs new file mode 100644 index 0000000000..b4f55cd65f --- /dev/null +++ b/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/Program.cs @@ -0,0 +1,118 @@ +namespace Cosmos.Samples.ApplicationInsights +{ + using System; + using System.Threading.Tasks; + using Newtonsoft.Json; + using Microsoft.Azure.Cosmos; + using Microsoft.Extensions.Logging; + using Microsoft.Extensions.Configuration; + using Microsoft.Extensions.DependencyInjection; + using Microsoft.ApplicationInsights; + using Microsoft.ApplicationInsights.WorkerService; + using Microsoft.Extensions.Logging.ApplicationInsights; + + internal class Program + { + private static readonly string databaseName = "samples"; + private static readonly string containerName = "ai-sample"; + + private static TelemetryClient? _telemetryClient; + + static async Task Main() + { + try + { + IConfigurationRoot configuration = new ConfigurationBuilder() + .AddJsonFile("AppSettings.json") + .Build(); + + string endpoint = configuration["CosmosDBEndPointUrl"]; + if (string.IsNullOrEmpty(endpoint)) + { + throw new ArgumentNullException("Please specify a valid CosmosDBEndPointUrl in the appSettings.json"); + } + + string authKey = configuration["CosmosDBAuthorizationKey"]; + if (string.IsNullOrEmpty(authKey) || string.Equals(authKey, "Super secret key")) + { + throw new ArgumentException("Please specify a valid CosmosDBAuthorizationKey in the appSettings.json"); + } + + string aiConnectionString = configuration["ApplicationInsightsConnectionString"]; + if (string.IsNullOrEmpty(authKey) || string.Equals(authKey, "Super secret connection string")) + { + throw new ArgumentException("Please specify a valid ApplicationInsightsConnectionString in the appSettings.json"); + } + + // + IServiceCollection services = new ServiceCollection(); + services.AddApplicationInsightsTelemetryWorkerService((ApplicationInsightsServiceOptions options) => options.ConnectionString = aiConnectionString); + + IServiceProvider serviceProvider = services.BuildServiceProvider(); + _telemetryClient = serviceProvider.GetRequiredService(); + // + + CosmosClientOptions options = new CosmosClientOptions() + { + IsDistributedTracingEnabled = true // Defaults to true, set to false to disable + }; + using (CosmosClient client = new CosmosClient(endpoint, authKey, options)) + { + Console.WriteLine($"Getting container reference for {containerName}."); + + ContainerProperties properties = new ContainerProperties(containerName, partitionKeyPath: "/id"); + + await client.CreateDatabaseIfNotExistsAsync(databaseName); + Container container = await client.GetDatabase(databaseName).CreateContainerIfNotExistsAsync(properties); + + await Program.RunCrudDemo(container); + } + } + finally + { + // Explicitly calling Flush() followed by sleep is required for Application Insights logging in console apps to ensure that telemetry is sent to the back-end even if application terminates. + _telemetryClient?.Flush(); + await Task.Delay(5000); + + Console.WriteLine("End of demo."); + } + } + + public static async Task RunCrudDemo(Container container) + { + // Any operations will automatically generate telemetry + + for (int i = 1; i <= 5; i++) + { + await container.CreateItemAsync(new Item { Id = $"{i}", Status = "new" }, new PartitionKey($"{i}")); + Console.WriteLine($"Created document with id: {i}"); + } + + for (int i = 1; i <= 5; i++) + { + await container.ReadItemAsync($"{i}", new PartitionKey($"{i}")); + Console.WriteLine($"Read document with id: {i}"); + } + + for (int i = 1; i <= 5; i++) + { + await container.ReplaceItemAsync(new Item { Id = $"{i}", Status = "updated" }, $"{i}", new PartitionKey($"{i}")); + Console.WriteLine($"Updated document with id: {i}"); + } + + for (int i = 1; i <= 5; i++) + { + await container.DeleteItemAsync($"{i}", new PartitionKey($"{i}")); + Console.WriteLine($"Deleted document with id: {i}"); + } + } + } + + internal class Item + { + [JsonProperty("id")] + public string Id { get; set; } + + public string Status { get; set; } + } +} \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/Cosmos.Samples.Usage.sln b/Microsoft.Azure.Cosmos.Samples/Usage/Cosmos.Samples.Usage.sln index de1e1f4731..999b48d928 100644 --- a/Microsoft.Azure.Cosmos.Samples/Usage/Cosmos.Samples.Usage.sln +++ b/Microsoft.Azure.Cosmos.Samples/Usage/Cosmos.Samples.Usage.sln @@ -51,6 +51,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CFPullModelAllVersionsAndDe EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CFPullModelLatestVersionMode", "CFPullModelLatestVersionMode\CFPullModelLatestVersionMode.csproj", "{985B0E0A-D480-4C3C-A1FC-589F2EC4BBF6}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry", "OpenTelemetry\OpenTelemetry.csproj", "{C6EF6948-C085-4013-A21F-99303ECBA7A9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApplicationInsights", "ApplicationInsights\ApplicationInsights.csproj", "{55149A3C-A263-4EE5-AD2D-02FE9AC4D291}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -153,6 +157,14 @@ Global {985B0E0A-D480-4C3C-A1FC-589F2EC4BBF6}.Debug|Any CPU.Build.0 = Debug|Any CPU {985B0E0A-D480-4C3C-A1FC-589F2EC4BBF6}.Release|Any CPU.ActiveCfg = Release|Any CPU {985B0E0A-D480-4C3C-A1FC-589F2EC4BBF6}.Release|Any CPU.Build.0 = Release|Any CPU + {C6EF6948-C085-4013-A21F-99303ECBA7A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6EF6948-C085-4013-A21F-99303ECBA7A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6EF6948-C085-4013-A21F-99303ECBA7A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6EF6948-C085-4013-A21F-99303ECBA7A9}.Release|Any CPU.Build.0 = Release|Any CPU + {55149A3C-A263-4EE5-AD2D-02FE9AC4D291}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55149A3C-A263-4EE5-AD2D-02FE9AC4D291}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55149A3C-A263-4EE5-AD2D-02FE9AC4D291}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55149A3C-A263-4EE5-AD2D-02FE9AC4D291}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/AppSettings.json b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/AppSettings.json new file mode 100644 index 0000000000..1ea1245434 --- /dev/null +++ b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/AppSettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Azure-Cosmos-Operation-Request-Diagnostics": "Information" + } + }, + "CosmosDBEndPointUrl": "https://localhost:8081", + "CosmosDBAuthorizationKey": "Super secret key", + "ApplicationInsightsConnectionString": "Super secret connection string" +} \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj new file mode 100644 index 0000000000..4dd1171328 --- /dev/null +++ b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj @@ -0,0 +1,28 @@ + + + + Exe + net6.0 + Cosmos.Samples.OpenTelemetry + Cosmos.Samples.OpenTelemetry + latest + + + + + + + + + + + + + + + + PreserveNewest + + + + diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs new file mode 100644 index 0000000000..d799731f1e --- /dev/null +++ b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs @@ -0,0 +1,138 @@ +namespace Cosmos.Samples.OpenTelemetry +{ + using global::OpenTelemetry; + using global::OpenTelemetry.Trace; + using global::OpenTelemetry.Resources; + using System; + using System.Threading.Tasks; + using Newtonsoft.Json; + using Microsoft.Azure.Cosmos; + using Microsoft.Extensions.Azure; + using Microsoft.Extensions.Logging; + using Microsoft.Extensions.Configuration; + using Azure.Monitor.OpenTelemetry.Exporter; + + internal class Program + { + private static readonly string databaseName = "samples"; + private static readonly string containerName = "otel-sample"; + private static readonly string serviceName = "MySampleService"; + + private static TracerProvider? _traceProvider; + + static async Task Main() + { + try + { + IConfigurationRoot configuration = new ConfigurationBuilder() + .AddJsonFile("AppSettings.json") + .Build(); + + string endpoint = configuration["CosmosDBEndPointUrl"]; + if (string.IsNullOrEmpty(endpoint)) + { + throw new ArgumentNullException("Please specify a valid CosmosDBEndPointUrl in the appSettings.json"); + } + + string authKey = configuration["CosmosDBAuthorizationKey"]; + if (string.IsNullOrEmpty(authKey) || string.Equals(authKey, "Super secret key")) + { + throw new ArgumentException("Please specify a valid CosmosDBAuthorizationKey in the appSettings.json"); + } + + string aiConnectionString = configuration["ApplicationInsightsConnectionString"]; + if (string.IsNullOrEmpty(authKey) || string.Equals(authKey, "Super secret connection string")) + { + throw new ArgumentException("Please specify a valid ApplicationInsightsConnectionString in the appSettings.json"); + } + + // + ResourceBuilder resource = ResourceBuilder.CreateDefault().AddService( + serviceName: serviceName, + serviceVersion: "1.0.0"); + + // Set up logging to forward logs to chosen exporter + using ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddOpenTelemetry(options => + { + options.IncludeFormattedMessage = true; + options.SetResourceBuilder(resource); + options.AddAzureMonitorLogExporter(o => o.ConnectionString = aiConnectionString); // Set up exporter of your choice + })); + + AzureEventSourceLogForwarder logforwader = new AzureEventSourceLogForwarder(loggerFactory); + logforwader.Start(); + + // Configure OpenTelemetry trace provider + AppContext.SetSwitch("Azure.Experimental.EnableActivitySource", true); + _traceProvider = Sdk.CreateTracerProviderBuilder() + .AddSource("Azure.Cosmos.Operation") // Cosmos DB source for operation level telemetry + .AddAzureMonitorTraceExporter(o => o.ConnectionString = aiConnectionString) // Set up exporter of your choice + .SetResourceBuilder(resource) + .Build(); + // + + CosmosClientOptions options = new CosmosClientOptions() + { + IsDistributedTracingEnabled = true // Defaults to true, set to false to disable + }; + using (CosmosClient client = new CosmosClient(endpoint, authKey, options)) + { + Console.WriteLine($"Getting container reference for {containerName}."); + + ContainerProperties properties = new ContainerProperties(containerName, partitionKeyPath: "/id"); + + await client.CreateDatabaseIfNotExistsAsync(databaseName); + Container container = await client.GetDatabase(databaseName).CreateContainerIfNotExistsAsync(properties); + + await Program.RunCrudDemo(container); + } + + } + finally + { + _traceProvider?.Dispose(); + // Sleep is required for logging in console apps to ensure that telemetry is sent to the back-end even if application terminates. + await Task.Delay(5000); + + Console.WriteLine("End of demo."); + } + } + + public static async Task RunCrudDemo(Container container) + { + // Any operations will automatically generate telemetry + + for(int i = 1; i <= 5; i++) + { + await container.CreateItemAsync(new Item { Id = $"{i}", Status = "new" }, new PartitionKey($"{i}")); + Console.WriteLine($"Created document with id: {i}"); + } + + for (int i = 1; i <= 5; i++) + { + await container.ReadItemAsync($"{i}", new PartitionKey($"{i}")); + Console.WriteLine($"Read document with id: {i}"); + } + + for (int i = 1; i <= 5; i++) + { + await container.ReplaceItemAsync(new Item { Id = $"{i}", Status = "updated" }, $"{i}", new PartitionKey($"{i}")); + Console.WriteLine($"Updated document with id: {i}"); + } + + for (int i = 1; i <= 5; i++) + { + await container.DeleteItemAsync($"{i}", new PartitionKey($"{i}")); + Console.WriteLine($"Deleted document with id: {i}"); + } + } + } + + internal class Item + { + [JsonProperty("id")] + public string Id { get; set; } + + public string Status { get; set; } + } +} \ No newline at end of file From 0c158656a8a9a42fafeda52757360698fbfa04ea Mon Sep 17 00:00:00 2001 From: Erik O'Leary <969938+onionhammer@users.noreply.github.com> Date: Tue, 9 May 2023 10:45:01 -0500 Subject: [PATCH 04/39] [Internal] Query: Added custom serializer coverage tests to ExpressionToSQL.cs (#3722) * Ensure enum as string is preserved for custom serializer * Failing test * Added failing tests * Updated requested names * Ignore result of test for now * Added additional comment on why the test is ignored * Replaced with sample code * Remove ignore attribute from tests, documented misbehavior for future use * Updated comment --------- Co-authored-by: leminh98 --- .../Linq/CosmosLinqJsonConverterTests.cs | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Linq/CosmosLinqJsonConverterTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Linq/CosmosLinqJsonConverterTests.cs index e4f90f1957..ca2e12c8da 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Linq/CosmosLinqJsonConverterTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Linq/CosmosLinqJsonConverterTests.cs @@ -6,7 +6,10 @@ namespace Microsoft.Azure.Cosmos.Linq { using System; using System.Globalization; + using System.IO; + using System.Linq; using System.Linq.Expressions; + using global::Azure.Core.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -30,6 +33,104 @@ public void DateTimeKindIsPreservedTest() Assert.AreEqual("(a[\"StartDate\"] <= \"2022-05-26\")", sql); } + [TestMethod] + public void EnumIsPreservedAsINTest() + { + // Arrange + CosmosLinqSerializerOptions options = new() + { + //CustomCosmosSerializer = new TestCustomJsonSerializer() + }; + + // Act + TestEnum[] values = new[] { TestEnum.One, TestEnum.Two }; + Expression> expr = a => values.Contains(a.Value); + + string sql = SqlTranslator.TranslateExpression(expr.Body, options); + + // Assert + // Assert.AreEqual("(a[\"Value\"] IN (\"One\", \"Two\"))", sql); // <- TODO - Desired Behavior with CustomSerializer + Assert.AreEqual("(a[\"Value\"] IN (0, 1))", sql); // <- Actual behavior, with ability to set custom serializor reverted + } + + [TestMethod] + public void EnumIsPreservedAsEQUALSTest() + { + // Arrange + CosmosLinqSerializerOptions options = new() + { + // CustomCosmosSerializer = new TestCustomJsonSerializer() + }; + + // Act + TestEnum statusValue = TestEnum.One; + Expression> expr = a => a.Value == statusValue; + + string sql = SqlTranslator.TranslateExpression(expr.Body, options); + + // Assert + // Assert.AreEqual("(a[\"Value\"] = \"One\")", sql); // <- THIS is the correct value, if we are able to use the custom serializer + Assert.AreEqual("(a[\"Value\"] = 0)", sql); // <- THIS is the current mis-behavior of the SDK + } + + [TestMethod] + public void EnumIsPreservedAsEXPRESSIONTest() + { + // Arrange + CosmosLinqSerializerOptions options = new() + { + // CustomCosmosSerializer = new TestCustomJsonSerializer() + }; + + // Act + + // Get status constant + ConstantExpression status = Expression.Constant(TestEnum.One); + + // Get member access expression + ParameterExpression arg = Expression.Parameter(typeof(TestEnumNewtonsoftDocument), "a"); + + // Access the value property + MemberExpression docValueExpression = Expression.MakeMemberAccess( + arg, + typeof(TestEnumNewtonsoftDocument).GetProperty(nameof(TestEnumNewtonsoftDocument.Value))! + ); + + // Create comparison expression + BinaryExpression expression = Expression.Equal( + docValueExpression, + status + ); + + // Create lambda expression + Expression> lambda = + Expression.Lambda>(expression, arg); + + string sql = SqlTranslator.TranslateExpression(lambda.Body, options); + + // Assert + Assert.AreEqual("(a[\"Value\"] = \"One\")", sql); + } + + enum TestEnum + { + One, + Two, + Three, + } + + class TestEnumDocument + { + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter))] // TODO: Remove this once we have the ability to use custom serializer for LINQ queries + public TestEnum Value { get; set; } + } + + class TestEnumNewtonsoftDocument + { + [JsonConverter(typeof(StringEnumConverter))] + public TestEnum Value { get; set; } + } + class TestDocument { [JsonConverter(typeof(DateJsonConverter))] @@ -50,5 +151,54 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s } } } + + /// + // See: https://github.com/Azure/azure-cosmos-dotnet-v3/blob/master/Microsoft.Azure.Cosmos.Samples/Usage/SystemTextJson/CosmosSystemTextJsonSerializer.cs + /// + class TestCustomJsonSerializer : CosmosSerializer + { + private readonly JsonObjectSerializer systemTextJsonSerializer; + + public static readonly System.Text.Json.JsonSerializerOptions JsonOptions = new() + { + DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull, + PropertyNameCaseInsensitive = true, + Converters = { + new System.Text.Json.Serialization.JsonStringEnumConverter(), + } + }; + + public TestCustomJsonSerializer() + { + this.systemTextJsonSerializer = new JsonObjectSerializer(JsonOptions); + } + + public override T FromStream(Stream stream) + { + using (stream) + { + if (stream.CanSeek && stream.Length == 0) + { + return default; + } + + if (typeof(Stream).IsAssignableFrom(typeof(T))) + { + return (T)(object)stream; + } + + return (T)this.systemTextJsonSerializer.Deserialize(stream, typeof(T), default); + } + } + + public override Stream ToStream(T input) + { + MemoryStream stream = new (); + + this.systemTextJsonSerializer.Serialize(stream, input, typeof(T), default); + stream.Position = 0; + return stream; + } + } } } From ade7e3410c0ffb78e2af815f5fe355c2047f3436 Mon Sep 17 00:00:00 2001 From: Erik O'Leary <969938+onionhammer@users.noreply.github.com> Date: Tue, 9 May 2023 12:30:29 -0500 Subject: [PATCH 05/39] Query: Added remaining Cosmos Type checking functions to CosmosLinqExtensions (#3724) * Added the remaining Cosmos Type checking functions to the CosmosLinqExtensions * Added comments requested * Updated comment * Updated baseline * Improve readability of dictionary initialization * Aligned with code style guide * Revert change to baseline * Executed update baseline script --------- Co-authored-by: neildsh <35383880+neildsh@users.noreply.github.com> Co-authored-by: leminh98 --- .../BuiltinFunctions/TypeCheckFunctions.cs | 59 ++++++--- .../src/Linq/CosmosLinqExtensions.cs | 99 ++++++++++++++- ...onBaselineTests.TestTypeCheckFunctions.xml | 117 ++++++++++++++++++ .../LinqTranslationBaselineTests.cs | 20 ++- .../Contracts/DotNetSDKAPI.json | 35 ++++++ 5 files changed, 311 insertions(+), 19 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/TypeCheckFunctions.cs b/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/TypeCheckFunctions.cs index 93c09d65ab..db875f3ae0 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/TypeCheckFunctions.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/TypeCheckFunctions.cs @@ -18,33 +18,62 @@ static TypeCheckFunctions() { TypeCheckFunctionsDefinitions = new Dictionary { - { - "IsDefined", - new SqlBuiltinFunctionVisitor("IS_DEFINED", + [nameof(CosmosLinqExtensions.IsArray)] = new SqlBuiltinFunctionVisitor( + "IS_ARRAY", true, new List() { new Type[]{typeof(object)}, - }) - }, - { - "IsNull", - new SqlBuiltinFunctionVisitor("IS_NULL", + }), + [nameof(CosmosLinqExtensions.IsBool)] = new SqlBuiltinFunctionVisitor( + "IS_BOOL", true, new List() { new Type[]{typeof(object)}, - }) - }, - { - "IsPrimitive", - new SqlBuiltinFunctionVisitor("IS_PRIMITIVE", + }), + [nameof(CosmosLinqExtensions.IsDefined)] = new SqlBuiltinFunctionVisitor( + "IS_DEFINED", true, new List() { new Type[]{typeof(object)}, - }) - } + }), + [nameof(CosmosLinqExtensions.IsNull)] = new SqlBuiltinFunctionVisitor( + "IS_NULL", + true, + new List() + { + new Type[]{typeof(object)}, + }), + [nameof(CosmosLinqExtensions.IsNumber)] = new SqlBuiltinFunctionVisitor( + "IS_NUMBER", + true, + new List() + { + new Type[]{typeof(object)}, + }), + [nameof(CosmosLinqExtensions.IsObject)] = new SqlBuiltinFunctionVisitor( + "IS_OBJECT", + true, + new List() + { + new Type[]{typeof(object)}, + }), + [nameof(CosmosLinqExtensions.IsPrimitive)] = new SqlBuiltinFunctionVisitor( + "IS_PRIMITIVE", + true, + new List() + { + new Type[]{typeof(object)}, + }), + [nameof(CosmosLinqExtensions.IsString)] = new SqlBuiltinFunctionVisitor( + "IS_STRING", + true, + new List() + { + new Type[]{typeof(object)}, + }), }; } diff --git a/Microsoft.Azure.Cosmos/src/Linq/CosmosLinqExtensions.cs b/Microsoft.Azure.Cosmos/src/Linq/CosmosLinqExtensions.cs index dc86de0cb6..6663f52673 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/CosmosLinqExtensions.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/CosmosLinqExtensions.cs @@ -20,6 +20,44 @@ namespace Microsoft.Azure.Cosmos.Linq /// public static class CosmosLinqExtensions { + /// + /// Returns a Boolean value indicating if the type of the specified expression is an array. + /// This method is to be used in LINQ expressions only and will be evaluated on server. + /// There's no implementation provided in the client library. + /// + /// + /// Returns true if the type of the specified expression is an array; otherwise, false. + /// + /// + /// document.Names.IsArray()); + /// ]]> + /// + /// + public static bool IsArray(this object obj) + { + throw new NotImplementedException(ClientResources.TypeCheckExtensionFunctionsNotImplemented); + } + + /// + /// Returns a Boolean value indicating if the type of the specified expression is a boolean. + /// This method is to be used in LINQ expressions only and will be evaluated on server. + /// There's no implementation provided in the client library. + /// + /// + /// Returns true if the type of the specified expression is a boolean; otherwise, false. + /// + /// + /// document.IsRegistered.IsBool()); + /// ]]> + /// + /// + public static bool IsBool(this object obj) + { + throw new NotImplementedException(ClientResources.TypeCheckExtensionFunctionsNotImplemented); + } + /// /// Determines if a certain property is defined or not. /// This method is to be used in LINQ expressions only and will be evaluated on server. @@ -52,12 +90,50 @@ public static bool IsDefined(this object obj) /// var isNullQuery = documents.Where(document => document.Name.IsNull()); /// ]]> /// - /// s> + /// public static bool IsNull(this object obj) { throw new NotImplementedException(ClientResources.TypeCheckExtensionFunctionsNotImplemented); } + /// + /// Returns a Boolean value indicating if the type of the specified expression is a number. + /// This method is to be used in LINQ expressions only and will be evaluated on server. + /// There's no implementation provided in the client library. + /// + /// + /// Returns true if the type of the specified expression is a number; otherwise, false. + /// + /// + /// document.Age.IsNumber()); + /// ]]> + /// + /// + public static bool IsNumber(this object obj) + { + throw new NotImplementedException(ClientResources.TypeCheckExtensionFunctionsNotImplemented); + } + + /// + /// Returns a Boolean value indicating if the type of the specified expression is an object. + /// This method is to be used in LINQ expressions only and will be evaluated on server. + /// There's no implementation provided in the client library. + /// + /// + /// Returns true if the type of the specified expression is an object; otherwise, false. + /// + /// + /// document.Address.IsObject()); + /// ]]> + /// + /// + public static bool IsObject(this object obj) + { + throw new NotImplementedException(ClientResources.TypeCheckExtensionFunctionsNotImplemented); + } + /// /// Determines if a certain property is of primitive JSON type. /// This method is to be used in LINQ expressions only and will be evaluated on server. @@ -74,12 +150,31 @@ public static bool IsNull(this object obj) /// var isPrimitiveQuery = documents.Where(document => document.Name.IsPrimitive()); /// ]]> /// - /// s> + /// public static bool IsPrimitive(this object obj) { throw new NotImplementedException(ClientResources.TypeCheckExtensionFunctionsNotImplemented); } + /// + /// Returns a Boolean value indicating if the type of the specified expression is a string. + /// This method is to be used in LINQ expressions only and will be evaluated on server. + /// There's no implementation provided in the client library. + /// + /// + /// Returns true if the type of the specified expression is a string; otherwise, false. + /// + /// + /// document.Name.IsString()); + /// ]]> + /// + /// + public static bool IsString(this object obj) + { + throw new NotImplementedException(ClientResources.TypeCheckExtensionFunctionsNotImplemented); + } + /// /// This method generate query definition from LINQ query. /// diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestTypeCheckFunctions.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestTypeCheckFunctions.xml index 90a463defa..97aac9ef55 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestTypeCheckFunctions.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestTypeCheckFunctions.xml @@ -1,4 +1,52 @@  + + + + doc.ArrayField.IsArray())]]> + + + + + + + + + doc.StringField.IsArray())]]> + + + + + + + + + Convert(doc.BooleanField, Object).IsBool())]]> + + + + + + + + + doc.StringField.IsBool())]]> + + + + + @@ -45,6 +93,52 @@ FROM root WHERE IS_NULL(root["StringField"])]]> + + + + Convert(doc.NumericField, Object).IsNumber())]]> + + + + + + + + + doc.StringField.IsNumber())]]> + + + + + + + + + doc.ObjectField.IsObject())]]> + + + + + + + + + doc.StringField.IsObject())]]> + + + + + @@ -68,4 +162,27 @@ FROM root WHERE IS_PRIMITIVE(root["StringField"])]]> + + + + doc.StringField.IsString())]]> + + + + + + + + + Convert(doc.NumericField, Object).IsString())]]> + + + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationBaselineTests.cs index 76bd0ffc81..5a46a2d118 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationBaselineTests.cs @@ -116,6 +116,7 @@ internal class DataObject : LinqTestObject public int? NullableField; #pragma warning disable CS0649 // Field is never assigned to, and will always have its default value false public bool BooleanField; + public SimpleObject ObjectField = new SimpleObject(); public Guid GuidField; #pragma warning restore // Field is never assigned to, and will always have its default value false @@ -155,6 +156,11 @@ internal class DataObject : LinqTestObject public string Pk; } + internal class SimpleObject + { + public string Field { get; set; } + } + class DateJsonConverter : IsoDateTimeConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) @@ -257,7 +263,7 @@ public void TestLiteralSerialization() [TestMethod] public void TestTypeCheckFunctions() { - // IsDefined, IsNull, and IsPrimitive are not supported on the client side. + // IsArray, IsBool, IsDefined, IsNull, IsNumber, IsObject, IsPrimitive, and IsString are not supported on the client side. // Partly because IsPrimitive is not trivial to implement. // Therefore these methods are verified with baseline only. List data = new List(); @@ -266,12 +272,22 @@ public void TestTypeCheckFunctions() List inputs = new List { + new LinqTestInput("IsArray array", b => getQuery(b).Where(doc => doc.ArrayField.IsArray())), + new LinqTestInput("IsArray string", b => getQuery(b).Where(doc => doc.StringField.IsArray())), + new LinqTestInput("IsBool bool", b => getQuery(b).Where(doc => doc.BooleanField.IsBool())), + new LinqTestInput("IsBool string", b => getQuery(b).Where(doc => doc.StringField.IsBool())), new LinqTestInput("IsDefined array", b => getQuery(b).Select(doc => doc.ArrayField.IsDefined())), new LinqTestInput("IsDefined string", b => getQuery(b).Where(doc => doc.StringField.IsDefined())), new LinqTestInput("IsNull array", b => getQuery(b).Select(doc => doc.ArrayField.IsNull())), new LinqTestInput("IsNull string", b => getQuery(b).Where(doc => doc.StringField.IsNull())), + new LinqTestInput("IsNumber number", b => getQuery(b).Select(doc => doc.NumericField.IsNumber())), + new LinqTestInput("IsNumber string", b => getQuery(b).Where(doc => doc.StringField.IsNumber())), + new LinqTestInput("IsObject object", b => getQuery(b).Select(doc => doc.ObjectField.IsObject())), + new LinqTestInput("IsObject string", b => getQuery(b).Where(doc => doc.StringField.IsObject())), new LinqTestInput("IsPrimitive array", b => getQuery(b).Select(doc => doc.ArrayField.IsPrimitive())), - new LinqTestInput("IsPrimitive string", b => getQuery(b).Where(doc => doc.StringField.IsPrimitive())) + new LinqTestInput("IsPrimitive string", b => getQuery(b).Where(doc => doc.StringField.IsPrimitive())), + new LinqTestInput("IsString string", b => getQuery(b).Where(doc => doc.StringField.IsString())), + new LinqTestInput("IsString number", b => getQuery(b).Select(doc => doc.NumericField.IsString())), }; this.ExecuteTestSuite(inputs); } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json index 3eee7f406b..5b2e38772a 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json @@ -5296,6 +5296,20 @@ "Microsoft.Azure.Cosmos.Linq.CosmosLinqExtensions;System.Object;IsAbstract:True;IsSealed:True;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, "Members": { + "Boolean IsArray(System.Object)[System.Runtime.CompilerServices.ExtensionAttribute()]": { + "Type": "Method", + "Attributes": [ + "ExtensionAttribute" + ], + "MethodInfo": "Boolean IsArray(System.Object);IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Boolean IsBool(System.Object)[System.Runtime.CompilerServices.ExtensionAttribute()]": { + "Type": "Method", + "Attributes": [ + "ExtensionAttribute" + ], + "MethodInfo": "Boolean IsBool(System.Object);IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Boolean IsDefined(System.Object)[System.Runtime.CompilerServices.ExtensionAttribute()]": { "Type": "Method", "Attributes": [ @@ -5310,6 +5324,20 @@ ], "MethodInfo": "Boolean IsNull(System.Object);IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, + "Boolean IsNumber(System.Object)[System.Runtime.CompilerServices.ExtensionAttribute()]": { + "Type": "Method", + "Attributes": [ + "ExtensionAttribute" + ], + "MethodInfo": "Boolean IsNumber(System.Object);IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Boolean IsObject(System.Object)[System.Runtime.CompilerServices.ExtensionAttribute()]": { + "Type": "Method", + "Attributes": [ + "ExtensionAttribute" + ], + "MethodInfo": "Boolean IsObject(System.Object);IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Boolean IsPrimitive(System.Object)[System.Runtime.CompilerServices.ExtensionAttribute()]": { "Type": "Method", "Attributes": [ @@ -5317,6 +5345,13 @@ ], "MethodInfo": "Boolean IsPrimitive(System.Object);IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, + "Boolean IsString(System.Object)[System.Runtime.CompilerServices.ExtensionAttribute()]": { + "Type": "Method", + "Attributes": [ + "ExtensionAttribute" + ], + "MethodInfo": "Boolean IsString(System.Object);IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Microsoft.Azure.Cosmos.FeedIterator ToStreamIterator[T](System.Linq.IQueryable`1[T])[System.Runtime.CompilerServices.ExtensionAttribute()]": { "Type": "Method", "Attributes": [ From aff7349cb80da9eab40f2e792b71390268e18169 Mon Sep 17 00:00:00 2001 From: Justine Cocchi Date: Wed, 10 May 2023 08:21:05 -0700 Subject: [PATCH 06/39] update sdk version and section tags (#3841) --- .../Usage/ApplicationInsights/ApplicationInsights.csproj | 2 +- .../Usage/ApplicationInsights/Program.cs | 2 +- .../Usage/OpenTelemetry/OpenTelemetry.csproj | 2 +- .../Usage/OpenTelemetry/Program.cs | 6 ++++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/ApplicationInsights.csproj b/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/ApplicationInsights.csproj index cee6d0a6e3..59162abaca 100644 --- a/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/ApplicationInsights.csproj +++ b/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/ApplicationInsights.csproj @@ -10,7 +10,7 @@ - + diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/Program.cs b/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/Program.cs index b4f55cd65f..288ce80c64 100644 --- a/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/Program.cs +++ b/Microsoft.Azure.Cosmos.Samples/Usage/ApplicationInsights/Program.cs @@ -50,7 +50,7 @@ static async Task Main() IServiceProvider serviceProvider = services.BuildServiceProvider(); _telemetryClient = serviceProvider.GetRequiredService(); - // + // CosmosClientOptions options = new CosmosClientOptions() { diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj index 4dd1171328..46fe296b80 100644 --- a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj +++ b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj @@ -10,7 +10,7 @@ - + diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs index d799731f1e..4d6431823e 100644 --- a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs +++ b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs @@ -46,7 +46,7 @@ static async Task Main() throw new ArgumentException("Please specify a valid ApplicationInsightsConnectionString in the appSettings.json"); } - // + // ResourceBuilder resource = ResourceBuilder.CreateDefault().AddService( serviceName: serviceName, serviceVersion: "1.0.0"); @@ -69,12 +69,14 @@ static async Task Main() .AddAzureMonitorTraceExporter(o => o.ConnectionString = aiConnectionString) // Set up exporter of your choice .SetResourceBuilder(resource) .Build(); - // + // + // CosmosClientOptions options = new CosmosClientOptions() { IsDistributedTracingEnabled = true // Defaults to true, set to false to disable }; + // using (CosmosClient client = new CosmosClient(endpoint, authKey, options)) { Console.WriteLine($"Getting container reference for {containerName}."); From 1a8b7f0d0bad48d7517f8871cb5174a4f929118f Mon Sep 17 00:00:00 2001 From: Philip Thomas <86612891+philipthomas-MSFT@users.noreply.github.com> Date: Tue, 16 May 2023 10:44:26 -0400 Subject: [PATCH 07/39] PackageLicense: Removes PackageLicenseUrl and Adds PackageLicenseFile since PackageLicenseUrl is deprecated (#3847) * proposal to add PackageLicenseFile since PackageLicenseUrl is deprecated. https://github.com/NuGet/Home/issues/4628 * adding attribute Visible=false --- Microsoft.Azure.Cosmos/src/Microsoft.Azure.Cosmos.csproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Microsoft.Azure.Cosmos/src/Microsoft.Azure.Cosmos.csproj b/Microsoft.Azure.Cosmos/src/Microsoft.Azure.Cosmos.csproj index 6a5be8ccbb..886a84d586 100644 --- a/Microsoft.Azure.Cosmos/src/Microsoft.Azure.Cosmos.csproj +++ b/Microsoft.Azure.Cosmos/src/Microsoft.Azure.Cosmos.csproj @@ -24,7 +24,6 @@ Microsoft.Azure.Cosmos microsoft;azure;cosmos;cosmosdb;documentdb;docdb;nosql;azureofficial;dotnetcore;netcore;netstandard The change log for this SDK is made available at https://github.com/Azure/azure-cosmos-dotnet-v3/blob/master/changelog.md at the time of release. - https://aka.ms/netcoregaeula https://github.com/Azure/azure-cosmos-dotnet-v3 true http://go.microsoft.com/fwlink/?LinkID=288890 @@ -43,8 +42,13 @@ NU5125 true $(LangVersion) + LICENSE + + + + From b06d6c3cb4bee845406ba0631228ca70e82ce70d Mon Sep 17 00:00:00 2001 From: Philip Thomas <86612891+philipthomas-MSFT@users.noreply.github.com> Date: Wed, 17 May 2023 13:48:21 -0400 Subject: [PATCH 08/39] making ChangeFeedMode.LatestVersion accessible to the public (#3854) --- .../src/ChangeFeed/ChangeFeedMode.cs | 7 +------ .../Contracts/DotNetPreviewSDKAPI.json | 10 ---------- .../Contracts/DotNetSDKAPI.json | 10 ++++++++++ 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/ChangeFeed/ChangeFeedMode.cs b/Microsoft.Azure.Cosmos/src/ChangeFeed/ChangeFeedMode.cs index 7df0871d74..50098a8057 100644 --- a/Microsoft.Azure.Cosmos/src/ChangeFeed/ChangeFeedMode.cs +++ b/Microsoft.Azure.Cosmos/src/ChangeFeed/ChangeFeedMode.cs @@ -38,12 +38,7 @@ internal ChangeFeedMode() /// Latest version mode includes item creations and updates, not deletions. /// /// A to receive latest version item changes. -#if PREVIEW - public -#else - internal -#endif - static ChangeFeedMode LatestVersion => ChangeFeedModeIncremental.Instance; + public static ChangeFeedMode LatestVersion => ChangeFeedModeIncremental.Instance; /// /// Creates a to receive notifications for creations, deletes, as well as all intermediary snapshots for updates. diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json index ab29c95bf0..08d0d65a7e 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json @@ -169,16 +169,6 @@ "Type": "Method", "Attributes": [], "MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode get_AllVersionsAndDeletes();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, - "Microsoft.Azure.Cosmos.ChangeFeedMode get_LatestVersion()": { - "Type": "Method", - "Attributes": [], - "MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode get_LatestVersion();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, - "Microsoft.Azure.Cosmos.ChangeFeedMode LatestVersion": { - "Type": "Property", - "Attributes": [], - "MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode LatestVersion;CanRead:True;CanWrite:False;Microsoft.Azure.Cosmos.ChangeFeedMode get_LatestVersion();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" } }, "NestedTypes": {} diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json index 5b2e38772a..074be1ee37 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json @@ -307,10 +307,20 @@ "Attributes": [], "MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode get_Incremental();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, + "Microsoft.Azure.Cosmos.ChangeFeedMode get_LatestVersion()": { + "Type": "Method", + "Attributes": [], + "MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode get_LatestVersion();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Microsoft.Azure.Cosmos.ChangeFeedMode Incremental": { "Type": "Property", "Attributes": [], "MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode Incremental;CanRead:True;CanWrite:False;Microsoft.Azure.Cosmos.ChangeFeedMode get_Incremental();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Microsoft.Azure.Cosmos.ChangeFeedMode LatestVersion": { + "Type": "Property", + "Attributes": [], + "MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode LatestVersion;CanRead:True;CanWrite:False;Microsoft.Azure.Cosmos.ChangeFeedMode get_LatestVersion();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" } }, "NestedTypes": {} From c66e4884dcaf05657ef35f4452844fdc14447e4e Mon Sep 17 00:00:00 2001 From: Sourabh Jain Date: Thu, 18 May 2023 02:29:57 +0530 Subject: [PATCH 09/39] AI Integration: Fixes Operation Name in the activity and end to end Tests. (#3845) * first draft * second draft * 3rd draft * remove untouched file * test fix * fix order * change order * refactor * skip network activities in test * remove network attributes --- .../OpenTelemetryRecorderFactory.cs | 4 +- ...iterBaselineTests.BatchOperationsAsync.xml | 31 +- ...riterBaselineTests.BulkOperationsAsync.xml | 2679 +++++++++++++++-- ...aceWriterBaselineTests.ChangeFeedAsync.xml | 571 +++- ...eWriterBaselineTests.MiscellanousAsync.xml | 114 +- ...neTests.PointOperationsExceptionsAsync.xml | 174 +- ...EndTraceWriterBaselineTests.QueryAsync.xml | 763 ++++- ...TraceWriterBaselineTests.ReadFeedAsync.xml | 436 ++- ...TraceWriterBaselineTests.ReadManyAsync.xml | 62 +- ...selineTests.StreamPointOperationsAsync.xml | 124 +- ...aselineTests.TypedPointOperationsAsync.xml | 124 +- .../Tracing/AssertActivity.cs | 14 +- .../Tracing/CustomListener.cs | 93 +- .../Tracing/CustomOtelExporter.cs | 2 +- .../EndToEndTraceWriterBaselineTests.cs | 21 +- .../Utils/Util.cs | 4 +- 16 files changed, 4639 insertions(+), 577 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs b/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs index 51b4666b6f..fe10e7b22c 100644 --- a/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs +++ b/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs @@ -26,7 +26,7 @@ public static OpenTelemetryCoreRecorder CreateRecorder(string operationName, { if (clientContext is { ClientOptions.IsDistributedTracingEnabled: true }) { - OpenTelemetryRecorderFactory.ScopeFactory ??= new DiagnosticScopeFactory(clientNamespace: OpenTelemetryAttributeKeys.DiagnosticNamespace, + OpenTelemetryRecorderFactory.ScopeFactory ??= new DiagnosticScopeFactory(clientNamespace: $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.{OpenTelemetryAttributeKeys.OperationPrefix}", resourceProviderNamespace: OpenTelemetryAttributeKeys.ResourceProviderNamespace, isActivityEnabled: true, suppressNestedClientActivities: true); @@ -34,7 +34,7 @@ public static OpenTelemetryCoreRecorder CreateRecorder(string operationName, // If there is no source then it will return default otherwise a valid diagnostic scope DiagnosticScope scope = OpenTelemetryRecorderFactory .ScopeFactory - .CreateScope(name: $"{OpenTelemetryAttributeKeys.OperationPrefix}.{operationName}", + .CreateScope(name: operationName, kind: clientContext.ClientOptions.ConnectionMode == ConnectionMode.Gateway ? DiagnosticScope.ActivityKind.Internal : DiagnosticScope.ActivityKind.Client); // Record values only when we have a valid Diagnostic Scope diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml index 90f32b89c9..09579f83b7 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml @@ -128,10 +128,31 @@ ] } ] -}]]> - Operation.ExecuteAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationExecuteAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeBatchdb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + ExecuteAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Batch + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml index b776a8eaae..be3a8c7910 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml @@ -152,29 +152,248 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + + + + + + + + + @@ -310,29 +529,248 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + + + + + + + + + @@ -468,29 +906,248 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + + + + + + + + + @@ -626,29 +1283,248 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + + + + + + + + + @@ -784,29 +1660,248 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + + + + + + + + + @@ -942,29 +2037,248 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + + + + + + + + + @@ -1100,29 +2414,248 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + + + + + + + + + @@ -1258,29 +2791,248 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + + + + + + + + + @@ -1416,29 +3168,248 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + + + + + + + + + @@ -1574,29 +3545,248 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + + + + + + + + + @@ -2323,10 +4513,29 @@ ] } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectexception.stacktraceexception.typedb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.regions_contactedexception.messagedb.cosmosdb.operation_typeCreate -ExceptionIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Some Value + Some Value + Some Value + Some Value + Some Value + + Some Value + Create + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml index 4189b4bab8..43d95de95d 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml @@ -951,19 +951,128 @@ ] } ] -}]]> - Operation.Change Feed Iterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Iterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Change Feed Iterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Iterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Change Feed Iterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Iterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Change Feed Iterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Iterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Change Feed Iterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Iterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Iterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Iterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Iterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Iterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Iterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + + @@ -1568,19 +1677,128 @@ ] } ] -}]]> - Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + + @@ -2166,19 +2384,128 @@ ] } ] -}]]> - Operation.Change Feed Iterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Iterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Change Feed Iterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Iterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Change Feed Iterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Iterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Change Feed Iterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Iterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Change Feed Iterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Iterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Iterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Iterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Iterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Iterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Iterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + + @@ -2784,19 +3111,128 @@ ] } ] -}]]> - Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + + @@ -3065,10 +3501,31 @@ ] } ] -}]]> - Operation.Change Feed Estimator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationChange Feed Estimator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Change Feed Estimator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml index 591a6af4ac..29fc40f674 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml @@ -106,13 +106,56 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.DeleteAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationDeleteAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeDeletedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateDatabaseAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateDatabaseAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + DeleteAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Delete + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateDatabaseAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + @@ -206,12 +249,55 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.DeleteAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationDeleteAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeDeletedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -Operation.CreateDatabaseAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateDatabaseAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contacted -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + DeleteAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Delete + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateDatabaseAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + + + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml index 64e7e0c3ed..9ee0b6e650 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml @@ -147,11 +147,30 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectexception.stacktraceexception.typedb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.regions_contactedSouth Central USexception.messagedb.cosmosdb.operation_typeCreate -ExceptionIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + Some Value + Create + + + @@ -389,11 +408,30 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectexception.stacktraceexception.typedb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.regions_contactedSouth Central USexception.messagedb.cosmosdb.operation_typeCreate -ExceptionIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + Some Value + Create + + + @@ -614,11 +652,30 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectexception.stacktraceexception.typedb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.regions_contactedSouth Central USexception.messagedb.cosmosdb.operation_typeCreate -ExceptionIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + Some Value + Create + + + @@ -871,11 +928,30 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectexception.stacktraceexception.typedb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.regions_contactedSouth Central USexception.messagedb.cosmosdb.operation_typeCreate -ExceptionIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + Some Value + Create + + + @@ -1192,11 +1268,30 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectexception.stacktraceexception.typedb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.regions_contactedSouth Central USexception.messagedb.cosmosdb.operation_typeCreate -ExceptionIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + Some Value + Create + + + @@ -1346,10 +1441,29 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectexception.stacktraceexception.typedb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.regions_contactedSouth Central USexception.messagedb.cosmosdb.operation_typeCreate -ExceptionIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + Some Value + Create + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml index d2abebc194..e9b0f96a00 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml @@ -573,17 +573,104 @@ ] } ] -}]]> - Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + @@ -1179,17 +1266,104 @@ ] } ] -}]]> - Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + @@ -1766,17 +1940,104 @@ ] } ] -}]]> - Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + @@ -2373,17 +2634,104 @@ ] } ] -}]]> - Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + @@ -3047,17 +3395,104 @@ ] } ] -}]]> - Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + @@ -3643,17 +4078,104 @@ ] } ] -}]]> - Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + @@ -4259,16 +4781,103 @@ ] } ] -}]]> - Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeQuerydb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Query + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml index dc6df3eacf..501a8b187e 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml @@ -535,17 +535,104 @@ ] } ] -}]]> - Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + @@ -1103,17 +1190,104 @@ ] } ] -}]]> - Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + @@ -1652,17 +1826,104 @@ ] } ] -}]]> - Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.FeedIterator Read Next Asyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationFeedIterator Read Next Asyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + FeedIterator Read Next Async + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + @@ -2221,16 +2482,103 @@ ] } ] -}]]> - Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -Operation.Typed FeedIterator ReadNextAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationTyped FeedIterator ReadNextAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReadFeeddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Typed FeedIterator ReadNextAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + ReadFeed + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml index 29b36304ec..627a8ea66f 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml @@ -541,11 +541,32 @@ ] } ] -}]]> - Operation.ReadManyItemsStreamAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationReadManyItemsStreamAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReaddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + ReadManyItemsStreamAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Read + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + @@ -1101,10 +1122,31 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.ReadManyItemsAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationReadManyItemsAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReaddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + ReadManyItemsAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Read + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml index 18f11acd62..016a37aaaf 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml @@ -88,11 +88,32 @@ ] } ] -}]]> - Operation.CreateItemStreamAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemStreamAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemStreamAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + @@ -177,11 +198,32 @@ ] } ] -}]]> - Operation.ReadItemStreamAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationReadItemStreamAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReaddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + ReadItemStreamAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Read + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + @@ -274,11 +316,32 @@ ] } ] -}]]> - Operation.ReplaceItemStreamAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationReplaceItemStreamAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReplacedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + ReplaceItemStreamAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Replace + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + @@ -366,10 +429,31 @@ ] } ] -}]]> - Operation.DeleteItemStreamAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationDeleteItemStreamAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeDeletedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + DeleteItemStreamAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Delete + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml index abeaa41de8..add1fcc343 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml @@ -108,11 +108,32 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.CreateItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationCreateItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeCreatedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + CreateItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Create + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + @@ -202,11 +223,32 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.ReadItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationReadItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReaddb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + ReadItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Read + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + @@ -309,11 +351,32 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.ReplaceItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationReplaceItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeReplacedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + ReplaceItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Replace + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + @@ -405,10 +468,31 @@ "duration in milliseconds": 0 } ] -}]]> - Operation.DeleteItemAsyncaz.namespaceMicrosoft.DocumentDBaz.schema_urldb.operationDeleteItemAsyncdb.namedb.cosmosdb.containerdb.systemcosmosdbdb.cosmosdb.machine_idnet.peer.name127.0.0.1db.cosmosdb.client_iduser_agent.originaldb.cosmosdb.connection_modeDirectdb.cosmosdb.operation_typeDeletedb.cosmosdb.request_content_length_bytesdb.cosmosdb.response_content_length_bytesdb.cosmosdb.status_codedb.cosmosdb.sub_status_codedb.cosmosdb.request_chargedb.cosmosdb.item_countdb.cosmosdb.activity_iddb.cosmosdb.correlated_activity_iddb.cosmosdb.regions_contactedSouth Central US -LatencyOverThresholdIdeally, this should contain request diagnostics but request diagnostics is subject to change with each request as it contains few unique id. So just putting this tag with this static text to make sure event is getting generated for each test. - - +}]]> + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + DeleteItemAsync + Some Value + Some Value + cosmosdb + Some Value + 127.0.0.1 + Some Value + Some Value + Direct + Delete + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + Some Value + South Central US + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs index f4983c10a7..e25a46e44c 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs @@ -14,7 +14,7 @@ namespace Microsoft.Azure.Cosmos.Tracing internal static class AssertActivity { - public static void IsValid(Activity activity) + public static void IsValidOperationActivity(Activity activity) { Assert.IsTrue(activity.OperationName == activity.DisplayName); @@ -71,7 +71,7 @@ public static void IsValid(Activity activity) public static void AreEqualAcrossListeners() { Assert.AreEqual( - JsonConvert.SerializeObject(CustomListener.CollectedActivities.OrderBy(x => x.Id)), + JsonConvert.SerializeObject(CustomListener.CollectedOperationActivities.OrderBy(x => x.Id)), JsonConvert.SerializeObject(CustomOtelExporter.CollectedActivities.OrderBy(x => x.Id))); } @@ -79,11 +79,11 @@ private static void AssertDatabaseAndContainerName(string name, KeyValuePair exceptionsForContainerAttribute = new List { - "Operation.CreateDatabaseAsync", - "Operation.CreateDatabaseIfNotExistsAsync", - "Operation.ReadAsync", - "Operation.DeleteAsync", - "Operation.DeleteStreamAsync" + "CreateDatabaseAsync", + "CreateDatabaseIfNotExistsAsync", + "ReadAsync", + "DeleteAsync", + "DeleteStreamAsync" }; if ((tag.Key == OpenTelemetryAttributeKeys.ContainerName && !exceptionsForContainerAttribute.Contains(name)) || diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs index 5f98a6191a..b0df15c3f2 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs @@ -30,30 +30,19 @@ internal class CustomListener : private ConcurrentBag subscriptions = new(); private ConcurrentBag Scopes { get; } = new(); - public static ConcurrentBag CollectedActivities { private set; get; } = new(); + public static ConcurrentBag CollectedOperationActivities { private set; get; } = new(); + public static ConcurrentBag CollectedNetworkActivities { private set; get; } = new(); private static ConcurrentBag CollectedEvents { set; get; } = new(); - private string SourceType { set; get; } - - // Regex is used to match string 'n' against diagnosticNameSpace string - // which is constructed by combining first two parts of name. - // Eg: Azure.Cosmos.Operation where diagnosticNameSpace is Azure.Cosmos and Operation is the sourceType public CustomListener(string name, string eventName) - : this(n => - { - string[] nameParts = name.Split("."); - string diagnosticNameSpace = $"{nameParts[0]}.{nameParts[1]}"; - return Regex.Match(n, diagnosticNameSpace).Success; - }, name.Split(".")[2], eventName) - + : this(n => Regex.Match(n, name).Success, eventName) { } - public CustomListener(Func filter, string sourceType, string eventName) + public CustomListener(Func filter, string eventName) { this.sourceNameFilter = filter; this.eventName = eventName; - this.SourceType = sourceType; DiagnosticListener.AllListeners.Subscribe(this); } @@ -87,12 +76,7 @@ public void OnNext(KeyValuePair value) string startSuffix = ".Start"; string stopSuffix = ".Stop"; string exceptionSuffix = ".Exception"; - - if(!this.SourceType.Contains("*") && !Activity.Current.OperationName.Contains(this.SourceType)) - { - return; - } - + if (value.Key.EndsWith(startSuffix)) { string name = value.Key[..^startSuffix.Length]; @@ -115,9 +99,16 @@ public void OnNext(KeyValuePair value) { if (producedDiagnosticScope.Activity.Id == Activity.Current.Id) { - AssertActivity.IsValid(producedDiagnosticScope.Activity); - CustomListener.CollectedActivities.Add(producedDiagnosticScope.Activity); - + if (producedDiagnosticScope.Activity.Source.Name.EndsWith("Operation")) + { + AssertActivity.IsValidOperationActivity(producedDiagnosticScope.Activity); + CustomListener.CollectedOperationActivities.Add(producedDiagnosticScope.Activity); + } + else if (producedDiagnosticScope.Activity.Source.Name.EndsWith("Request")) + { + CustomListener.CollectedNetworkActivities.Add(producedDiagnosticScope.Activity); + } + producedDiagnosticScope.IsCompleted = true; return; } @@ -173,13 +164,8 @@ protected override void OnEventSourceCreated(EventSource eventSource) protected override void OnEventWritten(EventWrittenEventArgs eventData) { StringBuilder builder = new StringBuilder(); - builder.Append("") - .Append("").Append(eventData.EventName).Append("") - .Append("Ideally, this should contain request diagnostics but request diagnostics is " + - "subject to change with each request as it contains few unique id. " + - "So just putting this tag with this static text to make sure event is getting generated" + - " for each test.") - .Append(""); + builder.Append($""); + CustomListener.CollectedEvents.Add(builder.ToString()); } @@ -238,6 +224,7 @@ private string GenerateTagForBaselineTest(Activity activity) { List tagsWithStaticValue = new List { + "az.schema_url", "kind", "az.namespace", "db.operation", @@ -249,24 +236,18 @@ private string GenerateTagForBaselineTest(Activity activity) }; StringBuilder builder = new StringBuilder(); - builder.Append("") - .Append("") - .Append(activity.OperationName) - .Append(""); - + builder.Append($""); foreach (KeyValuePair tag in activity.Tags) { - builder - .Append("") - .Append(tag.Key) - .Append(""); - if (tagsWithStaticValue.Contains(tag.Key)) { builder - .Append("") - .Append(tag.Value) - .Append(""); + .Append($"{tag.Value}"); + } + else + { + builder + .Append($"Some Value"); } } @@ -278,15 +259,26 @@ private string GenerateTagForBaselineTest(Activity activity) public List GetRecordedAttributes() { List generatedActivityTagsForBaselineXmls = new(); - List collectedActivities = new List(CustomListener.CollectedActivities); - - collectedActivities.OrderBy(act => act.OperationName); - foreach (Activity activity in collectedActivities) + List collectedOperationActivities = new List(CustomListener.CollectedOperationActivities); + foreach (Activity activity in collectedOperationActivities) { generatedActivityTagsForBaselineXmls.Add(this.GenerateTagForBaselineTest(activity)); } - + + /* List collectedNetworkActivities = new List(CustomListener.CollectedNetworkActivities); + collectedNetworkActivities = collectedNetworkActivities + .OrderBy(act => + act.Source.Name + + act.OperationName + + act.GetTagItem("rntbd.status_code") + + act.GetTagItem("rntbd.sub_status_code")) + .ToList(); + foreach (Activity activity in collectedNetworkActivities) + { + generatedActivityTagsForBaselineXmls.Add(this.GenerateTagForBaselineTest(activity)); + }*/ + List outputList = new List(); if(generatedActivityTagsForBaselineXmls != null && generatedActivityTagsForBaselineXmls.Count > 0) { @@ -304,7 +296,8 @@ public List GetRecordedAttributes() public void ResetAttributes() { CustomListener.CollectedEvents = new(); - CustomListener.CollectedActivities = new(); + CustomListener.CollectedOperationActivities = new(); + CustomListener.CollectedNetworkActivities = new(); } public class ProducedDiagnosticScope diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs index 1f6c335fdd..de819ee021 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs @@ -33,7 +33,7 @@ public override ExportResult Export(in Batch batch) foreach (Activity activity in batch) { - AssertActivity.IsValid(activity); + AssertActivity.IsValidOperationActivity(activity); CollectedActivities.Add(activity); } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/EndToEndTraceWriterBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/EndToEndTraceWriterBaselineTests.cs index ba7e828edf..63d883ef21 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/EndToEndTraceWriterBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/EndToEndTraceWriterBaselineTests.cs @@ -14,6 +14,7 @@ namespace Microsoft.Azure.Cosmos.EmulatorTests.Tracing using System.Threading; using System.Threading.Tasks; using System.Xml; + using System.Xml.Linq; using global::Azure; using Microsoft.Azure.Cosmos.CosmosElements; using Microsoft.Azure.Cosmos.Diagnostics; @@ -1452,10 +1453,12 @@ public override Output ExecuteTest(Input input) StringBuilder oTelActivitiesString = new StringBuilder(); if (input.OTelActivities != null && input.OTelActivities.Count > 0) { + oTelActivitiesString.Append(""); foreach (string attributes in input.OTelActivities) { oTelActivitiesString.AppendLine(attributes); } + oTelActivitiesString.Append(""); } AssertTraceProperites(input.Trace); @@ -1464,9 +1467,23 @@ public override Output ExecuteTest(Input input) Assert.IsTrue(text.Contains("Client Configuration"), $"All diagnostics should have Client Configuration: {text}"); Assert.IsTrue(json.Contains("Client Configuration"), $"All diagnostics should have Client Configuration: {json}"); - return new Output(text, JToken.Parse(json).ToString(Newtonsoft.Json.Formatting.Indented), oTelActivitiesString.ToString()); + return new Output(text, JToken.Parse(json).ToString(Newtonsoft.Json.Formatting.Indented), this.FormatXml(oTelActivitiesString.ToString())); } + private string FormatXml(string xml) + { + try + { + XDocument doc = XDocument.Parse(xml); + return doc.ToString(); + } + catch (Exception) + { + // Handle and throw if fatal exception here; don't just ignore them + return xml; + } + } + private static TraceForBaselineTesting CreateTraceForBaslineTesting(ITrace trace, TraceForBaselineTesting parent) { TraceForBaselineTesting convertedTrace = new TraceForBaselineTesting(trace.Name, trace.Level, trace.Component, parent); @@ -1650,9 +1667,7 @@ public override void SerializeAsXml(XmlWriter xmlWriter) if (!string.IsNullOrWhiteSpace(this.OTelActivities)) { - xmlWriter.WriteStartElement(nameof(this.OTelActivities)); xmlWriter.WriteRaw(this.OTelActivities); - xmlWriter.WriteEndElement(); } } } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs index 59172beb33..366cc68811 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs @@ -548,11 +548,11 @@ internal static CustomListener ConfigureOpenTelemetryAndCustomListeners() // Open Telemetry Listener Util.OTelTracerProvider = Sdk.CreateTracerProviderBuilder() .AddCustomOtelExporter() // use any exporter here - .AddSource($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation") // Right now, it will capture only "Azure.Cosmos.Operation" + .AddSource($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.*") .Build(); // Custom Listener - Util.TestListener = new CustomListener($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", "Azure-Cosmos-Operation-Request-Diagnostics"); + Util.TestListener = new CustomListener($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.*", "Azure-Cosmos-Operation-Request-Diagnostics"); return Util.TestListener; From 7b32e8eb094caf9d9c2e6e905775c025e5d166f1 Mon Sep 17 00:00:00 2001 From: Philip Thomas <86612891+philipthomas-MSFT@users.noreply.github.com> Date: Thu, 18 May 2023 10:47:27 -0400 Subject: [PATCH 10/39] SDK 3.34.0 : Adds version bump and changelog (#3855) * SDK 3.34.0: Adds version bump and changelog * adding changelog changes * added a missing PREVIEW PR * Update changelog.md Co-authored-by: Justine Cocchi * Update changelog.md Co-authored-by: Kiran Kumar Kolli * removed 3840 as it was not committed * change text for 3832 * fix merge issue * add 3724 * Update changelog.md Co-authored-by: Matias Quaranta * Update changelog.md Co-authored-by: Matias Quaranta * including 3845 --------- Co-authored-by: Justine Cocchi Co-authored-by: Kiran Kumar Kolli Co-authored-by: Matias Quaranta --- Directory.Build.props | 4 +- .../contracts/API_3.34.0-preview.txt | 1558 +++++++++++++++++ .../contracts/API_3.34.0.txt | 1499 ++++++++++++++++ changelog.md | 17 + 4 files changed, 3076 insertions(+), 2 deletions(-) create mode 100644 Microsoft.Azure.Cosmos/contracts/API_3.34.0-preview.txt create mode 100644 Microsoft.Azure.Cosmos/contracts/API_3.34.0.txt diff --git a/Directory.Build.props b/Directory.Build.props index a24f0ab2ac..ef1ffd2e01 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 3.33.0 - 3.33.0 + 3.34.0 + 3.34.0 preview 3.30.8 2.0.1 diff --git a/Microsoft.Azure.Cosmos/contracts/API_3.34.0-preview.txt b/Microsoft.Azure.Cosmos/contracts/API_3.34.0-preview.txt new file mode 100644 index 0000000000..4087f63f84 --- /dev/null +++ b/Microsoft.Azure.Cosmos/contracts/API_3.34.0-preview.txt @@ -0,0 +1,1558 @@ +namespace Microsoft.Azure.Cosmos +{ + public class AccountConsistency + { + public AccountConsistency(); + public ConsistencyLevel DefaultConsistencyLevel { get; } + public int MaxStalenessIntervalInSeconds { get; } + public int MaxStalenessPrefix { get; } + } + public class AccountProperties + { + public AccountConsistency Consistency { get; } + public string ETag { get; } + public string Id { get; } + public IEnumerable ReadableRegions { get; } + public IEnumerable WritableRegions { get; } + } + public class AccountRegion + { + public AccountRegion(); + public string Endpoint { get; } + public string Name { get; } + } + public sealed class BoundingBoxProperties + { + public BoundingBoxProperties(); + public double Xmax { get; set; } + public double Xmin { get; set; } + public double Ymax { get; set; } + public double Ymin { get; set; } + } + public abstract class ChangeFeedEstimator + { + protected ChangeFeedEstimator(); + public abstract FeedIterator GetCurrentStateIterator(ChangeFeedEstimatorRequestOptions changeFeedEstimatorRequestOptions=null); + } + public sealed class ChangeFeedEstimatorRequestOptions + { + public ChangeFeedEstimatorRequestOptions(); + public Nullable MaxItemCount { get; set; } + } + public class ChangeFeedItemChange + { + public ChangeFeedItemChange(); + public T Current { get; set; } + public ChangeFeedMetadata Metadata { get; set; } + public T Previous { get; set; } + } + public class ChangeFeedMetadata + { + public ChangeFeedMetadata(DateTime conflictResolutionTimestamp, long lsn, ChangeFeedOperationType operationType, long previousLsn); + public DateTime ConflictResolutionTimestamp { get; } + public bool IsTimeToLiveExpired { get; } + public long Lsn { get; } + public ChangeFeedOperationType OperationType { get; } + public long PreviousLsn { get; } + } + public abstract class ChangeFeedMode + { + public static ChangeFeedMode AllVersionsAndDeletes { get; } + public static ChangeFeedMode Incremental { get; } + public static ChangeFeedMode LatestVersion { get; } + } + public enum ChangeFeedOperationType + { + Create = 0, + Delete = 2, + Replace = 1, + } + public sealed class ChangeFeedPolicy + { + public ChangeFeedPolicy(); + public static TimeSpan FullFidelityNoRetention { get; } + public TimeSpan FullFidelityRetention { get; set; } + } + public abstract class ChangeFeedProcessor + { + protected ChangeFeedProcessor(); + public abstract Task StartAsync(); + public abstract Task StopAsync(); + } + public class ChangeFeedProcessorBuilder + { + public ChangeFeedProcessor Build(); + public ChangeFeedProcessorBuilder WithErrorNotification(Container.ChangeFeedMonitorErrorDelegate errorDelegate); + public ChangeFeedProcessorBuilder WithInstanceName(string instanceName); + public ChangeFeedProcessorBuilder WithLeaseAcquireNotification(Container.ChangeFeedMonitorLeaseAcquireDelegate acquireDelegate); + public ChangeFeedProcessorBuilder WithLeaseConfiguration(Nullable acquireInterval=default(Nullable), Nullable expirationInterval=default(Nullable), Nullable renewInterval=default(Nullable)); + public ChangeFeedProcessorBuilder WithLeaseContainer(Container leaseContainer); + public ChangeFeedProcessorBuilder WithLeaseReleaseNotification(Container.ChangeFeedMonitorLeaseReleaseDelegate releaseDelegate); + public ChangeFeedProcessorBuilder WithMaxItems(int maxItemCount); + public ChangeFeedProcessorBuilder WithPollInterval(TimeSpan pollInterval); + public ChangeFeedProcessorBuilder WithStartTime(DateTime startTime); + } + public abstract class ChangeFeedProcessorContext + { + protected ChangeFeedProcessorContext(); + public abstract CosmosDiagnostics Diagnostics { get; } + public abstract Headers Headers { get; } + public abstract string LeaseToken { get; } + } + public sealed class ChangeFeedProcessorState + { + public ChangeFeedProcessorState(string leaseToken, long estimatedLag, string instanceName); + public long EstimatedLag { get; } + public string InstanceName { get; } + public string LeaseToken { get; } + } + public class ChangeFeedProcessorUserException : Exception + { + public ChangeFeedProcessorUserException(Exception originalException, ChangeFeedProcessorContext context); + protected ChangeFeedProcessorUserException(SerializationInfo info, StreamingContext context); + public ChangeFeedProcessorContext ChangeFeedProcessorContext { get; } + public override void GetObjectData(SerializationInfo info, StreamingContext context); + } + public sealed class ChangeFeedRequestOptions : RequestOptions + { + public ChangeFeedRequestOptions(); + public new string IfMatchEtag { get; set; } + public new string IfNoneMatchEtag { get; set; } + public Nullable PageSizeHint { get; set; } + } + public abstract class ChangeFeedStartFrom + { + public static ChangeFeedStartFrom Beginning(); + public static ChangeFeedStartFrom Beginning(FeedRange feedRange); + public static ChangeFeedStartFrom ContinuationToken(string continuationToken); + public static ChangeFeedStartFrom Now(); + public static ChangeFeedStartFrom Now(FeedRange feedRange); + public static ChangeFeedStartFrom Time(DateTime dateTimeUtc); + public static ChangeFeedStartFrom Time(DateTime dateTimeUtc, FeedRange feedRange); + } + public sealed class ClientEncryptionIncludedPath + { + public ClientEncryptionIncludedPath(); + public string ClientEncryptionKeyId { get; set; } + public string EncryptionAlgorithm { get; set; } + public string EncryptionType { get; set; } + public string Path { get; set; } + } + public abstract class ClientEncryptionKey + { + protected ClientEncryptionKey(); + public abstract string Id { get; } + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(ClientEncryptionKeyProperties clientEncryptionKeyProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class ClientEncryptionKeyProperties : IEquatable + { + protected ClientEncryptionKeyProperties(); + public ClientEncryptionKeyProperties(string id, string encryptionAlgorithm, byte[] wrappedDataEncryptionKey, EncryptionKeyWrapMetadata encryptionKeyWrapMetadata); + public Nullable CreatedTime { get; } + public string EncryptionAlgorithm { get; } + public EncryptionKeyWrapMetadata EncryptionKeyWrapMetadata { get; } + public string ETag { get; } + public string Id { get; } + public Nullable LastModified { get; } + public virtual string SelfLink { get; } + public byte[] WrappedDataEncryptionKey { get; } + public bool Equals(ClientEncryptionKeyProperties other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public class ClientEncryptionKeyResponse : Response + { + protected ClientEncryptionKeyResponse(); + public override string ActivityId { get; } + public virtual ClientEncryptionKey ClientEncryptionKey { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override ClientEncryptionKeyProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator ClientEncryptionKey (ClientEncryptionKeyResponse response); + } + public sealed class ClientEncryptionPolicy + { + public ClientEncryptionPolicy(IEnumerable includedPaths); + public ClientEncryptionPolicy(IEnumerable includedPaths, int policyFormatVersion); + public IEnumerable IncludedPaths { get; } + public int PolicyFormatVersion { get; } + } + public sealed class CompositePath + { + public CompositePath(); + public CompositePathSortOrder Order { get; set; } + public string Path { get; set; } + } + public enum CompositePathSortOrder + { + Ascending = 0, + Descending = 1, + } + public sealed class ComputedProperty + { + public ComputedProperty(); + public string Name { get; set; } + public string Query { get; set; } + } + public class ConflictProperties + { + public ConflictProperties(); + public string Id { get; } + public OperationKind OperationKind { get; } + public string SelfLink { get; } + } + public enum ConflictResolutionMode + { + Custom = 1, + LastWriterWins = 0, + } + public class ConflictResolutionPolicy + { + public ConflictResolutionPolicy(); + public ConflictResolutionMode Mode { get; set; } + public string ResolutionPath { get; set; } + public string ResolutionProcedure { get; set; } + } + public abstract class Conflicts + { + protected Conflicts(); + public abstract Task DeleteAsync(ConflictProperties conflict, PartitionKey partitionKey, CancellationToken cancellationToken=default(CancellationToken)); + public abstract FeedIterator GetConflictQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract T ReadConflictContent(ConflictProperties conflict); + public abstract Task> ReadCurrentAsync(ConflictProperties conflict, PartitionKey partitionKey, CancellationToken cancellationToken=default(CancellationToken)); + } + public enum ConnectionMode + { + Direct = 1, + Gateway = 0, + } + public enum ConsistencyLevel + { + BoundedStaleness = 1, + ConsistentPrefix = 4, + Eventual = 3, + Session = 2, + Strong = 0, + } + public abstract class Container + { + protected Container(); + public abstract Conflicts Conflicts { get; } + public abstract Database Database { get; } + public abstract string Id { get; } + public abstract Scripts Scripts { get; } + public abstract Task> CreateItemAsync(T item, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateItemStreamAsync(Stream streamPayload, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract TransactionalBatch CreateTransactionalBatch(PartitionKey partitionKey); + public abstract Task DeleteAllItemsByPartitionKeyStreamAsync(PartitionKey partitionKey, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteContainerAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteContainerStreamAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> DeleteItemAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteItemStreamAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ChangeFeedEstimator GetChangeFeedEstimator(string processorName, Container leaseContainer); + public abstract ChangeFeedProcessorBuilder GetChangeFeedEstimatorBuilder(string processorName, Container.ChangesEstimationHandler estimationDelegate, Nullable estimationPeriod=default(Nullable)); + public abstract FeedIterator GetChangeFeedIterator(ChangeFeedStartFrom changeFeedStartFrom, ChangeFeedMode changeFeedMode, ChangeFeedRequestOptions changeFeedRequestOptions=null); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangeFeedStreamHandler onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilderWithManualCheckpoint(string processorName, Container.ChangeFeedStreamHandlerWithManualCheckpoint onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilderWithManualCheckpoint(string processorName, Container.ChangeFeedHandlerWithManualCheckpoint onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangeFeedHandler onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangesHandler onChangesDelegate); + public abstract FeedIterator GetChangeFeedStreamIterator(ChangeFeedStartFrom changeFeedStartFrom, ChangeFeedMode changeFeedMode, ChangeFeedRequestOptions changeFeedRequestOptions=null); + public abstract Task> GetFeedRangesAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract IOrderedQueryable GetItemLinqQueryable(bool allowSynchronousQueryExecution=false, string continuationToken=null, QueryRequestOptions requestOptions=null, CosmosLinqSerializerOptions linqSerializerOptions=null); + public abstract FeedIterator GetItemQueryIterator(FeedRange feedRange, QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(FeedRange feedRange, QueryDefinition queryDefinition, string continuationToken, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task> GetPartitionKeyRangesAsync(FeedRange feedRange, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> PatchItemAsync(string id, PartitionKey partitionKey, IReadOnlyList patchOperations, PatchItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task PatchItemStreamAsync(string id, PartitionKey partitionKey, IReadOnlyList patchOperations, PatchItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadContainerAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadContainerStreamAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadItemAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadItemStreamAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadManyItemsAsync(IReadOnlyList> items, ReadManyRequestOptions readManyRequestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadManyItemsStreamAsync(IReadOnlyList> items, ReadManyRequestOptions readManyRequestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadThroughputAsync(RequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadThroughputAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceContainerAsync(ContainerProperties containerProperties, ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceContainerStreamAsync(ContainerProperties containerProperties, ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReplaceItemAsync(T item, string id, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceItemStreamAsync(Stream streamPayload, string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(int throughput, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> UpsertItemAsync(T item, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertItemStreamAsync(Stream streamPayload, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public delegate Task ChangeFeedHandlerWithManualCheckpoint(ChangeFeedProcessorContext context, IReadOnlyCollection changes, Func checkpointAsync, CancellationToken cancellationToken); + public delegate Task ChangeFeedHandler(ChangeFeedProcessorContext context, IReadOnlyCollection changes, CancellationToken cancellationToken); + public delegate Task ChangeFeedMonitorErrorDelegate(string leaseToken, Exception exception); + public delegate Task ChangeFeedMonitorLeaseAcquireDelegate(string leaseToken); + public delegate Task ChangeFeedMonitorLeaseReleaseDelegate(string leaseToken); + public delegate Task ChangeFeedStreamHandler(ChangeFeedProcessorContext context, Stream changes, CancellationToken cancellationToken); + public delegate Task ChangeFeedStreamHandlerWithManualCheckpoint(ChangeFeedProcessorContext context, Stream changes, Func checkpointAsync, CancellationToken cancellationToken); + public delegate Task ChangesEstimationHandler(long estimatedPendingChanges, CancellationToken cancellationToken); + public delegate Task ChangesHandler(IReadOnlyCollection changes, CancellationToken cancellationToken); + } + public class ContainerProperties + { + public ContainerProperties(); + public ContainerProperties(string id, IReadOnlyList partitionKeyPaths); + public ContainerProperties(string id, string partitionKeyPath); + public Nullable AnalyticalStoreTimeToLiveInSeconds { get; set; } + public ChangeFeedPolicy ChangeFeedPolicy { get; set; } + public ClientEncryptionPolicy ClientEncryptionPolicy { get; set; } + public Collection ComputedProperties { get; set; } + public ConflictResolutionPolicy ConflictResolutionPolicy { get; set; } + public Nullable DefaultTimeToLive { get; set; } + public string ETag { get; } + public GeospatialConfig GeospatialConfig { get; set; } + public string Id { get; set; } + public IndexingPolicy IndexingPolicy { get; set; } + public Nullable LastModified { get; } + public Nullable PartitionKeyDefinitionVersion { get; set; } + public string PartitionKeyPath { get; set; } + public IReadOnlyList PartitionKeyPaths { get; set; } + public string SelfLink { get; } + public string TimeToLivePropertyPath { get; set; } + public UniqueKeyPolicy UniqueKeyPolicy { get; set; } + } + public class ContainerRequestOptions : RequestOptions + { + public ContainerRequestOptions(); + public bool PopulateQuotaInfo { get; set; } + } + public class ContainerResponse : Response + { + protected ContainerResponse(); + public override string ActivityId { get; } + public virtual Container Container { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override ContainerProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Container (ContainerResponse response); + } + public class CosmosClient : IDisposable + { + protected CosmosClient(); + public CosmosClient(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, CosmosClientOptions clientOptions=null); + public CosmosClient(string accountEndpoint, TokenCredential tokenCredential, CosmosClientOptions clientOptions=null); + public CosmosClient(string connectionString, CosmosClientOptions clientOptions=null); + public CosmosClient(string accountEndpoint, string authKeyOrResourceToken, CosmosClientOptions clientOptions=null); + public virtual CosmosClientOptions ClientOptions { get; } + public virtual Uri Endpoint { get; } + public virtual CosmosResponseFactory ResponseFactory { get; } + public static Task CreateAndInitializeAsync(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string accountEndpoint, TokenCredential tokenCredential, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string connectionString, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string accountEndpoint, string authKeyOrResourceToken, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseAsync(string id, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseAsync(string id, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseIfNotExistsAsync(string id, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseIfNotExistsAsync(string id, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseStreamAsync(DatabaseProperties databaseProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual Container GetContainer(string databaseId, string containerId); + public virtual Database GetDatabase(string id); + public virtual FeedIterator GetDatabaseQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual Task ReadAccountAsync(); + } + public class CosmosClientOptions + { + public CosmosClientOptions(); + public bool AllowBulkExecution { get; set; } + public string ApplicationName { get; set; } + public IReadOnlyList ApplicationPreferredRegions { get; set; } + public string ApplicationRegion { get; set; } + public ConnectionMode ConnectionMode { get; set; } + public Nullable ConsistencyLevel { get; set; } + public Collection CustomHandlers { get; } + public Nullable EnableContentResponseOnWrite { get; set; } + public bool EnableTcpConnectionEndpointRediscovery { get; set; } + public int GatewayModeMaxConnectionLimit { get; set; } + public Func HttpClientFactory { get; set; } + public Nullable IdleTcpConnectionTimeout { get; set; } + public bool IsDistributedTracingEnabled { get; set; } + public bool LimitToEndpoint { get; set; } + public Nullable MaxRequestsPerTcpConnection { get; set; } + public Nullable MaxRetryAttemptsOnRateLimitedRequests { get; set; } + public Nullable MaxRetryWaitTimeOnRateLimitedRequests { get; set; } + public Nullable MaxTcpConnectionsPerEndpoint { get; set; } + public Nullable OpenTcpConnectionTimeout { get; set; } + public Nullable PortReuseMode { get; set; } + public TimeSpan RequestTimeout { get; set; } + public CosmosSerializer Serializer { get; set; } + public CosmosSerializationOptions SerializerOptions { get; set; } + public Func ServerCertificateCustomValidationCallback { get; set; } + public Nullable TokenCredentialBackgroundRefreshInterval { get; set; } + public IWebProxy WebProxy { get; set; } + } + public abstract class CosmosDiagnostics + { + protected CosmosDiagnostics(); + public virtual TimeSpan GetClientElapsedTime(); + public abstract IReadOnlyList> GetContactedRegions(); + public virtual int GetFailedRequestCount(); + public virtual Nullable GetStartTimeUtc(); + public abstract override string ToString(); + } + public class CosmosException : Exception + { + public CosmosException(string message, HttpStatusCode statusCode, int subStatusCode, string activityId, double requestCharge); + public virtual string ActivityId { get; } + public virtual CosmosDiagnostics Diagnostics { get; } + public virtual Headers Headers { get; } + public override string Message { get; } + public virtual double RequestCharge { get; } + public virtual string ResponseBody { get; } + public virtual Nullable RetryAfter { get; } + public override string StackTrace { get; } + public virtual HttpStatusCode StatusCode { get; } + public virtual int SubStatusCode { get; } + public override string ToString(); + public virtual bool TryGetHeader(string headerName, out string value); + } + public sealed class CosmosLinqSerializerOptions + { + public CosmosLinqSerializerOptions(); + public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } + } + public class CosmosOperationCanceledException : OperationCanceledException + { + public CosmosOperationCanceledException(OperationCanceledException originalException, CosmosDiagnostics diagnostics); + protected CosmosOperationCanceledException(SerializationInfo info, StreamingContext context); + public override IDictionary Data { get; } + public CosmosDiagnostics Diagnostics { get; } + public override string HelpLink { get; set; } + public override string Message { get; } + public override string Source { get; set; } + public override string StackTrace { get; } + public override Exception GetBaseException(); + public override void GetObjectData(SerializationInfo info, StreamingContext context); + public override string ToString(); + } + public enum CosmosPropertyNamingPolicy + { + CamelCase = 1, + Default = 0, + } + public abstract class CosmosResponseFactory + { + protected CosmosResponseFactory(); + public abstract FeedResponse CreateItemFeedResponse(ResponseMessage responseMessage); + public abstract ItemResponse CreateItemResponse(ResponseMessage responseMessage); + public abstract StoredProcedureExecuteResponse CreateStoredProcedureExecuteResponse(ResponseMessage responseMessage); + } + public sealed class CosmosSerializationOptions + { + public CosmosSerializationOptions(); + public bool IgnoreNullValues { get; set; } + public bool Indented { get; set; } + public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } + } + public abstract class CosmosSerializer + { + protected CosmosSerializer(); + public abstract T FromStream(Stream stream); + public abstract Stream ToStream(T input); + } + public abstract class Database + { + protected Database(); + public abstract CosmosClient Client { get; } + public abstract string Id { get; } + public abstract Task CreateClientEncryptionKeyAsync(ClientEncryptionKeyProperties clientEncryptionKeyProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(string id, string partitionKeyPath, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(string id, string partitionKeyPath, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerStreamAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerStreamAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateUserAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ContainerBuilder DefineContainer(string name, string partitionKeyPath); + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteStreamAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ClientEncryptionKey GetClientEncryptionKey(string id); + public abstract FeedIterator GetClientEncryptionKeyQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Container GetContainer(string id); + public abstract FeedIterator GetContainerQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract User GetUser(string id); + public abstract FeedIterator GetUserQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadStreamAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadThroughputAsync(RequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadThroughputAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(int throughput, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertUserAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class DatabaseProperties + { + public DatabaseProperties(); + public DatabaseProperties(string id); + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class DatabaseResponse : Response + { + protected DatabaseResponse(); + public override string ActivityId { get; } + public virtual Database Database { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override DatabaseProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Database (DatabaseResponse response); + } + public enum DataType + { + LineString = 3, + MultiPolygon = 5, + Number = 0, + Point = 2, + Polygon = 4, + String = 1, + } + public class DedicatedGatewayRequestOptions + { + public DedicatedGatewayRequestOptions(); + public Nullable MaxIntegratedCacheStaleness { get; set; } + } + public class EncryptionKeyWrapMetadata : IEquatable + { + public EncryptionKeyWrapMetadata(EncryptionKeyWrapMetadata source); + public EncryptionKeyWrapMetadata(string type, string name, string value, string algorithm); + public string Algorithm { get; } + public string Name { get; } + public string Type { get; } + public string Value { get; } + public bool Equals(EncryptionKeyWrapMetadata other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class ExcludedPath + { + public ExcludedPath(); + public string Path { get; set; } + } + public abstract class FeedIterator : IDisposable + { + protected FeedIterator(); + public abstract bool HasMoreResults { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public abstract Task ReadNextAsync(CancellationToken cancellationToken=default(CancellationToken)); + } + public abstract class FeedIterator : IDisposable + { + protected FeedIterator(); + public abstract bool HasMoreResults { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public abstract Task> ReadNextAsync(CancellationToken cancellationToken=default(CancellationToken)); + } + public abstract class FeedRange + { + protected FeedRange(); + public static FeedRange FromJsonString(string toStringValue); + public static FeedRange FromPartitionKey(PartitionKey partitionKey); + public abstract string ToJsonString(); + } + public abstract class FeedResponse : IEnumerable, IEnumerable + { + protected FeedResponse(); + public override string ActivityId { get; } + public abstract string ContinuationToken { get; } + public abstract int Count { get; } + public override string ETag { get; } + public abstract string IndexMetrics { get; } + public override double RequestCharge { get; } + public abstract IEnumerator GetEnumerator(); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + } + public sealed class GeospatialConfig + { + public GeospatialConfig(); + public GeospatialConfig(GeospatialType geospatialType); + public GeospatialType GeospatialType { get; set; } + } + public enum GeospatialType + { + Geography = 0, + Geometry = 1, + } + public class Headers : IEnumerable + { + public Headers(); + public virtual string ActivityId { get; } + public virtual string ContentLength { get; set; } + public virtual string ContentType { get; } + public virtual string ContinuationToken { get; } + public virtual string ETag { get; } + public virtual string this[string headerName] { get; set; } + public virtual string Location { get; } + public virtual double RequestCharge { get; } + public virtual string Session { get; } + public virtual void Add(string headerName, IEnumerable values); + public virtual void Add(string headerName, string value); + public virtual string[] AllKeys(); + public virtual string Get(string headerName); + public virtual IEnumerator GetEnumerator(); + public virtual T GetHeaderValue(string headerName); + public virtual string GetValueOrDefault(string headerName); + public virtual void Remove(string headerName); + public virtual void Set(string headerName, string value); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + public virtual bool TryGetValue(string headerName, out string value); + } + public sealed class IncludedPath + { + public IncludedPath(); + public string Path { get; set; } + } + public enum IndexingDirective + { + Default = 0, + Exclude = 2, + Include = 1, + } + public enum IndexingMode + { + Consistent = 0, + Lazy = 1, + None = 2, + } + public sealed class IndexingPolicy + { + public IndexingPolicy(); + public bool Automatic { get; set; } + public Collection> CompositeIndexes { get; } + public Collection ExcludedPaths { get; } + public Collection IncludedPaths { get; } + public IndexingMode IndexingMode { get; set; } + public Collection SpatialIndexes { get; } + } + public enum IndexKind + { + Hash = 0, + Range = 1, + Spatial = 2, + } + public class ItemRequestOptions : RequestOptions + { + public ItemRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions { get; set; } + public Nullable EnableContentResponseOnWrite { get; set; } + public Nullable IndexingDirective { get; set; } + public IEnumerable PostTriggers { get; set; } + public IEnumerable PreTriggers { get; set; } + public string SessionToken { get; set; } + } + public class ItemResponse : Response + { + protected ItemResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override T Resource { get; } + public override HttpStatusCode StatusCode { get; } + } + public enum OperationKind + { + Create = 1, + Delete = 3, + Invalid = 0, + Read = 4, + Replace = 2, + } + public struct PartitionKey : IEquatable + { + public static readonly PartitionKey None; + public static readonly PartitionKey Null; + public static readonly string SystemKeyName; + public static readonly string SystemKeyPath; + public PartitionKey(bool partitionKeyValue); + public PartitionKey(double partitionKeyValue); + public PartitionKey(string partitionKeyValue); + public bool Equals(PartitionKey other); + public override bool Equals(object obj); + public override int GetHashCode(); + public static bool operator ==(PartitionKey left, PartitionKey right); + public static bool operator !=(PartitionKey left, PartitionKey right); + public override string ToString(); + } + public sealed class PartitionKeyBuilder + { + public PartitionKeyBuilder(); + public PartitionKeyBuilder Add(bool val); + public PartitionKeyBuilder Add(double val); + public PartitionKeyBuilder Add(string val); + public PartitionKeyBuilder AddNoneType(); + public PartitionKeyBuilder AddNullValue(); + public PartitionKey Build(); + } + public enum PartitionKeyDefinitionVersion + { + V1 = 1, + V2 = 2, + } + public sealed class PatchItemRequestOptions : ItemRequestOptions + { + public PatchItemRequestOptions(); + public string FilterPredicate { get; set; } + } + public abstract class PatchOperation + { + protected PatchOperation(); + public virtual string From { get; set; } + public abstract PatchOperationType OperationType { get; } + public abstract string Path { get; } + public static PatchOperation Add(string path, T value); + public static PatchOperation Increment(string path, double value); + public static PatchOperation Increment(string path, long value); + public static PatchOperation Move(string from, string path); + public static PatchOperation Remove(string path); + public static PatchOperation Replace(string path, T value); + public static PatchOperation Set(string path, T value); + public virtual bool TrySerializeValueParameter(CosmosSerializer cosmosSerializer, out Stream valueParam); + } + public enum PatchOperationType + { + Add = 0, + Increment = 4, + Move = 5, + Remove = 1, + Replace = 2, + Set = 3, + } + public abstract class PatchOperation : PatchOperation + { + protected PatchOperation(); + public abstract T Value { get; } + } + public abstract class Permission + { + protected Permission(); + public abstract string Id { get; } + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadAsync(Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public enum PermissionMode : byte + { + All = (byte)2, + Read = (byte)1, + } + public class PermissionProperties + { + public PermissionProperties(string id, PermissionMode permissionMode, Container container, PartitionKey resourcePartitionKey, string itemId); + public PermissionProperties(string id, PermissionMode permissionMode, Container container, Nullable resourcePartitionKey=default(Nullable)); + public string ETag { get; } + public string Id { get; } + public Nullable LastModified { get; } + public PermissionMode PermissionMode { get; } + public Nullable ResourcePartitionKey { get; set; } + public string ResourceUri { get; } + public string SelfLink { get; } + public string Token { get; } + } + public class PermissionResponse : Response + { + protected PermissionResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public virtual Permission Permission { get; } + public override double RequestCharge { get; } + public override PermissionProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Permission (PermissionResponse response); + } + public enum PortReuseMode + { + PrivatePortPool = 1, + ReuseUnicastPort = 0, + } + public enum PriorityLevel + { + High = 1, + Low = 2, + } + public class QueryDefinition + { + public QueryDefinition(string query); + public string QueryText { get; } + public IReadOnlyList> GetQueryParameters(); + public QueryDefinition WithParameter(string name, object value); + public QueryDefinition WithParameterStream(string name, Stream valueStream); + } + public class QueryRequestOptions : RequestOptions + { + public QueryRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions { get; set; } + public Nullable EnableLowPrecisionOrderBy { get; set; } + public Nullable EnableScanInQuery { get; set; } + public Nullable MaxBufferedItemCount { get; set; } + public Nullable MaxConcurrency { get; set; } + public Nullable MaxItemCount { get; set; } + public Nullable PartitionKey { get; set; } + public Nullable PopulateIndexMetrics { get; set; } + public Nullable ResponseContinuationTokenLimitInKb { get; set; } + public string SessionToken { get; set; } + } + public class ReadManyRequestOptions : RequestOptions + { + public ReadManyRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public string SessionToken { get; set; } + } + public static class Regions + { + public const string AustraliaCentral = "Australia Central"; + public const string AustraliaCentral2 = "Australia Central 2"; + public const string AustraliaEast = "Australia East"; + public const string AustraliaSoutheast = "Australia Southeast"; + public const string BrazilSouth = "Brazil South"; + public const string BrazilSoutheast = "Brazil Southeast"; + public const string CanadaCentral = "Canada Central"; + public const string CanadaEast = "Canada East"; + public const string CentralIndia = "Central India"; + public const string CentralUS = "Central US"; + public const string CentralUSEUAP = "Central US EUAP"; + public const string ChinaEast = "China East"; + public const string ChinaEast2 = "China East 2"; + public const string ChinaEast3 = "China East 3"; + public const string ChinaNorth = "China North"; + public const string ChinaNorth2 = "China North 2"; + public const string ChinaNorth3 = "China North 3"; + public const string EastAsia = "East Asia"; + public const string EastUS = "East US"; + public const string EastUS2 = "East US 2"; + public const string EastUS2EUAP = "East US 2 EUAP"; + public const string EastUSSLV = "East US SLV"; + public const string FranceCentral = "France Central"; + public const string FranceSouth = "France South"; + public const string GermanyCentral = "Germany Central"; + public const string GermanyNorth = "Germany North"; + public const string GermanyNortheast = "Germany Northeast"; + public const string GermanyWestCentral = "Germany West Central"; + public const string JapanEast = "Japan East"; + public const string JapanWest = "Japan West"; + public const string JioIndiaCentral = "Jio India Central"; + public const string JioIndiaWest = "Jio India West"; + public const string KoreaCentral = "Korea Central"; + public const string KoreaSouth = "Korea South"; + public const string NorthCentralUS = "North Central US"; + public const string NorthEurope = "North Europe"; + public const string NorwayEast = "Norway East"; + public const string NorwayWest = "Norway West"; + public const string PolandCentral = "Poland Central"; + public const string QatarCentral = "Qatar Central"; + public const string SouthAfricaNorth = "South Africa North"; + public const string SouthAfricaWest = "South Africa West"; + public const string SouthCentralUS = "South Central US"; + public const string SoutheastAsia = "Southeast Asia"; + public const string SouthIndia = "South India"; + public const string SwedenCentral = "Sweden Central"; + public const string SwedenSouth = "Sweden South"; + public const string SwitzerlandNorth = "Switzerland North"; + public const string SwitzerlandWest = "Switzerland West"; + public const string UAECentral = "UAE Central"; + public const string UAENorth = "UAE North"; + public const string UKSouth = "UK South"; + public const string UKWest = "UK West"; + public const string USDoDCentral = "USDoD Central"; + public const string USDoDEast = "USDoD East"; + public const string USGovArizona = "USGov Arizona"; + public const string USGovTexas = "USGov Texas"; + public const string USGovVirginia = "USGov Virginia"; + public const string USNatEast = "USNat East"; + public const string USNatWest = "USNat West"; + public const string USSecEast = "USSec East"; + public const string USSecWest = "USSec West"; + public const string WestCentralUS = "West Central US"; + public const string WestEurope = "West Europe"; + public const string WestIndia = "West India"; + public const string WestUS = "West US"; + public const string WestUS2 = "West US 2"; + public const string WestUS3 = "West US 3"; + } + public abstract class RequestHandler + { + protected RequestHandler(); + public RequestHandler InnerHandler { get; set; } + public virtual Task SendAsync(RequestMessage request, CancellationToken cancellationToken); + } + public class RequestMessage : IDisposable + { + public RequestMessage(); + public RequestMessage(HttpMethod method, Uri requestUri); + public virtual Stream Content { get; set; } + public virtual Headers Headers { get; } + public virtual HttpMethod Method { get; } + public virtual Dictionary Properties { get; } + public virtual Uri RequestUri { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + } + public class RequestOptions + { + public RequestOptions(); + public Action AddRequestHeaders { get; set; } + public string IfMatchEtag { get; set; } + public string IfNoneMatchEtag { get; set; } + public Nullable PriorityLevel { get; set; } + public IReadOnlyDictionary Properties { get; set; } + public RequestOptions ShallowCopy(); + } + public class ResponseMessage : IDisposable + { + public ResponseMessage(); + public ResponseMessage(HttpStatusCode statusCode, RequestMessage requestMessage=null, string errorMessage=null); + public virtual Stream Content { get; set; } + public virtual string ContinuationToken { get; } + public virtual CosmosDiagnostics Diagnostics { get; set; } + public virtual string ErrorMessage { get; } + public virtual Headers Headers { get; } + public string IndexMetrics { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual RequestMessage RequestMessage { get; } + public virtual HttpStatusCode StatusCode { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual ResponseMessage EnsureSuccessStatusCode(); + } + public abstract class Response + { + protected Response(); + public abstract string ActivityId { get; } + public abstract CosmosDiagnostics Diagnostics { get; } + public abstract string ETag { get; } + public abstract Headers Headers { get; } + public abstract double RequestCharge { get; } + public abstract T Resource { get; } + public abstract HttpStatusCode StatusCode { get; } + public static implicit operator T (Response response); + } + public sealed class SpatialPath + { + public SpatialPath(); + public BoundingBoxProperties BoundingBox { get; set; } + public string Path { get; set; } + public Collection SpatialTypes { get; } + } + public enum SpatialType + { + LineString = 1, + MultiPolygon = 3, + Point = 0, + Polygon = 2, + } + public class ThroughputProperties + { + public Nullable AutoscaleMaxThroughput { get; } + public string ETag { get; } + public Nullable LastModified { get; } + public string SelfLink { get; } + public Nullable Throughput { get; } + public static ThroughputProperties CreateAutoscaleThroughput(int autoscaleMaxThroughput); + public static ThroughputProperties CreateManualThroughput(int throughput); + } + public class ThroughputResponse : Response + { + protected ThroughputResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public Nullable IsReplacePending { get; } + public Nullable MinThroughput { get; } + public override double RequestCharge { get; } + public override ThroughputProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator ThroughputProperties (ThroughputResponse response); + } + public abstract class TransactionalBatch + { + protected TransactionalBatch(); + public abstract TransactionalBatch CreateItemStream(Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch CreateItem(T item, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch DeleteItem(string id, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract Task ExecuteAsync(TransactionalBatchRequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract TransactionalBatch PatchItem(string id, IReadOnlyList patchOperations, TransactionalBatchPatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReadItem(string id, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReplaceItemStream(string id, Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReplaceItem(string id, T item, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch UpsertItemStream(Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch UpsertItem(T item, TransactionalBatchItemRequestOptions requestOptions=null); + } + public class TransactionalBatchItemRequestOptions : RequestOptions + { + public TransactionalBatchItemRequestOptions(); + public Nullable EnableContentResponseOnWrite { get; set; } + public Nullable IndexingDirective { get; set; } + } + public class TransactionalBatchOperationResult + { + protected TransactionalBatchOperationResult(); + public virtual string ETag { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual Stream ResourceStream { get; } + public virtual TimeSpan RetryAfter { get; } + public virtual HttpStatusCode StatusCode { get; } + } + public class TransactionalBatchOperationResult : TransactionalBatchOperationResult + { + protected TransactionalBatchOperationResult(); + public virtual T Resource { get; set; } + } + public class TransactionalBatchPatchItemRequestOptions : TransactionalBatchItemRequestOptions + { + public TransactionalBatchPatchItemRequestOptions(); + public string FilterPredicate { get; set; } + } + public class TransactionalBatchRequestOptions : RequestOptions + { + public TransactionalBatchRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public string SessionToken { get; set; } + } + public class TransactionalBatchResponse : IDisposable, IEnumerable, IEnumerable, IReadOnlyCollection, IReadOnlyList + { + protected TransactionalBatchResponse(); + public virtual string ActivityId { get; } + public virtual int Count { get; } + public virtual CosmosDiagnostics Diagnostics { get; } + public virtual string ErrorMessage { get; } + public virtual Headers Headers { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual TransactionalBatchOperationResult this[int index] { get; } + public virtual double RequestCharge { get; } + public virtual Nullable RetryAfter { get; } + public virtual HttpStatusCode StatusCode { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual IEnumerator GetEnumerator(); + public virtual TransactionalBatchOperationResult GetOperationResultAtIndex(int index); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + } + public class UniqueKey + { + public UniqueKey(); + public Collection Paths { get; } + } + public sealed class UniqueKeyPolicy + { + public UniqueKeyPolicy(); + public Collection UniqueKeys { get; } + } + public abstract class User + { + protected User(); + public abstract string Id { get; } + public abstract Task CreatePermissionAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Permission GetPermission(string id); + public abstract FeedIterator GetPermissionQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetPermissionQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(UserProperties userProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertPermissionAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class UserProperties + { + protected UserProperties(); + public UserProperties(string id); + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class UserResponse : Response + { + protected UserResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override UserProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public virtual User User { get; } + public static implicit operator User (UserResponse response); + } +} +namespace Microsoft.Azure.Cosmos.Fluent +{ + public class ChangeFeedPolicyDefinition + { + public ContainerBuilder Attach(); + } + public sealed class ClientEncryptionPolicyDefinition + { + public ContainerBuilder Attach(); + public ClientEncryptionPolicyDefinition WithIncludedPath(ClientEncryptionIncludedPath path); + } + public class CompositeIndexDefinition + { + public T Attach(); + public CompositeIndexDefinition Path(string path); + public CompositeIndexDefinition Path(string path, CompositePathSortOrder sortOrder); + } + public class ComputedPropertiesDefinition + { + public T Attach(); + public ComputedPropertiesDefinition WithComputedProperty(string name, string query); + } + public class ConflictResolutionDefinition + { + public ContainerBuilder Attach(); + public ConflictResolutionDefinition WithCustomStoredProcedureResolution(string conflictResolutionProcedure); + public ConflictResolutionDefinition WithLastWriterWinsResolution(string conflictResolutionPath); + } + public class ContainerBuilder : ContainerDefinition + { + protected ContainerBuilder(); + public ContainerBuilder(Database database, string name, string partitionKeyPath); + public new ContainerProperties Build(); + public Task CreateAsync(ThroughputProperties throughputProperties, CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateAsync(Nullable throughput=default(Nullable), CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateIfNotExistsAsync(ThroughputProperties throughputProperties, CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateIfNotExistsAsync(Nullable throughput=default(Nullable), CancellationToken cancellationToken=default(CancellationToken)); + public ChangeFeedPolicyDefinition WithChangeFeedPolicy(TimeSpan retention); + public ClientEncryptionPolicyDefinition WithClientEncryptionPolicy(); + public ClientEncryptionPolicyDefinition WithClientEncryptionPolicy(int policyFormatVersion); + public ConflictResolutionDefinition WithConflictResolution(); + public UniqueKeyDefinition WithUniqueKey(); + } + public abstract class ContainerDefinition where T : ContainerDefinition + { + public ContainerDefinition(); + public ContainerProperties Build(); + public ComputedPropertiesDefinition WithComputedProperties(); + public T WithDefaultTimeToLive(int defaultTtlInSeconds); + public T WithDefaultTimeToLive(TimeSpan defaultTtlTimeSpan); + public IndexingPolicyDefinition WithIndexingPolicy(); + public T WithPartitionKeyDefinitionVersion(PartitionKeyDefinitionVersion partitionKeyDefinitionVersion); + public T WithTimeToLivePropertyPath(string propertyPath); + } + public class CosmosClientBuilder + { + public CosmosClientBuilder(string connectionString); + public CosmosClientBuilder(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential); + public CosmosClientBuilder(string accountEndpoint, TokenCredential tokenCredential); + public CosmosClientBuilder(string accountEndpoint, string authKeyOrResourceToken); + public CosmosClientBuilder AddCustomHandlers(params RequestHandler[] customHandlers); + public CosmosClient Build(); + public Task BuildAndInitializeAsync(IReadOnlyList> containers, CancellationToken cancellationToken=default(CancellationToken)); + public CosmosClientBuilder WithApplicationName(string applicationName); + public CosmosClientBuilder WithApplicationPreferredRegions(IReadOnlyList applicationPreferredRegions); + public CosmosClientBuilder WithApplicationRegion(string applicationRegion); + public CosmosClientBuilder WithBulkExecution(bool enabled); + public CosmosClientBuilder WithConnectionModeDirect(); + public CosmosClientBuilder WithConnectionModeDirect(Nullable idleTcpConnectionTimeout=default(Nullable), Nullable openTcpConnectionTimeout=default(Nullable), Nullable maxRequestsPerTcpConnection=default(Nullable), Nullable maxTcpConnectionsPerEndpoint=default(Nullable), Nullable portReuseMode=default(Nullable), Nullable enableTcpConnectionEndpointRediscovery=default(Nullable)); + public CosmosClientBuilder WithConnectionModeGateway(Nullable maxConnectionLimit=default(Nullable), IWebProxy webProxy=null); + public CosmosClientBuilder WithConsistencyLevel(ConsistencyLevel consistencyLevel); + public CosmosClientBuilder WithContentResponseOnWrite(bool contentResponseOnWrite); + public CosmosClientBuilder WithCustomSerializer(CosmosSerializer cosmosJsonSerializer); + public CosmosClientBuilder WithDistributedTracing(bool isEnabled=true); + public CosmosClientBuilder WithHttpClientFactory(Func httpClientFactory); + public CosmosClientBuilder WithLimitToEndpoint(bool limitToEndpoint); + public CosmosClientBuilder WithRequestTimeout(TimeSpan requestTimeout); + public CosmosClientBuilder WithSerializerOptions(CosmosSerializationOptions cosmosSerializerOptions); + public CosmosClientBuilder WithThrottlingRetryOptions(TimeSpan maxRetryWaitTimeOnThrottledRequests, int maxRetryAttemptsOnThrottledRequests); + } + public class IndexingPolicyDefinition + { + public IndexingPolicyDefinition(); + public T Attach(); + public IndexingPolicyDefinition WithAutomaticIndexing(bool enabled); + public CompositeIndexDefinition> WithCompositeIndex(); + public PathsDefinition> WithExcludedPaths(); + public PathsDefinition> WithIncludedPaths(); + public IndexingPolicyDefinition WithIndexingMode(IndexingMode indexingMode); + public SpatialIndexDefinition> WithSpatialIndex(); + } + public class PathsDefinition + { + public T Attach(); + public PathsDefinition Path(string path); + } + public class SpatialIndexDefinition + { + public T Attach(); + public SpatialIndexDefinition Path(string path); + public SpatialIndexDefinition Path(string path, params SpatialType[] spatialTypes); + } + public class UniqueKeyDefinition + { + public ContainerBuilder Attach(); + public UniqueKeyDefinition Path(string path); + } +} +namespace Microsoft.Azure.Cosmos.Linq +{ + public static class CosmosLinq + { + public static object InvokeUserDefinedFunction(string udfName, params object[] arguments); + } + public static class CosmosLinqExtensions + { + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> CountAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static bool IsArray(this object obj); + public static bool IsBool(this object obj); + public static bool IsDefined(this object obj); + public static bool IsNull(this object obj); + public static bool IsNumber(this object obj); + public static bool IsObject(this object obj); + public static bool IsPrimitive(this object obj); + public static bool IsString(this object obj); + public static Task> MaxAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> MinAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static FeedIterator ToFeedIterator(this IQueryable query); + public static QueryDefinition ToQueryDefinition(this IQueryable query); + public static QueryDefinition ToQueryDefinition(this IQueryable query, IDictionary namedParameters); + public static FeedIterator ToStreamIterator(this IQueryable query); + } +} +namespace Microsoft.Azure.Cosmos.Scripts +{ + public abstract class Scripts + { + protected Scripts(); + public abstract Task CreateStoredProcedureAsync(StoredProcedureProperties storedProcedureProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateTriggerAsync(TriggerProperties triggerProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateUserDefinedFunctionAsync(UserDefinedFunctionProperties userDefinedFunctionProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteStoredProcedureAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteTriggerAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteUserDefinedFunctionAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ExecuteStoredProcedureAsync(string storedProcedureId, PartitionKey partitionKey, dynamic parameters, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteStoredProcedureStreamAsync(string storedProcedureId, PartitionKey partitionKey, dynamic parameters, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteStoredProcedureStreamAsync(string storedProcedureId, Stream streamPayload, PartitionKey partitionKey, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract FeedIterator GetStoredProcedureQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadStoredProcedureAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadTriggerAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadUserDefinedFunctionAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceStoredProcedureAsync(StoredProcedureProperties storedProcedureProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceTriggerAsync(TriggerProperties triggerProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceUserDefinedFunctionAsync(UserDefinedFunctionProperties userDefinedFunctionProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class StoredProcedureExecuteResponse : Response + { + protected StoredProcedureExecuteResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override T Resource { get; } + public virtual string ScriptLog { get; } + public virtual string SessionToken { get; } + public override HttpStatusCode StatusCode { get; } + } + public class StoredProcedureProperties + { + public StoredProcedureProperties(); + public StoredProcedureProperties(string id, string body); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class StoredProcedureRequestOptions : RequestOptions + { + public StoredProcedureRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public bool EnableScriptLogging { get; set; } + public string SessionToken { get; set; } + } + public class StoredProcedureResponse : Response + { + protected StoredProcedureResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override StoredProcedureProperties Resource { get; } + public virtual string SessionToken { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator StoredProcedureProperties (StoredProcedureResponse response); + } + public enum TriggerOperation : short + { + All = (short)0, + Create = (short)1, + Delete = (short)3, + Replace = (short)4, + Update = (short)2, + } + public class TriggerProperties + { + public TriggerProperties(); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public string SelfLink { get; } + public TriggerOperation TriggerOperation { get; set; } + public TriggerType TriggerType { get; set; } + } + public class TriggerResponse : Response + { + protected TriggerResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override TriggerProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator TriggerProperties (TriggerResponse response); + } + public enum TriggerType : byte + { + Post = (byte)1, + Pre = (byte)0, + } + public class UserDefinedFunctionProperties + { + public UserDefinedFunctionProperties(); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public string SelfLink { get; } + } + public class UserDefinedFunctionResponse : Response + { + protected UserDefinedFunctionResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override UserDefinedFunctionProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator UserDefinedFunctionProperties (UserDefinedFunctionResponse response); + } +} +namespace Microsoft.Azure.Cosmos.Spatial +{ + public sealed class BoundingBox : IEquatable + { + public BoundingBox(Position min, Position max); + public Position Max { get; } + public Position Min { get; } + public bool Equals(BoundingBox other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public abstract class Crs + { + protected Crs(CrsType type); + public static Crs Default { get; } + public CrsType Type { get; } + public static Crs Unspecified { get; } + public static LinkedCrs Linked(string href); + public static LinkedCrs Linked(string href, string type); + public static NamedCrs Named(string name); + } + public enum CrsType + { + Linked = 1, + Named = 0, + Unspecified = 2, + } + public abstract class Geometry + { + protected Geometry(GeometryType type, GeometryParams geometryParams); + public IDictionary AdditionalProperties { get; } + public BoundingBox BoundingBox { get; } + public Crs Crs { get; } + public GeometryType Type { get; } + public double Distance(Geometry to); + public override bool Equals(object obj); + public override int GetHashCode(); + public bool Intersects(Geometry geometry2); + public bool IsValid(); + public GeometryValidationResult IsValidDetailed(); + public bool Within(Geometry outer); + } + public class GeometryParams + { + public GeometryParams(); + public IDictionary AdditionalProperties { get; set; } + public BoundingBox BoundingBox { get; set; } + public Crs Crs { get; set; } + } + public enum GeometryShape + { + GeometryCollection = 6, + LineString = 2, + MultiLineString = 3, + MultiPoint = 1, + MultiPolygon = 5, + Point = 0, + Polygon = 4, + } + public enum GeometryType + { + GeometryCollection = 6, + LineString = 2, + MultiLineString = 3, + MultiPoint = 1, + MultiPolygon = 5, + Point = 0, + Polygon = 4, + } + public class GeometryValidationResult + { + public GeometryValidationResult(); + public bool IsValid { get; } + public string Reason { get; } + } + public sealed class LinearRing : IEquatable + { + public LinearRing(IList coordinates); + public ReadOnlyCollection Positions { get; } + public bool Equals(LinearRing other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class LineString : Geometry, IEquatable + { + public LineString(IList coordinates); + public LineString(IList coordinates, GeometryParams geometryParams); + public ReadOnlyCollection Positions { get; } + public bool Equals(LineString other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class LinkedCrs : Crs, IEquatable + { + public string Href { get; } + public string HrefType { get; } + public bool Equals(LinkedCrs other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class MultiPolygon : Geometry, IEquatable + { + public MultiPolygon(IList polygons); + public MultiPolygon(IList polygons, GeometryParams geometryParams); + public ReadOnlyCollection Polygons { get; } + public bool Equals(MultiPolygon other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class NamedCrs : Crs, IEquatable + { + public string Name { get; } + public bool Equals(NamedCrs other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Point : Geometry, IEquatable + { + public Point(Position position); + public Point(Position position, GeometryParams geometryParams); + public Point(double longitude, double latitude); + public Position Position { get; } + public bool Equals(Point other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Polygon : Geometry, IEquatable + { + public Polygon(IList rings); + public Polygon(IList rings, GeometryParams geometryParams); + public Polygon(IList externalRingPositions); + public ReadOnlyCollection Rings { get; } + public bool Equals(Polygon other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class PolygonCoordinates : IEquatable + { + public PolygonCoordinates(IList rings); + public ReadOnlyCollection Rings { get; } + public bool Equals(PolygonCoordinates other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Position : IEquatable + { + public Position(IList coordinates); + public Position(double longitude, double latitude); + public Position(double longitude, double latitude, Nullable altitude); + public Nullable Altitude { get; } + public ReadOnlyCollection Coordinates { get; } + public double Latitude { get; } + public double Longitude { get; } + public bool Equals(Position other); + public override bool Equals(object obj); + public override int GetHashCode(); + } +} diff --git a/Microsoft.Azure.Cosmos/contracts/API_3.34.0.txt b/Microsoft.Azure.Cosmos/contracts/API_3.34.0.txt new file mode 100644 index 0000000000..a365c00c6a --- /dev/null +++ b/Microsoft.Azure.Cosmos/contracts/API_3.34.0.txt @@ -0,0 +1,1499 @@ +namespace Microsoft.Azure.Cosmos +{ + public class AccountConsistency + { + public AccountConsistency(); + public ConsistencyLevel DefaultConsistencyLevel { get; } + public int MaxStalenessIntervalInSeconds { get; } + public int MaxStalenessPrefix { get; } + } + public class AccountProperties + { + public AccountConsistency Consistency { get; } + public string ETag { get; } + public string Id { get; } + public IEnumerable ReadableRegions { get; } + public IEnumerable WritableRegions { get; } + } + public class AccountRegion + { + public AccountRegion(); + public string Endpoint { get; } + public string Name { get; } + } + public sealed class BoundingBoxProperties + { + public BoundingBoxProperties(); + public double Xmax { get; set; } + public double Xmin { get; set; } + public double Ymax { get; set; } + public double Ymin { get; set; } + } + public abstract class ChangeFeedEstimator + { + protected ChangeFeedEstimator(); + public abstract FeedIterator GetCurrentStateIterator(ChangeFeedEstimatorRequestOptions changeFeedEstimatorRequestOptions=null); + } + public sealed class ChangeFeedEstimatorRequestOptions + { + public ChangeFeedEstimatorRequestOptions(); + public Nullable MaxItemCount { get; set; } + } + public abstract class ChangeFeedMode + { + public static ChangeFeedMode Incremental { get; } + public static ChangeFeedMode LatestVersion { get; } + } + public abstract class ChangeFeedProcessor + { + protected ChangeFeedProcessor(); + public abstract Task StartAsync(); + public abstract Task StopAsync(); + } + public class ChangeFeedProcessorBuilder + { + public ChangeFeedProcessor Build(); + public ChangeFeedProcessorBuilder WithErrorNotification(Container.ChangeFeedMonitorErrorDelegate errorDelegate); + public ChangeFeedProcessorBuilder WithInstanceName(string instanceName); + public ChangeFeedProcessorBuilder WithLeaseAcquireNotification(Container.ChangeFeedMonitorLeaseAcquireDelegate acquireDelegate); + public ChangeFeedProcessorBuilder WithLeaseConfiguration(Nullable acquireInterval=default(Nullable), Nullable expirationInterval=default(Nullable), Nullable renewInterval=default(Nullable)); + public ChangeFeedProcessorBuilder WithLeaseContainer(Container leaseContainer); + public ChangeFeedProcessorBuilder WithLeaseReleaseNotification(Container.ChangeFeedMonitorLeaseReleaseDelegate releaseDelegate); + public ChangeFeedProcessorBuilder WithMaxItems(int maxItemCount); + public ChangeFeedProcessorBuilder WithPollInterval(TimeSpan pollInterval); + public ChangeFeedProcessorBuilder WithStartTime(DateTime startTime); + } + public abstract class ChangeFeedProcessorContext + { + protected ChangeFeedProcessorContext(); + public abstract CosmosDiagnostics Diagnostics { get; } + public abstract Headers Headers { get; } + public abstract string LeaseToken { get; } + } + public sealed class ChangeFeedProcessorState + { + public ChangeFeedProcessorState(string leaseToken, long estimatedLag, string instanceName); + public long EstimatedLag { get; } + public string InstanceName { get; } + public string LeaseToken { get; } + } + public class ChangeFeedProcessorUserException : Exception + { + public ChangeFeedProcessorUserException(Exception originalException, ChangeFeedProcessorContext context); + protected ChangeFeedProcessorUserException(SerializationInfo info, StreamingContext context); + public ChangeFeedProcessorContext ChangeFeedProcessorContext { get; } + public override void GetObjectData(SerializationInfo info, StreamingContext context); + } + public sealed class ChangeFeedRequestOptions : RequestOptions + { + public ChangeFeedRequestOptions(); + public new string IfMatchEtag { get; set; } + public new string IfNoneMatchEtag { get; set; } + public Nullable PageSizeHint { get; set; } + } + public abstract class ChangeFeedStartFrom + { + public static ChangeFeedStartFrom Beginning(); + public static ChangeFeedStartFrom Beginning(FeedRange feedRange); + public static ChangeFeedStartFrom ContinuationToken(string continuationToken); + public static ChangeFeedStartFrom Now(); + public static ChangeFeedStartFrom Now(FeedRange feedRange); + public static ChangeFeedStartFrom Time(DateTime dateTimeUtc); + public static ChangeFeedStartFrom Time(DateTime dateTimeUtc, FeedRange feedRange); + } + public sealed class ClientEncryptionIncludedPath + { + public ClientEncryptionIncludedPath(); + public string ClientEncryptionKeyId { get; set; } + public string EncryptionAlgorithm { get; set; } + public string EncryptionType { get; set; } + public string Path { get; set; } + } + public abstract class ClientEncryptionKey + { + protected ClientEncryptionKey(); + public abstract string Id { get; } + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(ClientEncryptionKeyProperties clientEncryptionKeyProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class ClientEncryptionKeyProperties : IEquatable + { + protected ClientEncryptionKeyProperties(); + public ClientEncryptionKeyProperties(string id, string encryptionAlgorithm, byte[] wrappedDataEncryptionKey, EncryptionKeyWrapMetadata encryptionKeyWrapMetadata); + public Nullable CreatedTime { get; } + public string EncryptionAlgorithm { get; } + public EncryptionKeyWrapMetadata EncryptionKeyWrapMetadata { get; } + public string ETag { get; } + public string Id { get; } + public Nullable LastModified { get; } + public virtual string SelfLink { get; } + public byte[] WrappedDataEncryptionKey { get; } + public bool Equals(ClientEncryptionKeyProperties other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public class ClientEncryptionKeyResponse : Response + { + protected ClientEncryptionKeyResponse(); + public override string ActivityId { get; } + public virtual ClientEncryptionKey ClientEncryptionKey { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override ClientEncryptionKeyProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator ClientEncryptionKey (ClientEncryptionKeyResponse response); + } + public sealed class ClientEncryptionPolicy + { + public ClientEncryptionPolicy(IEnumerable includedPaths); + public ClientEncryptionPolicy(IEnumerable includedPaths, int policyFormatVersion); + public IEnumerable IncludedPaths { get; } + public int PolicyFormatVersion { get; } + } + public sealed class CompositePath + { + public CompositePath(); + public CompositePathSortOrder Order { get; set; } + public string Path { get; set; } + } + public enum CompositePathSortOrder + { + Ascending = 0, + Descending = 1, + } + public class ConflictProperties + { + public ConflictProperties(); + public string Id { get; } + public OperationKind OperationKind { get; } + public string SelfLink { get; } + } + public enum ConflictResolutionMode + { + Custom = 1, + LastWriterWins = 0, + } + public class ConflictResolutionPolicy + { + public ConflictResolutionPolicy(); + public ConflictResolutionMode Mode { get; set; } + public string ResolutionPath { get; set; } + public string ResolutionProcedure { get; set; } + } + public abstract class Conflicts + { + protected Conflicts(); + public abstract Task DeleteAsync(ConflictProperties conflict, PartitionKey partitionKey, CancellationToken cancellationToken=default(CancellationToken)); + public abstract FeedIterator GetConflictQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract T ReadConflictContent(ConflictProperties conflict); + public abstract Task> ReadCurrentAsync(ConflictProperties conflict, PartitionKey partitionKey, CancellationToken cancellationToken=default(CancellationToken)); + } + public enum ConnectionMode + { + Direct = 1, + Gateway = 0, + } + public enum ConsistencyLevel + { + BoundedStaleness = 1, + ConsistentPrefix = 4, + Eventual = 3, + Session = 2, + Strong = 0, + } + public abstract class Container + { + protected Container(); + public abstract Conflicts Conflicts { get; } + public abstract Database Database { get; } + public abstract string Id { get; } + public abstract Scripts Scripts { get; } + public abstract Task> CreateItemAsync(T item, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateItemStreamAsync(Stream streamPayload, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract TransactionalBatch CreateTransactionalBatch(PartitionKey partitionKey); + public abstract Task DeleteContainerAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteContainerStreamAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> DeleteItemAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteItemStreamAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ChangeFeedEstimator GetChangeFeedEstimator(string processorName, Container leaseContainer); + public abstract ChangeFeedProcessorBuilder GetChangeFeedEstimatorBuilder(string processorName, Container.ChangesEstimationHandler estimationDelegate, Nullable estimationPeriod=default(Nullable)); + public abstract FeedIterator GetChangeFeedIterator(ChangeFeedStartFrom changeFeedStartFrom, ChangeFeedMode changeFeedMode, ChangeFeedRequestOptions changeFeedRequestOptions=null); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangeFeedStreamHandler onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilderWithManualCheckpoint(string processorName, Container.ChangeFeedStreamHandlerWithManualCheckpoint onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilderWithManualCheckpoint(string processorName, Container.ChangeFeedHandlerWithManualCheckpoint onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangeFeedHandler onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangesHandler onChangesDelegate); + public abstract FeedIterator GetChangeFeedStreamIterator(ChangeFeedStartFrom changeFeedStartFrom, ChangeFeedMode changeFeedMode, ChangeFeedRequestOptions changeFeedRequestOptions=null); + public abstract Task> GetFeedRangesAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract IOrderedQueryable GetItemLinqQueryable(bool allowSynchronousQueryExecution=false, string continuationToken=null, QueryRequestOptions requestOptions=null, CosmosLinqSerializerOptions linqSerializerOptions=null); + public abstract FeedIterator GetItemQueryIterator(FeedRange feedRange, QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(FeedRange feedRange, QueryDefinition queryDefinition, string continuationToken, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task> PatchItemAsync(string id, PartitionKey partitionKey, IReadOnlyList patchOperations, PatchItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task PatchItemStreamAsync(string id, PartitionKey partitionKey, IReadOnlyList patchOperations, PatchItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadContainerAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadContainerStreamAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadItemAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadItemStreamAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadManyItemsAsync(IReadOnlyList> items, ReadManyRequestOptions readManyRequestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadManyItemsStreamAsync(IReadOnlyList> items, ReadManyRequestOptions readManyRequestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadThroughputAsync(RequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadThroughputAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceContainerAsync(ContainerProperties containerProperties, ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceContainerStreamAsync(ContainerProperties containerProperties, ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReplaceItemAsync(T item, string id, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceItemStreamAsync(Stream streamPayload, string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(int throughput, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> UpsertItemAsync(T item, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertItemStreamAsync(Stream streamPayload, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public delegate Task ChangeFeedHandlerWithManualCheckpoint(ChangeFeedProcessorContext context, IReadOnlyCollection changes, Func checkpointAsync, CancellationToken cancellationToken); + public delegate Task ChangeFeedHandler(ChangeFeedProcessorContext context, IReadOnlyCollection changes, CancellationToken cancellationToken); + public delegate Task ChangeFeedMonitorErrorDelegate(string leaseToken, Exception exception); + public delegate Task ChangeFeedMonitorLeaseAcquireDelegate(string leaseToken); + public delegate Task ChangeFeedMonitorLeaseReleaseDelegate(string leaseToken); + public delegate Task ChangeFeedStreamHandler(ChangeFeedProcessorContext context, Stream changes, CancellationToken cancellationToken); + public delegate Task ChangeFeedStreamHandlerWithManualCheckpoint(ChangeFeedProcessorContext context, Stream changes, Func checkpointAsync, CancellationToken cancellationToken); + public delegate Task ChangesEstimationHandler(long estimatedPendingChanges, CancellationToken cancellationToken); + public delegate Task ChangesHandler(IReadOnlyCollection changes, CancellationToken cancellationToken); + } + public class ContainerProperties + { + public ContainerProperties(); + public ContainerProperties(string id, IReadOnlyList partitionKeyPaths); + public ContainerProperties(string id, string partitionKeyPath); + public Nullable AnalyticalStoreTimeToLiveInSeconds { get; set; } + public ClientEncryptionPolicy ClientEncryptionPolicy { get; set; } + public ConflictResolutionPolicy ConflictResolutionPolicy { get; set; } + public Nullable DefaultTimeToLive { get; set; } + public string ETag { get; } + public GeospatialConfig GeospatialConfig { get; set; } + public string Id { get; set; } + public IndexingPolicy IndexingPolicy { get; set; } + public Nullable LastModified { get; } + public Nullable PartitionKeyDefinitionVersion { get; set; } + public string PartitionKeyPath { get; set; } + public IReadOnlyList PartitionKeyPaths { get; set; } + public string SelfLink { get; } + public string TimeToLivePropertyPath { get; set; } + public UniqueKeyPolicy UniqueKeyPolicy { get; set; } + } + public class ContainerRequestOptions : RequestOptions + { + public ContainerRequestOptions(); + public bool PopulateQuotaInfo { get; set; } + } + public class ContainerResponse : Response + { + protected ContainerResponse(); + public override string ActivityId { get; } + public virtual Container Container { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override ContainerProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Container (ContainerResponse response); + } + public class CosmosClient : IDisposable + { + protected CosmosClient(); + public CosmosClient(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, CosmosClientOptions clientOptions=null); + public CosmosClient(string accountEndpoint, TokenCredential tokenCredential, CosmosClientOptions clientOptions=null); + public CosmosClient(string connectionString, CosmosClientOptions clientOptions=null); + public CosmosClient(string accountEndpoint, string authKeyOrResourceToken, CosmosClientOptions clientOptions=null); + public virtual CosmosClientOptions ClientOptions { get; } + public virtual Uri Endpoint { get; } + public virtual CosmosResponseFactory ResponseFactory { get; } + public static Task CreateAndInitializeAsync(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string accountEndpoint, TokenCredential tokenCredential, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string connectionString, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string accountEndpoint, string authKeyOrResourceToken, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseAsync(string id, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseAsync(string id, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseIfNotExistsAsync(string id, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseIfNotExistsAsync(string id, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseStreamAsync(DatabaseProperties databaseProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual Container GetContainer(string databaseId, string containerId); + public virtual Database GetDatabase(string id); + public virtual FeedIterator GetDatabaseQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual Task ReadAccountAsync(); + } + public class CosmosClientOptions + { + public CosmosClientOptions(); + public bool AllowBulkExecution { get; set; } + public string ApplicationName { get; set; } + public IReadOnlyList ApplicationPreferredRegions { get; set; } + public string ApplicationRegion { get; set; } + public ConnectionMode ConnectionMode { get; set; } + public Nullable ConsistencyLevel { get; set; } + public Collection CustomHandlers { get; } + public Nullable EnableContentResponseOnWrite { get; set; } + public bool EnableTcpConnectionEndpointRediscovery { get; set; } + public int GatewayModeMaxConnectionLimit { get; set; } + public Func HttpClientFactory { get; set; } + public Nullable IdleTcpConnectionTimeout { get; set; } + public bool LimitToEndpoint { get; set; } + public Nullable MaxRequestsPerTcpConnection { get; set; } + public Nullable MaxRetryAttemptsOnRateLimitedRequests { get; set; } + public Nullable MaxRetryWaitTimeOnRateLimitedRequests { get; set; } + public Nullable MaxTcpConnectionsPerEndpoint { get; set; } + public Nullable OpenTcpConnectionTimeout { get; set; } + public Nullable PortReuseMode { get; set; } + public TimeSpan RequestTimeout { get; set; } + public CosmosSerializer Serializer { get; set; } + public CosmosSerializationOptions SerializerOptions { get; set; } + public Func ServerCertificateCustomValidationCallback { get; set; } + public Nullable TokenCredentialBackgroundRefreshInterval { get; set; } + public IWebProxy WebProxy { get; set; } + } + public abstract class CosmosDiagnostics + { + protected CosmosDiagnostics(); + public virtual TimeSpan GetClientElapsedTime(); + public abstract IReadOnlyList> GetContactedRegions(); + public virtual int GetFailedRequestCount(); + public virtual Nullable GetStartTimeUtc(); + public abstract override string ToString(); + } + public class CosmosException : Exception + { + public CosmosException(string message, HttpStatusCode statusCode, int subStatusCode, string activityId, double requestCharge); + public virtual string ActivityId { get; } + public virtual CosmosDiagnostics Diagnostics { get; } + public virtual Headers Headers { get; } + public override string Message { get; } + public virtual double RequestCharge { get; } + public virtual string ResponseBody { get; } + public virtual Nullable RetryAfter { get; } + public override string StackTrace { get; } + public virtual HttpStatusCode StatusCode { get; } + public virtual int SubStatusCode { get; } + public override string ToString(); + public virtual bool TryGetHeader(string headerName, out string value); + } + public sealed class CosmosLinqSerializerOptions + { + public CosmosLinqSerializerOptions(); + public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } + } + public class CosmosOperationCanceledException : OperationCanceledException + { + public CosmosOperationCanceledException(OperationCanceledException originalException, CosmosDiagnostics diagnostics); + protected CosmosOperationCanceledException(SerializationInfo info, StreamingContext context); + public override IDictionary Data { get; } + public CosmosDiagnostics Diagnostics { get; } + public override string HelpLink { get; set; } + public override string Message { get; } + public override string Source { get; set; } + public override string StackTrace { get; } + public override Exception GetBaseException(); + public override void GetObjectData(SerializationInfo info, StreamingContext context); + public override string ToString(); + } + public enum CosmosPropertyNamingPolicy + { + CamelCase = 1, + Default = 0, + } + public abstract class CosmosResponseFactory + { + protected CosmosResponseFactory(); + public abstract FeedResponse CreateItemFeedResponse(ResponseMessage responseMessage); + public abstract ItemResponse CreateItemResponse(ResponseMessage responseMessage); + public abstract StoredProcedureExecuteResponse CreateStoredProcedureExecuteResponse(ResponseMessage responseMessage); + } + public sealed class CosmosSerializationOptions + { + public CosmosSerializationOptions(); + public bool IgnoreNullValues { get; set; } + public bool Indented { get; set; } + public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } + } + public abstract class CosmosSerializer + { + protected CosmosSerializer(); + public abstract T FromStream(Stream stream); + public abstract Stream ToStream(T input); + } + public abstract class Database + { + protected Database(); + public abstract CosmosClient Client { get; } + public abstract string Id { get; } + public abstract Task CreateClientEncryptionKeyAsync(ClientEncryptionKeyProperties clientEncryptionKeyProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(string id, string partitionKeyPath, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(string id, string partitionKeyPath, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerStreamAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerStreamAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateUserAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ContainerBuilder DefineContainer(string name, string partitionKeyPath); + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteStreamAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ClientEncryptionKey GetClientEncryptionKey(string id); + public abstract FeedIterator GetClientEncryptionKeyQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Container GetContainer(string id); + public abstract FeedIterator GetContainerQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract User GetUser(string id); + public abstract FeedIterator GetUserQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadStreamAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadThroughputAsync(RequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadThroughputAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(int throughput, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertUserAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class DatabaseProperties + { + public DatabaseProperties(); + public DatabaseProperties(string id); + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class DatabaseResponse : Response + { + protected DatabaseResponse(); + public override string ActivityId { get; } + public virtual Database Database { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override DatabaseProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Database (DatabaseResponse response); + } + public enum DataType + { + LineString = 3, + MultiPolygon = 5, + Number = 0, + Point = 2, + Polygon = 4, + String = 1, + } + public class DedicatedGatewayRequestOptions + { + public DedicatedGatewayRequestOptions(); + public Nullable MaxIntegratedCacheStaleness { get; set; } + } + public class EncryptionKeyWrapMetadata : IEquatable + { + public EncryptionKeyWrapMetadata(EncryptionKeyWrapMetadata source); + public EncryptionKeyWrapMetadata(string type, string name, string value, string algorithm); + public string Algorithm { get; } + public string Name { get; } + public string Type { get; } + public string Value { get; } + public bool Equals(EncryptionKeyWrapMetadata other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class ExcludedPath + { + public ExcludedPath(); + public string Path { get; set; } + } + public abstract class FeedIterator : IDisposable + { + protected FeedIterator(); + public abstract bool HasMoreResults { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public abstract Task ReadNextAsync(CancellationToken cancellationToken=default(CancellationToken)); + } + public abstract class FeedIterator : IDisposable + { + protected FeedIterator(); + public abstract bool HasMoreResults { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public abstract Task> ReadNextAsync(CancellationToken cancellationToken=default(CancellationToken)); + } + public abstract class FeedRange + { + protected FeedRange(); + public static FeedRange FromJsonString(string toStringValue); + public static FeedRange FromPartitionKey(PartitionKey partitionKey); + public abstract string ToJsonString(); + } + public abstract class FeedResponse : IEnumerable, IEnumerable + { + protected FeedResponse(); + public override string ActivityId { get; } + public abstract string ContinuationToken { get; } + public abstract int Count { get; } + public override string ETag { get; } + public abstract string IndexMetrics { get; } + public override double RequestCharge { get; } + public abstract IEnumerator GetEnumerator(); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + } + public sealed class GeospatialConfig + { + public GeospatialConfig(); + public GeospatialConfig(GeospatialType geospatialType); + public GeospatialType GeospatialType { get; set; } + } + public enum GeospatialType + { + Geography = 0, + Geometry = 1, + } + public class Headers : IEnumerable + { + public Headers(); + public virtual string ActivityId { get; } + public virtual string ContentLength { get; set; } + public virtual string ContentType { get; } + public virtual string ContinuationToken { get; } + public virtual string ETag { get; } + public virtual string this[string headerName] { get; set; } + public virtual string Location { get; } + public virtual double RequestCharge { get; } + public virtual string Session { get; } + public virtual void Add(string headerName, IEnumerable values); + public virtual void Add(string headerName, string value); + public virtual string[] AllKeys(); + public virtual string Get(string headerName); + public virtual IEnumerator GetEnumerator(); + public virtual T GetHeaderValue(string headerName); + public virtual string GetValueOrDefault(string headerName); + public virtual void Remove(string headerName); + public virtual void Set(string headerName, string value); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + public virtual bool TryGetValue(string headerName, out string value); + } + public sealed class IncludedPath + { + public IncludedPath(); + public string Path { get; set; } + } + public enum IndexingDirective + { + Default = 0, + Exclude = 2, + Include = 1, + } + public enum IndexingMode + { + Consistent = 0, + Lazy = 1, + None = 2, + } + public sealed class IndexingPolicy + { + public IndexingPolicy(); + public bool Automatic { get; set; } + public Collection> CompositeIndexes { get; } + public Collection ExcludedPaths { get; } + public Collection IncludedPaths { get; } + public IndexingMode IndexingMode { get; set; } + public Collection SpatialIndexes { get; } + } + public enum IndexKind + { + Hash = 0, + Range = 1, + Spatial = 2, + } + public class ItemRequestOptions : RequestOptions + { + public ItemRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions { get; set; } + public Nullable EnableContentResponseOnWrite { get; set; } + public Nullable IndexingDirective { get; set; } + public IEnumerable PostTriggers { get; set; } + public IEnumerable PreTriggers { get; set; } + public string SessionToken { get; set; } + } + public class ItemResponse : Response + { + protected ItemResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override T Resource { get; } + public override HttpStatusCode StatusCode { get; } + } + public enum OperationKind + { + Create = 1, + Delete = 3, + Invalid = 0, + Read = 4, + Replace = 2, + } + public struct PartitionKey : IEquatable + { + public static readonly PartitionKey None; + public static readonly PartitionKey Null; + public static readonly string SystemKeyName; + public static readonly string SystemKeyPath; + public PartitionKey(bool partitionKeyValue); + public PartitionKey(double partitionKeyValue); + public PartitionKey(string partitionKeyValue); + public bool Equals(PartitionKey other); + public override bool Equals(object obj); + public override int GetHashCode(); + public static bool operator ==(PartitionKey left, PartitionKey right); + public static bool operator !=(PartitionKey left, PartitionKey right); + public override string ToString(); + } + public sealed class PartitionKeyBuilder + { + public PartitionKeyBuilder(); + public PartitionKeyBuilder Add(bool val); + public PartitionKeyBuilder Add(double val); + public PartitionKeyBuilder Add(string val); + public PartitionKeyBuilder AddNoneType(); + public PartitionKeyBuilder AddNullValue(); + public PartitionKey Build(); + } + public enum PartitionKeyDefinitionVersion + { + V1 = 1, + V2 = 2, + } + public sealed class PatchItemRequestOptions : ItemRequestOptions + { + public PatchItemRequestOptions(); + public string FilterPredicate { get; set; } + } + public abstract class PatchOperation + { + protected PatchOperation(); + public virtual string From { get; set; } + public abstract PatchOperationType OperationType { get; } + public abstract string Path { get; } + public static PatchOperation Add(string path, T value); + public static PatchOperation Increment(string path, double value); + public static PatchOperation Increment(string path, long value); + public static PatchOperation Move(string from, string path); + public static PatchOperation Remove(string path); + public static PatchOperation Replace(string path, T value); + public static PatchOperation Set(string path, T value); + public virtual bool TrySerializeValueParameter(CosmosSerializer cosmosSerializer, out Stream valueParam); + } + public enum PatchOperationType + { + Add = 0, + Increment = 4, + Move = 5, + Remove = 1, + Replace = 2, + Set = 3, + } + public abstract class PatchOperation : PatchOperation + { + protected PatchOperation(); + public abstract T Value { get; } + } + public abstract class Permission + { + protected Permission(); + public abstract string Id { get; } + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadAsync(Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public enum PermissionMode : byte + { + All = (byte)2, + Read = (byte)1, + } + public class PermissionProperties + { + public PermissionProperties(string id, PermissionMode permissionMode, Container container, PartitionKey resourcePartitionKey, string itemId); + public PermissionProperties(string id, PermissionMode permissionMode, Container container, Nullable resourcePartitionKey=default(Nullable)); + public string ETag { get; } + public string Id { get; } + public Nullable LastModified { get; } + public PermissionMode PermissionMode { get; } + public Nullable ResourcePartitionKey { get; set; } + public string ResourceUri { get; } + public string SelfLink { get; } + public string Token { get; } + } + public class PermissionResponse : Response + { + protected PermissionResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public virtual Permission Permission { get; } + public override double RequestCharge { get; } + public override PermissionProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Permission (PermissionResponse response); + } + public enum PortReuseMode + { + PrivatePortPool = 1, + ReuseUnicastPort = 0, + } + public class QueryDefinition + { + public QueryDefinition(string query); + public string QueryText { get; } + public IReadOnlyList> GetQueryParameters(); + public QueryDefinition WithParameter(string name, object value); + public QueryDefinition WithParameterStream(string name, Stream valueStream); + } + public class QueryRequestOptions : RequestOptions + { + public QueryRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions { get; set; } + public Nullable EnableLowPrecisionOrderBy { get; set; } + public Nullable EnableScanInQuery { get; set; } + public Nullable MaxBufferedItemCount { get; set; } + public Nullable MaxConcurrency { get; set; } + public Nullable MaxItemCount { get; set; } + public Nullable PartitionKey { get; set; } + public Nullable PopulateIndexMetrics { get; set; } + public Nullable ResponseContinuationTokenLimitInKb { get; set; } + public string SessionToken { get; set; } + } + public class ReadManyRequestOptions : RequestOptions + { + public ReadManyRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public string SessionToken { get; set; } + } + public static class Regions + { + public const string AustraliaCentral = "Australia Central"; + public const string AustraliaCentral2 = "Australia Central 2"; + public const string AustraliaEast = "Australia East"; + public const string AustraliaSoutheast = "Australia Southeast"; + public const string BrazilSouth = "Brazil South"; + public const string BrazilSoutheast = "Brazil Southeast"; + public const string CanadaCentral = "Canada Central"; + public const string CanadaEast = "Canada East"; + public const string CentralIndia = "Central India"; + public const string CentralUS = "Central US"; + public const string CentralUSEUAP = "Central US EUAP"; + public const string ChinaEast = "China East"; + public const string ChinaEast2 = "China East 2"; + public const string ChinaEast3 = "China East 3"; + public const string ChinaNorth = "China North"; + public const string ChinaNorth2 = "China North 2"; + public const string ChinaNorth3 = "China North 3"; + public const string EastAsia = "East Asia"; + public const string EastUS = "East US"; + public const string EastUS2 = "East US 2"; + public const string EastUS2EUAP = "East US 2 EUAP"; + public const string EastUSSLV = "East US SLV"; + public const string FranceCentral = "France Central"; + public const string FranceSouth = "France South"; + public const string GermanyCentral = "Germany Central"; + public const string GermanyNorth = "Germany North"; + public const string GermanyNortheast = "Germany Northeast"; + public const string GermanyWestCentral = "Germany West Central"; + public const string JapanEast = "Japan East"; + public const string JapanWest = "Japan West"; + public const string JioIndiaCentral = "Jio India Central"; + public const string JioIndiaWest = "Jio India West"; + public const string KoreaCentral = "Korea Central"; + public const string KoreaSouth = "Korea South"; + public const string NorthCentralUS = "North Central US"; + public const string NorthEurope = "North Europe"; + public const string NorwayEast = "Norway East"; + public const string NorwayWest = "Norway West"; + public const string PolandCentral = "Poland Central"; + public const string QatarCentral = "Qatar Central"; + public const string SouthAfricaNorth = "South Africa North"; + public const string SouthAfricaWest = "South Africa West"; + public const string SouthCentralUS = "South Central US"; + public const string SoutheastAsia = "Southeast Asia"; + public const string SouthIndia = "South India"; + public const string SwedenCentral = "Sweden Central"; + public const string SwedenSouth = "Sweden South"; + public const string SwitzerlandNorth = "Switzerland North"; + public const string SwitzerlandWest = "Switzerland West"; + public const string UAECentral = "UAE Central"; + public const string UAENorth = "UAE North"; + public const string UKSouth = "UK South"; + public const string UKWest = "UK West"; + public const string USDoDCentral = "USDoD Central"; + public const string USDoDEast = "USDoD East"; + public const string USGovArizona = "USGov Arizona"; + public const string USGovTexas = "USGov Texas"; + public const string USGovVirginia = "USGov Virginia"; + public const string USNatEast = "USNat East"; + public const string USNatWest = "USNat West"; + public const string USSecEast = "USSec East"; + public const string USSecWest = "USSec West"; + public const string WestCentralUS = "West Central US"; + public const string WestEurope = "West Europe"; + public const string WestIndia = "West India"; + public const string WestUS = "West US"; + public const string WestUS2 = "West US 2"; + public const string WestUS3 = "West US 3"; + } + public abstract class RequestHandler + { + protected RequestHandler(); + public RequestHandler InnerHandler { get; set; } + public virtual Task SendAsync(RequestMessage request, CancellationToken cancellationToken); + } + public class RequestMessage : IDisposable + { + public RequestMessage(); + public RequestMessage(HttpMethod method, Uri requestUri); + public virtual Stream Content { get; set; } + public virtual Headers Headers { get; } + public virtual HttpMethod Method { get; } + public virtual Dictionary Properties { get; } + public virtual Uri RequestUri { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + } + public class RequestOptions + { + public RequestOptions(); + public Action AddRequestHeaders { get; set; } + public string IfMatchEtag { get; set; } + public string IfNoneMatchEtag { get; set; } + public IReadOnlyDictionary Properties { get; set; } + public RequestOptions ShallowCopy(); + } + public class ResponseMessage : IDisposable + { + public ResponseMessage(); + public ResponseMessage(HttpStatusCode statusCode, RequestMessage requestMessage=null, string errorMessage=null); + public virtual Stream Content { get; set; } + public virtual string ContinuationToken { get; } + public virtual CosmosDiagnostics Diagnostics { get; set; } + public virtual string ErrorMessage { get; } + public virtual Headers Headers { get; } + public string IndexMetrics { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual RequestMessage RequestMessage { get; } + public virtual HttpStatusCode StatusCode { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual ResponseMessage EnsureSuccessStatusCode(); + } + public abstract class Response + { + protected Response(); + public abstract string ActivityId { get; } + public abstract CosmosDiagnostics Diagnostics { get; } + public abstract string ETag { get; } + public abstract Headers Headers { get; } + public abstract double RequestCharge { get; } + public abstract T Resource { get; } + public abstract HttpStatusCode StatusCode { get; } + public static implicit operator T (Response response); + } + public sealed class SpatialPath + { + public SpatialPath(); + public BoundingBoxProperties BoundingBox { get; set; } + public string Path { get; set; } + public Collection SpatialTypes { get; } + } + public enum SpatialType + { + LineString = 1, + MultiPolygon = 3, + Point = 0, + Polygon = 2, + } + public class ThroughputProperties + { + public Nullable AutoscaleMaxThroughput { get; } + public string ETag { get; } + public Nullable LastModified { get; } + public string SelfLink { get; } + public Nullable Throughput { get; } + public static ThroughputProperties CreateAutoscaleThroughput(int autoscaleMaxThroughput); + public static ThroughputProperties CreateManualThroughput(int throughput); + } + public class ThroughputResponse : Response + { + protected ThroughputResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public Nullable IsReplacePending { get; } + public Nullable MinThroughput { get; } + public override double RequestCharge { get; } + public override ThroughputProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator ThroughputProperties (ThroughputResponse response); + } + public abstract class TransactionalBatch + { + protected TransactionalBatch(); + public abstract TransactionalBatch CreateItemStream(Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch CreateItem(T item, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch DeleteItem(string id, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract Task ExecuteAsync(TransactionalBatchRequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract TransactionalBatch PatchItem(string id, IReadOnlyList patchOperations, TransactionalBatchPatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReadItem(string id, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReplaceItemStream(string id, Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReplaceItem(string id, T item, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch UpsertItemStream(Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch UpsertItem(T item, TransactionalBatchItemRequestOptions requestOptions=null); + } + public class TransactionalBatchItemRequestOptions : RequestOptions + { + public TransactionalBatchItemRequestOptions(); + public Nullable EnableContentResponseOnWrite { get; set; } + public Nullable IndexingDirective { get; set; } + } + public class TransactionalBatchOperationResult + { + protected TransactionalBatchOperationResult(); + public virtual string ETag { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual Stream ResourceStream { get; } + public virtual TimeSpan RetryAfter { get; } + public virtual HttpStatusCode StatusCode { get; } + } + public class TransactionalBatchOperationResult : TransactionalBatchOperationResult + { + protected TransactionalBatchOperationResult(); + public virtual T Resource { get; set; } + } + public class TransactionalBatchPatchItemRequestOptions : TransactionalBatchItemRequestOptions + { + public TransactionalBatchPatchItemRequestOptions(); + public string FilterPredicate { get; set; } + } + public class TransactionalBatchRequestOptions : RequestOptions + { + public TransactionalBatchRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public string SessionToken { get; set; } + } + public class TransactionalBatchResponse : IDisposable, IEnumerable, IEnumerable, IReadOnlyCollection, IReadOnlyList + { + protected TransactionalBatchResponse(); + public virtual string ActivityId { get; } + public virtual int Count { get; } + public virtual CosmosDiagnostics Diagnostics { get; } + public virtual string ErrorMessage { get; } + public virtual Headers Headers { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual TransactionalBatchOperationResult this[int index] { get; } + public virtual double RequestCharge { get; } + public virtual Nullable RetryAfter { get; } + public virtual HttpStatusCode StatusCode { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual IEnumerator GetEnumerator(); + public virtual TransactionalBatchOperationResult GetOperationResultAtIndex(int index); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + } + public class UniqueKey + { + public UniqueKey(); + public Collection Paths { get; } + } + public sealed class UniqueKeyPolicy + { + public UniqueKeyPolicy(); + public Collection UniqueKeys { get; } + } + public abstract class User + { + protected User(); + public abstract string Id { get; } + public abstract Task CreatePermissionAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Permission GetPermission(string id); + public abstract FeedIterator GetPermissionQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetPermissionQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(UserProperties userProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertPermissionAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class UserProperties + { + protected UserProperties(); + public UserProperties(string id); + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class UserResponse : Response + { + protected UserResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override UserProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public virtual User User { get; } + public static implicit operator User (UserResponse response); + } +} +namespace Microsoft.Azure.Cosmos.Fluent +{ + public sealed class ClientEncryptionPolicyDefinition + { + public ContainerBuilder Attach(); + public ClientEncryptionPolicyDefinition WithIncludedPath(ClientEncryptionIncludedPath path); + } + public class CompositeIndexDefinition + { + public T Attach(); + public CompositeIndexDefinition Path(string path); + public CompositeIndexDefinition Path(string path, CompositePathSortOrder sortOrder); + } + public class ConflictResolutionDefinition + { + public ContainerBuilder Attach(); + public ConflictResolutionDefinition WithCustomStoredProcedureResolution(string conflictResolutionProcedure); + public ConflictResolutionDefinition WithLastWriterWinsResolution(string conflictResolutionPath); + } + public class ContainerBuilder : ContainerDefinition + { + protected ContainerBuilder(); + public ContainerBuilder(Database database, string name, string partitionKeyPath); + public new ContainerProperties Build(); + public Task CreateAsync(ThroughputProperties throughputProperties, CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateAsync(Nullable throughput=default(Nullable), CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateIfNotExistsAsync(ThroughputProperties throughputProperties, CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateIfNotExistsAsync(Nullable throughput=default(Nullable), CancellationToken cancellationToken=default(CancellationToken)); + public ClientEncryptionPolicyDefinition WithClientEncryptionPolicy(); + public ClientEncryptionPolicyDefinition WithClientEncryptionPolicy(int policyFormatVersion); + public ConflictResolutionDefinition WithConflictResolution(); + public UniqueKeyDefinition WithUniqueKey(); + } + public abstract class ContainerDefinition where T : ContainerDefinition + { + public ContainerDefinition(); + public ContainerProperties Build(); + public T WithDefaultTimeToLive(int defaultTtlInSeconds); + public T WithDefaultTimeToLive(TimeSpan defaultTtlTimeSpan); + public IndexingPolicyDefinition WithIndexingPolicy(); + public T WithPartitionKeyDefinitionVersion(PartitionKeyDefinitionVersion partitionKeyDefinitionVersion); + public T WithTimeToLivePropertyPath(string propertyPath); + } + public class CosmosClientBuilder + { + public CosmosClientBuilder(string connectionString); + public CosmosClientBuilder(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential); + public CosmosClientBuilder(string accountEndpoint, TokenCredential tokenCredential); + public CosmosClientBuilder(string accountEndpoint, string authKeyOrResourceToken); + public CosmosClientBuilder AddCustomHandlers(params RequestHandler[] customHandlers); + public CosmosClient Build(); + public Task BuildAndInitializeAsync(IReadOnlyList> containers, CancellationToken cancellationToken=default(CancellationToken)); + public CosmosClientBuilder WithApplicationName(string applicationName); + public CosmosClientBuilder WithApplicationPreferredRegions(IReadOnlyList applicationPreferredRegions); + public CosmosClientBuilder WithApplicationRegion(string applicationRegion); + public CosmosClientBuilder WithBulkExecution(bool enabled); + public CosmosClientBuilder WithConnectionModeDirect(); + public CosmosClientBuilder WithConnectionModeDirect(Nullable idleTcpConnectionTimeout=default(Nullable), Nullable openTcpConnectionTimeout=default(Nullable), Nullable maxRequestsPerTcpConnection=default(Nullable), Nullable maxTcpConnectionsPerEndpoint=default(Nullable), Nullable portReuseMode=default(Nullable), Nullable enableTcpConnectionEndpointRediscovery=default(Nullable)); + public CosmosClientBuilder WithConnectionModeGateway(Nullable maxConnectionLimit=default(Nullable), IWebProxy webProxy=null); + public CosmosClientBuilder WithConsistencyLevel(ConsistencyLevel consistencyLevel); + public CosmosClientBuilder WithContentResponseOnWrite(bool contentResponseOnWrite); + public CosmosClientBuilder WithCustomSerializer(CosmosSerializer cosmosJsonSerializer); + public CosmosClientBuilder WithHttpClientFactory(Func httpClientFactory); + public CosmosClientBuilder WithLimitToEndpoint(bool limitToEndpoint); + public CosmosClientBuilder WithRequestTimeout(TimeSpan requestTimeout); + public CosmosClientBuilder WithSerializerOptions(CosmosSerializationOptions cosmosSerializerOptions); + public CosmosClientBuilder WithThrottlingRetryOptions(TimeSpan maxRetryWaitTimeOnThrottledRequests, int maxRetryAttemptsOnThrottledRequests); + } + public class IndexingPolicyDefinition + { + public IndexingPolicyDefinition(); + public T Attach(); + public IndexingPolicyDefinition WithAutomaticIndexing(bool enabled); + public CompositeIndexDefinition> WithCompositeIndex(); + public PathsDefinition> WithExcludedPaths(); + public PathsDefinition> WithIncludedPaths(); + public IndexingPolicyDefinition WithIndexingMode(IndexingMode indexingMode); + public SpatialIndexDefinition> WithSpatialIndex(); + } + public class PathsDefinition + { + public T Attach(); + public PathsDefinition Path(string path); + } + public class SpatialIndexDefinition + { + public T Attach(); + public SpatialIndexDefinition Path(string path); + public SpatialIndexDefinition Path(string path, params SpatialType[] spatialTypes); + } + public class UniqueKeyDefinition + { + public ContainerBuilder Attach(); + public UniqueKeyDefinition Path(string path); + } +} +namespace Microsoft.Azure.Cosmos.Linq +{ + public static class CosmosLinq + { + public static object InvokeUserDefinedFunction(string udfName, params object[] arguments); + } + public static class CosmosLinqExtensions + { + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> CountAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static bool IsArray(this object obj); + public static bool IsBool(this object obj); + public static bool IsDefined(this object obj); + public static bool IsNull(this object obj); + public static bool IsNumber(this object obj); + public static bool IsObject(this object obj); + public static bool IsPrimitive(this object obj); + public static bool IsString(this object obj); + public static Task> MaxAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> MinAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static FeedIterator ToFeedIterator(this IQueryable query); + public static QueryDefinition ToQueryDefinition(this IQueryable query); + public static FeedIterator ToStreamIterator(this IQueryable query); + } +} +namespace Microsoft.Azure.Cosmos.Scripts +{ + public abstract class Scripts + { + protected Scripts(); + public abstract Task CreateStoredProcedureAsync(StoredProcedureProperties storedProcedureProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateTriggerAsync(TriggerProperties triggerProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateUserDefinedFunctionAsync(UserDefinedFunctionProperties userDefinedFunctionProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteStoredProcedureAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteTriggerAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteUserDefinedFunctionAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ExecuteStoredProcedureAsync(string storedProcedureId, PartitionKey partitionKey, dynamic parameters, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteStoredProcedureStreamAsync(string storedProcedureId, PartitionKey partitionKey, dynamic parameters, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteStoredProcedureStreamAsync(string storedProcedureId, Stream streamPayload, PartitionKey partitionKey, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract FeedIterator GetStoredProcedureQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadStoredProcedureAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadTriggerAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadUserDefinedFunctionAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceStoredProcedureAsync(StoredProcedureProperties storedProcedureProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceTriggerAsync(TriggerProperties triggerProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceUserDefinedFunctionAsync(UserDefinedFunctionProperties userDefinedFunctionProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class StoredProcedureExecuteResponse : Response + { + protected StoredProcedureExecuteResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override T Resource { get; } + public virtual string ScriptLog { get; } + public virtual string SessionToken { get; } + public override HttpStatusCode StatusCode { get; } + } + public class StoredProcedureProperties + { + public StoredProcedureProperties(); + public StoredProcedureProperties(string id, string body); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class StoredProcedureRequestOptions : RequestOptions + { + public StoredProcedureRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public bool EnableScriptLogging { get; set; } + public string SessionToken { get; set; } + } + public class StoredProcedureResponse : Response + { + protected StoredProcedureResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override StoredProcedureProperties Resource { get; } + public virtual string SessionToken { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator StoredProcedureProperties (StoredProcedureResponse response); + } + public enum TriggerOperation : short + { + All = (short)0, + Create = (short)1, + Delete = (short)3, + Replace = (short)4, + Update = (short)2, + } + public class TriggerProperties + { + public TriggerProperties(); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public string SelfLink { get; } + public TriggerOperation TriggerOperation { get; set; } + public TriggerType TriggerType { get; set; } + } + public class TriggerResponse : Response + { + protected TriggerResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override TriggerProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator TriggerProperties (TriggerResponse response); + } + public enum TriggerType : byte + { + Post = (byte)1, + Pre = (byte)0, + } + public class UserDefinedFunctionProperties + { + public UserDefinedFunctionProperties(); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public string SelfLink { get; } + } + public class UserDefinedFunctionResponse : Response + { + protected UserDefinedFunctionResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override UserDefinedFunctionProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator UserDefinedFunctionProperties (UserDefinedFunctionResponse response); + } +} +namespace Microsoft.Azure.Cosmos.Spatial +{ + public sealed class BoundingBox : IEquatable + { + public BoundingBox(Position min, Position max); + public Position Max { get; } + public Position Min { get; } + public bool Equals(BoundingBox other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public abstract class Crs + { + protected Crs(CrsType type); + public static Crs Default { get; } + public CrsType Type { get; } + public static Crs Unspecified { get; } + public static LinkedCrs Linked(string href); + public static LinkedCrs Linked(string href, string type); + public static NamedCrs Named(string name); + } + public enum CrsType + { + Linked = 1, + Named = 0, + Unspecified = 2, + } + public abstract class Geometry + { + protected Geometry(GeometryType type, GeometryParams geometryParams); + public IDictionary AdditionalProperties { get; } + public BoundingBox BoundingBox { get; } + public Crs Crs { get; } + public GeometryType Type { get; } + public double Distance(Geometry to); + public override bool Equals(object obj); + public override int GetHashCode(); + public bool Intersects(Geometry geometry2); + public bool IsValid(); + public GeometryValidationResult IsValidDetailed(); + public bool Within(Geometry outer); + } + public class GeometryParams + { + public GeometryParams(); + public IDictionary AdditionalProperties { get; set; } + public BoundingBox BoundingBox { get; set; } + public Crs Crs { get; set; } + } + public enum GeometryShape + { + GeometryCollection = 6, + LineString = 2, + MultiLineString = 3, + MultiPoint = 1, + MultiPolygon = 5, + Point = 0, + Polygon = 4, + } + public enum GeometryType + { + GeometryCollection = 6, + LineString = 2, + MultiLineString = 3, + MultiPoint = 1, + MultiPolygon = 5, + Point = 0, + Polygon = 4, + } + public class GeometryValidationResult + { + public GeometryValidationResult(); + public bool IsValid { get; } + public string Reason { get; } + } + public sealed class LinearRing : IEquatable + { + public LinearRing(IList coordinates); + public ReadOnlyCollection Positions { get; } + public bool Equals(LinearRing other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class LineString : Geometry, IEquatable + { + public LineString(IList coordinates); + public LineString(IList coordinates, GeometryParams geometryParams); + public ReadOnlyCollection Positions { get; } + public bool Equals(LineString other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class LinkedCrs : Crs, IEquatable + { + public string Href { get; } + public string HrefType { get; } + public bool Equals(LinkedCrs other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class MultiPolygon : Geometry, IEquatable + { + public MultiPolygon(IList polygons); + public MultiPolygon(IList polygons, GeometryParams geometryParams); + public ReadOnlyCollection Polygons { get; } + public bool Equals(MultiPolygon other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class NamedCrs : Crs, IEquatable + { + public string Name { get; } + public bool Equals(NamedCrs other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Point : Geometry, IEquatable + { + public Point(Position position); + public Point(Position position, GeometryParams geometryParams); + public Point(double longitude, double latitude); + public Position Position { get; } + public bool Equals(Point other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Polygon : Geometry, IEquatable + { + public Polygon(IList rings); + public Polygon(IList rings, GeometryParams geometryParams); + public Polygon(IList externalRingPositions); + public ReadOnlyCollection Rings { get; } + public bool Equals(Polygon other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class PolygonCoordinates : IEquatable + { + public PolygonCoordinates(IList rings); + public ReadOnlyCollection Rings { get; } + public bool Equals(PolygonCoordinates other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Position : IEquatable + { + public Position(IList coordinates); + public Position(double longitude, double latitude); + public Position(double longitude, double latitude, Nullable altitude); + public Nullable Altitude { get; } + public ReadOnlyCollection Coordinates { get; } + public double Latitude { get; } + public double Longitude { get; } + public bool Equals(Position other); + public override bool Equals(object obj); + public override int GetHashCode(); + } +} diff --git a/changelog.md b/changelog.md index 709a4bfccf..906c0746ef 100644 --- a/changelog.md +++ b/changelog.md @@ -12,6 +12,23 @@ Preview features are treated as a separate branch and will not be included in th The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +### [3.34.0-preview](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.34.0-preview) - 2023-05-17 + +### Added +- [3761](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3761) Query: Adds Computed Property SDK Support + +### [3.34.0](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.34.0) - 2023-05-17 + +#### Fixed +- [3847](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3847) PackageLicense: Replaces PackageLicenseUrl with PackageLicenseFile since PackageLicenseUrl is deprecated +- [3845](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3845) AI Integration: Fixes Operation Name in the activity and end to end Tests. +- [3832](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3832) Query: Fixes format exception when using culture and partitionKey, difference between Windows and Linux + +#### Added +- [3854](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3854) Change Feed: Adds LatestVersion to ChangeFeedMode +- [3833](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3833) Query: Adds TRIM string system function support in LINQ +- [3826](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3826) Query: Adds support for Lambda expression reuse in LINQ +- [3724](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3724) Query: Added remaining Cosmos Type checking functions to CosmosLinqExtensions. Thanks @onionhammer. ### [3.33.0-preview](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.33.0-preview) - 2023-04-21 From 2b7d709b9fab04a09f373d4d64e2a1ff7c16f849 Mon Sep 17 00:00:00 2001 From: Philip Thomas <86612891+philipthomas-MSFT@users.noreply.github.com> Date: Thu, 18 May 2023 12:10:49 -0400 Subject: [PATCH 11/39] Release: Fixes changelog.md change for 3845 to preview (#3859) --- changelog.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 906c0746ef..b1b3139828 100644 --- a/changelog.md +++ b/changelog.md @@ -17,11 +17,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - [3761](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3761) Query: Adds Computed Property SDK Support +#### Fixed +- [3845](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3845) AI Integration: Fixes Operation Name in the activity and end to end Tests. + ### [3.34.0](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.34.0) - 2023-05-17 #### Fixed - [3847](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3847) PackageLicense: Replaces PackageLicenseUrl with PackageLicenseFile since PackageLicenseUrl is deprecated -- [3845](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3845) AI Integration: Fixes Operation Name in the activity and end to end Tests. - [3832](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3832) Query: Fixes format exception when using culture and partitionKey, difference between Windows and Linux #### Added From 3727d4d738cfc24aa372b578fd8ca482a5bc2f3f Mon Sep 17 00:00:00 2001 From: Philip Thomas <86612891+philipthomas-MSFT@users.noreply.github.com> Date: Fri, 19 May 2023 11:12:10 -0400 Subject: [PATCH 12/39] removing ThirdPartyNotice.txt from content and contentfiles folders (#3864) --- Microsoft.Azure.Cosmos/src/Microsoft.Azure.Cosmos.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Microsoft.Azure.Cosmos/src/Microsoft.Azure.Cosmos.csproj b/Microsoft.Azure.Cosmos/src/Microsoft.Azure.Cosmos.csproj index 886a84d586..f8afb4af6c 100644 --- a/Microsoft.Azure.Cosmos/src/Microsoft.Azure.Cosmos.csproj +++ b/Microsoft.Azure.Cosmos/src/Microsoft.Azure.Cosmos.csproj @@ -59,7 +59,7 @@ - + From 69cda11e4c7537cc8c864e358a4f7d47828c36d7 Mon Sep 17 00:00:00 2001 From: Rinat Minibaev <132935507+rinatmini@users.noreply.github.com> Date: Mon, 22 May 2023 06:19:42 -0700 Subject: [PATCH 13/39] Documentation: Adds see also link to Container.CreateTransactionalBatch (#3860) * Linking limit documentation to Container.CreateTransactionalBatch(PartitionKey) method * Resolved PR comments * Links update * Using learn.microsoft instead of docs.microsoft in the links --------- Co-authored-by: Matias Quaranta --- Microsoft.Azure.Cosmos/src/Batch/TransactionalBatch.cs | 6 +++++- Microsoft.Azure.Cosmos/src/Resource/Container/Container.cs | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Microsoft.Azure.Cosmos/src/Batch/TransactionalBatch.cs b/Microsoft.Azure.Cosmos/src/Batch/TransactionalBatch.cs index aa8ff6af62..a479f3d8b0 100644 --- a/Microsoft.Azure.Cosmos/src/Batch/TransactionalBatch.cs +++ b/Microsoft.Azure.Cosmos/src/Batch/TransactionalBatch.cs @@ -107,7 +107,9 @@ namespace Microsoft.Azure.Cosmos /// ]]> /// /// - /// Limits on TransactionalBatch requests + /// + /// Limits on TransactionalBatch requests + /// public abstract class TransactionalBatch { /// @@ -244,6 +246,7 @@ public abstract TransactionalBatch PatchItem( /// /// This API only throws on client side exceptions. This is to increase performance and prevent the overhead of throwing exceptions. /// Use on the response returned to ensure that the transactional batch succeeded. + /// Limits on TransactionalBatch requests /// public abstract Task ExecuteAsync( CancellationToken cancellationToken = default); @@ -275,6 +278,7 @@ public abstract Task ExecuteAsync( /// /// This API only throws on client side exceptions. This is to increase performance and prevent the overhead of throwing exceptions. /// Use on the response returned to ensure that the transactional batch succeeded. + /// Limits on TransactionalBatch requests /// public abstract Task ExecuteAsync( TransactionalBatchRequestOptions requestOptions, diff --git a/Microsoft.Azure.Cosmos/src/Resource/Container/Container.cs b/Microsoft.Azure.Cosmos/src/Resource/Container/Container.cs index 1defe1f3cc..106262a13f 100644 --- a/Microsoft.Azure.Cosmos/src/Resource/Container/Container.cs +++ b/Microsoft.Azure.Cosmos/src/Resource/Container/Container.cs @@ -1342,6 +1342,9 @@ public abstract ChangeFeedEstimator GetChangeFeedEstimator( /// /// The partition key for all items in the batch. /// A new instance of . + /// + /// Limits on TransactionalBatch requests + /// public abstract TransactionalBatch CreateTransactionalBatch(PartitionKey partitionKey); /// From d4f48f4258d2e2769a8beee69034e155f4028934 Mon Sep 17 00:00:00 2001 From: Maya-Painter <130110800+Maya-Painter@users.noreply.github.com> Date: Tue, 23 May 2023 15:33:44 -0700 Subject: [PATCH 14/39] Query: Adds type-markers with count and length for large arrays (#3852) * initial commit * cleanup * update test output * cleanup * typo * Pr comments --- .../src/Json/JsonWriter.JsonBinaryWriter.cs | 51 +-- Microsoft.Azure.Cosmos/src/Json/JsonWriter.cs | 1 - .../Json/JsonWriterTests.cs | 409 ++++++++++++------ 3 files changed, 306 insertions(+), 155 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Json/JsonWriter.JsonBinaryWriter.cs b/Microsoft.Azure.Cosmos/src/Json/JsonWriter.JsonBinaryWriter.cs index b9d6d2047a..0df6582cf6 100644 --- a/Microsoft.Azure.Cosmos/src/Json/JsonWriter.JsonBinaryWriter.cs +++ b/Microsoft.Azure.Cosmos/src/Json/JsonWriter.JsonBinaryWriter.cs @@ -33,7 +33,7 @@ abstract partial class JsonWriter : IJsonWriter /// Blitted bytes. public static PreblittedBinaryJsonScope CapturePreblittedBinaryJsonScope(Action scopeWriter) { - JsonBinaryWriter jsonBinaryWriter = new JsonBinaryWriter(initialCapacity: 256, serializeCount: false, enableEncodedStrings: false); + JsonBinaryWriter jsonBinaryWriter = new JsonBinaryWriter(initialCapacity: 256, enableEncodedStrings: false); Contract.Requires(!jsonBinaryWriter.JsonObjectState.InArrayContext); Contract.Requires(!jsonBinaryWriter.JsonObjectState.InObjectContext); Contract.Requires(!jsonBinaryWriter.JsonObjectState.IsPropertyExpected); @@ -243,13 +243,6 @@ private enum RawValueType : byte /// private readonly Stack bufferedContexts; - /// - /// With binary encoding json elements like arrays and object are prefixed with a length in bytes and optionally a count. - /// This flag just determines whether you want to serialize the count, since it's optional and up to the user to make the - /// tradeoff between O(1) .Count() operation as the cost of additional storage. - /// - private readonly bool serializeCount; - /// /// When a user writes an open array or object we reserve this much space for the type marker + length + count /// And correct it later when they write a close array or object. @@ -269,18 +262,15 @@ private enum RawValueType : byte /// Initializes a new instance of the JsonBinaryWriter class. /// /// The initial capacity to avoid intermediary allocations. - /// Whether to serialize the count for object and array typemarkers. /// enable reference string encoding public JsonBinaryWriter( int initialCapacity, - bool serializeCount, bool enableEncodedStrings) { this.EnableEncodedStrings = enableEncodedStrings; this.binaryWriter = new JsonBinaryMemoryWriter(initialCapacity); this.bufferedContexts = new Stack(); - this.serializeCount = serializeCount; - this.reservationSize = JsonBinaryEncoding.TypeMarkerLength + JsonBinaryEncoding.OneByteLength + (this.serializeCount ? JsonBinaryEncoding.OneByteCount : 0); + this.reservationSize = JsonBinaryEncoding.TypeMarkerLength + JsonBinaryEncoding.OneByteLength; this.sharedStrings = new List(); this.sharedStringIndexes = new ReferenceStringDictionary(); this.stringReferenceOffsets = new List(); @@ -300,13 +290,13 @@ public JsonBinaryWriter( public override long CurrentLength => this.binaryWriter.Position; /// - public override void WriteObjectStart() => this.WriterArrayOrObjectStart(isArray: false); + public override void WriteObjectStart() => this.WriteArrayOrObjectStart(isArray: false); /// public override void WriteObjectEnd() => this.WriteArrayOrObjectEnd(isArray: false); /// - public override void WriteArrayStart() => this.WriterArrayOrObjectStart(isArray: true); + public override void WriteArrayStart() => this.WriteArrayOrObjectStart(isArray: true); /// public override void WriteArrayEnd() => this.WriteArrayOrObjectEnd(isArray: true); @@ -536,7 +526,7 @@ internal PreblittedBinaryJsonScope CapturePreblittedBinaryJsonScope(int startPos this.binaryWriter.BufferAsSpan.Slice(startPosition, this.binaryWriter.Position - startPosition).ToArray()); } - private void WriterArrayOrObjectStart(bool isArray) + private void WriteArrayOrObjectStart(bool isArray) { this.RegisterArrayOrObjectStart(isArray, this.binaryWriter.Position, valueCount: 0); @@ -544,10 +534,6 @@ private void WriterArrayOrObjectStart(bool isArray) // We'll adjust this as needed when writing the end of the array/object. this.binaryWriter.Write((byte)0); this.binaryWriter.Write((byte)0); - if (this.serializeCount) - { - this.binaryWriter.Write((byte)0); - } } private void RegisterArrayOrObjectStart(bool isArray, long offset, int valueCount) @@ -611,16 +597,20 @@ private void WriteArrayOrObjectEnd(bool isArray) // Need to figure out how many bytes to encode the length and the count if (payloadLength <= byte.MaxValue) { - // 1 byte length - don't need to move the buffer + bool serializeCount = isArray && (count > 16); + + // 1 byte length - move the buffer forward + Span buffer = this.binaryWriter.BufferAsSpan; int bytesToWrite = JsonBinaryEncoding.TypeMarkerLength + JsonBinaryEncoding.OneByteLength - + (this.serializeCount ? JsonBinaryEncoding.OneByteCount : 0); + + (serializeCount ? JsonBinaryEncoding.OneByteCount : 0); + this.MoveBuffer(buffer, payloadIndex, payloadLength, typeMarkerIndex, bytesToWrite, stringStartIndex, stringReferenceStartIndex); // Move the cursor back this.binaryWriter.Position = typeMarkerIndex; // Write the type marker - if (this.serializeCount) + if (serializeCount) { this.binaryWriter.Write(isArray ? JsonBinaryEncoding.TypeMarker.Array1ByteLengthAndCount : JsonBinaryEncoding.TypeMarker.Object1ByteLengthAndCount); this.binaryWriter.Write((byte)payloadLength); @@ -637,9 +627,11 @@ private void WriteArrayOrObjectEnd(bool isArray) } else if (payloadLength <= ushort.MaxValue) { + bool serializeCount = isArray && ((count > 16) || (payloadLength > 0x1000)); + // 2 byte length - make space for the extra byte length (and extra byte count) this.binaryWriter.Write((byte)0); - if (this.serializeCount) + if (serializeCount) { this.binaryWriter.Write((byte)0); } @@ -648,14 +640,14 @@ private void WriteArrayOrObjectEnd(bool isArray) Span buffer = this.binaryWriter.BufferAsSpan; int bytesToWrite = JsonBinaryEncoding.TypeMarkerLength + JsonBinaryEncoding.TwoByteLength - + (this.serializeCount ? JsonBinaryEncoding.TwoByteCount : 0); + + (serializeCount ? JsonBinaryEncoding.TwoByteCount : 0); this.MoveBuffer(buffer, payloadIndex, payloadLength, typeMarkerIndex, bytesToWrite, stringStartIndex, stringReferenceStartIndex); // Move the cursor back this.binaryWriter.Position = typeMarkerIndex; // Write the type marker - if (this.serializeCount) + if (serializeCount) { this.binaryWriter.Write(isArray ? JsonBinaryEncoding.TypeMarker.Array2ByteLengthAndCount : JsonBinaryEncoding.TypeMarker.Object2ByteLengthAndCount); this.binaryWriter.Write((ushort)payloadLength); @@ -673,11 +665,12 @@ private void WriteArrayOrObjectEnd(bool isArray) else { // (payloadLength <= uint.MaxValue) + bool serializeCount = isArray; // 4 byte length - make space for an extra 3 byte length (and 3 byte count) this.binaryWriter.Write((byte)0); this.binaryWriter.Write((ushort)0); - if (this.serializeCount) + if (serializeCount) { this.binaryWriter.Write((byte)0); this.binaryWriter.Write((ushort)0); @@ -687,14 +680,14 @@ private void WriteArrayOrObjectEnd(bool isArray) Span buffer = this.binaryWriter.BufferAsSpan; int bytesToWrite = JsonBinaryEncoding.TypeMarkerLength + JsonBinaryEncoding.FourByteLength - + (this.serializeCount ? JsonBinaryEncoding.FourByteCount : 0); + + (serializeCount ? JsonBinaryEncoding.FourByteCount : 0); this.MoveBuffer(buffer, payloadIndex, payloadLength, typeMarkerIndex, bytesToWrite, stringStartIndex, stringReferenceStartIndex); // Move the cursor back this.binaryWriter.Position = typeMarkerIndex; // Write the type marker - if (this.serializeCount) + if (serializeCount) { this.binaryWriter.Write(isArray ? JsonBinaryEncoding.TypeMarker.Array4ByteLengthAndCount : JsonBinaryEncoding.TypeMarker.Object4ByteLengthAndCount); this.binaryWriter.Write((uint)payloadLength); @@ -915,7 +908,7 @@ private bool TryRegisterStringValue(Utf8Span utf8Span) // In order to avoid having to change the typer marker later on, we need to account for the case // where the buffer might shift as a result of adjusting array/object length. - int maxOffset = (this.JsonObjectState.CurrentDepth * 3) + (int)this.CurrentLength; + int maxOffset = (this.JsonObjectState.CurrentDepth * 7) + (int)this.CurrentLength; bool shouldAddValue = (utf8Span.Length >= 5) || ((maxOffset <= byte.MaxValue) && (utf8Span.Length >= 2)) || diff --git a/Microsoft.Azure.Cosmos/src/Json/JsonWriter.cs b/Microsoft.Azure.Cosmos/src/Json/JsonWriter.cs index 8e75c0c116..9ea7b42325 100644 --- a/Microsoft.Azure.Cosmos/src/Json/JsonWriter.cs +++ b/Microsoft.Azure.Cosmos/src/Json/JsonWriter.cs @@ -58,7 +58,6 @@ public static IJsonWriter Create( JsonSerializationFormat.Text => new JsonTextWriter(initalCapacity), JsonSerializationFormat.Binary => new JsonBinaryWriter( initialCapacity: initalCapacity, - serializeCount: false, enableEncodedStrings: enableEncodedStrings), _ => throw new ArgumentException( string.Format( diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Json/JsonWriterTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Json/JsonWriterTests.cs index e60ab573e8..b44cb49b1f 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Json/JsonWriterTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Json/JsonWriterTests.cs @@ -16,7 +16,7 @@ public class JsonWriterTests #region Literals [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void TrueTest() { string expectedString = "true"; @@ -37,7 +37,7 @@ public void TrueTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void FalseTest() { string expectedString = "false"; @@ -58,7 +58,7 @@ public void FalseTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void NullTest() { string expectedString = "null"; @@ -80,7 +80,7 @@ public void NullTest() #endregion #region Numbers [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void IntegerTest() { string expectedString = "1337"; @@ -103,7 +103,7 @@ public void IntegerTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void DoubleTest() { string expectedString = "1337.1337"; @@ -126,7 +126,7 @@ public void DoubleTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void NaNTest() { string expectedString = "\"NaN\""; @@ -149,7 +149,7 @@ public void NaNTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void PositiveInfinityTest() { string expectedString = "\"Infinity\""; @@ -172,7 +172,7 @@ public void PositiveInfinityTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void NegativeInfinityTest() { string expectedString = "\"-Infinity\""; @@ -195,7 +195,7 @@ public void NegativeInfinityTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void NegativeNumberTest() { string expectedString = "-1337.1337"; @@ -218,7 +218,7 @@ public void NegativeNumberTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void NumberWithScientificNotationTest() { string expectedString = "6.02252E+23"; @@ -241,7 +241,7 @@ public void NumberWithScientificNotationTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void NumberRegressionTest() { // regression test - the value 0.00085647800000000004 was being incorrectly rejected @@ -267,7 +267,7 @@ public void NumberRegressionTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void NumberPrecisionTest() { string expectedString = "[2.7620553993338772e+018,2.7620553993338778e+018]"; @@ -303,7 +303,7 @@ public void NumberPrecisionTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void LargeNumbersTest() { string expectedString = @"[1,-1,10,-10,14997460357411200,14997460357411000,1499746035741101,1499746035741109,-14997460357411200,-14997460357411000,-1499746035741101,-1499746035741109,1499746035741128,1499752659822592,1499752939110661,1499753827614475,1499970126403840,1499970590815128,1499970842400644,1499971371510025,1499972760675685,1499972969962006,1499973086735836,1499973302072392,1499976826748983]"; @@ -343,7 +343,7 @@ public void LargeNumbersTest() #endregion #region String [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void EmptyStringTest() { string expectedString = "\"\""; @@ -364,7 +364,7 @@ public void EmptyStringTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void StringTest() { string expectedString = "\"Hello World\""; @@ -387,7 +387,7 @@ public void StringTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void SystemStringTest() { int systemStringId = 0; @@ -418,7 +418,7 @@ public void SystemStringTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void DateTimeStringsTest() { { @@ -633,7 +633,7 @@ public void DateTimeStringsTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void HexStringsTest() { { @@ -719,7 +719,7 @@ public void HexStringsTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void CompressedStringsTest() { { @@ -933,7 +933,7 @@ public void CompressedStringsTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void GuidStringsTest() { { @@ -1325,7 +1325,7 @@ public void GuidStringsTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void ReferenceStringsTest() { { @@ -1501,97 +1501,97 @@ public void ReferenceStringsTest() }; byte[] binaryPayload = new byte[] { - 0x80, 0xEB, 0xCE, 0x02, 0x89, 0x70, 0x72, 0x6F, + 0x80, 0xEB, 0xD2, 0x02, 0x89, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x31, 0x86, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x31, 0x89, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x32, 0xC3, 0x0E, 0x89, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, - 0x74, 0x79, 0x33, 0xE2, 0x64, 0x89, 0x70, 0x72, - 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x30, 0xC3, - 0x04, 0xC3, 0x15, 0xC3, 0x21, 0x89, 0x70, 0x72, - 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x34, 0x89, - 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, - 0x35, 0x89, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, - 0x74, 0x79, 0x36, 0x89, 0x70, 0x72, 0x6F, 0x70, - 0x65, 0x72, 0x74, 0x79, 0x37, 0x89, 0x70, 0x72, - 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x38, 0x89, - 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, - 0x39, 0xC3, 0x0E, 0xC3, 0x0E, 0xC3, 0x0E, 0xC3, - 0x6F, 0xC3, 0x65, 0xC3, 0x5B, 0xC3, 0x47, 0xC3, - 0x3D, 0xC3, 0x21, 0xC3, 0x15, 0xC3, 0x04, 0xC3, - 0x2D, 0xC3, 0x21, 0xC3, 0x0E, 0xC3, 0x3D, 0xC3, - 0x0E, 0xC3, 0x47, 0xE2, 0xB8, 0x8E, 0x53, 0x74, + 0x74, 0x79, 0x33, 0xE5, 0x64, 0x16, 0x89, 0x70, + 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x30, + 0xC3, 0x04, 0xC3, 0x15, 0xC3, 0x21, 0x89, 0x70, + 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x34, + 0x89, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x35, 0x89, 0x70, 0x72, 0x6F, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x36, 0x89, 0x70, 0x72, 0x6F, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x37, 0x89, 0x70, + 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x38, + 0x89, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x39, 0xC3, 0x0E, 0xC3, 0x0E, 0xC3, 0x0E, + 0xC3, 0x70, 0xC3, 0x66, 0xC3, 0x5C, 0xC3, 0x48, + 0xC3, 0x3E, 0xC3, 0x21, 0xC3, 0x15, 0xC3, 0x04, + 0xC3, 0x2E, 0xC3, 0x21, 0xC3, 0x0E, 0xC3, 0x3E, + 0xC3, 0x0E, 0xC3, 0x48, 0xE5, 0xB8, 0x16, 0x8E, + 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x56, 0x61, + 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x30, 0x8E, 0x53, + 0x74, 0x72, 0x69, 0x6E, 0x67, 0x56, 0x61, 0x6C, + 0x75, 0x65, 0x5F, 0x5F, 0x31, 0x8E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x56, 0x61, 0x6C, 0x75, - 0x65, 0x5F, 0x5F, 0x30, 0x8E, 0x53, 0x74, 0x72, + 0x65, 0x5F, 0x5F, 0x32, 0x8E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, - 0x5F, 0x5F, 0x31, 0x8E, 0x53, 0x74, 0x72, 0x69, + 0x5F, 0x5F, 0x33, 0x8E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x5F, - 0x5F, 0x32, 0x8E, 0x53, 0x74, 0x72, 0x69, 0x6E, + 0x5F, 0x34, 0x8E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, - 0x33, 0x8E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, - 0x56, 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x34, + 0x35, 0x8E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, + 0x56, 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x36, 0x8E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x56, - 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x35, 0x8E, + 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x37, 0x8E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x56, 0x61, - 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x36, 0x8E, 0x53, + 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x38, 0x8E, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x56, 0x61, 0x6C, - 0x75, 0x65, 0x5F, 0x5F, 0x37, 0x8E, 0x53, 0x74, - 0x72, 0x69, 0x6E, 0x67, 0x56, 0x61, 0x6C, 0x75, - 0x65, 0x5F, 0x5F, 0x38, 0x8E, 0x53, 0x74, 0x72, - 0x69, 0x6E, 0x67, 0x56, 0x61, 0x6C, 0x75, 0x65, - 0x5F, 0x5F, 0x39, 0x86, 0x76, 0x61, 0x6C, 0x75, - 0x65, 0x32, 0xC4, 0x33, 0x01, 0xC4, 0x33, 0x01, - 0xC4, 0x24, 0x01, 0xC4, 0x15, 0x01, 0xC4, 0x06, - 0x01, 0xC3, 0xE8, 0xC3, 0xD9, 0xC3, 0xCA, 0xC3, - 0xBB, 0xC3, 0xAC, 0xC3, 0x9D, 0xC3, 0x47, 0xC4, - 0x33, 0x01, 0xC3, 0x51, 0xC4, 0x33, 0x01, 0xC3, - 0x5B, 0xE2, 0xAA, 0x8C, 0x54, 0x65, 0x78, 0x74, - 0x56, 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x30, + 0x75, 0x65, 0x5F, 0x5F, 0x39, 0x86, 0x76, 0x61, + 0x6C, 0x75, 0x65, 0x32, 0xC4, 0x35, 0x01, 0xC4, + 0x35, 0x01, 0xC4, 0x26, 0x01, 0xC4, 0x17, 0x01, + 0xC4, 0x08, 0x01, 0xC3, 0xEA, 0xC3, 0xDB, 0xC3, + 0xCC, 0xC3, 0xBD, 0xC3, 0xAE, 0xC3, 0x9F, 0xC3, + 0x48, 0xC4, 0x35, 0x01, 0xC3, 0x52, 0xC4, 0x35, + 0x01, 0xC3, 0x5C, 0xE5, 0xAA, 0x16, 0x8C, 0x54, + 0x65, 0x78, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, + 0x5F, 0x5F, 0x30, 0x8C, 0x54, 0x65, 0x78, 0x74, + 0x56, 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x31, 0x8C, 0x54, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6C, - 0x75, 0x65, 0x5F, 0x5F, 0x31, 0x8C, 0x54, 0x65, + 0x75, 0x65, 0x5F, 0x5F, 0x32, 0x8C, 0x54, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x5F, - 0x5F, 0x32, 0x8C, 0x54, 0x65, 0x78, 0x74, 0x56, - 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x33, 0x8C, + 0x5F, 0x33, 0x8C, 0x54, 0x65, 0x78, 0x74, 0x56, + 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x34, 0x8C, 0x54, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6C, 0x75, - 0x65, 0x5F, 0x5F, 0x34, 0x8C, 0x54, 0x65, 0x78, + 0x65, 0x5F, 0x5F, 0x35, 0x8C, 0x54, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, - 0x35, 0x8C, 0x54, 0x65, 0x78, 0x74, 0x56, 0x61, - 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x36, 0x8C, 0x54, + 0x36, 0x8C, 0x54, 0x65, 0x78, 0x74, 0x56, 0x61, + 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x37, 0x8C, 0x54, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, - 0x5F, 0x5F, 0x37, 0x8C, 0x54, 0x65, 0x78, 0x74, - 0x56, 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x38, - 0x8C, 0x54, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6C, - 0x75, 0x65, 0x5F, 0x5F, 0x39, 0x86, 0x76, 0x61, - 0x6C, 0x75, 0x65, 0x33, 0xC4, 0xE5, 0x01, 0xC4, - 0xE5, 0x01, 0xC4, 0xD8, 0x01, 0xC4, 0xCB, 0x01, - 0xC4, 0xBE, 0x01, 0xC4, 0xA4, 0x01, 0xC4, 0x97, - 0x01, 0xC4, 0x8A, 0x01, 0xC4, 0x7D, 0x01, 0xC4, - 0x70, 0x01, 0xC4, 0x63, 0x01, 0xC3, 0x65, 0xC4, - 0xE5, 0x01, 0xC3, 0x6F, 0xC4, 0xE5, 0x01, 0xC3, - 0x2D, 0xE2, 0xA0, 0x8B, 0x42, 0x72, 0x6F, 0x77, - 0x6E, 0x44, 0x6F, 0x67, 0x5F, 0x5F, 0x30, 0x8B, + 0x5F, 0x5F, 0x38, 0x8C, 0x54, 0x65, 0x78, 0x74, + 0x56, 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x5F, 0x39, + 0x86, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x33, 0xC4, + 0xE8, 0x01, 0xC4, 0xE8, 0x01, 0xC4, 0xDB, 0x01, + 0xC4, 0xCE, 0x01, 0xC4, 0xC1, 0x01, 0xC4, 0xA7, + 0x01, 0xC4, 0x9A, 0x01, 0xC4, 0x8D, 0x01, 0xC4, + 0x80, 0x01, 0xC4, 0x73, 0x01, 0xC4, 0x66, 0x01, + 0xC3, 0x66, 0xC4, 0xE8, 0x01, 0xC3, 0x70, 0xC4, + 0xE8, 0x01, 0xC3, 0x2E, 0xE5, 0xA0, 0x16, 0x8B, 0x42, 0x72, 0x6F, 0x77, 0x6E, 0x44, 0x6F, 0x67, - 0x5F, 0x5F, 0x31, 0x8B, 0x42, 0x72, 0x6F, 0x77, - 0x6E, 0x44, 0x6F, 0x67, 0x5F, 0x5F, 0x32, 0x8B, + 0x5F, 0x5F, 0x30, 0x8B, 0x42, 0x72, 0x6F, 0x77, + 0x6E, 0x44, 0x6F, 0x67, 0x5F, 0x5F, 0x31, 0x8B, 0x42, 0x72, 0x6F, 0x77, 0x6E, 0x44, 0x6F, 0x67, - 0x5F, 0x5F, 0x33, 0x8B, 0x42, 0x72, 0x6F, 0x77, - 0x6E, 0x44, 0x6F, 0x67, 0x5F, 0x5F, 0x34, 0x8B, + 0x5F, 0x5F, 0x32, 0x8B, 0x42, 0x72, 0x6F, 0x77, + 0x6E, 0x44, 0x6F, 0x67, 0x5F, 0x5F, 0x33, 0x8B, 0x42, 0x72, 0x6F, 0x77, 0x6E, 0x44, 0x6F, 0x67, - 0x5F, 0x5F, 0x35, 0x8B, 0x42, 0x72, 0x6F, 0x77, - 0x6E, 0x44, 0x6F, 0x67, 0x5F, 0x5F, 0x36, 0x8B, + 0x5F, 0x5F, 0x34, 0x8B, 0x42, 0x72, 0x6F, 0x77, + 0x6E, 0x44, 0x6F, 0x67, 0x5F, 0x5F, 0x35, 0x8B, 0x42, 0x72, 0x6F, 0x77, 0x6E, 0x44, 0x6F, 0x67, - 0x5F, 0x5F, 0x37, 0x8B, 0x42, 0x72, 0x6F, 0x77, - 0x6E, 0x44, 0x6F, 0x67, 0x5F, 0x5F, 0x38, 0x8B, + 0x5F, 0x5F, 0x36, 0x8B, 0x42, 0x72, 0x6F, 0x77, + 0x6E, 0x44, 0x6F, 0x67, 0x5F, 0x5F, 0x37, 0x8B, 0x42, 0x72, 0x6F, 0x77, 0x6E, 0x44, 0x6F, 0x67, - 0x5F, 0x5F, 0x39, 0x86, 0x76, 0x61, 0x6C, 0x75, - 0x65, 0x34, 0xC4, 0x93, 0x02, 0xC4, 0x93, 0x02, - 0xC4, 0x87, 0x02, 0xC4, 0x7B, 0x02, 0xC4, 0x6F, - 0x02, 0xC4, 0x57, 0x02, 0xC4, 0x4B, 0x02, 0xC4, - 0x3F, 0x02, 0xC4, 0x33, 0x02, 0xC4, 0x27, 0x02, - 0xC4, 0x1B, 0x02, 0x89, 0x70, 0x72, 0x6F, 0x70, - 0x65, 0x72, 0x74, 0x79, 0x41, 0x86, 0x76, 0x61, - 0x6C, 0x75, 0x65, 0x41, 0xC4, 0xBB, 0x02, 0xC4, - 0xC5, 0x02 + 0x5F, 0x5F, 0x38, 0x8B, 0x42, 0x72, 0x6F, 0x77, + 0x6E, 0x44, 0x6F, 0x67, 0x5F, 0x5F, 0x39, 0x86, + 0x76, 0x61, 0x6C, 0x75, 0x65, 0x34, 0xC4, 0x97, + 0x02, 0xC4, 0x97, 0x02, 0xC4, 0x8B, 0x02, 0xC4, + 0x7F, 0x02, 0xC4, 0x73, 0x02, 0xC4, 0x5B, 0x02, + 0xC4, 0x4F, 0x02, 0xC4, 0x43, 0x02, 0xC4, 0x37, + 0x02, 0xC4, 0x2B, 0x02, 0xC4, 0x1F, 0x02, 0x89, + 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x41, 0x86, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x41, + 0xC4, 0xBF, 0x02, 0xC4, 0xC9, 0x02 }; this.VerifyWriter(tokensToWrite, binaryPayload); @@ -1600,7 +1600,7 @@ public void ReferenceStringsTest() #endregion #region Array [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void EmptyArrayTest() { string expectedString = "[]"; @@ -1622,7 +1622,7 @@ public void EmptyArrayTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void SingleItemArrayTest() { string expectedString = "[true]"; @@ -1646,7 +1646,7 @@ public void SingleItemArrayTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void IntArrayTest() { string expectedString = "[-2,-1,0,1,2]"; @@ -1686,7 +1686,7 @@ public void IntArrayTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void NumberArrayTest() { string expectedString = "[15,22,0.1,-0.073,7.70001E+91]"; @@ -1726,7 +1726,7 @@ public void NumberArrayTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void BooleanArrayTest() { string expectedString = "[true,false]"; @@ -1754,7 +1754,67 @@ public void BooleanArrayTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] + public void BooleanLargeArrayTest() + { + string expectedString = "[true,false,true,false,true,false,false,false,true,false,true,false,true,true,true,false,true]"; + byte[] binaryOutput = + { + BinaryFormat, + JsonBinaryEncoding.TypeMarker.Array1ByteLengthAndCount, + // length + 17, + // count + 17, + JsonBinaryEncoding.TypeMarker.True, + JsonBinaryEncoding.TypeMarker.False, + JsonBinaryEncoding.TypeMarker.True, + JsonBinaryEncoding.TypeMarker.False, + JsonBinaryEncoding.TypeMarker.True, + JsonBinaryEncoding.TypeMarker.False, + JsonBinaryEncoding.TypeMarker.False, + JsonBinaryEncoding.TypeMarker.False, + JsonBinaryEncoding.TypeMarker.True, + JsonBinaryEncoding.TypeMarker.False, + JsonBinaryEncoding.TypeMarker.True, + JsonBinaryEncoding.TypeMarker.False, + JsonBinaryEncoding.TypeMarker.True, + JsonBinaryEncoding.TypeMarker.True, + JsonBinaryEncoding.TypeMarker.True, + JsonBinaryEncoding.TypeMarker.False, + JsonBinaryEncoding.TypeMarker.True, + }; + + JsonToken[] tokensToWrite = + { + JsonToken.ArrayStart(), + JsonToken.Boolean(true), + JsonToken.Boolean(false), + JsonToken.Boolean(true), + JsonToken.Boolean(false), + JsonToken.Boolean(true), + JsonToken.Boolean(false), + JsonToken.Boolean(false), + JsonToken.Boolean(false), + JsonToken.Boolean(true), + JsonToken.Boolean(false), + JsonToken.Boolean(true), + JsonToken.Boolean(false), + JsonToken.Boolean(true), + JsonToken.Boolean(true), + JsonToken.Boolean(true), + JsonToken.Boolean(false), + JsonToken.Boolean(true), + JsonToken.ArrayEnd(), + }; + + this.VerifyWriter(tokensToWrite, expectedString); + this.VerifyWriter(tokensToWrite, binaryOutput); + this.VerifyWriter(tokensToWrite, binaryOutput, null, false); + } + + [TestMethod] + [Owner("mayapainter")] public void StringArrayTest() { string expectedString = @"[""Hello"",""World"",""Bye""]"; @@ -1794,7 +1854,61 @@ public void StringArrayTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] + public void StringLargeArrayTest() + { + int stringCount = 20; + + string expectedString = @"["; + for (int index = 0; index < stringCount; index++) + { + if (index == 0) + { + expectedString += @"""Hello0"""; + } + else + { + expectedString += @",""Hello" + index + @""""; + } + + } + expectedString += "]"; + + List binaryOutputBuilder = new List + { + new byte[] { BinaryFormat, JsonBinaryEncoding.TypeMarker.Array1ByteLengthAndCount } + }; + + List strings = new List(); + + for (int index = 0; index < stringCount; index++) + { + string value = "Hello" + index; + strings.Add(new byte[] { (byte)(JsonBinaryEncoding.TypeMarker.EncodedStringLengthMin + value.Length) }); + strings.Add(Encoding.UTF8.GetBytes(value)); + } + byte[] stringBytes = strings.SelectMany(x => x).ToArray(); + + binaryOutputBuilder.Add(new byte[] { (byte)stringBytes.Length }); + binaryOutputBuilder.Add(new byte[] { (byte)stringCount }); + binaryOutputBuilder.Add(stringBytes); + byte[] binaryOutput = binaryOutputBuilder.SelectMany(x => x).ToArray(); + + JsonToken[] tokensToWrite = new JsonToken[stringCount + 2]; + tokensToWrite[0] = JsonToken.ArrayStart(); + for (int index = 1; index < stringCount + 1; index++) + { + tokensToWrite[index] = JsonToken.String("Hello" + (index - 1)); + } + tokensToWrite[stringCount + 1] = JsonToken.ArrayEnd(); + + this.VerifyWriter(tokensToWrite, expectedString); + this.VerifyWriter(tokensToWrite, binaryOutput); + this.VerifyWriter(tokensToWrite, binaryOutput, null, false); + } + + [TestMethod] + [Owner("mayapainter")] public void NullArrayTest() { string expectedString = "[null,null,null]"; @@ -1824,7 +1938,52 @@ public void NullArrayTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] + public void NullLargeArrayTest() + { + int nullCount = 300; + + string expectedString = "["; + for (int index = 0; index < nullCount; index++) + { + expectedString += (index == 0) ? "null" : ",null"; + } + expectedString += "]"; + + List binaryOutputBuilder = new List + { + new byte[] { BinaryFormat, JsonBinaryEncoding.TypeMarker.Array2ByteLengthAndCount }, + // length + BitConverter.GetBytes((ushort)nullCount), + // count + BitConverter.GetBytes((ushort)nullCount), + }; + + byte[] elementsBytes = new byte[nullCount]; + + for (int index = 0; index < nullCount; index++) + { + elementsBytes[index] = JsonBinaryEncoding.TypeMarker.Null; + } + + binaryOutputBuilder.Add(elementsBytes); + byte[] binaryOutput = binaryOutputBuilder.SelectMany(x => x).ToArray(); + + JsonToken[] tokensToWrite = new JsonToken[nullCount + 2]; + tokensToWrite[0] = JsonToken.ArrayStart(); + for (int index = 1; index < nullCount + 1; index++) + { + tokensToWrite[index] = JsonToken.Null(); + } + tokensToWrite[nullCount + 1] = JsonToken.ArrayEnd(); + + this.VerifyWriter(tokensToWrite, expectedString); + this.VerifyWriter(tokensToWrite, binaryOutput); + this.VerifyWriter(tokensToWrite, binaryOutput, null, false); + } + + [TestMethod] + [Owner("mayapainter")] public void ObjectArrayTest() { string expectedString = "[{},{}]"; @@ -1854,7 +2013,7 @@ public void ObjectArrayTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void AllPrimitiveArrayTest() { string expectedString = "[0,0,-1,-1.1,1,2,\"hello\",null,true,false]"; @@ -1905,7 +2064,7 @@ public void AllPrimitiveArrayTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void NestedArrayTest() { string expectedString = "[[],[]]"; @@ -1935,7 +2094,7 @@ public void NestedArrayTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void StrangeNumberArrayTest() { string expectedString = @"[ @@ -1994,7 +2153,7 @@ public void StrangeNumberArrayTest() #endregion Array #region Escaping [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void EscapeCharacterTest() { /// @@ -2026,7 +2185,7 @@ public void EscapeCharacterTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void UnicodeEscapeTest() { // You don't have to escape a regular unicode character @@ -2042,7 +2201,7 @@ public void UnicodeEscapeTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void TwoAdjacentUnicodeCharactersTest() { // 2 unicode escape characters that are not surrogate pairs @@ -2059,7 +2218,7 @@ public void TwoAdjacentUnicodeCharactersTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void UnicodeTest() { // You don't have to escape a regular unicode character @@ -2083,7 +2242,7 @@ public void UnicodeTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void EmojiUTF32Test() { // You don't have to escape a regular unicode character @@ -2107,7 +2266,7 @@ public void EmojiUTF32Test() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void ControlCharacterTests() { HashSet escapeCharacters = new HashSet { '\b', '\f', '\n', '\r', '\t', '\\', '"', '/' }; @@ -2132,7 +2291,7 @@ public void ControlCharacterTests() #endregion #region Objects [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void EmptyObjectTest() { string expectedString = "{}"; @@ -2154,7 +2313,7 @@ public void EmptyObjectTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void SimpleObjectTest() { string expectedString = "{\"GlossDiv\":10,\"title\": \"example glossary\" }"; @@ -2222,7 +2381,7 @@ public void SimpleObjectTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void AllPrimitivesObjectTest() { string expectedString = @"{ @@ -2425,7 +2584,7 @@ public void AllPrimitivesObjectTest() #endregion #region Exceptions [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void ArrayNotStartedTest() { JsonToken[] tokensToWrite = @@ -2438,7 +2597,7 @@ public void ArrayNotStartedTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void ObjectNotStartedTest() { JsonToken[] tokensToWrite = @@ -2451,7 +2610,7 @@ public void ObjectNotStartedTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void PropertyArrayOrObjectNotStartedTest() { JsonToken[] tokensToWrite = @@ -2466,7 +2625,7 @@ public void PropertyArrayOrObjectNotStartedTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void MissingPropertyTest() { JsonToken[] tokensToWrite = @@ -2481,7 +2640,7 @@ public void MissingPropertyTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void PropertyAlreadyAddedTest() { string duplicateFieldName = "This property is added twice"; @@ -2501,7 +2660,7 @@ public void PropertyAlreadyAddedTest() #endregion #region ExtendedTypes [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void Int8Test() { sbyte[] values = new sbyte[] { sbyte.MinValue, sbyte.MinValue + 1, -1, 0, 1, sbyte.MaxValue, sbyte.MaxValue - 1 }; @@ -2531,7 +2690,7 @@ public void Int8Test() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void Int16Test() { short[] values = new short[] { short.MinValue, short.MinValue + 1, -1, 0, 1, short.MaxValue, short.MaxValue - 1 }; @@ -2561,7 +2720,7 @@ public void Int16Test() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void Int32Test() { int[] values = new int[] { int.MinValue, int.MinValue + 1, -1, 0, 1, int.MaxValue, int.MaxValue - 1 }; @@ -2591,7 +2750,7 @@ public void Int32Test() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void Int64Test() { long[] values = new long[] { long.MinValue, long.MinValue + 1, -1, 0, 1, long.MaxValue, long.MaxValue - 1 }; @@ -2621,7 +2780,7 @@ public void Int64Test() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void UInt32Test() { uint[] values = new uint[] { uint.MinValue, uint.MinValue + 1, 0, 1, uint.MaxValue, uint.MaxValue - 1 }; @@ -2651,7 +2810,7 @@ public void UInt32Test() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void Float32Test() { float[] values = new float[] { float.MinValue, float.MinValue + 1, 0, 1, float.MaxValue, float.MaxValue - 1 }; @@ -2681,7 +2840,7 @@ public void Float32Test() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void Float64Test() { double[] values = new double[] { double.MinValue, double.MinValue + 1, 0, 1, double.MaxValue, double.MaxValue - 1 }; @@ -2711,7 +2870,7 @@ public void Float64Test() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void GuidTest() { Guid[] values = new Guid[] { Guid.Empty, Guid.NewGuid() }; @@ -2741,7 +2900,7 @@ public void GuidTest() } [TestMethod] - [Owner("brchon")] + [Owner("mayapainter")] public void BinaryTest() { { From 459a865d323ce0009520420b4d802a1d0e3bf775 Mon Sep 17 00:00:00 2001 From: Sourabh Jain Date: Wed, 24 May 2023 14:23:56 +0530 Subject: [PATCH 15/39] [Internal] AI Integration or Open Telemetry: Design Document (#3858) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * first draft * redesign * ädd link * updated observability url --- docs/SdkDesign.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/SdkDesign.md b/docs/SdkDesign.md index f3f2ec1581..62d4a751f7 100644 --- a/docs/SdkDesign.md +++ b/docs/SdkDesign.md @@ -186,3 +186,32 @@ flowchart LR ConsistencyWriter --> TCPClient ``` +## Distributed Tracing (Preview) + +For detail about usage of this feature, please see the [Azure Cosmos DB SDK observability](https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/sdk-observability?tabs=dotnet) + +```mermaid +flowchart TD + classDef orange fill:#f96 + classDef blue fill:#6fa8dc + subgraph ClientContextCore + OpenTelemetryRecorderFactory --> CheckFeatureFlag{isDistributedTracing Enabled?} + CheckFeatureFlag --> |Yes| CreateActivity(Start an Activity or Child activity with specific kind Using DiagnosticScope
and preloaded attributes like containerName, databaseName, operationType) + CreateActivity --> HandlerPipeline + GetResponse --> TriggerDispose(Trigger Dispose of Disagnostic Scope) + TriggerDispose --> CheckLatencyThreshold{Is high latency/errored response?} + CheckLatencyThreshold -- Yes --> GenerateTraceEvent(Generate Warning or Error Trace Event With Request Diagnostics) --> StopActivity + CheckLatencyThreshold -- No --> StopActivity + StopActivity --> SendResponse(Send Response to Caller):::blue + end + OperationRequest[Operation Request]:::blue --> ClientContextCore + subgraph Application + OperationCall(User Application):::orange + end + OperationCall(User Application):::orange --> OperationRequest + CheckFeatureFlag --> |No| HandlerPipeline + HandlerPipeline --> OtherLogic(Goes through TCP/HTTP calls
based on Connection Mode):::blue + OtherLogic --> GetResponse(Get Response for the request) + SendResponse --> OperationCall + +``` \ No newline at end of file From 09e6facad468954b9ac9d51452a39fc207b5035f Mon Sep 17 00:00:00 2001 From: Nalu Tripician <27316859+NaluTripician@users.noreply.github.com> Date: Thu, 25 May 2023 11:55:41 -0400 Subject: [PATCH 16/39] Benchmarking: Adds use of ARM Templates for benchmarking (#3838) * initial commit DONT REVIEW * fixes and documentation * Apply suggestions from code review Co-authored-by: Matias Quaranta * requested changes * Apply suggestions from code review Co-authored-by: Matias Quaranta * name changes * readme changes * nits + changing case of parameters file --------- Co-authored-by: Matias Quaranta --- .../Tools/Benchmark/ARMTemplate/README.md | 73 +++++++++ .../Tools/Benchmark/ARMTemplate/arm1.png | Bin 0 -> 73958 bytes .../Tools/Benchmark/ARMTemplate/arm2.png | Bin 0 -> 85941 bytes .../Tools/Benchmark/ARMTemplate/arm3.png | Bin 0 -> 15913 bytes .../ARMTemplate/benchmarkTemplate.json | 154 ++++++++++++++++++ .../Benchmark/ARMTemplate/parameters.json | 39 +++++ .../Tools/Benchmark/ARMTemplate/run.sh | 2 + 7 files changed, 268 insertions(+) create mode 100644 Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/README.md create mode 100644 Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/arm1.png create mode 100644 Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/arm2.png create mode 100644 Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/arm3.png create mode 100644 Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/benchmarkTemplate.json create mode 100644 Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/parameters.json create mode 100644 Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/run.sh diff --git a/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/README.md b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/README.md new file mode 100644 index 0000000000..f829b79bc6 --- /dev/null +++ b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/README.md @@ -0,0 +1,73 @@ +# Running benchmarks on ARM Tempaltes + +[ARM Templates](https://learn.microsoft.com/azure/azure-resource-manager/templates/) makes executing the Azure Cosmos DB SDK Benchmark extremely easy, with very few steps involved. Plus, it lets you test and evaluate performance quickly on multiple resource (CPU/RAM) configurations and across multiple Azure regions seamlessly. + +For the below steps, you will **need an Azure Subscription**. + +## Steps + +### Deploy with one click + +Just click in the **Deploy to Azure button** and it will guide you into automatically configuring, deploying, and running the benchmark. + +[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-cosmos-dotnet-v3%2Fmaster%2FARMBenchmarking%2FMicrosoft.Azure.Cosmos.Samples%2FTools%2FBenchmark%2FARMTemplate%2FbenchmarkTemplate.json) + +Please populate the `endpoint` and `key` for your Azure Cosmos DB account. You can [obtain these from the Azure Portal or through CLI](https://learn.microsoft.com/azure/cosmos-db/secure-access-to-data?tabs=using-primary-key#primary-keys). + +Optionally you can modify the other parameters, such as the `throughput` for the container that will get created, the amount of `documents` to insert, the degree of `parallelism`, and if you want the container to be deleted after the benchmark is run (`cleanUpOnFinish` `true/false`). + +Additionally, the template lets you customize the size of the container instance that will be deployed, which you can make as similar as possible to the instance you will be running in production to simulate results. + +### Deploy with Azure CLI + +First open the `parameters.json` file and populate the `endpoint` and `key` for your Azure Cosmos DB account. You can [obtain these from the Azure Portal or through CLI](https://learn.microsoft.com/azure/cosmos-db/secure-access-to-data?tabs=using-primary-key#primary-keys). + + Next, modify the other parameters, such as the `throughput` for the container that will get created, the amount of `documents` to insert, the degree of `parallelism`, and if you want the container to be deleted after the benchmark is run (`cleanUpOnFinish` `true/false`). + + If you're deploying the template to a resource group that does not exist you must create one first. Please note that the name of the resource group can only include alphanumeric characters, periods, underscores, hyphens, and parenthesis. It can be up to 90 characters. The name can't end in a period. To create a resource group use the following command: + ```bash + az group create --name $resourceGroupName --location $location + ``` + + To run the benchmark first navigate to the directory the `benchmarkTemplate.json` and `parameters.json` files are stored and use the Azure CLI with the following command: + ```bash + az deployment group create --resource-group $resourceGroupName --template-file benchmarkTemplate.json --parameters @parameters.json + ``` + +### The Benchmark + +Once you create the benchmark, it will do the following: + +1. It will create a Linux container named `cosmosdbsdkperf` and provision an image with NET 6 inside an instance with the configured CPU and RAM. +![Provisioned Container Instance](./arm1.png) +2. Clone the Azure Cosmos DB SDK repository with the required files +3. Execute the benchmark and provide output logs +4. Stop the instance + +While the container instance is running (or after), you can either use the Azure Portal or the Azure CLI to check the benchmark results with: + +```bash +az container logs -g $resourceGroupName -n cosmosdbsdkperf +``` + +Additionally you can check the logs in the Azure Portal by navigating to the container instance and clicking on the **Logs** tab. + +The logs will show the information, including the initial parameters: + +![Initial benchmark parameters](./arm2.png) + +And the results: + +![Benchmark results](./arm3.png) + +### Clean up + +If you want to remove the Benchmark instance, ypu can delete the container from the Azure Portal. You can also do so from the Azure CLI: + +```bash +az container delete -g $resourceGroupName -n cosmosdbsdkperf +``` + +You can also delete the Benchmark instance from the Azure Portal by navigating to the container instance and clicking on the **Delete** button. + +**Remember to delete the Database and Container** that were created for the Benchmark in your CosmosDB account if you did not use the `CLEANUPFINISH` parameter as `true`. diff --git a/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/arm1.png b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/arm1.png new file mode 100644 index 0000000000000000000000000000000000000000..c740b8b3d7528c4f7232b24da55fee45cdb4f6c1 GIT binary patch literal 73958 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%0D|IlC+?d0-n`+H&eX$k1t(WTw;An|l8=kkjqf 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 ADF6Tf literal 0 HcmV?d00001 diff --git a/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/benchmarkTemplate.json b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/benchmarkTemplate.json new file mode 100644 index 0000000000..13bb3070da --- /dev/null +++ b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/benchmarkTemplate.json @@ -0,0 +1,154 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "endpoint": { + "type": "string", + "metadata": { + "description": "Your account endpoint" + } + }, + "key": { + "type": "securestring", + "metadata": { + "description": "Your account key" + } + }, + "throughput": { + "type": "string", + "metadata": { + "description": "The throughput for the container." + } + }, + "documents": { + "type": "string", + "metadata": { + "description": "The amount of items to insert." + } + }, + "parallelism": { + "type": "string", + "metadata": { + "description": "The degree of parallelism." + }, + "defaultValue": "-1" + }, + "cleanUpOnFinish": { + "type": "string", + "metadata": { + "description": "Whether to delete the container after the benchmark is run." + }, + "defaultValue": "false" + }, + "containerGroupName": { + "type": "string", + "metadata": { + "description": "Name for the container group" + }, + "defaultValue": "CosmosDBBenchmark" + }, + "containerName": { + "type": "string", + "metadata": { + "description": "Name for the container" + }, + "defaultValue": "cosmosdbsdkperf" + }, + "volumeName": { + "type": "string", + "metadata": { + "description": "Name for the gitRepo volume" + }, + "defaultValue": "cosmosdbsdk" + }, + "port": { + "type": "string", + "metadata": { + "description": "Port to open on the container and the public IP address." + }, + "defaultValue": "80" + }, + "cpuCores": { + "type": "string", + "metadata": { + "description": "The number of CPU cores to allocate to the container." + }, + "defaultValue": "4" + }, + "memoryInGb": { + "type": "string", + "metadata": { + "description": "The amount of memory to allocate to the container in gigabytes." + }, + "defaultValue": "8" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Location for all resources." + } + } + }, + "variables": {}, + "resources": [ + { + "name": "[parameters('containerGroupName')]", + "type": "Microsoft.ContainerInstance/containerGroups", + "apiVersion": "2020-11-01", + "location": "[parameters('location')]", + "properties": { + "containers": [ + { + "name": "[parameters('containerName')]", + "properties": { + "image": "mcr.microsoft.com/dotnet/sdk:6.0", + "ports": [ + { + "port": "[parameters('port')]" + } + ], + "resources": { + "requests": { + "cpu": "[parameters('cpuCores')]", + "memoryInGB": "[parameters('memoryInGb')]" + } + }, + "volumeMounts": [ + { + "name": "[parameters('volumeName')]", + "mountPath": "/mnt/gitrepos/", + "readOnly": false + } + ], + "command": [ + "/bin/bash", + "-c", + "[concat('cd /mnt/gitrepos/azure-cosmos-dotnet-v3/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate;export ENDPOINT=\"', parameters('endpoint'),'\";export KEY=\"', parameters('key'),'\";export THROUGHPUT=\"', parameters('throughput'),'\";export DOCUMENTS=\"', parameters('documents'),'\";export PARALLELISM=\"', parameters('parallelism'),'\";export CLEANUPFINISH=\"', parameters('cleanUpOnFinish'),'\";chmod +x run.sh;./run.sh')]" + ] + } + } + ], + "osType": "Linux", + "restartPolicy": "Never", + "ipAddress": { + "type": "Public", + "ports": [ + { + "protocol": "TCP", + "port": "[parameters('port')]" + } + ] + }, + "volumes": [ + { + "name": "[parameters('volumeName')]", + "gitRepo": { + "repository": "https://github.com/Azure/azure-cosmos-dotnet-v3" + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/parameters.json b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/parameters.json new file mode 100644 index 0000000000..f8b1983b33 --- /dev/null +++ b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/parameters.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "endpoint": { + "value": "" + }, + "key": { + "value": "" + }, + "throughput": { + "value": "" + }, + "documents": { + "value": "" + }, + "parallelism": { + "value": "-1" + }, + "cleanUpOnFinish": { + "value": "false" + }, + "containergroupname": { + "value": "CosmosDBBenchmark" + }, + "containername": { + "value": "cosmosdbsdkperf" + }, + "volumename": { + "value": "cosmosdbsdk" + }, + "cpuCores": { + "value": "4" + }, + "memoryInGb": { + "value": "8" + } + } +} \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/run.sh b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/run.sh new file mode 100644 index 0000000000..3b8855a95f --- /dev/null +++ b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/run.sh @@ -0,0 +1,2 @@ +cd .. +dotnet run -c Release -e ${ENDPOINT} -k ${KEY} -t ${THROUGHPUT} -n ${DOCUMENTS} --pl ${PARALLELISM} --CleanupOnFinish ${CLEANUPFINISH} -w InsertV2BenchmarkOperation \ No newline at end of file From 83bad122481303a66e7a1ae9a84ec9fbdb561aee Mon Sep 17 00:00:00 2001 From: Nalu Tripician <27316859+NaluTripician@users.noreply.github.com> Date: Fri, 26 May 2023 13:51:46 -0400 Subject: [PATCH 17/39] Update README.md (#3875) URL typo. --- .../Tools/Benchmark/ARMTemplate/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/README.md b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/README.md index f829b79bc6..7821e1eefd 100644 --- a/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/README.md +++ b/Microsoft.Azure.Cosmos.Samples/Tools/Benchmark/ARMTemplate/README.md @@ -10,7 +10,7 @@ For the below steps, you will **need an Azure Subscription**. Just click in the **Deploy to Azure button** and it will guide you into automatically configuring, deploying, and running the benchmark. -[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-cosmos-dotnet-v3%2Fmaster%2FARMBenchmarking%2FMicrosoft.Azure.Cosmos.Samples%2FTools%2FBenchmark%2FARMTemplate%2FbenchmarkTemplate.json) +[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-cosmos-dotnet-v3%2Fmaster%2FMicrosoft.Azure.Cosmos.Samples%2FTools%2FBenchmark%2FARMTemplate%2FbenchmarkTemplate.json) Please populate the `endpoint` and `key` for your Azure Cosmos DB account. You can [obtain these from the Azure Portal or through CLI](https://learn.microsoft.com/azure/cosmos-db/secure-access-to-data?tabs=using-primary-key#primary-keys). From c5ef47e1e70fab32ff1aa81b370607d8b9b7fbb8 Mon Sep 17 00:00:00 2001 From: Sourabh Jain Date: Sat, 27 May 2023 23:40:23 +0530 Subject: [PATCH 18/39] moved to new file (#3876) --- docs/SdkDesign.md | 29 ----------------------------- docs/observability.md | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 29 deletions(-) create mode 100644 docs/observability.md diff --git a/docs/SdkDesign.md b/docs/SdkDesign.md index 62d4a751f7..f3f2ec1581 100644 --- a/docs/SdkDesign.md +++ b/docs/SdkDesign.md @@ -186,32 +186,3 @@ flowchart LR ConsistencyWriter --> TCPClient ``` -## Distributed Tracing (Preview) - -For detail about usage of this feature, please see the [Azure Cosmos DB SDK observability](https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/sdk-observability?tabs=dotnet) - -```mermaid -flowchart TD - classDef orange fill:#f96 - classDef blue fill:#6fa8dc - subgraph ClientContextCore - OpenTelemetryRecorderFactory --> CheckFeatureFlag{isDistributedTracing Enabled?} - CheckFeatureFlag --> |Yes| CreateActivity(Start an Activity or Child activity with specific kind Using DiagnosticScope
and preloaded attributes like containerName, databaseName, operationType) - CreateActivity --> HandlerPipeline - GetResponse --> TriggerDispose(Trigger Dispose of Disagnostic Scope) - TriggerDispose --> CheckLatencyThreshold{Is high latency/errored response?} - CheckLatencyThreshold -- Yes --> GenerateTraceEvent(Generate Warning or Error Trace Event With Request Diagnostics) --> StopActivity - CheckLatencyThreshold -- No --> StopActivity - StopActivity --> SendResponse(Send Response to Caller):::blue - end - OperationRequest[Operation Request]:::blue --> ClientContextCore - subgraph Application - OperationCall(User Application):::orange - end - OperationCall(User Application):::orange --> OperationRequest - CheckFeatureFlag --> |No| HandlerPipeline - HandlerPipeline --> OtherLogic(Goes through TCP/HTTP calls
based on Connection Mode):::blue - OtherLogic --> GetResponse(Get Response for the request) - SendResponse --> OperationCall - -``` \ No newline at end of file diff --git a/docs/observability.md b/docs/observability.md new file mode 100644 index 0000000000..b74b55cd21 --- /dev/null +++ b/docs/observability.md @@ -0,0 +1,36 @@ +# .NET SDK Observability Feature Design + +## Distributed Tracing (Preview) + +**Source to capture operation level activities**: _Azure.Cosmos.Operation_\ +**Source to capture event with request diagnostics** : _Azure-Cosmos-Operation-Request-Diagnostics_ + +For detail about usage of this feature, please see the [Azure Cosmos DB SDK observability](https://learn.microsoft.com/azure/cosmos-db/nosql/sdk-observability?tabs=dotnet) + +```mermaid +flowchart TD + classDef orange fill:#f96 + classDef blue fill:#6fa8dc + subgraph ClientContextCore + OpenTelemetryRecorderFactory --> CheckFeatureFlag{isDistributedTracing Enabled?} + CheckFeatureFlag --> |Yes| CreateActivity(Start an Activity or Child activity
with preloaded attributes) + CreateActivity --> HandlerPipeline{Handler Pipeline} + GetResponse --> TriggerDispose(Trigger Dispose of Diagnostic Scope) + subgraph Dispose + TriggerDispose --> CheckLatencyThreshold{Is high latency/errored response?} + CheckLatencyThreshold -- Yes --> GenerateEvent(Generate Warning or Error Event With Request Diagnostics) --> StopActivity + CheckLatencyThreshold -- No --> StopActivity + end + StopActivity --> SendResponse(Send Response to Caller):::blue + end + OperationRequest[Operation Request]:::blue --> ClientContextCore + subgraph Application + OperationCall(User Application):::orange + end + OperationCall(User Application):::orange --> OperationRequest + CheckFeatureFlag --> |No| HandlerPipeline + HandlerPipeline --> OtherLogic(Goes through TCP/HTTP calls
based on Connection Mode):::blue + OtherLogic --> GetResponse(Get Response for the request) + SendResponse --> OperationCall + +``` \ No newline at end of file From ee7f86ddd2ea141103c0d57c82e8ff429cd1f6ed Mon Sep 17 00:00:00 2001 From: Sourabh Jain Date: Tue, 30 May 2023 20:16:32 +0530 Subject: [PATCH 19/39] Direct Package Upgrade 3.31.0: Refactors code to make compatible with latest direct (#3877) * upgrade to 3.31.0 * add more regions * enable dt for operations * updated contract file --- Directory.Build.props | 2 +- Microsoft.Azure.Cosmos/src/DocumentClient.cs | 7 ++++++- Microsoft.Azure.Cosmos/src/Regions.cs | 10 ++++++++++ .../src/Routing/GatewayAddressCache.cs | 2 +- .../Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs | 4 ++-- .../Contracts/DotNetSDKAPI.json | 10 ++++++++++ 6 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index ef1ffd2e01..52e815227a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,7 +3,7 @@ 3.34.0 3.34.0 preview - 3.30.8 + 3.31.0 2.0.1 2.0.1 preview diff --git a/Microsoft.Azure.Cosmos/src/DocumentClient.cs b/Microsoft.Azure.Cosmos/src/DocumentClient.cs index 451166618d..068bb5b857 100644 --- a/Microsoft.Azure.Cosmos/src/DocumentClient.cs +++ b/Microsoft.Azure.Cosmos/src/DocumentClient.cs @@ -6644,6 +6644,11 @@ private void InitializeDirectConnectivity(IStoreClientFactory storeClientFactory } else { + Documents.Telemetry.DistributedTracingOptions distributedTracingOptions = new () + { + IsDistributedTracingEnabled = this.isDistributedTracingEnabled + }; + StoreClientFactory newClientFactory = new StoreClientFactory( this.ConnectionPolicy.ConnectionProtocol, (int)this.ConnectionPolicy.RequestTimeout.TotalSeconds, @@ -6667,7 +6672,7 @@ private void InitializeDirectConnectivity(IStoreClientFactory storeClientFactory addressResolver: this.AddressResolver, rntbdMaxConcurrentOpeningConnectionCount: this.rntbdMaxConcurrentOpeningConnectionCount, remoteCertificateValidationCallback: this.remoteCertificateValidationCallback, - isDistributedTracingEnabled: this.isDistributedTracingEnabled); + distributedTracingOptions: distributedTracingOptions); if (this.transportClientHandlerFactory != null) { diff --git a/Microsoft.Azure.Cosmos/src/Regions.cs b/Microsoft.Azure.Cosmos/src/Regions.cs index 853bc48267..666ec0435b 100644 --- a/Microsoft.Azure.Cosmos/src/Regions.cs +++ b/Microsoft.Azure.Cosmos/src/Regions.cs @@ -349,5 +349,15 @@ public static class Regions /// Name of the Azure Poland Central region in the Azure Cosmos DB service. ///
public const string PolandCentral = "Poland Central"; + + /// + /// Name of the Azure Malaysia South region in the Azure Cosmos DB service. + /// + public const string MalaysiaSouth = "Malaysia South"; + + /// + /// Name of the Azure Italy North region in the Azure Cosmos DB service. + /// + public const string ItalyNorth = "Italy North"; } } diff --git a/Microsoft.Azure.Cosmos/src/Routing/GatewayAddressCache.cs b/Microsoft.Azure.Cosmos/src/Routing/GatewayAddressCache.cs index d99be609ea..182243ec40 100644 --- a/Microsoft.Azure.Cosmos/src/Routing/GatewayAddressCache.cs +++ b/Microsoft.Azure.Cosmos/src/Routing/GatewayAddressCache.cs @@ -85,7 +85,7 @@ public GatewayAddressCache( GatewayAddressCache.ProtocolString(this.protocol)); this.openConnectionsHandler = openConnectionsHandler; - this.isReplicaAddressValidationEnabled = Helpers.GetEnvironmentVariableAsBool( + this.isReplicaAddressValidationEnabled = Helpers.GetEnvironmentVariable( name: Constants.EnvironmentVariables.ReplicaConnectivityValidationEnabled, defaultValue: false); } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs index 366cc68811..4773c7de96 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs @@ -548,11 +548,11 @@ internal static CustomListener ConfigureOpenTelemetryAndCustomListeners() // Open Telemetry Listener Util.OTelTracerProvider = Sdk.CreateTracerProviderBuilder() .AddCustomOtelExporter() // use any exporter here - .AddSource($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.*") + .AddSource($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation") .Build(); // Custom Listener - Util.TestListener = new CustomListener($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.*", "Azure-Cosmos-Operation-Request-Diagnostics"); + Util.TestListener = new CustomListener($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", "Azure-Cosmos-Operation-Request-Diagnostics"); return Util.TestListener; diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json index 074be1ee37..e5b95a7ed9 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json @@ -6680,6 +6680,11 @@ "Attributes": [], "MethodInfo": "System.String GermanyWestCentral;IsInitOnly:False;IsStatic:True;" }, + "System.String ItalyNorth": { + "Type": "Field", + "Attributes": [], + "MethodInfo": "System.String ItalyNorth;IsInitOnly:False;IsStatic:True;" + }, "System.String JapanEast": { "Type": "Field", "Attributes": [], @@ -6710,6 +6715,11 @@ "Attributes": [], "MethodInfo": "System.String KoreaSouth;IsInitOnly:False;IsStatic:True;" }, + "System.String MalaysiaSouth": { + "Type": "Field", + "Attributes": [], + "MethodInfo": "System.String MalaysiaSouth;IsInitOnly:False;IsStatic:True;" + }, "System.String NorthCentralUS": { "Type": "Field", "Attributes": [], From 89cc257324d8caf8fe9826c7dfebf88add7ad42c Mon Sep 17 00:00:00 2001 From: jiajunpeng-msft <32749342+jiajunpeng-msft@users.noreply.github.com> Date: Wed, 31 May 2023 09:12:59 -0700 Subject: [PATCH 20/39] [Preview] Integrated cache: Adds BypassIntegratedCache to DedicatedGatewayRequestOptions (#3836) * Integrated cache: Add BypassIntegratedCache to DedicatedGatewayRequestOptions Currently, integrated cache is used by default for Dedicated Gateway. Customers cannot skip cache for particular requests or data unless they shift to multi-tenant Gateway,which will lose the benefits of Dedicated Gateway. For customers to have more control over integrated cache, we're introducing a new "RequestOption" called "BypassIntegratedCache". This option will allow the customer to decide whether to use integrated cache for each request or not. If this value is set to true, the item/query will be served from backend and won't be cached in Dedicated Gateway. * Move this feature to public preview * Address comments 1. Add more tests 2. Add more detail and example code for BypassIntegratedCache * Revert changes in EncryptionCustomAPI --------- Co-authored-by: Jiajun Peng Co-authored-by: Matias Quaranta --- .../src/RequestOptions/ItemRequestOptions.cs | 1 + .../src/RequestOptions/QueryRequestOptions.cs | 1 + .../DedicatedGatewayRequestOptions.cs | 42 +++++++++ .../Contracts/DotNetPreviewSDKAPI.json | 25 +++++ .../DedicatedGatewayRequestOptionsTests.cs | 94 +++++++++++++++++++ 5 files changed, 163 insertions(+) create mode 100644 Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Resource/Settings/DedicatedGatewayRequestOptionsTests.cs diff --git a/Microsoft.Azure.Cosmos/src/RequestOptions/ItemRequestOptions.cs b/Microsoft.Azure.Cosmos/src/RequestOptions/ItemRequestOptions.cs index 59b5b245f7..d807f42f57 100644 --- a/Microsoft.Azure.Cosmos/src/RequestOptions/ItemRequestOptions.cs +++ b/Microsoft.Azure.Cosmos/src/RequestOptions/ItemRequestOptions.cs @@ -151,6 +151,7 @@ internal override void PopulateRequestOptions(RequestMessage request) } DedicatedGatewayRequestOptions.PopulateMaxIntegratedCacheStalenessOption(this.DedicatedGatewayRequestOptions, request); + DedicatedGatewayRequestOptions.PopulateBypassIntegratedCacheOption(this.DedicatedGatewayRequestOptions, request); RequestOptions.SetSessionToken(request, this.SessionToken); base.PopulateRequestOptions(request); diff --git a/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs b/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs index 8711836191..8ce4761c31 100644 --- a/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs +++ b/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs @@ -264,6 +264,7 @@ internal override void PopulateRequestOptions(RequestMessage request) } DedicatedGatewayRequestOptions.PopulateMaxIntegratedCacheStalenessOption(this.DedicatedGatewayRequestOptions, request); + DedicatedGatewayRequestOptions.PopulateBypassIntegratedCacheOption(this.DedicatedGatewayRequestOptions, request); request.Headers.Add(HttpConstants.HttpHeaders.PopulateQueryMetrics, bool.TrueString); diff --git a/Microsoft.Azure.Cosmos/src/Resource/Settings/DedicatedGatewayRequestOptions.cs b/Microsoft.Azure.Cosmos/src/Resource/Settings/DedicatedGatewayRequestOptions.cs index e3b7dccf3f..9ca854388c 100644 --- a/Microsoft.Azure.Cosmos/src/Resource/Settings/DedicatedGatewayRequestOptions.cs +++ b/Microsoft.Azure.Cosmos/src/Resource/Settings/DedicatedGatewayRequestOptions.cs @@ -23,6 +23,40 @@ public class DedicatedGatewayRequestOptions /// public TimeSpan? MaxIntegratedCacheStaleness { get; set; } + /// + /// Gets or sets if bypass the integrated cache or not associated with the request in the Azure CosmosDB service. + /// When set this value to true, the request will not be served from the integrated cache, and the response will not be cached either. + /// + /// Default value is false. + /// + /// + /// + /// + /// +#if PREVIEW + public +#else + internal +#endif + bool? BypassIntegratedCache { get; set; } + internal static void PopulateMaxIntegratedCacheStalenessOption(DedicatedGatewayRequestOptions dedicatedGatewayRequestOptions, RequestMessage request) { if (dedicatedGatewayRequestOptions?.MaxIntegratedCacheStaleness != null) @@ -37,5 +71,13 @@ internal static void PopulateMaxIntegratedCacheStalenessOption(DedicatedGatewayR request.Headers.Set(HttpConstants.HttpHeaders.DedicatedGatewayPerRequestCacheStaleness, cacheStalenessInMilliseconds.ToString(CultureInfo.InvariantCulture)); } } + + internal static void PopulateBypassIntegratedCacheOption(DedicatedGatewayRequestOptions dedicatedGatewayRequestOptions, RequestMessage request) + { + if (dedicatedGatewayRequestOptions != null && dedicatedGatewayRequestOptions.BypassIntegratedCache.HasValue && dedicatedGatewayRequestOptions.BypassIntegratedCache.Value) + { + request.Headers.Set(HttpConstants.HttpHeaders.DedicatedGatewayPerRequestBypassIntegratedCache, true.ToString(CultureInfo.InvariantCulture)); + } + } } } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json index 08d0d65a7e..de49584da2 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json @@ -377,6 +377,31 @@ }, "NestedTypes": {} }, + "Microsoft.Azure.Cosmos.DedicatedGatewayRequestOptions;System.Object;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { + "Subclasses": {}, + "Members": { + "System.Nullable`1[System.Boolean] BypassIntegratedCache": { + "Type": "Property", + "Attributes": [], + "MethodInfo": "System.Nullable`1[System.Boolean] BypassIntegratedCache;CanRead:True;CanWrite:True;System.Nullable`1[System.Boolean] get_BypassIntegratedCache();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_BypassIntegratedCache(System.Nullable`1[System.Boolean]);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "System.Nullable`1[System.Boolean] get_BypassIntegratedCache()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "System.Nullable`1[System.Boolean] get_BypassIntegratedCache();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Void set_BypassIntegratedCache(System.Nullable`1[System.Boolean])[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Void set_BypassIntegratedCache(System.Nullable`1[System.Boolean]);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + } + }, + "NestedTypes": {} + }, "Microsoft.Azure.Cosmos.Fluent.ChangeFeedPolicyDefinition;System.Object;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, "Members": { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Resource/Settings/DedicatedGatewayRequestOptionsTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Resource/Settings/DedicatedGatewayRequestOptionsTests.cs new file mode 100644 index 0000000000..b0f5cd2ea0 --- /dev/null +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Resource/Settings/DedicatedGatewayRequestOptionsTests.cs @@ -0,0 +1,94 @@ +namespace Microsoft.Azure.Cosmos.Tests.Resource.Settings +{ + using Microsoft.Azure.Documents; + using Microsoft.VisualStudio.TestTools.UnitTesting; + + [TestClass] + public class DedicatedGatewayRequestOptionsTests + { + [TestMethod] + public void BypassIntegratedCacheHeaderIsSetWhenTrue() + { + DedicatedGatewayRequestOptions dedicatedGatewayRequestOptions = new DedicatedGatewayRequestOptions + { + BypassIntegratedCache = true + }; + + ItemRequestOptions itemRequestOptions = new ItemRequestOptions + { + DedicatedGatewayRequestOptions = dedicatedGatewayRequestOptions + }; + + QueryRequestOptions queryRequestOptions = new QueryRequestOptions + { + DedicatedGatewayRequestOptions = dedicatedGatewayRequestOptions + }; + + RequestMessage itemRequestMessage = new RequestMessage(); + RequestMessage queryRequestMessage = new RequestMessage(); + + itemRequestOptions.PopulateRequestOptions(itemRequestMessage); + queryRequestOptions.PopulateRequestOptions(queryRequestMessage); + + + Assert.IsNotNull(itemRequestMessage.Headers[HttpConstants.HttpHeaders.DedicatedGatewayPerRequestBypassIntegratedCache]); + Assert.IsNotNull(queryRequestMessage.Headers[HttpConstants.HttpHeaders.DedicatedGatewayPerRequestBypassIntegratedCache]); + + Assert.AreEqual("True", itemRequestMessage.Headers[HttpConstants.HttpHeaders.DedicatedGatewayPerRequestBypassIntegratedCache]); + Assert.AreEqual("True", queryRequestMessage.Headers[HttpConstants.HttpHeaders.DedicatedGatewayPerRequestBypassIntegratedCache]); + } + + [TestMethod] + public void BypassIntegratedCacheHeaderIsNotSetWhenFalse() + { + DedicatedGatewayRequestOptions dedicatedGatewayRequestOptions = new DedicatedGatewayRequestOptions + { + BypassIntegratedCache = false + }; + + ItemRequestOptions itemRequestOptions = new ItemRequestOptions + { + DedicatedGatewayRequestOptions = dedicatedGatewayRequestOptions + }; + + QueryRequestOptions queryRequestOptions = new QueryRequestOptions + { + DedicatedGatewayRequestOptions = dedicatedGatewayRequestOptions + }; + + RequestMessage itemRequestMessage = new RequestMessage(); + RequestMessage queryRequestMessage = new RequestMessage(); + + itemRequestOptions.PopulateRequestOptions(itemRequestMessage); + queryRequestOptions.PopulateRequestOptions(queryRequestMessage); + + + Assert.IsNull(itemRequestMessage.Headers[HttpConstants.HttpHeaders.DedicatedGatewayPerRequestBypassIntegratedCache]); + Assert.IsNull(queryRequestMessage.Headers[HttpConstants.HttpHeaders.DedicatedGatewayPerRequestBypassIntegratedCache]); + } + + [TestMethod] + public void BypassIntegratedCacheHeaderIsNotSetWhenNotSet() + { + ItemRequestOptions itemRequestOptions = new ItemRequestOptions + { + DedicatedGatewayRequestOptions = new DedicatedGatewayRequestOptions() + }; + + QueryRequestOptions queryRequestOptions = new QueryRequestOptions + { + DedicatedGatewayRequestOptions = new DedicatedGatewayRequestOptions() + }; + + RequestMessage itemRequestMessage = new RequestMessage(); + RequestMessage queryRequestMessage = new RequestMessage(); + + itemRequestOptions.PopulateRequestOptions(itemRequestMessage); + queryRequestOptions.PopulateRequestOptions(queryRequestMessage); + + + Assert.IsNull(itemRequestMessage.Headers[HttpConstants.HttpHeaders.DedicatedGatewayPerRequestBypassIntegratedCache]); + Assert.IsNull(queryRequestMessage.Headers[HttpConstants.HttpHeaders.DedicatedGatewayPerRequestBypassIntegratedCache]); + } + } +} From 327422b02180029899d283ee385d3f7e2abeb24b Mon Sep 17 00:00:00 2001 From: vipulvishal-ms <110802706+vipulvishal-ms@users.noreply.github.com> Date: Thu, 1 Jun 2023 22:05:15 +0530 Subject: [PATCH 21/39] Client Encryption: Adds Microsoft.Azure.Cosmos compatibility to version 3.34.0 (#3874) * chaging Microsoft.Azure.Cosmos support version * resolved merge conflicts --- Directory.Build.props | 4 ++-- Microsoft.Azure.Cosmos.Encryption/changelog.md | 10 ++++++++++ .../src/Microsoft.Azure.Cosmos.Encryption.csproj | 4 ++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 52e815227a..7eecd3c8e2 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,8 +4,8 @@ 3.34.0 preview 3.31.0 - 2.0.1 - 2.0.1 + 2.0.2 + 2.0.2 preview 1.0.0-preview05 1.1.0-preview3 diff --git a/Microsoft.Azure.Cosmos.Encryption/changelog.md b/Microsoft.Azure.Cosmos.Encryption/changelog.md index a5e7101074..a8edf3441d 100644 --- a/Microsoft.Azure.Cosmos.Encryption/changelog.md +++ b/Microsoft.Azure.Cosmos.Encryption/changelog.md @@ -3,6 +3,16 @@ Preview features are treated as a separate branch and will not be included in th The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +### [2.0.2](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Encryption/2.0.2) - 2023-06-01 + +#### Added +- [#3874](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3874) Adds support for Microsoft.Azure.Cosmos up to 3.34.0. + +### [2.0.2-preview](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Encryption/2.0.2-preview) - 2023-06-01 + +#### Added +- [#3874](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3874) Adds support for Microsoft.Azure.Cosmos 3.34.0-preview. + ### [2.0.1](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Encryption/2.0.1) - 2023-03-11 #### Added diff --git a/Microsoft.Azure.Cosmos.Encryption/src/Microsoft.Azure.Cosmos.Encryption.csproj b/Microsoft.Azure.Cosmos.Encryption/src/Microsoft.Azure.Cosmos.Encryption.csproj index f58b171cd5..94e93aa6fe 100644 --- a/Microsoft.Azure.Cosmos.Encryption/src/Microsoft.Azure.Cosmos.Encryption.csproj +++ b/Microsoft.Azure.Cosmos.Encryption/src/Microsoft.Azure.Cosmos.Encryption.csproj @@ -28,11 +28,11 @@ - + - + From 3e3bbe5d53bd771ead625f5aee6e55cca9dd8764 Mon Sep 17 00:00:00 2001 From: Rinat Minibaev <132935507+rinatmini@users.noreply.github.com> Date: Thu, 1 Jun 2023 15:03:04 -0700 Subject: [PATCH 22/39] CosmosClient: Fixes missing Trace when converting HTTP Timeout to 503 (#3866) * Added tracing when converting HTTP Timeout to 503 * Fixed tracing when converting HTTP Timeout to 503 * Resolved PR comments * Using ITrace as part of ClientSideRequestStatisticsTraceDatum * Refactoring * Test update * Unit tests fix --- .../src/GatewayAccountReader.cs | 2 +- .../src/Handler/TransportHandler.cs | 2 +- .../src/HttpClient/CosmosHttpClientCore.cs | 4 + .../src/Routing/ClientCollectionCache.cs | 2 +- .../src/Routing/PartitionKeyRangeCache.cs | 2 +- .../ClientSideRequestStatisticsTraceDatum.cs | 13 ++- .../RegionContactedInDiagnosticsBenchmark.cs | 2 +- .../TraceWriterBaselineTests.TraceData.xml | 6 +- .../CosmosHttpClientCoreTests.cs | 92 ++++++++++++------- .../GatewayAccountReaderTests.cs | 23 +++-- .../GatewayStoreModelTest.cs | 35 ++++--- ...entSideRequestStatisticsTraceDatumTests.cs | 6 +- .../Tracing/ContactedRegionsTests.cs | 2 +- .../Tracing/TraceTests.cs | 2 +- .../Tracing/TraceWriterBaselineTests.cs | 6 +- 15 files changed, 121 insertions(+), 78 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/GatewayAccountReader.cs b/Microsoft.Azure.Cosmos/src/GatewayAccountReader.cs index 2754dfaa40..5413103fee 100644 --- a/Microsoft.Azure.Cosmos/src/GatewayAccountReader.cs +++ b/Microsoft.Azure.Cosmos/src/GatewayAccountReader.cs @@ -49,7 +49,7 @@ await this.cosmosAuthorization.AddAuthorizationHeaderAsync( using (ITrace trace = Trace.GetRootTrace("Account Read", TraceComponent.Transport, TraceLevel.Info)) { - IClientSideRequestStatistics stats = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace.Summary); + IClientSideRequestStatistics stats = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace); try { diff --git a/Microsoft.Azure.Cosmos/src/Handler/TransportHandler.cs b/Microsoft.Azure.Cosmos/src/Handler/TransportHandler.cs index e524214976..7baf8a7254 100644 --- a/Microsoft.Azure.Cosmos/src/Handler/TransportHandler.cs +++ b/Microsoft.Azure.Cosmos/src/Handler/TransportHandler.cs @@ -93,7 +93,7 @@ internal async Task ProcessMessageAsync( DocumentServiceRequest serviceRequest = request.ToDocumentServiceRequest(); - ClientSideRequestStatisticsTraceDatum clientSideRequestStatisticsTraceDatum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, request.Trace.Summary); + ClientSideRequestStatisticsTraceDatum clientSideRequestStatisticsTraceDatum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, request.Trace); serviceRequest.RequestContext.ClientRequestStatistics = clientSideRequestStatisticsTraceDatum; //TODO: extrace auth into a separate handler diff --git a/Microsoft.Azure.Cosmos/src/HttpClient/CosmosHttpClientCore.cs b/Microsoft.Azure.Cosmos/src/HttpClient/CosmosHttpClientCore.cs index 0fde01afb5..c29c3a5b94 100644 --- a/Microsoft.Azure.Cosmos/src/HttpClient/CosmosHttpClientCore.cs +++ b/Microsoft.Azure.Cosmos/src/HttpClient/CosmosHttpClientCore.cs @@ -16,6 +16,7 @@ namespace Microsoft.Azure.Cosmos using System.Threading.Tasks; using Microsoft.Azure.Cosmos.Core.Trace; using Microsoft.Azure.Cosmos.Resource.CosmosExceptions; + using Microsoft.Azure.Cosmos.Tracing; using Microsoft.Azure.Cosmos.Tracing.TraceData; using Microsoft.Azure.Documents; using Microsoft.Azure.Documents.Collections; @@ -361,9 +362,11 @@ private async Task SendHttpHelperAsync( } catch (Exception e) { + ITrace trace = NoOpTrace.Singleton; if (clientSideRequestStatistics is ClientSideRequestStatisticsTraceDatum datum) { datum.RecordHttpException(requestMessage, e, resourceType, requestStartTime); + trace = datum.Trace; } bool isOutOfRetries = CosmosHttpClientCore.IsOutOfRetries(timeoutPolicy, startDateTimeUtc, timeoutEnumerator); @@ -394,6 +397,7 @@ private async Task SendHttpHelperAsync( ActivityId = System.Diagnostics.Trace.CorrelationManager.ActivityId.ToString(), SubStatusCode = SubStatusCodes.TransportGenerated503 }, + trace: trace, innerException: e); } diff --git a/Microsoft.Azure.Cosmos/src/Routing/ClientCollectionCache.cs b/Microsoft.Azure.Cosmos/src/Routing/ClientCollectionCache.cs index 30ece5015b..530bbfceb5 100644 --- a/Microsoft.Azure.Cosmos/src/Routing/ClientCollectionCache.cs +++ b/Microsoft.Azure.Cosmos/src/Routing/ClientCollectionCache.cs @@ -186,7 +186,7 @@ private async Task ReadCollectionAsync( { headers.XDate = Rfc1123DateTimeCache.UtcNow(); - request.RequestContext.ClientRequestStatistics = clientSideRequestStatistics ?? new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace.Summary); + request.RequestContext.ClientRequestStatistics = clientSideRequestStatistics ?? new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace); if (clientSideRequestStatistics == null) { childTrace.AddDatum( diff --git a/Microsoft.Azure.Cosmos/src/Routing/PartitionKeyRangeCache.cs b/Microsoft.Azure.Cosmos/src/Routing/PartitionKeyRangeCache.cs index 4373d61f56..d9e2854b2b 100644 --- a/Microsoft.Azure.Cosmos/src/Routing/PartitionKeyRangeCache.cs +++ b/Microsoft.Azure.Cosmos/src/Routing/PartitionKeyRangeCache.cs @@ -316,7 +316,7 @@ private async Task ExecutePartitionKeyRangeReadChangeFe } request.Headers[HttpConstants.HttpHeaders.Authorization] = authorizationToken; - request.RequestContext.ClientRequestStatistics = clientSideRequestStatistics ?? new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace.Summary); + request.RequestContext.ClientRequestStatistics = clientSideRequestStatistics ?? new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace); if (clientSideRequestStatistics == null) { childTrace.AddDatum("Client Side Request Stats", request.RequestContext.ClientRequestStatistics); diff --git a/Microsoft.Azure.Cosmos/src/Tracing/TraceData/ClientSideRequestStatisticsTraceDatum.cs b/Microsoft.Azure.Cosmos/src/Tracing/TraceData/ClientSideRequestStatisticsTraceDatum.cs index 10845f133f..def12c8262 100644 --- a/Microsoft.Azure.Cosmos/src/Tracing/TraceData/ClientSideRequestStatisticsTraceDatum.cs +++ b/Microsoft.Azure.Cosmos/src/Tracing/TraceData/ClientSideRequestStatisticsTraceDatum.cs @@ -33,9 +33,8 @@ internal sealed class ClientSideRequestStatisticsTraceDatum : TraceDatum, IClien private IReadOnlyList shallowCopyOfStoreResponseStatistics = null; private IReadOnlyList shallowCopyOfHttpResponseStatistics = null; private SystemUsageHistory systemUsageHistory = null; - public TraceSummary TraceSummary = null; - public ClientSideRequestStatisticsTraceDatum(DateTime startTime, TraceSummary summary) + public ClientSideRequestStatisticsTraceDatum(DateTime startTime, ITrace trace) { this.RequestStartTimeUtc = startTime; this.RequestEndTimeUtc = null; @@ -45,7 +44,7 @@ public ClientSideRequestStatisticsTraceDatum(DateTime startTime, TraceSummary su this.FailedReplicas = new HashSet(); this.RegionsContacted = new HashSet<(string, Uri)>(); this.httpResponseStatistics = new List(); - this.TraceSummary = summary; + this.Trace = trace; } public DateTime RequestStartTimeUtc { get; } @@ -75,6 +74,10 @@ public IReadOnlyDictionary EndpointToAddres public HashSet<(string, Uri)> RegionsContacted { get; } + public ITrace Trace { get; private set; } + + public TraceSummary TraceSummary => this.Trace?.Summary; + public IReadOnlyList StoreResponseStatisticsList { get @@ -502,11 +505,11 @@ public HttpResponseStatistics( if (responseMessage != null) { Headers headers = new Headers(GatewayStoreClient.ExtractResponseHeaders(responseMessage)); - this.ActivityId = headers.ActivityId ?? Trace.CorrelationManager.ActivityId.ToString(); + this.ActivityId = headers.ActivityId ?? System.Diagnostics.Trace.CorrelationManager.ActivityId.ToString(); } else { - this.ActivityId = Trace.CorrelationManager.ActivityId.ToString(); + this.ActivityId = System.Diagnostics.Trace.CorrelationManager.ActivityId.ToString(); } } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Performance.Tests/Benchmarks/RegionContactedInDiagnosticsBenchmark.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Performance.Tests/Benchmarks/RegionContactedInDiagnosticsBenchmark.cs index bcf95ba776..0d3d2ffd81 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Performance.Tests/Benchmarks/RegionContactedInDiagnosticsBenchmark.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Performance.Tests/Benchmarks/RegionContactedInDiagnosticsBenchmark.cs @@ -42,7 +42,7 @@ private ITrace CreateTestTraceTree() private TraceDatum GetDatumObject(string regionName1, string regionName2 = null) { - ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()); + ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, Trace.GetRootTrace(nameof(RegionContactedInDiagnosticsBenchmark))); Uri uri1 = new Uri("http://someUri1.com"); datum.RegionsContacted.Add((regionName1, uri1)); if (regionName2 != null) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml index d3b996a0e9..8b6adc1c15 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml @@ -187,7 +187,7 @@ TraceForBaselineTesting rootTrace; using (rootTrace = TraceForBaselineTesting.GetRootTrace()) { - ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, new TraceSummary()); + ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, rootTrace); TransportAddressUri uri1 = new TransportAddressUri(new Uri("http://someUri1.com")); TransportAddressUri uri2 = new TransportAddressUri(new Uri("http://someUri2.com")); @@ -405,7 +405,7 @@ TraceForBaselineTesting rootTrace; using (rootTrace = TraceForBaselineTesting.GetRootTrace()) { - ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, new TraceSummary()); + ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, rootTrace); datum.ContactedReplicas.Add(default); TraceWriterBaselineTests.GetPrivateField>(datum, "endpointToAddressResolutionStats").Add("asdf", default); @@ -546,7 +546,7 @@ TraceForBaselineTesting rootTrace; using (rootTrace = TraceForBaselineTesting.GetRootTrace()) { - ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, new TraceSummary()); + ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, rootTrace); TraceWriterBaselineTests.SetEndRequestTime(datum,DateTime.MaxValue); HttpResponseStatistics httpResponseStatistics = new HttpResponseStatistics( diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/CosmosHttpClientCoreTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/CosmosHttpClientCoreTests.cs index 0d475ca370..03fdb84ead 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/CosmosHttpClientCoreTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/CosmosHttpClientCoreTests.cs @@ -42,14 +42,17 @@ static Task sendFunc(HttpRequestMessage request, Cancellati HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri("http://localhost")); - HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => - new ValueTask(httpRequestMessage), - ResourceType.Collection, - timeoutPolicy: HttpTimeoutPolicyDefault.Instance, - new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow,new TraceSummary()), - default); - - Assert.AreEqual(httpRequestMessage, responseMessage.RequestMessage); + using (ITrace trace = Trace.GetRootTrace(nameof(ResponseMessageHasRequestMessageAsync))) + { + HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => + new ValueTask(httpRequestMessage), + ResourceType.Collection, + timeoutPolicy: HttpTimeoutPolicyDefault.Instance, + new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace), + default); + + Assert.AreEqual(httpRequestMessage, responseMessage.RequestMessage); + } } [TestMethod] @@ -111,15 +114,18 @@ async Task sendFunc(HttpRequestMessage request, Cancellatio HttpMessageHandler messageHandler = new MockMessageHandler(sendFunc); using CosmosHttpClient cosmoshttpClient = MockCosmosUtil.CreateCosmosHttpClient(() => new HttpClient(messageHandler)); - HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => + using (ITrace trace = Trace.GetRootTrace(nameof(RetryTransientIssuesTestAsync))) + { + HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => new ValueTask( result: new HttpRequestMessage(HttpMethod.Get, new Uri("http://localhost"))), resourceType: ResourceType.Collection, timeoutPolicy: currentTimeoutPolicy.Key, - clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()), + clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace), cancellationToken: default); - Assert.AreEqual(HttpStatusCode.OK, responseMessage.StatusCode); + Assert.AreEqual(HttpStatusCode.OK, responseMessage.StatusCode); + } } } @@ -178,15 +184,18 @@ async Task sendFunc(HttpRequestMessage request, Cancellatio HttpMessageHandler messageHandler = new MockMessageHandler(sendFunc); using CosmosHttpClient cosmoshttpClient = MockCosmosUtil.CreateCosmosHttpClient(() => new HttpClient(messageHandler)); - HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => + using (ITrace trace = Trace.GetRootTrace(nameof(RetryTransient408sTestAsync))) + { + HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => new ValueTask( result: new HttpRequestMessage(HttpMethod.Get, new Uri("http://localhost"))), resourceType: ResourceType.Collection, timeoutPolicy: HttpTimeoutPolicyControlPlaneRetriableHotPath.Instance, - clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()), + clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace), cancellationToken: default); - Assert.AreEqual(HttpStatusCode.OK, responseMessage.StatusCode); + Assert.AreEqual(HttpStatusCode.OK, responseMessage.StatusCode); + } } [TestMethod] @@ -216,15 +225,18 @@ async Task sendFunc(HttpRequestMessage request, Cancellatio HttpMessageHandler messageHandler = new MockMessageHandler(sendFunc); using CosmosHttpClient cosmoshttpClient = MockCosmosUtil.CreateCosmosHttpClient(() => new HttpClient(messageHandler)); - HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => + using (ITrace trace = Trace.GetRootTrace(nameof(DoesNotRetryTransient408sOnDefaultPolicyTestAsync))) + { + HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => new ValueTask( result: new HttpRequestMessage(HttpMethod.Get, new Uri("http://localhost"))), resourceType: ResourceType.Collection, timeoutPolicy: HttpTimeoutPolicyControlPlaneRead.Instance, - clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()), + clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace), cancellationToken: default); - - Assert.AreEqual(HttpStatusCode.RequestTimeout, responseMessage.StatusCode, "Should be a request timeout"); + + Assert.AreEqual(HttpStatusCode.RequestTimeout, responseMessage.StatusCode, "Should be a request timeout"); + } } [TestMethod] @@ -245,13 +257,16 @@ async Task sendFunc(HttpRequestMessage request, Cancellatio try { - HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => + using (ITrace trace = Trace.GetRootTrace(nameof(Retry3TimesOnDefaultPolicyTestAsync))) + { + HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => new ValueTask( result: new HttpRequestMessage(HttpMethod.Get, new Uri("http://localhost"))), resourceType: ResourceType.Collection, timeoutPolicy: HttpTimeoutPolicyDefault.Instance, - clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()), + clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace), cancellationToken: default); + } } catch (Exception ex) { @@ -282,14 +297,16 @@ async Task sendFunc(HttpRequestMessage request, Cancellatio try { - - HttpResponseMessage responseMessage1 = await cosmoshttpClient.SendHttpAsync(() => + using (ITrace trace = Trace.GetRootTrace(nameof(NoRetryOnNoRetryPolicyTestAsync))) + { + HttpResponseMessage responseMessage1 = await cosmoshttpClient.SendHttpAsync(() => new ValueTask( result: new HttpRequestMessage(method, new Uri("http://localhost"))), resourceType: resourceType, timeoutPolicy: timeoutPolicy, - clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()), + clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace), cancellationToken: default); + } } catch (Exception e) { @@ -301,6 +318,9 @@ async Task sendFunc(HttpRequestMessage request, Cancellatio CosmosException cosmosException = (CosmosException)e; Assert.AreEqual(cosmosException.StatusCode, System.Net.HttpStatusCode.ServiceUnavailable); Assert.AreEqual((int)cosmosException.SubStatusCode,(int)SubStatusCodes.TransportGenerated503); + + Assert.IsNotNull(cosmosException.Trace); + Assert.AreNotEqual(cosmosException.Trace, NoOpTrace.Singleton); } } @@ -344,13 +364,16 @@ async Task sendFunc(HttpRequestMessage request, Cancellatio try { - HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => + using (ITrace trace = Trace.GetRootTrace(nameof(NoRetryOnNoRetryPolicyTestAsync))) + { + HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => new ValueTask( result: new HttpRequestMessage(HttpMethod.Get, new Uri("http://localhost"))), resourceType: ResourceType.Collection, timeoutPolicy: HttpTimeoutPolicyNoRetry.Instance, - clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()), + clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace), cancellationToken: default); + } } catch (Exception ex) { @@ -401,15 +424,18 @@ async Task sendFunc(HttpRequestMessage request, Cancellatio HttpMessageHandler messageHandler = new MockMessageHandler(sendFunc); using CosmosHttpClient cosmoshttpClient = MockCosmosUtil.CreateCosmosHttpClient(() => new HttpClient(messageHandler)); - HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => - new ValueTask( - result: new HttpRequestMessage(HttpMethod.Post, new Uri("http://localhost"))), - resourceType: ResourceType.Document, - timeoutPolicy: HttpTimeoutPolicyControlPlaneRetriableHotPath.Instance, - clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()), - cancellationToken: default); + using (ITrace trace = Trace.GetRootTrace(nameof(RetryTransientIssuesForQueryPlanTestAsync))) + { + HttpResponseMessage responseMessage = await cosmoshttpClient.SendHttpAsync(() => + new ValueTask( + result: new HttpRequestMessage(HttpMethod.Post, new Uri("http://localhost"))), + resourceType: ResourceType.Document, + timeoutPolicy: HttpTimeoutPolicyControlPlaneRetriableHotPath.Instance, + clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace), + cancellationToken: default); - Assert.AreEqual(HttpStatusCode.OK, responseMessage.StatusCode); + Assert.AreEqual(HttpStatusCode.OK, responseMessage.StatusCode); + } } [TestMethod] diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayAccountReaderTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayAccountReaderTests.cs index 2fc8359f68..cf54b12a52 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayAccountReaderTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayAccountReaderTests.cs @@ -57,15 +57,20 @@ public async Task DocumentClient_BuildHttpClientFactory_WithHandler() receivedResponseEventArgs: null); Assert.IsNotNull(httpClient); - HttpResponseMessage response = await httpClient.GetAsync( - uri: new Uri("https://localhost"), - additionalHeaders: new RequestNameValueCollection(), - resourceType: ResourceType.Document, - timeoutPolicy: HttpTimeoutPolicyDefault.InstanceShouldThrow503OnTimeout, - clientSideRequestStatistics: new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()), - cancellationToken: default); - - Assert.AreEqual(HttpStatusCode.Conflict, response.StatusCode); + + using (ITrace trace = Trace.GetRootTrace(nameof(DocumentClient_BuildHttpClientFactory_WithHandler))) + { + IClientSideRequestStatistics stats = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace); + HttpResponseMessage response = await httpClient.GetAsync( + uri: new Uri("https://localhost"), + additionalHeaders: new RequestNameValueCollection(), + resourceType: ResourceType.Document, + timeoutPolicy: HttpTimeoutPolicyDefault.InstanceShouldThrow503OnTimeout, + clientSideRequestStatistics: stats, + cancellationToken: default); + + Assert.AreEqual(HttpStatusCode.Conflict, response.StatusCode); + } } [TestMethod] diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayStoreModelTest.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayStoreModelTest.cs index 36b350a751..e16f176e61 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayStoreModelTest.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayStoreModelTest.cs @@ -865,21 +865,26 @@ public async Task GatewayStatsDurationTest() HttpMessageHandler mockMessageHandler = new MockMessageHandler(sendFunc); CosmosHttpClient cosmosHttpClient = MockCosmosUtil.CreateCosmosHttpClient(() => new HttpClient(mockMessageHandler), DocumentClientEventSource.Instance); - Tracing.TraceData.ClientSideRequestStatisticsTraceDatum clientSideRequestStatistics = new Tracing.TraceData.ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()); - - await cosmosHttpClient.SendHttpAsync(() => new ValueTask(new HttpRequestMessage(HttpMethod.Get, "http://someuri.com")), - ResourceType.Document, - HttpTimeoutPolicyDefault.InstanceShouldThrow503OnTimeout, - clientSideRequestStatistics, - CancellationToken.None); - - Assert.AreEqual(clientSideRequestStatistics.HttpResponseStatisticsList.Count, 2); - // The duration is calculated using date times which can cause the duration to be slightly off. This allows for up to 15 Ms of variance. - // https://stackoverflow.com/questions/2143140/c-sharp-datetime-now-precision#:~:text=The%20precision%20is%20related%20to,35%2D40%20ms%20accuracy - Assert.IsTrue(clientSideRequestStatistics.HttpResponseStatisticsList[0].Duration.TotalMilliseconds >= 985, $"First request did was not delayed by at least 1 second. {JsonConvert.SerializeObject(clientSideRequestStatistics.HttpResponseStatisticsList[0])}"); - Assert.IsTrue(clientSideRequestStatistics.HttpResponseStatisticsList[1].Duration.TotalMilliseconds >= 985, $"Second request did was not delayed by at least 1 second. {JsonConvert.SerializeObject(clientSideRequestStatistics.HttpResponseStatisticsList[1])}"); - Assert.IsTrue(clientSideRequestStatistics.HttpResponseStatisticsList[0].RequestStartTime < - clientSideRequestStatistics.HttpResponseStatisticsList[1].RequestStartTime); + + using(ITrace trace = Tracing.Trace.GetRootTrace(nameof(GatewayStatsDurationTest))) + { + + Tracing.TraceData.ClientSideRequestStatisticsTraceDatum clientSideRequestStatistics = new Tracing.TraceData.ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace); + + await cosmosHttpClient.SendHttpAsync(() => new ValueTask(new HttpRequestMessage(HttpMethod.Get, "http://someuri.com")), + ResourceType.Document, + HttpTimeoutPolicyDefault.InstanceShouldThrow503OnTimeout, + clientSideRequestStatistics, + CancellationToken.None); + + Assert.AreEqual(clientSideRequestStatistics.HttpResponseStatisticsList.Count, 2); + // The duration is calculated using date times which can cause the duration to be slightly off. This allows for up to 15 Ms of variance. + // https://stackoverflow.com/questions/2143140/c-sharp-datetime-now-precision#:~:text=The%20precision%20is%20related%20to,35%2D40%20ms%20accuracy + Assert.IsTrue(clientSideRequestStatistics.HttpResponseStatisticsList[0].Duration.TotalMilliseconds >= 985, $"First request did was not delayed by at least 1 second. {JsonConvert.SerializeObject(clientSideRequestStatistics.HttpResponseStatisticsList[0])}"); + Assert.IsTrue(clientSideRequestStatistics.HttpResponseStatisticsList[1].Duration.TotalMilliseconds >= 985, $"Second request did was not delayed by at least 1 second. {JsonConvert.SerializeObject(clientSideRequestStatistics.HttpResponseStatisticsList[1])}"); + Assert.IsTrue(clientSideRequestStatistics.HttpResponseStatisticsList[0].RequestStartTime < + clientSideRequestStatistics.HttpResponseStatisticsList[1].RequestStartTime); + } } [TestMethod] diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/ClientSideRequestStatisticsTraceDatumTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/ClientSideRequestStatisticsTraceDatumTests.cs index 2ec6e9db62..a28300d82f 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/ClientSideRequestStatisticsTraceDatumTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/ClientSideRequestStatisticsTraceDatumTests.cs @@ -48,7 +48,7 @@ public async Task ConcurrentUpdateHttpResponseStatisticsListTests() [TestMethod] public void DuplicateContactedReplicasTests() { - ClientSideRequestStatisticsTraceDatum clientSideRequestStatisticsTraceDatum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()); + ClientSideRequestStatisticsTraceDatum clientSideRequestStatisticsTraceDatum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, Trace.GetRootTrace(nameof(DuplicateContactedReplicasTests))); clientSideRequestStatisticsTraceDatum.ContactedReplicas.Add(new TransportAddressUri(new Uri("http://storephysicaladdress1.com"))); clientSideRequestStatisticsTraceDatum.ContactedReplicas.Add(new TransportAddressUri(new Uri("http://storephysicaladdress2.com"))); clientSideRequestStatisticsTraceDatum.ContactedReplicas.Add(new TransportAddressUri(new Uri("http://storephysicaladdress2.com"))); @@ -89,7 +89,7 @@ public async Task ConcurrentUpdateStoreResponseStatisticsListTests() [TestMethod] public void VerifyIClientSideRequestStatisticsNullTests() { - IClientSideRequestStatistics clientSideRequestStatistics = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new Cosmos.Tracing.TraceSummary()); + IClientSideRequestStatistics clientSideRequestStatistics = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, Trace.GetRootTrace(nameof(VerifyIClientSideRequestStatisticsNullTests))); Assert.IsNotNull(clientSideRequestStatistics.ContactedReplicas); Assert.IsNotNull(clientSideRequestStatistics.FailedReplicas); Assert.IsNotNull(clientSideRequestStatistics.RegionsContacted); @@ -101,7 +101,7 @@ private async Task ConcurrentUpdateTestHelper( { using CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); - ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new Cosmos.Tracing.TraceSummary()); + ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, Trace.GetRootTrace(nameof(ConcurrentUpdateTestHelper))); Task backgroundTask = Task.Run(() => backgroundUpdater(datum, cancellationTokenSource.Token)); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/ContactedRegionsTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/ContactedRegionsTests.cs index 6f6a84cbe2..53a04e5228 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/ContactedRegionsTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/ContactedRegionsTests.cs @@ -54,7 +54,7 @@ private ITrace CreateTestTraceTree() private TraceDatum GetDatumObject(string regionName1, string regionName2 = null) { - ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()); + ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, Trace.GetRootTrace(nameof(ContactedRegionsTests))); Uri uri1 = new Uri("http://someUri1.com"); datum.RegionsContacted.Add((regionName1, uri1)); if (regionName2 != null) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceTests.cs index ff27842308..ad21070609 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceTests.cs @@ -97,7 +97,7 @@ public void ValidateStoreResultSerialization() HashSet storeResultProperties = typeof(StoreResult).GetProperties(BindingFlags.Public | BindingFlags.Instance).Select(x => x.Name).ToHashSet(); string datumKey = "ClientStats"; Trace trace = Trace.GetRootTrace("Test"); - ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, new TraceSummary()); + ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.UtcNow, trace); trace.AddDatum(datumKey, datum); ReferenceCountedDisposable storeResult = StoreResult.CreateForTesting(storeResponse: new StoreResponse()); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceWriterBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceWriterBaselineTests.cs index 67bafdbf56..fe3dc7054f 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceWriterBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceWriterBaselineTests.cs @@ -336,7 +336,7 @@ public void TraceData() TraceForBaselineTesting rootTrace; using (rootTrace = TraceForBaselineTesting.GetRootTrace()) { - ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, new TraceSummary()); + ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, rootTrace); TransportAddressUri uri1 = new TransportAddressUri(new Uri("http://someUri1.com")); TransportAddressUri uri2 = new TransportAddressUri(new Uri("http://someUri2.com")); @@ -382,7 +382,7 @@ public void TraceData() TraceForBaselineTesting rootTrace; using (rootTrace = TraceForBaselineTesting.GetRootTrace()) { - ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, new TraceSummary()); + ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, rootTrace); datum.ContactedReplicas.Add(default); TraceWriterBaselineTests.GetPrivateField>(datum, "endpointToAddressResolutionStats").Add("asdf", default); @@ -416,7 +416,7 @@ public void TraceData() TraceForBaselineTesting rootTrace; using (rootTrace = TraceForBaselineTesting.GetRootTrace()) { - ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, new TraceSummary()); + ClientSideRequestStatisticsTraceDatum datum = new ClientSideRequestStatisticsTraceDatum(DateTime.MinValue, rootTrace); TraceWriterBaselineTests.SetEndRequestTime(datum,DateTime.MaxValue); HttpResponseStatistics httpResponseStatistics = new HttpResponseStatistics( From 387ab62dbb55bcc99491bf16b88a32ad1cd663a5 Mon Sep 17 00:00:00 2001 From: Sourabh Jain Date: Fri, 2 Jun 2023 22:09:59 +0530 Subject: [PATCH 23/39] AI Integration: Fixes Open Telemetry Example (#3868) * first draft * add filter * revert csproj * fix sample * changed log message * remove unused library --- .../Usage/OpenTelemetry/AppSettings.json | 6 ++-- .../Usage/OpenTelemetry/OpenTelemetry.csproj | 4 --- .../Usage/OpenTelemetry/Program.cs | 31 +++++++++++++------ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/AppSettings.json b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/AppSettings.json index 1ea1245434..e0d21e3e09 100644 --- a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/AppSettings.json +++ b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/AppSettings.json @@ -1,7 +1,9 @@ { "Logging": { - "LogLevel": { - "Azure-Cosmos-Operation-Request-Diagnostics": "Information" + "OpenTelemetry": { + "LogLevel": { + "Azure.Cosmos.Operation.Request.Diagnostics": "Warning" + } } }, "CosmosDBEndPointUrl": "https://localhost:8081", diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj index 46fe296b80..83224d4570 100644 --- a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj +++ b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/OpenTelemetry.csproj @@ -12,10 +12,6 @@ - - - - diff --git a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs index 4d6431823e..b4729e41c7 100644 --- a/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs +++ b/Microsoft.Azure.Cosmos.Samples/Usage/OpenTelemetry/Program.cs @@ -25,8 +25,8 @@ static async Task Main() try { IConfigurationRoot configuration = new ConfigurationBuilder() - .AddJsonFile("AppSettings.json") - .Build(); + .AddJsonFile("AppSettings.json") + .Build(); string endpoint = configuration["CosmosDBEndPointUrl"]; if (string.IsNullOrEmpty(endpoint)) @@ -52,12 +52,16 @@ static async Task Main() serviceVersion: "1.0.0"); // Set up logging to forward logs to chosen exporter - using ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddOpenTelemetry(options => - { - options.IncludeFormattedMessage = true; - options.SetResourceBuilder(resource); - options.AddAzureMonitorLogExporter(o => o.ConnectionString = aiConnectionString); // Set up exporter of your choice - })); + using ILoggerFactory loggerFactory + = LoggerFactory.Create(builder => builder + .AddConfiguration(configuration.GetSection("Logging")) + .AddOpenTelemetry(options => + { + options.IncludeFormattedMessage = true; + options.SetResourceBuilder(resource); + options.AddAzureMonitorLogExporter(o => o.ConnectionString = aiConnectionString); // Set up exporter of your choice + })); + /*.AddFilter(level => level == LogLevel.Error) // Filter is irrespective of event type or event name*/ AzureEventSourceLogForwarder logforwader = new AzureEventSourceLogForwarder(loggerFactory); logforwader.Start(); @@ -76,6 +80,7 @@ static async Task Main() { IsDistributedTracingEnabled = true // Defaults to true, set to false to disable }; + // using (CosmosClient client = new CosmosClient(endpoint, authKey, options)) { @@ -88,7 +93,6 @@ static async Task Main() await Program.RunCrudDemo(container); } - } finally { @@ -116,6 +120,15 @@ public static async Task RunCrudDemo(Container container) Console.WriteLine($"Read document with id: {i}"); } + try + { + await container.ReadItemAsync($"random key", new PartitionKey($"random partition")); + } + catch(Exception) + { + Console.WriteLine("Generate exception by reading an invalid key"); + } + for (int i = 1; i <= 5; i++) { await container.ReplaceItemAsync(new Item { Id = $"{i}", Status = "updated" }, $"{i}", new PartitionKey($"{i}")); From f19acb073173fd9cbf640044f506c45cbe478e80 Mon Sep 17 00:00:00 2001 From: akotalwar <94020786+akotalwar@users.noreply.github.com> Date: Mon, 5 Jun 2023 15:02:17 -0700 Subject: [PATCH 24/39] [Internal] Query: Adds OptimisticDirectExecute and RequiresDistribution headers (#3882) * Adding ODE and RequiresDistribution Headers * Fixed comments * Updated parameter in SwitchToFallbackPipelineAsync * Renamed TryUnwrapContinuationToken to UnwrapContinuationToken --------- Co-authored-by: neildsh <35383880+neildsh@users.noreply.github.com> --- .../Headers/CosmosMessageHeadersInternal.cs | 12 + Microsoft.Azure.Cosmos/src/Headers/Headers.cs | 12 + .../src/Headers/StoreRequestHeaders.cs | 6 + .../NetworkAttachedDocumentContainer.cs | 5 +- .../Query/Core/AdditionalRequestHeaders.cs | 36 ++ .../CosmosQueryExecutionContextFactory.cs | 1 - ...misticDirectExecutionQueryPipelineStage.cs | 92 ++++-- .../Pagination/QueryPaginationOptions.cs | 4 + .../Core/QueryClient/CosmosQueryClient.cs | 3 +- .../Query/v3Query/CosmosQueryClientCore.cs | 8 +- .../Query/v3Query/CosmosQueryContextCore.cs | 5 +- .../src/RequestOptions/QueryRequestOptions.cs | 2 +- .../Query/MockCosmosQueryClient.cs | 8 +- .../OptimisticDirectExecutionQueryTests.cs | 312 ++++++++++++++++-- ...ositiveOptimisticDirectExecutionOutput.xml | 15 +- ...misticDirectExecutionQueryBaselineTests.cs | 246 ++++++++++++-- 16 files changed, 655 insertions(+), 112 deletions(-) create mode 100644 Microsoft.Azure.Cosmos/src/Query/Core/AdditionalRequestHeaders.cs diff --git a/Microsoft.Azure.Cosmos/src/Headers/CosmosMessageHeadersInternal.cs b/Microsoft.Azure.Cosmos/src/Headers/CosmosMessageHeadersInternal.cs index e8c584d782..f12595d832 100644 --- a/Microsoft.Azure.Cosmos/src/Headers/CosmosMessageHeadersInternal.cs +++ b/Microsoft.Azure.Cosmos/src/Headers/CosmosMessageHeadersInternal.cs @@ -177,6 +177,18 @@ public virtual string EndEpk set => this.SetProperty(HttpConstants.HttpHeaders.EndEpk, value); } + public virtual string OptimisticDirectExecute + { + get => this.GetValueOrDefault(HttpConstants.HttpHeaders.OptimisticDirectExecute); + set => this.SetProperty(HttpConstants.HttpHeaders.OptimisticDirectExecute, value); + } + + public virtual string RequiresDistribution + { + get => this.GetValueOrDefault(HttpConstants.HttpHeaders.RequiresDistribution); + set => this.SetProperty(HttpConstants.HttpHeaders.RequiresDistribution, value); + } + public abstract INameValueCollection INameValueCollection { get; } public virtual string this[string headerName] diff --git a/Microsoft.Azure.Cosmos/src/Headers/Headers.cs b/Microsoft.Azure.Cosmos/src/Headers/Headers.cs index 611de5f147..40f90c423a 100644 --- a/Microsoft.Azure.Cosmos/src/Headers/Headers.cs +++ b/Microsoft.Azure.Cosmos/src/Headers/Headers.cs @@ -171,6 +171,18 @@ internal virtual string PartitionKey set => this.CosmosMessageHeaders.PartitionKey = value; } + internal virtual string OptimisticDirectExecute + { + get => this.CosmosMessageHeaders.OptimisticDirectExecute; + set => this.CosmosMessageHeaders.OptimisticDirectExecute = value; + } + + internal virtual string RequiresDistribution + { + get => this.CosmosMessageHeaders.RequiresDistribution; + set => this.CosmosMessageHeaders.RequiresDistribution = value; + } + internal virtual string PartitionKeyRangeId { get => this.CosmosMessageHeaders.PartitionKeyRangeId; diff --git a/Microsoft.Azure.Cosmos/src/Headers/StoreRequestHeaders.cs b/Microsoft.Azure.Cosmos/src/Headers/StoreRequestHeaders.cs index 9147c31026..68086095f7 100644 --- a/Microsoft.Azure.Cosmos/src/Headers/StoreRequestHeaders.cs +++ b/Microsoft.Azure.Cosmos/src/Headers/StoreRequestHeaders.cs @@ -46,6 +46,12 @@ public override string XDate set => this.requestNameValueCollection.XDate = value; } + public override string OptimisticDirectExecute + { + get => this.requestNameValueCollection.OptimisticDirectExecute; + set => this.requestNameValueCollection.OptimisticDirectExecute = value; + } + public override string ConsistencyLevel { get => this.requestNameValueCollection.ConsistencyLevel; diff --git a/Microsoft.Azure.Cosmos/src/Pagination/NetworkAttachedDocumentContainer.cs b/Microsoft.Azure.Cosmos/src/Pagination/NetworkAttachedDocumentContainer.cs index 1132a40a35..7d8683c3fe 100644 --- a/Microsoft.Azure.Cosmos/src/Pagination/NetworkAttachedDocumentContainer.cs +++ b/Microsoft.Azure.Cosmos/src/Pagination/NetworkAttachedDocumentContainer.cs @@ -258,16 +258,17 @@ public async Task> MonadicQueryAsync( } QueryRequestOptions queryRequestOptions = this.queryRequestOptions == null ? new QueryRequestOptions() : this.queryRequestOptions; + AdditionalRequestHeaders additionalRequestHeaders = new AdditionalRequestHeaders(this.correlatedActivityId, isContinuationExpected: false, optimisticDirectExecute: queryPaginationOptions.OptimisticDirectExecute); + TryCatch monadicQueryPage = await this.cosmosQueryClient.ExecuteItemQueryAsync( this.resourceLink, this.resourceType, Documents.OperationType.Query, - this.correlatedActivityId, feedRangeState.FeedRange, queryRequestOptions, + additionalRequestHeaders, sqlQuerySpec, feedRangeState.State == null ? null : ((CosmosString)feedRangeState.State.Value).Value, - isContinuationExpected: false, queryPaginationOptions.PageSizeLimit ?? int.MaxValue, trace, cancellationToken); diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/AdditionalRequestHeaders.cs b/Microsoft.Azure.Cosmos/src/Query/Core/AdditionalRequestHeaders.cs new file mode 100644 index 0000000000..add4e15c99 --- /dev/null +++ b/Microsoft.Azure.Cosmos/src/Query/Core/AdditionalRequestHeaders.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +//------------------------------------------------------------ + +namespace Microsoft.Azure.Cosmos.Query.Core +{ + using System; + + /// + /// Captures additional headers to be sent in the web request. + /// + internal sealed class AdditionalRequestHeaders + { + /// + /// Enable backend to link multiple activityIds that belong to the same operation. + /// + public Guid CorrelatedActivityId { get; } + + /// + /// Let the backend know if continuations are expected for a certain query. + /// + public bool IsContinuationExpected { get; } + + /// + /// Let the backend know if a query is utilizing the OptimisticDirectExecute pipeline. + /// + public bool OptimisticDirectExecute { get; } + + public AdditionalRequestHeaders(Guid correlatedActivityId, bool isContinuationExpected, bool optimisticDirectExecute) + { + this.CorrelatedActivityId = correlatedActivityId; + this.IsContinuationExpected = isContinuationExpected; + this.OptimisticDirectExecute = optimisticDirectExecute; + } + } +} \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/CosmosQueryExecutionContextFactory.cs b/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/CosmosQueryExecutionContextFactory.cs index e276466f9d..8f35ff821a 100644 --- a/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/CosmosQueryExecutionContextFactory.cs +++ b/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/CosmosQueryExecutionContextFactory.cs @@ -477,7 +477,6 @@ private static TryCatch TryCreateOptimisticDirectExecutionC documentContainer: documentContainer, inputParameters: inputParameters, targetRange: new FeedRangeEpk(targetRange.ToRange()), - queryPaginationOptions: new QueryPaginationOptions(pageSizeHint: inputParameters.MaxItemCount), fallbackQueryPipelineStageFactory: (continuationToken) => { // In fallback scenario, the Specialized pipeline is always invoked diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/OptimisticDirectExecution/OptimisticDirectExecutionQueryPipelineStage.cs b/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/OptimisticDirectExecution/OptimisticDirectExecutionQueryPipelineStage.cs index 0664603024..e62ecf41f0 100644 --- a/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/OptimisticDirectExecution/OptimisticDirectExecutionQueryPipelineStage.cs +++ b/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/OptimisticDirectExecution/OptimisticDirectExecutionQueryPipelineStage.cs @@ -19,6 +19,7 @@ namespace Microsoft.Azure.Cosmos.Query.Core.Pipeline.OptimisticDirectExecutionQu using Microsoft.Azure.Cosmos.Query.Core.Pipeline.CrossPartition.Parallel; using Microsoft.Azure.Cosmos.Query.Core.Pipeline.Pagination; using Microsoft.Azure.Cosmos.Tracing; + using Microsoft.Azure.Documents; internal sealed class OptimisticDirectExecutionQueryPipelineStage : IQueryPipelineStage { @@ -28,11 +29,12 @@ private enum ExecutionState SpecializedDocumentQueryExecution, } - private const string optimisticDirectExecutionToken = "OptimisticDirectExecutionToken"; + private const string OptimisticDirectExecutionToken = "OptimisticDirectExecutionToken"; private readonly FallbackQueryPipelineStageFactory queryPipelineStageFactory; private TryCatch inner; private CosmosElement continuationToken; private ExecutionState executionState; + private bool? previousRequiresDistribution; private OptimisticDirectExecutionQueryPipelineStage(TryCatch inner, FallbackQueryPipelineStageFactory queryPipelineStageFactory, CosmosElement continuationToken) { @@ -40,6 +42,12 @@ private OptimisticDirectExecutionQueryPipelineStage(TryCatch> FallbackQueryPipelineStageFactory(CosmosElement continuationToken); @@ -55,22 +63,43 @@ public async ValueTask MoveNextAsync(ITrace trace) { TryCatch hasNext = await this.inner.TryAsync(pipelineStage => pipelineStage.MoveNextAsync(trace)); bool success = hasNext.Succeeded && hasNext.Result; - bool isPartitionSplitException = hasNext.Succeeded && this.Current.Failed && this.Current.InnerMostException.IsPartitionSplitException(); - - if (success && !isPartitionSplitException) - { - this.continuationToken = this.Current.Succeeded ? this.Current.Result.State?.Value : null; - } - else if (isPartitionSplitException && this.executionState == ExecutionState.OptimisticDirectExecution) + if (this.executionState == ExecutionState.OptimisticDirectExecution) { - this.inner = await this.queryPipelineStageFactory(this.TryUnwrapContinuationToken()); - this.executionState = ExecutionState.SpecializedDocumentQueryExecution; - if (this.inner.Failed) + bool isPartitionSplitException = hasNext.Succeeded && this.Current.Failed && this.Current.InnerMostException.IsPartitionSplitException(); + if (success && !isPartitionSplitException) { - return false; + this.continuationToken = this.Current.Succeeded ? this.Current.Result.State?.Value : null; + if (this.continuationToken != null) + { + bool requiresDistribution; + if (this.Current.Result.AdditionalHeaders.TryGetValue(HttpConstants.HttpHeaders.RequiresDistribution, out string requiresDistributionHeaderValue)) + { + requiresDistribution = bool.Parse(requiresDistributionHeaderValue); + } + else + { + requiresDistribution = true; + } + + if (this.previousRequiresDistribution.HasValue && this.previousRequiresDistribution != requiresDistribution) + { + // We should never enter this if statement as requiresDistribution flag can never switch mid execution. + // Hence, this exception should never be thrown. + throw new InvalidOperationException($"Unexpected switch in {HttpConstants.HttpHeaders.RequiresDistribution} value. Previous value : {this.previousRequiresDistribution} Current value : {requiresDistribution}."); + } + + if (requiresDistribution) + { + success = await this.SwitchToFallbackPipelineAsync(continuationToken: null, trace); + } + + this.previousRequiresDistribution = requiresDistribution; + } + } + else if (isPartitionSplitException) + { + success = await this.SwitchToFallbackPipelineAsync(continuationToken: UnwrapContinuationToken(this.continuationToken), trace); } - - success = await this.inner.Result.MoveNextAsync(trace); } return success; @@ -81,32 +110,46 @@ public void SetCancellationToken(CancellationToken cancellationToken) this.inner.Try(pipelineStage => pipelineStage.SetCancellationToken(cancellationToken)); } - private CosmosElement TryUnwrapContinuationToken() + private static CosmosElement UnwrapContinuationToken(CosmosElement continuationToken) { - if (this.continuationToken != null) + if (continuationToken == null) return null; + + CosmosObject cosmosObject = continuationToken as CosmosObject; + CosmosElement backendContinuationToken = cosmosObject[OptimisticDirectExecutionToken]; + Debug.Assert(backendContinuationToken != null); + + return CosmosArray.Create(backendContinuationToken); + } + + private async Task SwitchToFallbackPipelineAsync(CosmosElement continuationToken, ITrace trace) + { + Debug.Assert(this.executionState == ExecutionState.OptimisticDirectExecution, "OptimisticDirectExecuteQueryPipelineStage Assert!", "Only OptimisticDirectExecute pipeline can create this fallback pipeline"); + this.executionState = ExecutionState.SpecializedDocumentQueryExecution; + this.inner = continuationToken != null + ? await this.queryPipelineStageFactory(continuationToken) + : await this.queryPipelineStageFactory(null); + + if (this.inner.Failed) { - CosmosObject cosmosObject = this.continuationToken as CosmosObject; - CosmosElement backendContinuationToken = cosmosObject[optimisticDirectExecutionToken]; - Debug.Assert(backendContinuationToken != null); - return CosmosArray.Create(backendContinuationToken); + return false; } - return null; + return await this.inner.Result.MoveNextAsync(trace); } public static TryCatch MonadicCreate( DocumentContainer documentContainer, CosmosQueryExecutionContextFactory.InputParameters inputParameters, FeedRangeEpk targetRange, - QueryPaginationOptions queryPaginationOptions, FallbackQueryPipelineStageFactory fallbackQueryPipelineStageFactory, CancellationToken cancellationToken) { + QueryPaginationOptions paginationOptions = new QueryPaginationOptions(pageSizeHint: inputParameters.MaxItemCount, optimisticDirectExecute: true); TryCatch pipelineStage = OptimisticDirectExecutionQueryPipelineImpl.MonadicCreate( documentContainer: documentContainer, sqlQuerySpec: inputParameters.SqlQuerySpec, targetRange: targetRange, - queryPaginationOptions: queryPaginationOptions, + queryPaginationOptions: paginationOptions, partitionKey: inputParameters.PartitionKey, continuationToken: inputParameters.InitialUserContinuationToken, cancellationToken: cancellationToken); @@ -120,7 +163,7 @@ public static TryCatch MonadicCreate( return TryCatch.FromResult(odePipelineStageMonadicCreate); } - private class OptimisticDirectExecutionQueryPipelineImpl : IQueryPipelineStage + private sealed class OptimisticDirectExecutionQueryPipelineImpl : IQueryPipelineStage { private readonly QueryPartitionRangePageAsyncEnumerator queryPartitionRangePageAsyncEnumerator; @@ -226,7 +269,6 @@ public static TryCatch MonadicCreate( } FeedRangeState feedRangeState = monadicExtractState.Result; - QueryPartitionRangePageAsyncEnumerator partitionPageEnumerator = new QueryPartitionRangePageAsyncEnumerator( documentContainer, sqlQuerySpec, diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/Pagination/QueryPaginationOptions.cs b/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/Pagination/QueryPaginationOptions.cs index 0b692160be..c285135feb 100644 --- a/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/Pagination/QueryPaginationOptions.cs +++ b/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/Pagination/QueryPaginationOptions.cs @@ -15,6 +15,8 @@ internal sealed class QueryPaginationOptions : PaginationOptions { public static readonly QueryPaginationOptions Default = new QueryPaginationOptions(); + public bool OptimisticDirectExecute { get; } + public static readonly ImmutableHashSet BannedHeaders = new HashSet() { HttpConstants.HttpHeaders.Continuation, @@ -29,10 +31,12 @@ internal sealed class QueryPaginationOptions : PaginationOptions public QueryPaginationOptions( int? pageSizeHint = null, + bool optimisticDirectExecute = false, JsonSerializationFormat? jsonSerializationFormat = null, Dictionary additionalHeaders = null) : base(pageSizeHint, jsonSerializationFormat, additionalHeaders) { + this.OptimisticDirectExecute = optimisticDirectExecute; } protected override ImmutableHashSet BannedAdditionalHeaders => BannedHeaders; diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/QueryClient/CosmosQueryClient.cs b/Microsoft.Azure.Cosmos/src/Query/Core/QueryClient/CosmosQueryClient.cs index c2bcf91619..ac093cadce 100644 --- a/Microsoft.Azure.Cosmos/src/Query/Core/QueryClient/CosmosQueryClient.cs +++ b/Microsoft.Azure.Cosmos/src/Query/Core/QueryClient/CosmosQueryClient.cs @@ -54,12 +54,11 @@ public abstract Task> ExecuteItemQueryAsync( string resourceUri, Documents.ResourceType resourceType, Documents.OperationType operationType, - Guid clientQueryCorrelationId, FeedRange feedRange, QueryRequestOptions requestOptions, + AdditionalRequestHeaders additionalRequestHeaders, SqlQuerySpec sqlQuerySpec, string continuationToken, - bool isContinuationExpected, int pageSize, ITrace trace, CancellationToken cancellationToken); diff --git a/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryClientCore.cs b/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryClientCore.cs index 138f32c593..daf47e151c 100644 --- a/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryClientCore.cs +++ b/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryClientCore.cs @@ -119,12 +119,11 @@ public override async Task> ExecuteItemQueryAsync( string resourceUri, ResourceType resourceType, OperationType operationType, - Guid clientQueryCorrelationId, FeedRange feedRange, QueryRequestOptions requestOptions, + AdditionalRequestHeaders additionalRequestHeaders, SqlQuerySpec sqlQuerySpec, string continuationToken, - bool isContinuationExpected, int pageSize, ITrace trace, CancellationToken cancellationToken) @@ -143,13 +142,14 @@ public override async Task> ExecuteItemQueryAsync( { cosmosRequestMessage.Headers.Add( HttpConstants.HttpHeaders.IsContinuationExpected, - isContinuationExpected.ToString()); + additionalRequestHeaders.IsContinuationExpected.ToString()); QueryRequestOptions.FillContinuationToken( cosmosRequestMessage, continuationToken); cosmosRequestMessage.Headers.Add(HttpConstants.HttpHeaders.ContentType, MediaTypes.QueryJson); cosmosRequestMessage.Headers.Add(HttpConstants.HttpHeaders.IsQuery, bool.TrueString); - cosmosRequestMessage.Headers.Add(WFConstants.BackendHeaders.CorrelatedActivityId, clientQueryCorrelationId.ToString()); + cosmosRequestMessage.Headers.Add(WFConstants.BackendHeaders.CorrelatedActivityId, additionalRequestHeaders.CorrelatedActivityId.ToString()); + cosmosRequestMessage.Headers.Add(HttpConstants.HttpHeaders.OptimisticDirectExecute, additionalRequestHeaders.OptimisticDirectExecute.ToString()); }, trace: trace, cancellationToken: cancellationToken); diff --git a/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryContextCore.cs b/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryContextCore.cs index b1325f2652..215ca22b2c 100644 --- a/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryContextCore.cs +++ b/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryContextCore.cs @@ -51,16 +51,17 @@ internal override Task> ExecuteQueryAsync( ITrace trace, CancellationToken cancellationToken) { + AdditionalRequestHeaders additionalRequestHeaders = new AdditionalRequestHeaders(this.CorrelatedActivityId, isContinuationExpected, optimisticDirectExecute: false); + return this.QueryClient.ExecuteItemQueryAsync( resourceUri: this.ResourceLink, resourceType: this.ResourceTypeEnum, operationType: this.OperationTypeEnum, - clientQueryCorrelationId: this.CorrelatedActivityId, requestOptions: queryRequestOptions, + additionalRequestHeaders: additionalRequestHeaders, sqlQuerySpec: querySpecForInit, continuationToken: continuationToken, feedRange: feedRange, - isContinuationExpected: isContinuationExpected, pageSize: pageSize, trace: trace, cancellationToken: cancellationToken); diff --git a/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs b/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs index 8ce4761c31..cd505f1158 100644 --- a/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs +++ b/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs @@ -44,7 +44,7 @@ public class QueryRequestOptions : RequestOptions public bool? EnableLowPrecisionOrderBy { get; set; } /// - /// Gets or sets the option for customers to opt in for direct (optimistic) execution of the query.. + /// Gets or sets the option for customers to opt in for direct (optimistic) execution of the query. /// /// /// Direct (optimistic) execution offers improved performance for several kinds of queries such as a single partition streaming query. diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/MockCosmosQueryClient.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/MockCosmosQueryClient.cs index ee6eec3004..11d51403b1 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/MockCosmosQueryClient.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/MockCosmosQueryClient.cs @@ -68,12 +68,11 @@ public override Task> ExecuteItemQueryAsync( string resourceUri, ResourceType resourceType, OperationType operationType, - Guid clientQueryCorrelationId, FeedRange feedRange, QueryRequestOptions requestOptions, + AdditionalRequestHeaders additionalRequestHeaders, SqlQuerySpec sqlQuerySpec, string continuationToken, - bool isContinuationExpected, int pageSize, ITrace trace, CancellationToken cancellationToken) @@ -82,12 +81,11 @@ public override Task> ExecuteItemQueryAsync( resourceUri: resourceUri, resourceType: resourceType, operationType: operationType, - clientQueryCorrelationId: clientQueryCorrelationId, + feedRange: feedRange, requestOptions: requestOptions, + additionalRequestHeaders: additionalRequestHeaders, sqlQuerySpec: sqlQuerySpec, continuationToken: continuationToken, - feedRange: feedRange, - isContinuationExpected: isContinuationExpected, pageSize: pageSize, trace: trace, cancellationToken: cancellationToken); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/OptimisticDirectExecutionQueryTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/OptimisticDirectExecutionQueryTests.cs index cc9ef91733..78d4ddb8ed 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/OptimisticDirectExecutionQueryTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/OptimisticDirectExecutionQueryTests.cs @@ -20,7 +20,8 @@ public sealed class OptimisticDirectExecutionQueryTests : QueryTestsBase private static class PageSizeOptions { - public static readonly int[] NonGroupByPageSizeOptions = { -1, 1, 2, 10, 100 }; + public static readonly int[] NonGroupByAndNoContinuationTokenPageSizeOptions = { -1, 10 }; + public static readonly int[] NonGroupByWithContinuationTokenPageSizeOptions = { 1, 2 }; public static readonly int[] GroupByPageSizeOptions = { -1 }; public static readonly int[] PageSize100 = { 100 }; } @@ -42,49 +43,98 @@ public async Task TestPassingOptimisticDirectExecutionQueries() expectedResult: first5Integers, partitionKey: partitionKeyValue, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), CreateInput( query: $"SELECT TOP 5 VALUE r.numberField FROM r ORDER BY r.{PartitionKeyField}", expectedResult: first5Integers, partitionKey: partitionKeyValue, enableOptimisticDirectExecution: false, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.Passthrough), - // Simple query + // Simple query (requiresDist = false) CreateInput( query: $"SELECT VALUE r.numberField FROM r", expectedResult: first7Integers, partitionKey: partitionKeyValue, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 + CreateInput( + query: $"SELECT VALUE r.numberField FROM r", + expectedResult: first7Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + CreateInput( query: $"SELECT VALUE r.numberField FROM r", expectedResult: first7Integers, partitionKey: null, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), - - // DISTINCT with ORDER BY + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 + CreateInput( + query: $"SELECT VALUE r.numberField FROM r", + expectedResult: first7Integers, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + + // DISTINCT with ORDER BY (requiresDist = true) CreateInput( query: $"SELECT DISTINCT VALUE r.{NumberField} FROM r ORDER BY r.{NumberField} DESC", expectedResult: first7IntegersReversed, partitionKey: partitionKeyValue, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + CreateInput( + query: $"SELECT DISTINCT VALUE r.{NumberField} FROM r ORDER BY r.{NumberField} DESC", + expectedResult: first7IntegersReversed, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), CreateInput( query: $"SELECT DISTINCT VALUE r.{NumberField} FROM r ORDER BY r.{NumberField} DESC", expectedResult: first7IntegersReversed, partitionKey: null, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + CreateInput( + query: $"SELECT DISTINCT VALUE r.{NumberField} FROM r ORDER BY r.{NumberField} DESC", + expectedResult: first7IntegersReversed, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), - // TOP with GROUP BY + // DISTINCT (requiresDist = true) + CreateInput( + query: $"SELECT DISTINCT VALUE r.{NumberField} FROM r", + expectedResult: first7Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.GroupByPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + CreateInput( + query: $"SELECT DISTINCT VALUE r.{NumberField} FROM r", + expectedResult: first7Integers, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.GroupByPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + + // TOP with GROUP BY (requiresDist = true) CreateInput( query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r GROUP BY r.{NumberField}", expectedResult: first5Integers, @@ -99,72 +149,267 @@ public async Task TestPassingOptimisticDirectExecutionQueries() enableOptimisticDirectExecution: true, pageSizeOptions: PageSizeOptions.GroupByPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), - - // OFFSET LIMIT with WHERE and BETWEEN + + // TOP (requiresDist = false) + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r", + expectedResult: first5Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r", + expectedResult: first5Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r", + expectedResult: first5Integers, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r", + expectedResult: first5Integers, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + + // TOP with ORDER BY (requiresDist = false) + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r ORDER BY r.{NumberField}", + expectedResult: first5Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r ORDER BY r.{NumberField}", + expectedResult: first5Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r ORDER BY r.{NumberField}", + expectedResult: first5Integers, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r ORDER BY r.{NumberField}", + expectedResult: first5Integers, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + + // OFFSET LIMIT with WHERE and BETWEEN (requiresDist = false) + CreateInput( + query: $"SELECT VALUE r.numberField FROM r WHERE r.{NumberField} BETWEEN 0 AND {NumberOfDocuments} OFFSET 1 LIMIT 1", + expectedResult: new List { 1 }, + partitionKey: partitionKeyValue, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + enableOptimisticDirectExecution: true, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), CreateInput( query: $"SELECT VALUE r.numberField FROM r WHERE r.{NumberField} BETWEEN 0 AND {NumberOfDocuments} OFFSET 1 LIMIT 1", expectedResult: new List { 1 }, partitionKey: partitionKeyValue, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + enableOptimisticDirectExecution: true, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + CreateInput( + query: $"SELECT VALUE r.numberField FROM r WHERE r.{NumberField} BETWEEN 0 AND {NumberOfDocuments} OFFSET 1 LIMIT 1", + expectedResult: new List { 1 }, + partitionKey: null, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, enableOptimisticDirectExecution: true, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), CreateInput( query: $"SELECT VALUE r.numberField FROM r WHERE r.{NumberField} BETWEEN 0 AND {NumberOfDocuments} OFFSET 1 LIMIT 1", expectedResult: new List { 1 }, partitionKey: null, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, enableOptimisticDirectExecution: true, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution) - }; - + }; + List multiPartitionContainerTestCases = new List() { - // Simple query + // Simple query (requiresDist = false) CreateInput( query: $"SELECT VALUE r.numberField FROM r", expectedResult: first7Integers, partitionKey: partitionKeyValue, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 + CreateInput( + query: $"SELECT VALUE r.numberField FROM r", + expectedResult: first7Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + CreateInput( query: $"SELECT VALUE r.numberField FROM r", expectedResult: first7Integers, partitionKey: null, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Passthrough), + CreateInput( + query: $"SELECT VALUE r.numberField FROM r", + expectedResult: first7Integers, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.Passthrough), - // DISTINCT with ORDER BY + // DISTINCT with ORDER BY (requiresDist = true) CreateInput( query: $"SELECT DISTINCT VALUE r.{NumberField} FROM r ORDER BY r.{NumberField} DESC", expectedResult: first7IntegersReversed, partitionKey: partitionKeyValue, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), CreateInput( query: $"SELECT DISTINCT VALUE r.{NumberField} FROM r ORDER BY r.{NumberField} DESC", expectedResult: first7IntegersReversed, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + CreateInput( + query: $"SELECT DISTINCT VALUE r.{NumberField} FROM r ORDER BY r.{NumberField} DESC", + expectedResult: first7IntegersReversed, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + CreateInput( + query: $"SELECT DISTINCT VALUE r.{NumberField} FROM r ORDER BY r.{NumberField} DESC", + expectedResult: first7IntegersReversed, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + + // TOP (requiresDist = false) + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r", + expectedResult: first5Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r", + expectedResult: first5Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r", + expectedResult: first5Integers, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r", + expectedResult: first5Integers, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + + // TOP with ORDER BY (requiresDist = false) + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r ORDER BY r.{NumberField}", + expectedResult: first5Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r ORDER BY r.{NumberField}", + expectedResult: first5Integers, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r ORDER BY r.{NumberField}", + expectedResult: first5Integers, partitionKey: null, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + CreateInput( + query: $"SELECT TOP 5 VALUE r.{NumberField} FROM r ORDER BY r.{NumberField}", + expectedResult: first5Integers, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.Specialized), - // OFFSET LIMIT with WHERE and BETWEEN + // OFFSET LIMIT with WHERE and BETWEEN (requiresDist = false) CreateInput( query: $"SELECT VALUE r.numberField FROM r WHERE r.{NumberField} BETWEEN 0 AND {NumberOfDocuments} OFFSET 1 LIMIT 1", expectedResult: new List { 1 }, partitionKey: partitionKeyValue, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + CreateInput( + query: $"SELECT VALUE r.numberField FROM r WHERE r.{NumberField} BETWEEN 0 AND {NumberOfDocuments} OFFSET 1 LIMIT 1", + expectedResult: new List { 1 }, + partitionKey: partitionKeyValue, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), CreateInput( query: $"SELECT VALUE r.numberField FROM r WHERE r.{NumberField} BETWEEN 0 AND {NumberOfDocuments} OFFSET 1 LIMIT 1", expectedResult: new List { 1 }, partitionKey: null, enableOptimisticDirectExecution: true, - pageSizeOptions: PageSizeOptions.NonGroupByPageSizeOptions, + pageSizeOptions: PageSizeOptions.NonGroupByAndNoContinuationTokenPageSizeOptions, + expectedPipelineType: TestInjections.PipelineType.Specialized), + CreateInput( + query: $"SELECT VALUE r.numberField FROM r WHERE r.{NumberField} BETWEEN 0 AND {NumberOfDocuments} OFFSET 1 LIMIT 1", + expectedResult: new List { 1 }, + partitionKey: null, + enableOptimisticDirectExecution: true, + pageSizeOptions: PageSizeOptions.NonGroupByWithContinuationTokenPageSizeOptions, expectedPipelineType: TestInjections.PipelineType.Specialized) }; @@ -222,27 +467,34 @@ public async Task TestQueriesWithPartitionKeyNone() enableOptimisticDirectExecution: false, pageSizeOptions: PageSizeOptions.PageSize100, expectedPipelineType: TestInjections.PipelineType.Passthrough), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 CreateInput( query: $"SELECT VALUE r.numberField FROM r", expectedResult: first400Integers, partitionKey: PartitionKey.None, enableOptimisticDirectExecution: true, pageSizeOptions: PageSizeOptions.PageSize100, - expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + expectedPipelineType: TestInjections.PipelineType.Specialized), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 CreateInput( query: $"SELECT VALUE r.{NumberField} FROM r ORDER BY r.{NumberField} ASC", expectedResult: first400Integers, partitionKey: PartitionKey.None, enableOptimisticDirectExecution: true, pageSizeOptions: PageSizeOptions.PageSize100, - expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + expectedPipelineType: TestInjections.PipelineType.Specialized), + + //TODO: Change expectedPipelineType to OptimisticDirectExecution once emulator is updated to 0415 CreateInput( query: $"SELECT VALUE r.{NumberField} FROM r ORDER BY r.{NumberField} DESC", expectedResult: first400IntegersReversed, partitionKey: PartitionKey.None, enableOptimisticDirectExecution: true, pageSizeOptions: PageSizeOptions.PageSize100, - expectedPipelineType: TestInjections.PipelineType.OptimisticDirectExecution), + expectedPipelineType: TestInjections.PipelineType.Specialized), + CreateInput( query: $"SELECT VALUE r.numberField FROM r WHERE r.{NumberField} BETWEEN 0 AND {NumberOfDocuments} OFFSET 1 LIMIT 1", expectedResult: new List { 1 }, @@ -279,7 +531,7 @@ public async Task TestFailingOptimisticDirectExecutionOutput() { "SELECT TOP 10 * FOM r", null }, { "this is not a valid query", null }, }; - + await this.CreateIngestQueryDeleteAsync( ConnectionModes.Direct | ConnectionModes.Gateway, CollectionTypes.SinglePartition | CollectionTypes.MultiPartition, diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/OptimisticDirectExecutionQueryBaselineTests.PositiveOptimisticDirectExecutionOutput.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/OptimisticDirectExecutionQueryBaselineTests.PositiveOptimisticDirectExecutionOutput.xml index 5e496fc564..a5e6d97841 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/OptimisticDirectExecutionQueryBaselineTests.PositiveOptimisticDirectExecutionOutput.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/OptimisticDirectExecutionQueryBaselineTests.PositiveOptimisticDirectExecutionOutput.xml @@ -66,20 +66,7 @@ - Null Partition Key Value - SELECT * FROM c - - /pk - - Hash - - - true - - - - - None Partition Key Value + Cosmos.PartitionKey.Null Partition Key Value SELECT * FROM c /pk diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs index 20de3f1f03..fad65e80db 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs @@ -2,6 +2,7 @@ { using System; using System.Collections.Generic; + using System.Collections.Immutable; using System.Collections.ObjectModel; using System.IO; using System.Linq; @@ -80,19 +81,12 @@ public void PositiveOptimisticDirectExecutionOutput() // Below cases are Ode because they have a collection with a single physical partition. // Added emulator tests (TestPassingOptimisticDirectExecutionQueries()) to verify the negation of the below cases. CreateInput( - description: @"Null Partition Key Value", + description: @"Cosmos.PartitionKey.Null Partition Key Value", query: "SELECT * FROM c", expectedOptimisticDirectExecution: true, partitionKeyPath: @"/pk", partitionKeyValue: Cosmos.PartitionKey.Null), - CreateInput( - description: @"None Partition Key Value", - query: "SELECT * FROM c", - expectedOptimisticDirectExecution: true, - partitionKeyPath: @"/pk", - partitionKeyValue: Cosmos.PartitionKey.None), - CreateInput( description: @"C# Null Partition Key Value", query: "SELECT * FROM c", @@ -133,7 +127,7 @@ public void NegativeOptimisticDirectExecutionOutput() partitionKeyPath: @"/pk", partitionKeyValue: "a", continuationToken: CosmosArray.Create(new List() { ParallelContinuationToken.ToCosmosElement(parallelContinuationToken) })), - + CreateInput( description: @"Single Partition Key with OrderBy continuation token", query: "SELECT * FROM c ORDER BY c._ts", @@ -144,7 +138,7 @@ public void NegativeOptimisticDirectExecutionOutput() }; this.ExecuteTestSuite(testVariations); } - + // This test confirms that TestInjection.EnableOptimisticDirectExection is set to false from default. // Check test "TestPipelineForDistributedQueryAsync" to understand why this is done [TestMethod] @@ -169,7 +163,6 @@ public async Task TestPipelineForBackendDocumentsOnSinglePartitionAsync() partitionKeyValue: "a"); QueryRequestOptions queryRequestOptions = GetQueryRequestOptions(enableOptimisticDirectExecution: true); - DocumentContainer inMemoryCollection = await CreateDocumentContainerAsync(numItems, multiPartition: false); IQueryPipelineStage queryPipelineStage = await GetOdePipelineAsync(input, inMemoryCollection, queryRequestOptions); int documentCountInSinglePartition = 0; @@ -192,6 +185,145 @@ public async Task TestPipelineForBackendDocumentsOnSinglePartitionAsync() Assert.AreEqual(100, documentCountInSinglePartition); } + [TestMethod] + public async Task TestQueriesWhichNeverRequireDistribution() + { + // requiresDist = false + int numItems = 100; + List singlePartitionContainerTestCases = new List() + { + new RequiresDistributionTestCase("SELECT * FROM r", 10, 100), + new RequiresDistributionTestCase("SELECT VALUE r.id FROM r", 0, 10), + new RequiresDistributionTestCase("SELECT * FROM r WHERE r.id > 5", 0, 0), + new RequiresDistributionTestCase("SELECT r.id FROM r JOIN id IN r.id",0, 0), + new RequiresDistributionTestCase("SELECT TOP 5 r.id FROM r ORDER BY r.id", 0, 5), + new RequiresDistributionTestCase("SELECT TOP 5 r.id FROM r WHERE r.id > 5 ORDER BY r.id", 0, 0), + new RequiresDistributionTestCase("SELECT * FROM r OFFSET 5 LIMIT 3", 1, 3), + new RequiresDistributionTestCase("SELECT * FROM r WHERE r.id > 5 OFFSET 5 LIMIT 3", 0, 0) + }; + + foreach (RequiresDistributionTestCase testCase in singlePartitionContainerTestCases) + { + OptimisticDirectExecutionTestInput input = CreateInput( + description: @"Queries which will never require distribution", + query: testCase.Query, + expectedOptimisticDirectExecution: true, + partitionKeyPath: @"/pk", + partitionKeyValue: "a"); + + int result = await this.GetPipelineAndDrainAsync( + input, + numItems: numItems, + isMultiPartition: false, + expectedContinuationTokenCount: testCase.ExpectedContinuationTokenCount, + requiresDist: false); + + Assert.AreEqual(testCase.ExpectedDocumentCount, result); + } + } + + [TestMethod] + public async Task TestQueriesWhichWillAlwaysRequireDistribution() + { + // requiresDist = true + int numItems = 100; + List singlePartitionContainerTestCases = new List() + { + new RequiresDistributionTestCase("SELECT Sum(id) as sum_id FROM r JOIN id IN r.id", 0, 1), + new RequiresDistributionTestCase("SELECT DISTINCT TOP 5 r.id FROM r ORDER BY r.id", 0, 5), + new RequiresDistributionTestCase("SELECT DISTINCT r.id FROM r GROUP BY r.id", 0, 10), + new RequiresDistributionTestCase("SELECT DISTINCT r.id, Sum(r.id) as sum_a FROM r GROUP BY r.id",0, 10), + new RequiresDistributionTestCase("SELECT Count(1) FROM (SELECT DISTINCT r.id FROM root r)", 0, 1), + new RequiresDistributionTestCase("SELECT DISTINCT id FROM r JOIN id in r.id", 0, 0), + new RequiresDistributionTestCase("SELECT r.id, Count(1) AS count_a FROM r GROUP BY r.id ORDER BY r.id", 0, 10), + new RequiresDistributionTestCase("SELECT Count(1) as count FROM root r JOIN b IN r.id", 0, 1), + new RequiresDistributionTestCase("SELECT Avg(1) AS avg FROM root r", 0, 1), + new RequiresDistributionTestCase("SELECT r.id, Count(1) as count FROM r WHERE r.id > 0 GROUP BY r.id", 0, 0), + new RequiresDistributionTestCase("SELECT r.id FROM r WHERE r.id > 0 GROUP BY r.id ORDER BY r.id", 0, 0) + }; + + foreach (RequiresDistributionTestCase testCase in singlePartitionContainerTestCases) + { + OptimisticDirectExecutionTestInput input = CreateInput( + description: @"Queries which will always require distribution", + query: testCase.Query, + expectedOptimisticDirectExecution: true, + partitionKeyPath: @"/pk", + partitionKeyValue: "a"); + + int result = await this.GetPipelineAndDrainAsync( + input, + numItems: numItems, + isMultiPartition: false, + expectedContinuationTokenCount: testCase.ExpectedContinuationTokenCount, + requiresDist: true); + + Assert.AreEqual(testCase.ExpectedDocumentCount, result); + } + } + + [TestMethod] + public async Task TestQueriesWhichCanSwitchDistribution() + { + // requiresDist = true/false + int numItems = 100; + bool[] requiresDistSet = { true, false }; + + List singlePartitionContainerTestCases = new List() + { + new RequiresDistributionTestCase("SELECT Count(r.id) AS count_a FROM r", 0, 1), + new RequiresDistributionTestCase("SELECT DISTINCT r.id FROM r", 0, 10), + new RequiresDistributionTestCase("SELECT r.id, Count(1) AS count_a FROM r GROUP BY r.id", 0, 10), + new RequiresDistributionTestCase("SELECT Count(1) AS count FROM root r WHERE r.id < 2", 0, 1), + new RequiresDistributionTestCase("SELECT r.id, Count(r.id), Avg(r.id) FROM r WHERE r.id < 2 GROUP BY r.id", 0, 0), + new RequiresDistributionTestCase("SELECT TOP 5 Count(1) as count FROM r", 0, 1), + new RequiresDistributionTestCase("SELECT TOP 5 Count(1) as count FROM r ORDER BY r.id", 0, 1), + new RequiresDistributionTestCase("SELECT r.id FROM r GROUP BY r.id OFFSET 5 LIMIT 3", 0, 3), + new RequiresDistributionTestCase("SELECT Count(1) as count FROM r", 0, 1), + new RequiresDistributionTestCase("SELECT Sum(r.id) as sum_a FROM r", 0, 1), + new RequiresDistributionTestCase("SELECT Min(r.a) as min_a FROM r", 0, 1), + new RequiresDistributionTestCase("SELECT Max(r.a) as min_a FROM r", 0, 1), + new RequiresDistributionTestCase("SELECT Avg(r.a) as min_a FROM r", 0, 1), + new RequiresDistributionTestCase("SELECT Sum(r.a) as sum_a FROM r WHERE r.a > 0", 0, 1), + new RequiresDistributionTestCase("SELECT Sum(r.a) as sum_a FROM r WHERE r.a > 0 OFFSET 0 LIMIT 5", 0, 1), + new RequiresDistributionTestCase("SELECT Sum(r.a) as sum_a FROM r WHERE r.a > 0 OFFSET 5 LIMIT 5", 0, 0), + new RequiresDistributionTestCase("SELECT Sum(r.a) as sum_a FROM r ORDER BY r.a", 0, 1), + new RequiresDistributionTestCase("SELECT Sum(r.a) as sum_a FROM r ORDER BY r.a OFFSET 5 LIMIT 5", 0, 0), + new RequiresDistributionTestCase("SELECT Sum(r.a) as sum_a FROM r WHERE r.a > 0 ORDER BY r.a OFFSET 5 LIMIT 5", 0, 0), + new RequiresDistributionTestCase("SELECT DISTINCT VALUE r.id FROM r", 0, 10), + new RequiresDistributionTestCase("SELECT DISTINCT TOP 5 r.a FROM r", 0, 1), + new RequiresDistributionTestCase("SELECT s.id FROM (SELECT DISTINCT r.id FROM root r) as s", 0, 10), + new RequiresDistributionTestCase("SELECT DISTINCT r.a FROM r OFFSET 3 LIMIT 5", 0, 0), + new RequiresDistributionTestCase("SELECT Count(r.id) AS count_a FROM r", 0, 1), + new RequiresDistributionTestCase("SELECT r.id, Count(1) AS count_a FROM r GROUP BY r.id", 0, 10), + new RequiresDistributionTestCase("SELECT Count(1) AS count FROM root r WHERE r.id < 2", 0, 1), + new RequiresDistributionTestCase("SELECT TOP 5 Count(1) as count FROM r", 0, 1), + new RequiresDistributionTestCase("SELECT Count(1) AS count FROM root r WHERE r.id < 2", 0, 1), + }; + + foreach (RequiresDistributionTestCase testCase in singlePartitionContainerTestCases) + { + foreach (bool requiresDist in requiresDistSet) + { + OptimisticDirectExecutionTestInput input = CreateInput( + description: @"Queries which can require distribution in certain cases", + query: testCase.Query, + expectedOptimisticDirectExecution: true, + partitionKeyPath: @"/pk", + partitionKeyValue: "a"); + + int result = await this.GetPipelineAndDrainAsync( + input, + numItems: numItems, + isMultiPartition: false, + expectedContinuationTokenCount: testCase.ExpectedContinuationTokenCount, + requiresDist: requiresDist); + + Assert.AreEqual(testCase.ExpectedDocumentCount, result); + } + } + } + // test checks that the pipeline can take a query to the backend and returns its associated document(s) + continuation token. [TestMethod] public async Task TestPipelineForContinuationTokenOnSinglePartitionAsync() @@ -269,7 +401,7 @@ private static async Task ExecuteGoneExceptionOnODEPipeline(bool isMultiPa { Assert.AreEqual(TestInjections.PipelineType.OptimisticDirectExecution, queryRequestOptions.TestSettings.Stats.PipelineType.Value); } - else + else { Assert.AreNotEqual(TestInjections.PipelineType.OptimisticDirectExecution, queryRequestOptions.TestSettings.Stats.PipelineType.Value); } @@ -345,18 +477,20 @@ private static async Task TestHandlingOfFailedFallbackPipeline(bool isMult return (mergeTest, queryPipelineStage); } - private async Task GetPipelineAndDrainAsync(OptimisticDirectExecutionTestInput input, int numItems, bool isMultiPartition, int expectedContinuationTokenCount) + private async Task GetPipelineAndDrainAsync(OptimisticDirectExecutionTestInput input, int numItems, bool isMultiPartition, int expectedContinuationTokenCount, bool requiresDist = false) { QueryRequestOptions queryRequestOptions = GetQueryRequestOptions(enableOptimisticDirectExecution: true); - DocumentContainer inMemoryCollection = await CreateDocumentContainerAsync(numItems, multiPartition: isMultiPartition); + DocumentContainer inMemoryCollection = await CreateDocumentContainerAsync(numItems, multiPartition: isMultiPartition, requiresDist: requiresDist); IQueryPipelineStage queryPipelineStage = await GetOdePipelineAsync(input, inMemoryCollection, queryRequestOptions); - List documents = new List(); int continuationTokenCount = 0; while (await queryPipelineStage.MoveNextAsync(NoOpTrace.Singleton)) { - Assert.AreEqual(TestInjections.PipelineType.OptimisticDirectExecution, queryRequestOptions.TestSettings.Stats.PipelineType.Value); + if (!requiresDist) + { + Assert.AreEqual(TestInjections.PipelineType.OptimisticDirectExecution, queryRequestOptions.TestSettings.Stats.PipelineType.Value); + } TryCatch tryGetPage = queryPipelineStage.Current; tryGetPage.ThrowIfFailed(); @@ -420,6 +554,7 @@ private static async Task GetOdePipelineAsync(OptimisticDir private static async Task CreateDocumentContainerAsync( int numItems, bool multiPartition, + bool requiresDist = false, FlakyDocumentContainer.FailureConfigs failureConfigs = null) { PartitionKeyDefinition partitionKeyDefinition = new PartitionKeyDefinition() @@ -432,7 +567,9 @@ private static async Task CreateDocumentContainerAsync( Version = PartitionKeyDefinitionVersion.V2, }; - IMonadicDocumentContainer monadicDocumentContainer = new InMemoryContainer(partitionKeyDefinition); + MockDocumentContainer mockContainer = new MockDocumentContainer(partitionKeyDefinition, requiresDist); + IMonadicDocumentContainer monadicDocumentContainer = mockContainer; + if (failureConfigs != null) { monadicDocumentContainer = new FlakyDocumentContainer(monadicDocumentContainer, failureConfigs); @@ -523,7 +660,7 @@ public override OptimisticDirectExecutionTestOutput ExecuteTest(OptimisticDirect NoOpTrace.Singleton); bool result = queryPipelineStage.MoveNextAsync(NoOpTrace.Singleton).AsTask().GetAwaiter().GetResult(); - + if (input.ExpectedOptimisticDirectExecution) { Assert.AreEqual(TestInjections.PipelineType.OptimisticDirectExecution, queryRequestOptions.TestSettings.Stats.PipelineType.Value); @@ -546,11 +683,6 @@ public override OptimisticDirectExecutionTestOutput ExecuteTest(OptimisticDirect string sqlQuerySpecJsonString = streamReader.ReadToEnd(); PartitionedQueryExecutionInfo partitionedQueryExecutionInfo = GetPartitionedQueryExecutionInfo(sqlQuerySpecJsonString, input.PartitionKeyDefinition); - if (input.PartitionKeyValue == default || input.PartitionKeyValue == Cosmos.PartitionKey.None) - { - input.PartitionKeyValue = Cosmos.PartitionKey.Null; - } - CosmosQueryExecutionContextFactory.InputParameters inputParameters = new CosmosQueryExecutionContextFactory.InputParameters( sqlQuerySpec: new SqlQuerySpec(input.Query), initialUserContinuationToken: input.ContinuationToken, @@ -598,6 +730,68 @@ private static QueryRequestOptions GetQueryRequestOptions(bool enableOptimisticD }; } + internal readonly struct RequiresDistributionTestCase + { + public string Query { get; } + public int ExpectedContinuationTokenCount { get; } + public int ExpectedDocumentCount { get; } + + public RequiresDistributionTestCase( + string query, + int expectedContinuationTokenCount, + int expectedDocumentCount) + { + this.Query = query; + this.ExpectedContinuationTokenCount = expectedContinuationTokenCount; + this.ExpectedDocumentCount = expectedDocumentCount; + } + } + + private sealed class MockDocumentContainer : InMemoryContainer + { + private readonly bool requiresDistribution; + + public MockDocumentContainer( + PartitionKeyDefinition partitionKeyDefinition, + bool requiresDistribution) + : base(partitionKeyDefinition) + { + this.requiresDistribution = requiresDistribution; + } + + public override async Task> MonadicQueryAsync( + SqlQuerySpec sqlQuerySpec, + FeedRangeState feedRangeState, + QueryPaginationOptions queryPaginationOptions, + ITrace trace, + CancellationToken cancellationToken) + { + Task> queryPage = base.MonadicQueryAsync( + sqlQuerySpec, + feedRangeState, + queryPaginationOptions, + trace, + cancellationToken); + + ImmutableDictionary.Builder additionalHeaders = ImmutableDictionary.CreateBuilder(); + additionalHeaders.Add("x-ms-documentdb-partitionkeyrangeid", "0"); + additionalHeaders.Add("x-ms-test-header", "true"); + additionalHeaders.Add("x-ms-cosmos-query-requiresdistribution", this.requiresDistribution.ToString()); + + return await Task.FromResult( + TryCatch.FromResult( + new QueryPage( + queryPage.Result.Result.Documents, + requestCharge: 42, + activityId: Guid.NewGuid().ToString(), + responseLengthInBytes: 1337, + cosmosQueryExecutionInfo: default, + disallowContinuationTokenMessage: default, + additionalHeaders: additionalHeaders.ToImmutable(), + state: queryPage.Result.Result.State))); + } + } + private class MergeTestUtil { public int MoveNextCounter { get; private set; } @@ -626,7 +820,7 @@ public async Task ShouldReturnFailure() activityId: "0f8fad5b-d9cb-469f-a165-70867728950e", requestCharge: default); } - + if (this.IsFailedFallbackPipelineTest && this.GoneExceptionCreated && !this.TooManyRequestsFailureCreated) { this.TooManyRequestsFailureCreated = true; @@ -728,7 +922,7 @@ public override void SerializeAsXml(XmlWriter xmlWriter) } } } - + internal class TestCosmosQueryClient : CosmosQueryClient { public override Action OnExecuteScalarQueryCallback => throw new NotImplementedException(); @@ -743,7 +937,7 @@ public override void ClearSessionTokenCache(string collectionFullName) throw new NotImplementedException(); } - public override Task> ExecuteItemQueryAsync(string resourceUri, ResourceType resourceType, OperationType operationType, Guid clientQueryCorrelationId, Cosmos.FeedRange feedRange, QueryRequestOptions requestOptions, SqlQuerySpec sqlQuerySpec, string continuationToken, bool isContinuationExpected, int pageSize, ITrace trace, CancellationToken cancellationToken) + public override Task> ExecuteItemQueryAsync(string resourceUri, ResourceType resourceType, OperationType operationType, Cosmos.FeedRange feedRange, QueryRequestOptions requestOptions, AdditionalRequestHeaders additionalRequestHeaders, SqlQuerySpec sqlQuerySpec, string continuationToken, int pageSize, ITrace trace, CancellationToken cancellationToken) { throw new NotImplementedException(); } From c095bc1119684078737282dbe80ebbba100bab74 Mon Sep 17 00:00:00 2001 From: akotalwar <94020786+akotalwar@users.noreply.github.com> Date: Tue, 6 Jun 2023 17:26:50 -0700 Subject: [PATCH 25/39] Query: Refactors the EnableOptimisticDirectExecution flag to be public (#3883) * Made EnableOptimisticDirectExecution a public flag * Updated contract --- .../DotNetSDKEncryptionCustomAPI.json | 19 ++++++++++ .../src/RequestOptions/QueryRequestOptions.cs | 2 +- .../Contracts/DotNetSDKAPI.json | 38 +++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/Microsoft.Azure.Cosmos.Encryption.Custom/tests/Microsoft.Azure.Cosmos.Encryption.Custom.Tests/Contracts/DotNetSDKEncryptionCustomAPI.json b/Microsoft.Azure.Cosmos.Encryption.Custom/tests/Microsoft.Azure.Cosmos.Encryption.Custom.Tests/Contracts/DotNetSDKEncryptionCustomAPI.json index 8f858ddb94..1912d16407 100644 --- a/Microsoft.Azure.Cosmos.Encryption.Custom/tests/Microsoft.Azure.Cosmos.Encryption.Custom.Tests/Contracts/DotNetSDKEncryptionCustomAPI.json +++ b/Microsoft.Azure.Cosmos.Encryption.Custom/tests/Microsoft.Azure.Cosmos.Encryption.Custom.Tests/Contracts/DotNetSDKEncryptionCustomAPI.json @@ -51,6 +51,13 @@ ], "MethodInfo": "System.Threading.Tasks.Task`1[Microsoft.Azure.Cosmos.Encryption.Custom.DataEncryptionKey] FetchDataEncryptionKeyAsync(System.String, System.String, System.Threading.CancellationToken);IsAbstract:False;IsStatic:False;IsVirtual:True;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, + "System.Threading.Tasks.Task`1[Microsoft.Azure.Cosmos.Encryption.Custom.DataEncryptionKey] FetchDataEncryptionKeyWithoutRawKeyAsync(System.String, System.String, System.Threading.CancellationToken)[System.Runtime.CompilerServices.AsyncStateMachineAttribute(typeof(Microsoft.Azure.Cosmos.Encryption.Custom.CosmosDataEncryptionKeyProvider+))]": { + "Type": "Method", + "Attributes": [ + "AsyncStateMachineAttribute" + ], + "MethodInfo": "System.Threading.Tasks.Task`1[Microsoft.Azure.Cosmos.Encryption.Custom.DataEncryptionKey] FetchDataEncryptionKeyWithoutRawKeyAsync(System.String, System.String, System.Threading.CancellationToken);IsAbstract:False;IsStatic:False;IsVirtual:True;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Void .ctor(Microsoft.Azure.Cosmos.Encryption.Custom.EncryptionKeyWrapProvider, Microsoft.Data.Encryption.Cryptography.EncryptionKeyStoreProvider, System.Nullable`1[System.TimeSpan])[System.ObsoleteAttribute(\"Please use the constructor with EncryptionKeyStoreProvider only.\")]": { "Type": "Constructor", "Attributes": [ @@ -398,6 +405,13 @@ ], "MethodInfo": "System.Threading.Tasks.Task`1[Microsoft.Azure.Cosmos.Encryption.Custom.DataEncryptionKey] FetchDataEncryptionKeyAsync(System.String, System.String, System.Threading.CancellationToken);IsAbstract:False;IsStatic:False;IsVirtual:True;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, + "System.Threading.Tasks.Task`1[Microsoft.Azure.Cosmos.Encryption.Custom.DataEncryptionKey] FetchDataEncryptionKeyWithoutRawKeyAsync(System.String, System.String, System.Threading.CancellationToken)[System.Runtime.CompilerServices.AsyncStateMachineAttribute(typeof(Microsoft.Azure.Cosmos.Encryption.Custom.CosmosDataEncryptionKeyProvider+))]": { + "Type": "Method", + "Attributes": [ + "AsyncStateMachineAttribute" + ], + "MethodInfo": "System.Threading.Tasks.Task`1[Microsoft.Azure.Cosmos.Encryption.Custom.DataEncryptionKey] FetchDataEncryptionKeyWithoutRawKeyAsync(System.String, System.String, System.Threading.CancellationToken);IsAbstract:False;IsStatic:False;IsVirtual:True;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Void .ctor(Microsoft.Azure.Cosmos.Encryption.Custom.EncryptionKeyWrapProvider, Microsoft.Data.Encryption.Cryptography.EncryptionKeyStoreProvider, System.Nullable`1[System.TimeSpan])[System.ObsoleteAttribute(\"Please use the constructor with EncryptionKeyStoreProvider only.\")]": { "Type": "Constructor", "Attributes": [ @@ -426,6 +440,11 @@ "Type": "Method", "Attributes": [], "MethodInfo": "System.Threading.Tasks.Task`1[Microsoft.Azure.Cosmos.Encryption.Custom.DataEncryptionKey] FetchDataEncryptionKeyAsync(System.String, System.String, System.Threading.CancellationToken);IsAbstract:True;IsStatic:False;IsVirtual:True;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "System.Threading.Tasks.Task`1[Microsoft.Azure.Cosmos.Encryption.Custom.DataEncryptionKey] FetchDataEncryptionKeyWithoutRawKeyAsync(System.String, System.String, System.Threading.CancellationToken)": { + "Type": "Method", + "Attributes": [], + "MethodInfo": "System.Threading.Tasks.Task`1[Microsoft.Azure.Cosmos.Encryption.Custom.DataEncryptionKey] FetchDataEncryptionKeyWithoutRawKeyAsync(System.String, System.String, System.Threading.CancellationToken);IsAbstract:True;IsStatic:False;IsVirtual:True;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" } }, "NestedTypes": {} diff --git a/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs b/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs index cd505f1158..4cca513013 100644 --- a/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs +++ b/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs @@ -49,7 +49,7 @@ public class QueryRequestOptions : RequestOptions /// /// Direct (optimistic) execution offers improved performance for several kinds of queries such as a single partition streaming query. /// - internal bool EnableOptimisticDirectExecution { get; set; } + public bool EnableOptimisticDirectExecution { get; set; } /// /// Gets or sets the maximum number of items that can be buffered client side during diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json index e5b95a7ed9..8a3bc7b462 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json @@ -6279,6 +6279,18 @@ "Microsoft.Azure.Cosmos.QueryRequestOptions;Microsoft.Azure.Cosmos.RequestOptions;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, "Members": { + "Boolean EnableOptimisticDirectExecution": { + "Type": "Property", + "Attributes": [], + "MethodInfo": "Boolean EnableOptimisticDirectExecution;CanRead:True;CanWrite:True;Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Boolean get_EnableOptimisticDirectExecution()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Microsoft.Azure.Cosmos.DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions": { "Type": "Property", "Attributes": [], @@ -6433,6 +6445,13 @@ ], "MethodInfo": "Void set_EnableLowPrecisionOrderBy(System.Nullable`1[System.Boolean]);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, + "Void set_EnableOptimisticDirectExecution(Boolean)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Void set_EnableScanInQuery(System.Nullable`1[System.Boolean])[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { "Type": "Method", "Attributes": [ @@ -7301,6 +7320,18 @@ "Microsoft.Azure.Cosmos.QueryRequestOptions;Microsoft.Azure.Cosmos.RequestOptions;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, "Members": { + "Boolean EnableOptimisticDirectExecution": { + "Type": "Property", + "Attributes": [], + "MethodInfo": "Boolean EnableOptimisticDirectExecution;CanRead:True;CanWrite:True;Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Boolean get_EnableOptimisticDirectExecution()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Microsoft.Azure.Cosmos.DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions": { "Type": "Property", "Attributes": [], @@ -7455,6 +7486,13 @@ ], "MethodInfo": "Void set_EnableLowPrecisionOrderBy(System.Nullable`1[System.Boolean]);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, + "Void set_EnableOptimisticDirectExecution(Boolean)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Void set_EnableScanInQuery(System.Nullable`1[System.Boolean])[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { "Type": "Method", "Attributes": [ From 6024f2433b342f58d738b0339492850a09018309 Mon Sep 17 00:00:00 2001 From: Arooshi Avasthy <113193425+aavasthy@users.noreply.github.com> Date: Wed, 7 Jun 2023 09:15:05 -0700 Subject: [PATCH 26/39] [Internal] OpenTelemetry : Adds Telemetry Distributed Tracing functionality (#3801) * Direct Package update and replacing dagnostic files * Resolve merge conflicts * Running updateCOnstracts script * Add code changes for distributed tracing open telemetry changes * Add distributed tracing tests * Updated tests for distributed tracing * Addin traceID for diagnostics * Running update contract script * Removed LinqTranslationWithCustomSerializerBaseline file * Adding isDistributedTracingEnabled flag * Running update contracts * Running update contracts * Updates based on differnt code review comments * Running update contracts * Running update contracts * Running update contracts * fix test * Code cleanup for test fix * Running Update contracts * resolving merge conflicts * resolving merge conflicts * Set EnableDistributedTracing to true for performance tests * Benchmark project change for distributed tracing * Updating tests * Updated unit tests * Updated unit tests * Updated tests and constructors based on review comments * Updated scope name in recorder * Updated distributedOtel tests to cover more scenarios * Updated distributedOtel tests * Reverting benchmark performance test changes * Update DistributedOpentelemetry tests * Update test cleanup * Update distributed tests with custom builder * Update distributed open telemetry tests * Update contracts * Cleanup files * Update distributed Otel tests * Update distributed Otel tests * code refactoring * fix custom listener * Update direct package to 3.31.1 * Code clean up * Update tests with display name --------- Co-authored-by: Sourabh Jain --- Directory.Build.props | 2 +- .../src/Resource/ClientContextCore.cs | 1 + .../OpenTelemetryAttributeKeys.cs | 1 + .../OpenTelemetryCoreRecorder.cs | 67 +++++- .../OpenTelemetryRecorderFactory.cs | 47 ++-- ...iterBaselineTests.BatchOperationsAsync.xml | 5 +- ...riterBaselineTests.BulkOperationsAsync.xml | 55 ++++- ...aceWriterBaselineTests.ChangeFeedAsync.xml | 90 +++++-- ...eWriterBaselineTests.MiscellanousAsync.xml | 10 +- ...neTests.PointOperationsExceptionsAsync.xml | 30 ++- ...EndTraceWriterBaselineTests.QueryAsync.xml | 84 +++++++ ...TraceWriterBaselineTests.ReadFeedAsync.xml | 80 +++++-- ...TraceWriterBaselineTests.ReadManyAsync.xml | 10 +- ...selineTests.StreamPointOperationsAsync.xml | 20 +- ...aselineTests.TypedPointOperationsAsync.xml | 20 +- .../DistributedTracingOTelTests.cs | 222 ++++++++++++++++++ .../Tracing/AssertActivity.cs | 37 +-- .../Tracing/CustomListener.cs | 12 + .../Tracing/CustomOtelExporter.cs | 3 +- 19 files changed, 695 insertions(+), 101 deletions(-) create mode 100644 Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/DistributedTracingOTelTests.cs diff --git a/Directory.Build.props b/Directory.Build.props index 7eecd3c8e2..c8b86ceed2 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,7 +3,7 @@ 3.34.0 3.34.0 preview - 3.31.0 + 3.31.1 2.0.2 2.0.2 preview diff --git a/Microsoft.Azure.Cosmos/src/Resource/ClientContextCore.cs b/Microsoft.Azure.Cosmos/src/Resource/ClientContextCore.cs index d16d1c8bcc..42e128ac2e 100644 --- a/Microsoft.Azure.Cosmos/src/Resource/ClientContextCore.cs +++ b/Microsoft.Azure.Cosmos/src/Resource/ClientContextCore.cs @@ -497,6 +497,7 @@ private async Task RunWithDiagnosticsHelperAsync( databaseName: databaseName, operationType: operationType, requestOptions: requestOptions, + trace: trace, clientContext: this.isDisposed ? null : this)) using (new ActivityScope(Guid.NewGuid())) { diff --git a/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryAttributeKeys.cs b/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryAttributeKeys.cs index 755e1e3a66..1bb66170b5 100644 --- a/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryAttributeKeys.cs +++ b/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryAttributeKeys.cs @@ -10,6 +10,7 @@ internal sealed class OpenTelemetryAttributeKeys public const string DiagnosticNamespace = "Azure.Cosmos"; public const string ResourceProviderNamespace = "Microsoft.DocumentDB"; public const string OperationPrefix = "Operation"; + public const string NetworkLevelPrefix = "Request"; // Common database attributes public const string DbSystemName = "db.system"; diff --git a/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryCoreRecorder.cs b/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryCoreRecorder.cs index c199c0727c..2ef929ca8c 100644 --- a/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryCoreRecorder.cs +++ b/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryCoreRecorder.cs @@ -6,6 +6,7 @@ namespace Microsoft.Azure.Cosmos.Telemetry { using System; using System.Collections.Generic; + using System.Diagnostics; using global::Azure.Core; /// @@ -14,11 +15,12 @@ namespace Microsoft.Azure.Cosmos.Telemetry internal struct OpenTelemetryCoreRecorder : IDisposable { private const string CosmosDb = "cosmosdb"; - - private readonly DiagnosticScope scope; - private readonly DistributedTracingOptions config; - private readonly Documents.OperationType operationType; + private readonly DiagnosticScope scope = default; + private readonly DistributedTracingOptions config = null; + private readonly Activity activity = null; + + private readonly Documents.OperationType operationType = Documents.OperationType.Invalid; private OpenTelemetryAttributes response = null; internal static IDictionary> OTelCompatibleExceptions = new Dictionary>() @@ -30,7 +32,19 @@ internal struct OpenTelemetryCoreRecorder : IDisposable { typeof(ChangeFeedProcessorUserException), (exception, scope) => ChangeFeedProcessorUserException.RecordOtelAttributes((ChangeFeedProcessorUserException)exception, scope)} }; - public OpenTelemetryCoreRecorder( + private OpenTelemetryCoreRecorder(DiagnosticScope scope) + { + this.scope = scope; + this.scope.Start(); + } + + private OpenTelemetryCoreRecorder(string operationName) + { + this.activity = new Activity(operationName); + this.activity.Start(); + } + + private OpenTelemetryCoreRecorder( DiagnosticScope scope, string operationName, string containerName, @@ -54,6 +68,45 @@ public OpenTelemetryCoreRecorder( } } + /// + /// Used for creating parent activity in scenario where there are no listeners at operation level + /// but they are present at network level + /// + public static OpenTelemetryCoreRecorder CreateNetworkLevelParentActivity(DiagnosticScope networkScope) + { + return new OpenTelemetryCoreRecorder(networkScope); + } + + /// + /// Used for creating parent activity in scenario where there are no listeners at operation level and network level + /// + public static OpenTelemetryCoreRecorder CreateParentActivity(string operationName) + { + return new OpenTelemetryCoreRecorder(operationName); + } + + /// + /// Used for creating parent activity in scenario where there are listeners at operation level + /// + public static OpenTelemetryCoreRecorder CreateOperationLevelParentActivity( + DiagnosticScope operationScope, + string operationName, + string containerName, + string databaseName, + Documents.OperationType operationType, + CosmosClientContext clientContext, + DistributedTracingOptions config) + { + return new OpenTelemetryCoreRecorder( + operationScope, + operationName, + containerName, + databaseName, + operationType, + clientContext, + config); + } + public bool IsEnabled => this.scope.IsEnabled; public void Record(string key, string value) @@ -179,6 +232,10 @@ Documents.OperationType operationType this.scope.Dispose(); } + else + { + this.activity?.Stop(); + } } } } diff --git a/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs b/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs index fe10e7b22c..fee3282c1a 100644 --- a/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs +++ b/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs @@ -5,7 +5,9 @@ namespace Microsoft.Azure.Cosmos.Telemetry { using System; + using System.Diagnostics; using global::Azure.Core; + using Microsoft.Azure.Cosmos.Tracing; /// /// This class is used to generate Activities with Azure.Cosmos.Operation Source Name @@ -15,33 +17,42 @@ internal static class OpenTelemetryRecorderFactory /// /// Singleton to make sure we only have one instance of the DiagnosticScopeFactory and pattern matching of listener happens only once /// - private static DiagnosticScopeFactory ScopeFactory { get; set; } - + private static readonly Lazy LazyOperationScopeFactory = new Lazy( + valueFactory: () => new DiagnosticScopeFactory( + clientNamespace: $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.{OpenTelemetryAttributeKeys.OperationPrefix}", + resourceProviderNamespace: OpenTelemetryAttributeKeys.ResourceProviderNamespace, + isActivityEnabled: true, + suppressNestedClientActivities: true), + isThreadSafe: true); + + private static readonly Lazy LazyNetworkScopeFactory = new Lazy( + valueFactory: () => new DiagnosticScopeFactory( + clientNamespace: $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.{OpenTelemetryAttributeKeys.NetworkLevelPrefix}", + resourceProviderNamespace: OpenTelemetryAttributeKeys.ResourceProviderNamespace, + isActivityEnabled: true, + suppressNestedClientActivities: true), + isThreadSafe: true); + public static OpenTelemetryCoreRecorder CreateRecorder(string operationName, string containerName, string databaseName, Documents.OperationType operationType, RequestOptions requestOptions, + ITrace trace, CosmosClientContext clientContext) { + OpenTelemetryCoreRecorder openTelemetryRecorder = default; if (clientContext is { ClientOptions.IsDistributedTracingEnabled: true }) { - OpenTelemetryRecorderFactory.ScopeFactory ??= new DiagnosticScopeFactory(clientNamespace: $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.{OpenTelemetryAttributeKeys.OperationPrefix}", - resourceProviderNamespace: OpenTelemetryAttributeKeys.ResourceProviderNamespace, - isActivityEnabled: true, - suppressNestedClientActivities: true); - // If there is no source then it will return default otherwise a valid diagnostic scope - DiagnosticScope scope = OpenTelemetryRecorderFactory - .ScopeFactory - .CreateScope(name: operationName, + DiagnosticScope scope = LazyOperationScopeFactory.Value.CreateScope(name: operationName, kind: clientContext.ClientOptions.ConnectionMode == ConnectionMode.Gateway ? DiagnosticScope.ActivityKind.Internal : DiagnosticScope.ActivityKind.Client); // Record values only when we have a valid Diagnostic Scope if (scope.IsEnabled) { - return new OpenTelemetryCoreRecorder( - scope: scope, + openTelemetryRecorder = OpenTelemetryCoreRecorder.CreateOperationLevelParentActivity( + operationScope: scope, operationName: operationName, containerName: containerName, databaseName: databaseName, @@ -49,9 +60,17 @@ public static OpenTelemetryCoreRecorder CreateRecorder(string operationName, clientContext: clientContext, config: requestOptions?.DistributedTracingOptions ?? clientContext.ClientOptions?.DistributedTracingOptions); } - } +#if !INTERNAL + else if (Activity.Current is null) + { + DiagnosticScope requestScope = LazyNetworkScopeFactory.Value.CreateScope(name: operationName); - return default; + openTelemetryRecorder = requestScope.IsEnabled ? OpenTelemetryCoreRecorder.CreateNetworkLevelParentActivity(networkScope: requestScope) : OpenTelemetryCoreRecorder.CreateParentActivity(operationName); + } +#endif + trace.AddDatum("DistributedTraceId", Activity.Current?.TraceId); + } + return openTelemetryRecorder; } } } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml index 09579f83b7..66ca36f8ba 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml @@ -38,6 +38,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) └── Execute Next Batch(00000000-0000-0000-0000-000000000000) Batch-Component 00:00:00:000 0.00 milliseconds ├── Create Batch Request(00000000-0000-0000-0000-000000000000) Batch-Component 00:00:00:000 0.00 milliseconds @@ -64,7 +66,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml index be3a8c7910..b483975a57 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml @@ -35,6 +35,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -69,7 +71,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -431,6 +434,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -459,7 +464,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -808,6 +814,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -836,7 +844,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1185,6 +1194,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -1213,7 +1224,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1562,6 +1574,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -1590,7 +1604,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1939,6 +1954,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -1967,7 +1984,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2316,6 +2334,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -2344,7 +2364,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2693,6 +2714,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -2721,7 +2744,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -3070,6 +3094,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -3098,7 +3124,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -3447,6 +3474,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -3475,7 +3504,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -3840,6 +3870,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get Collection Cache(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -4014,7 +4046,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml index 43d95de95d..ffc97ea44f 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml @@ -30,6 +30,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -72,6 +74,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -99,6 +103,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -126,6 +132,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -153,6 +161,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ ├── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -245,7 +255,8 @@ "name": "Change Feed Iterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -408,7 +419,8 @@ "name": "Change Feed Iterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -495,7 +507,8 @@ "name": "Change Feed Iterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -582,7 +595,8 @@ "name": "Change Feed Iterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -669,7 +683,8 @@ "name": "Change Feed Iterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1106,6 +1121,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1149,6 +1166,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1177,6 +1196,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1205,6 +1226,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1240,7 +1263,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1407,7 +1431,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1498,7 +1523,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1589,7 +1615,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1833,6 +1860,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1875,6 +1904,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1902,6 +1933,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1929,6 +1962,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1963,7 +1998,8 @@ "name": "Change Feed Iterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2126,7 +2162,8 @@ "name": "Change Feed Iterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2213,7 +2250,8 @@ "name": "Change Feed Iterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2300,7 +2338,8 @@ "name": "Change Feed Iterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2540,6 +2579,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -2583,6 +2624,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -2611,6 +2654,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -2639,6 +2684,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ChangeFeed MoveNextAsync(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -2674,7 +2721,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2841,7 +2889,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2932,7 +2981,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -3023,7 +3073,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -3262,6 +3313,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── Initialize Lease Store(00000000-0000-0000-0000-000000000000) ChangeFeed-Component 00:00:00:000 0.00 milliseconds ├── Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds @@ -3331,7 +3384,8 @@ "name": "Change Feed Estimator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml index 29fc40f674..df53bd53d0 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml @@ -20,6 +20,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds │ ├── Waiting for Initialization of client to complete(00000000-0000-0000-0000-000000000000) Unknown-Component 00:00:00:000 0.00 milliseconds @@ -47,7 +49,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -175,6 +178,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds │ └── Microsoft.Azure.Cosmos.Handlers.DiagnosticsHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds @@ -200,7 +205,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml index 9ee0b6e650..902712a2a4 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml @@ -37,6 +37,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get PkValue From Stream(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -71,7 +73,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -223,6 +226,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get PkValue From Stream(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -276,7 +281,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -510,6 +516,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get PkValue From Stream(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -555,7 +563,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -754,6 +763,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get PkValue From Stream(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -810,7 +821,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1030,6 +1042,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get PkValue From Stream(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -1108,7 +1122,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1331,6 +1346,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get PkValue From Stream(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -1365,7 +1382,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml index e9b0f96a00..5075d5d3e9 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml @@ -24,6 +24,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -64,6 +66,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -97,6 +101,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -130,6 +136,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ [Query Correlated ActivityId] │ Redacted To Not Change The Baselines From Run To Run │ ) @@ -171,6 +179,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -298,6 +307,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -391,6 +401,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -484,6 +495,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -697,6 +709,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -738,6 +752,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -772,6 +788,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -806,6 +824,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ [Query Correlated ActivityId] │ Redacted To Not Change The Baselines From Run To Run │ ) @@ -848,6 +868,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -979,6 +1000,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -1076,6 +1098,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -1173,6 +1196,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -1391,6 +1415,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -1431,6 +1457,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -1464,6 +1492,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -1497,6 +1527,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ [Query Correlated ActivityId] │ Redacted To Not Change The Baselines From Run To Run │ ) @@ -1538,6 +1570,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -1665,6 +1698,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -1758,6 +1792,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -1851,6 +1886,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -2065,6 +2101,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -2106,6 +2144,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -2140,6 +2180,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -2174,6 +2216,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ [Query Correlated ActivityId] │ Redacted To Not Change The Baselines From Run To Run │ ) @@ -2216,6 +2260,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -2347,6 +2392,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -2444,6 +2490,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -2541,6 +2588,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -2762,6 +2810,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -2823,6 +2873,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -2857,6 +2909,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -2891,6 +2945,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ [Query Correlated ActivityId] │ Redacted To Not Change The Baselines From Run To Run │ ) @@ -2933,6 +2989,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -3108,6 +3165,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -3205,6 +3263,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -3302,6 +3361,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -3522,6 +3582,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -3563,6 +3625,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -3596,6 +3660,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -3629,6 +3695,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ [Query Correlated ActivityId] │ Redacted To Not Change The Baselines From Run To Run │ ) @@ -3670,6 +3738,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -3803,6 +3872,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -3896,6 +3966,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -3989,6 +4060,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -4205,6 +4277,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -4247,6 +4321,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -4281,6 +4357,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ [Query Correlated ActivityId] │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) @@ -4315,6 +4393,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ [Query Correlated ActivityId] │ Redacted To Not Change The Baselines From Run To Run │ ) @@ -4357,6 +4437,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -4494,6 +4575,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -4591,6 +4673,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ @@ -4688,6 +4771,7 @@ "duration in milliseconds": 0, "data": { "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run", "Query Correlated ActivityId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml index 501a8b187e..2dd4424cb7 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml @@ -24,6 +24,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -64,6 +66,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -89,6 +93,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -114,6 +120,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) └── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -146,7 +154,8 @@ "name": "FeedIterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -301,7 +310,8 @@ "name": "FeedIterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -380,7 +390,8 @@ "name": "FeedIterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -459,7 +470,8 @@ "name": "FeedIterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -659,6 +671,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -700,6 +714,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -726,6 +742,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -752,6 +770,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -785,7 +805,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -944,7 +965,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1027,7 +1049,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1110,7 +1133,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1315,6 +1339,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1355,6 +1381,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1380,6 +1408,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1405,6 +1435,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) └── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1437,7 +1469,8 @@ "name": "FeedIterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1592,7 +1625,8 @@ "name": "FeedIterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1671,7 +1705,8 @@ "name": "FeedIterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1750,7 +1785,8 @@ "name": "FeedIterator Read Next Async", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -1951,6 +1987,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -1992,6 +2030,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -2018,6 +2058,8 @@ │ │ ( │ │ [Client Configuration] │ │ Redacted To Not Change The Baselines From Run To Run + │ │ [DistributedTraceId] + │ │ Redacted To Not Change The Baselines From Run To Run │ │ ) │ ├── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -2044,6 +2086,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── MoveNextAsync(00000000-0000-0000-0000-000000000000) ReadFeed-Component 00:00:00:000 0.00 milliseconds │ └── MoveNextAsync(00000000-0000-0000-0000-000000000000) Pagination-Component 00:00:00:000 0.00 milliseconds @@ -2077,7 +2121,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2236,7 +2281,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2319,7 +2365,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -2402,7 +2449,8 @@ "name": "Typed FeedIterator ReadNextAsync", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml index 627a8ea66f..362afa7444 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml @@ -16,6 +16,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── Execute query for a partitionkeyrange(00000000-0000-0000-0000-000000000000) Query-Component 00:00:00:000 0.00 milliseconds │ │ ( @@ -141,7 +143,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -582,6 +585,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── Execute query for a partitionkeyrange(00000000-0000-0000-0000-000000000000) Query-Component 00:00:00:000 0.00 milliseconds │ │ ( @@ -710,7 +715,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml index 016a37aaaf..8816767262 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml @@ -22,6 +22,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) └── Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds └── Microsoft.Azure.Cosmos.Handlers.DiagnosticsHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds @@ -44,7 +46,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -132,6 +135,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) └── Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds └── Microsoft.Azure.Cosmos.Handlers.DiagnosticsHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds @@ -154,7 +159,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -250,6 +256,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) └── Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds └── Microsoft.Azure.Cosmos.Handlers.DiagnosticsHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds @@ -272,7 +280,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -363,6 +372,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) └── Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds └── Microsoft.Azure.Cosmos.Handlers.DiagnosticsHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds @@ -385,7 +396,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml index add1fcc343..f23344b440 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml @@ -20,6 +20,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Get PkValue From Stream(00000000-0000-0000-0000-000000000000) Routing-Component 00:00:00:000 0.00 milliseconds @@ -46,7 +48,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -152,6 +155,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds │ └── Microsoft.Azure.Cosmos.Handlers.DiagnosticsHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds @@ -175,7 +180,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -275,6 +281,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── ItemSerialize(00000000-0000-0000-0000-000000000000) Transport-Component 00:00:00:000 0.00 milliseconds ├── Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds @@ -299,7 +307,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { @@ -397,6 +406,8 @@ │ ( │ [Client Configuration] │ Redacted To Not Change The Baselines From Run To Run + │ [DistributedTraceId] + │ Redacted To Not Change The Baselines From Run To Run │ ) ├── Microsoft.Azure.Cosmos.Handlers.RequestInvokerHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds │ └── Microsoft.Azure.Cosmos.Handlers.DiagnosticsHandler(00000000-0000-0000-0000-000000000000) RequestHandler-Component 00:00:00:000 0.00 milliseconds @@ -420,7 +431,8 @@ "start datetime": "0001-01-01T00:00:00Z", "duration in milliseconds": 0, "data": { - "Client Configuration": "Redacted To Not Change The Baselines From Run To Run" + "Client Configuration": "Redacted To Not Change The Baselines From Run To Run", + "DistributedTraceId": "Redacted To Not Change The Baselines From Run To Run" }, "children": [ { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/DistributedTracingOTelTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/DistributedTracingOTelTests.cs new file mode 100644 index 0000000000..8b5825831c --- /dev/null +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/DistributedTracingOTelTests.cs @@ -0,0 +1,222 @@ +//------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +//------------------------------------------------------------ + +namespace Microsoft.Azure.Cosmos +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + using Microsoft.Azure.Cosmos.CosmosElements; + using Microsoft.Azure.Cosmos.SDK.EmulatorTests; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using Newtonsoft.Json.Linq; + using OpenTelemetry.Trace; + using OpenTelemetry; + using AzureCore = global::Azure.Core; + using Microsoft.Azure.Cosmos.Telemetry; + using System.Diagnostics; + using Microsoft.Azure.Cosmos.Tracing; + using System.Net.Http; + using System.ComponentModel; + + [VisualStudio.TestTools.UnitTesting.TestClass] + public sealed class DistributedTracingOTelTests : BaseCosmosClientHelper + { + [TestInitialize] + public void TestInitialize() + { + AppContext.SetSwitch("Azure.Experimental.EnableActivitySource", true); + AzureCore.ActivityExtensions.ResetFeatureSwitch(); + } + + [DataTestMethod] + [DataRow($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Request", DisplayName = "DirectMode and DistributedFlag On: Asserts activity creation at operation and network level with Diagnostic TraceId being added to logs")] + [DataRow($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", null, DisplayName = "DirectMode and DistributedFlag On: Asserts activity creation at operation level with Diagnostic TraceId being added to logs")] + public async Task SourceEnabled_FlagOn_DirectMode_RecordsActivity_AssertLogTraceId_AssertTraceparent(string operationLevelSource, string networkLevelSource) + { + string[] sources = new string[] { operationLevelSource, networkLevelSource }; + sources = sources.Where(x => x != null).ToArray(); + + using TracerProvider provider = Sdk.CreateTracerProviderBuilder() + .AddCustomOtelExporter() + .AddSource(sources) + .Build(); + + await base.TestInit(validateSinglePartitionKeyRangeCacheCall: false, + customizeClientBuilder: (builder) => builder + .WithDistributedTracing(true) + .WithConnectionModeDirect()); + + Container containerResponse = await this.database.CreateContainerAsync( + id: Guid.NewGuid().ToString(), + partitionKeyPath: "/id", + throughput: 20000); + + CosmosObject cosmosObject = CosmosObject.Create( + new Dictionary() + { + { "id", CosmosString.Create("1") } + }); + + ItemResponse createResponse = await containerResponse.CreateItemAsync(JToken.Parse(cosmosObject.ToString())); + + //Assert traceparent header in Direct mode request + Assert.IsTrue(createResponse.RequestMessage.Headers.TryGetValue("traceparent", out string traceheader)); + Assert.IsNotNull(traceheader); + string[] traceheaderParts = traceheader.Split('-'); + string traceheaderId = traceheaderParts[1]; + + //Assert traceId in Diagnostics logs + string diagnosticsCreateItem = createResponse.Diagnostics.ToString(); + JObject objDiagnosticsCreate = JObject.Parse(diagnosticsCreateItem); + string distributedTraceId = (string)objDiagnosticsCreate["data"]["DistributedTraceId"]; + Assert.IsFalse(string.IsNullOrEmpty(distributedTraceId)); + + //Assert diagnostics log trace id is same as parent trace id of the activity + string operationName = (string)objDiagnosticsCreate["name"]; + string traceIdCreateItem = CustomOtelExporter.CollectedActivities + .Where(x => x.OperationName.Contains(operationName)) + .FirstOrDefault() + .TraceId + .ToString(); + //Assert created activity traceId and diagnosticsLog traceId + Assert.AreEqual(distributedTraceId, traceIdCreateItem); + + //Assert requestHeader trace id and and diagnosticsLog traceId + Assert.AreEqual(distributedTraceId, traceheaderId); + + //Assert activity creation + Assert.IsNotNull(CustomOtelExporter.CollectedActivities); + + if (networkLevelSource != null) + { + // Assert activity created at network level have an existing parent activity + Activity networkLevelChildActivity = CustomOtelExporter.CollectedActivities + .Where(x => x.OperationName.Contains("Request")) + .FirstOrDefault(); + Assert.IsNotNull(CustomOtelExporter.CollectedActivities + .Where(x => x.Id == networkLevelChildActivity.ParentId)); + } + } + + [DataTestMethod] + [DataRow($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Request", DisplayName = "GatewayMode and DistributedFlag On: Asserts activity creation at operation and network level with Diagnostic TraceId being added to logs")] + [DataRow($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", null, DisplayName = "GatewayMode and DistributedFlag On: Asserts activity creation at operation level with Diagnostic TraceId being added to logs")] + public async Task SourceEnabled_FlagOn_GatewayMode_RecordsActivity_AssertLogTraceId_AssertTraceparent(string operationLevelSource, string networkLevelSource) + { + string[] sources = new string[] { operationLevelSource, networkLevelSource }; + sources = sources.Where(x => x != null).ToArray(); + + HttpClientHandlerHelper httpClientHandlerHelper = new HttpClientHandlerHelper + { + RequestCallBack = (request, cancellation) => + { + if (request.Headers.TryGetValues("traceparent", out IEnumerable traceparentHeaderValues)) + { + Assert.IsNotNull(traceparentHeaderValues); + } + return null; + } + }; + + using TracerProvider provider = Sdk.CreateTracerProviderBuilder() + .AddCustomOtelExporter() + .AddSource(sources) + .Build(); + + await base.TestInit(validateSinglePartitionKeyRangeCacheCall: false, + customizeClientBuilder: (builder) => builder + .WithDistributedTracing(true) + .WithHttpClientFactory(() => new HttpClient(httpClientHandlerHelper)) + .WithConnectionModeGateway()); + + ContainerResponse containerResponse = await this.database.CreateContainerAsync( + id: Guid.NewGuid().ToString(), + partitionKeyPath: "/id", + throughput: 20000); + + List b = CustomOtelExporter.CollectedActivities.ToList(); + //Assert traceId in Diagnostics logs + string diagnosticsCreateContainer = containerResponse.Diagnostics.ToString(); + JObject objDiagnosticsCreate = JObject.Parse(diagnosticsCreateContainer); + string distributedTraceId = (string)objDiagnosticsCreate["data"]["DistributedTraceId"]; + Assert.IsFalse(string.IsNullOrEmpty(distributedTraceId)); + + //Assert diagnostics log trace id is same as parent trace id of the activity + string operationName = (string)objDiagnosticsCreate["name"]; + string traceIdCreateContainer = CustomOtelExporter.CollectedActivities + .Where(x => x.OperationName.Contains(operationName)) + .FirstOrDefault() + .TraceId + .ToString(); + Assert.AreEqual(distributedTraceId, traceIdCreateContainer); + + //Assert activity creation + Assert.IsNotNull(CustomOtelExporter.CollectedActivities); + } + + [DataTestMethod] + [DataRow(false, true, "random.source.name", DisplayName = "DirectMode, DistributedFlag On, Random/No Source:Asserts no activity creation")] + [DataRow(true, true, "random.source.name", DisplayName = "GatewayMode, DistributedFlag On, Random/No Source:Asserts no activity creation")] + [DataRow(false, false, "random.source.name", DisplayName = "DirectMode, DistributedFlag Off, Random/No Source:Asserts no activity creation")] + [DataRow(true, false, "random.source.name", DisplayName = "GatewayMode, DistributedFlag Off, Random/No Source:Asserts no activity creation")] + [DataRow(false, false, $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", DisplayName = "DirectMode, DistributedFlag Off, OperationLevel Source:Asserts no activity creation")] + [DataRow(true, false, $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", DisplayName = "GatewayMode, DistributedFlag Off, OperationLevel Source:Asserts no activity creation")] + public async Task NoSourceEnabled_ResultsInNoSourceParentActivityCreation_AssertLogTraceId(bool useGateway, bool enableDistributingTracing, string source) + { + using TracerProvider provider = Sdk.CreateTracerProviderBuilder() + .AddCustomOtelExporter() + .AddSource(source) + .Build(); + + if (useGateway) + { + await base.TestInit(validateSinglePartitionKeyRangeCacheCall: false, + customizeClientBuilder: (builder) => builder + .WithDistributedTracing(enableDistributingTracing) + .WithConnectionModeGateway()); + } + else + { + await base.TestInit(validateSinglePartitionKeyRangeCacheCall: false, + customizeClientBuilder: (builder) => builder + .WithDistributedTracing(enableDistributingTracing)); + } + + ContainerResponse containerResponse = await this.database.CreateContainerAsync( + id: Guid.NewGuid().ToString(), + partitionKeyPath: "/id", + throughput: 20000); + + //Assert traceId in Diagnostics logs + string diagnosticsCreateContainer = containerResponse.Diagnostics.ToString(); + JObject objDiagnosticsCreate = JObject.Parse(diagnosticsCreateContainer); + + if (enableDistributingTracing) + { + //DistributedTraceId present in logs + string distributedTraceId = (string)objDiagnosticsCreate["data"]["DistributedTraceId"]; + Assert.IsFalse(string.IsNullOrEmpty(distributedTraceId), "Distributed Trace Id is not there in diagnostics"); + } + else + { + //DistributedTraceId field not present in logs + Assert.IsNull(objDiagnosticsCreate["data"]["DistributedTraceId"], "Distributed Trace Id has value in diagnostics i.e. " + (string)objDiagnosticsCreate["data"]["DistributedTraceId"]); + } + + //Assert no activity with attached source is created + Assert.AreEqual(0, CustomOtelExporter.CollectedActivities.Count()); + } + + [TestCleanup] + public async Task CleanUp() + { + await base.TestCleanup(); + + AppContext.SetSwitch("Azure.Experimental.EnableActivitySource", false); + AzureCore.ActivityExtensions.ResetFeatureSwitch(); + } + } +} \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs index e25a46e44c..b1223656f1 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs @@ -4,9 +4,11 @@ namespace Microsoft.Azure.Cosmos.Tracing { + using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; + using global::Azure; using Microsoft.Azure.Cosmos.Telemetry; using Microsoft.Azure.Cosmos.Tests; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -16,20 +18,22 @@ internal static class AssertActivity { public static void IsValidOperationActivity(Activity activity) { - Assert.IsTrue(activity.OperationName == activity.DisplayName); + if (string.Equals(activity.Source.Name, $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", StringComparison.OrdinalIgnoreCase)) + { + Assert.IsTrue(activity.OperationName == activity.DisplayName); - Assert.IsFalse(string.IsNullOrEmpty(activity.GetTagItem("db.cosmosdb.connection_mode").ToString()), $"connection mode is emtpy for {activity.OperationName}"); + Assert.IsFalse(string.IsNullOrEmpty(activity.GetTagItem("db.cosmosdb.connection_mode").ToString()), $"connection mode is emtpy for {activity.OperationName}"); - if (activity.GetTagItem("db.cosmosdb.connection_mode").ToString() == ConnectionMode.Gateway.ToString()) - { - Assert.AreEqual(ActivityKind.Internal, activity.Kind, $" Actual Kind is {activity.Kind} but expected is {ActivityKind.Internal} for {activity.OperationName}"); - } - else if (activity.GetTagItem("db.cosmosdb.connection_mode").ToString() == ConnectionMode.Direct.ToString()) - { - Assert.AreEqual(ActivityKind.Client, activity.Kind, $" Actual Kind is {activity.Kind} but expected is {ActivityKind.Client} for {activity.OperationName}"); - } - - IList expectedTags = new List + if (activity.GetTagItem("db.cosmosdb.connection_mode").ToString() == ConnectionMode.Gateway.ToString()) + { + Assert.AreEqual(ActivityKind.Internal, activity.Kind, $" Actual Kind is {activity.Kind} but expected is {ActivityKind.Internal} for {activity.OperationName}"); + } + else if (activity.GetTagItem("db.cosmosdb.connection_mode").ToString() == ConnectionMode.Direct.ToString()) + { + Assert.AreEqual(ActivityKind.Client, activity.Kind, $" Actual Kind is {activity.Kind} but expected is {ActivityKind.Client} for {activity.OperationName}"); + } + + IList expectedTags = new List { "az.namespace", "az.schema_url", @@ -60,11 +64,12 @@ public static void IsValidOperationActivity(Activity activity) "db.cosmosdb.correlated_activity_id" }; - foreach (KeyValuePair actualTag in activity.Tags) - { - Assert.IsTrue(expectedTags.Contains(actualTag.Key), $"{actualTag.Key} is not allowed for {activity.OperationName}"); + foreach (KeyValuePair actualTag in activity.Tags) + { + Assert.IsTrue(expectedTags.Contains(actualTag.Key), $"{actualTag.Key} is not allowed for {activity.OperationName}"); - AssertActivity.AssertDatabaseAndContainerName(activity.OperationName, actualTag); + AssertActivity.AssertDatabaseAndContainerName(activity.OperationName, actualTag); + } } } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs index b0df15c3f2..44d34abece 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs @@ -34,6 +34,8 @@ internal class CustomListener : public static ConcurrentBag CollectedNetworkActivities { private set; get; } = new(); private static ConcurrentBag CollectedEvents { set; get; } = new(); + private static List EventSources { set; get; } = new(); + public CustomListener(string name, string eventName) : this(n => Regex.Match(n, name).Success, eventName) { @@ -43,6 +45,11 @@ public CustomListener(Func filter, string eventName) { this.sourceNameFilter = filter; this.eventName = eventName; + + foreach (EventSource eventSource in EventSources) + { + this.OnEventSourceCreated(eventSource); + } DiagnosticListener.AllListeners.Subscribe(this); } @@ -152,6 +159,11 @@ public void OnNext(DiagnosticListener value) /// protected override void OnEventSourceCreated(EventSource eventSource) { + if(this.eventName == null) + { + EventSources.Add(eventSource); + } + if (eventSource != null && eventSource.Name.Equals(this.eventName)) { this.EnableEvents(eventSource, EventLevel.Informational); // Enable information level events diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs index de819ee021..9572a298a6 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs @@ -18,11 +18,12 @@ internal class CustomOtelExporter : BaseExporter { private readonly string _name; - public static List CollectedActivities = new List(); + public static List CollectedActivities; public CustomOtelExporter(string name = "CustomOtelExporter") { this._name = name; + CollectedActivities = new List(); } public override ExportResult Export(in Batch batch) From e08fd5242f2129c4f0297447f35ec69881a11682 Mon Sep 17 00:00:00 2001 From: Rinat Minibaev <132935507+rinatmini@users.noreply.github.com> Date: Thu, 8 Jun 2023 07:29:04 -0700 Subject: [PATCH 27/39] Documentation: Adds additional remarks to CosmosClient (#3891) * CosmosClient documentation improvements * Cref fix * Link fix * Documentation fix * Typo fix --------- Co-authored-by: Matias Quaranta --- Microsoft.Azure.Cosmos/src/CosmosClient.cs | 20 ++++++++++++++++++- .../src/Fluent/CosmosClientBuilder.cs | 13 ++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Microsoft.Azure.Cosmos/src/CosmosClient.cs b/Microsoft.Azure.Cosmos/src/CosmosClient.cs index d4fe7dcb9b..d622e9ddcb 100644 --- a/Microsoft.Azure.Cosmos/src/CosmosClient.cs +++ b/Microsoft.Azure.Cosmos/src/CosmosClient.cs @@ -92,6 +92,9 @@ namespace Microsoft.Azure.Cosmos /// ]]> /// /// + /// + /// The returned not-initialized reference doesn't guarantee credentials or connectivity validations because creation doesn't make any network calls + /// /// /// /// Performance Tips @@ -179,6 +182,9 @@ protected CosmosClient() /// ]]> /// /// + /// + /// The returned reference doesn't guarantee credentials or connectivity validations because creation doesn't make any network calls. + /// /// /// /// Performance Tips @@ -221,6 +227,9 @@ public CosmosClient( /// ]]> /// /// + /// + /// The returned reference doesn't guarantee credentials or connectivity validations because creation doesn't make any network calls. + /// /// /// /// Performance Tips @@ -274,7 +283,10 @@ public CosmosClient( /// /// Performance Tips /// Diagnose and troubleshoot issues - /// AzureKeyCredential enables changing/updating master-key/ResourceToken whle CosmosClient is still in use. + /// + /// AzureKeyCredential enables changing/updating master-key/ResourceToken whle CosmosClient is still in use. + /// The returned reference doesn't guarantee credentials or connectivity validations because creation doesn't make any network calls. + /// public CosmosClient( string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, @@ -292,6 +304,9 @@ public CosmosClient( /// of the application which enables efficient connection management and performance. Please refer to the /// performance guide. /// + /// + /// The returned reference doesn't guarantee credentials or connectivity validations because creation doesn't make any network calls. + /// /// The cosmos service endpoint to use. /// The token to provide AAD token for authorization. /// (Optional) client options @@ -368,6 +383,9 @@ internal CosmosClient( /// ]]> /// /// + /// + /// The returned reference doesn't guarantee credentials or connectivity validations because initialization doesn't make any network calls. + /// public static async Task CreateAndInitializeAsync(string accountEndpoint, string authKeyOrResourceToken, IReadOnlyList<(string databaseId, string containerId)> containers, diff --git a/Microsoft.Azure.Cosmos/src/Fluent/CosmosClientBuilder.cs b/Microsoft.Azure.Cosmos/src/Fluent/CosmosClientBuilder.cs index 692d5b498a..8b72bfffa4 100644 --- a/Microsoft.Azure.Cosmos/src/Fluent/CosmosClientBuilder.cs +++ b/Microsoft.Azure.Cosmos/src/Fluent/CosmosClientBuilder.cs @@ -167,9 +167,13 @@ public CosmosClientBuilder( /// /// A method to create the cosmos client + /// CosmosClient is thread-safe. Its recommended to maintain a single instance of CosmosClient per lifetime + /// of the application which enables efficient connection management and performance. Please refer to the + /// performance guide. /// /// /// Setting this property after sending any request won't have any effect. + /// The returned reference doesn't guarantee credentials or connectivity validations because creation doesn't make any network calls. /// /// An instance of . public CosmosClient Build() @@ -191,6 +195,11 @@ public CosmosClient Build() /// /// A method to create the cosmos client and initialize the provided containers. + /// In addition to that it initializes the client with containers provided i.e The SDK warms up the caches and + /// connections before the first call to the service is made. Use this to obtain lower latency while startup of your application. + /// CosmosClient is thread-safe. Its recommended to maintain a single instance of CosmosClient per lifetime + /// of the application which enables efficient connection management and performance. Please refer to the + /// performance guide. /// /// Containers to be initialized identified by it's database name and container name. /// (Optional) Cancellation Token @@ -214,9 +223,13 @@ public Task BuildAndInitializeAsync(IReadOnlyList<(string database /// /// A method to create the cosmos client + /// CosmosClient is thread-safe. Its recommended to maintain a single instance of CosmosClient per lifetime + /// of the application which enables efficient connection management and performance. Please refer to the + /// performance guide. /// /// /// Setting this property after sending any request won't have any effect. + /// The returned reference doesn't guarantee credentials or connectivity validations because creation doesn't make any network calls. /// internal virtual CosmosClient Build(DocumentClient documentClient) { From d58b44138e07f17dcd8db5b80400a47c4561c095 Mon Sep 17 00:00:00 2001 From: Sourabh Jain Date: Fri, 9 Jun 2023 02:00:27 +0530 Subject: [PATCH 28/39] Open Telemetry End To End Test: Adds baseline for network level requests trace (#3887) * enable request level in end to end * made some changes * fix tests * fix display name * hardcoded containername and databasenam * fix tests * temp * fix tests * update contracts * fix tests * fixed display name --- .../OpenTelemetryRecorderFactory.cs | 2 + ...iterBaselineTests.BatchOperationsAsync.xml | 13 +- ...riterBaselineTests.BulkOperationsAsync.xml | 676 ++++++++++-------- ...aceWriterBaselineTests.ChangeFeedAsync.xml | 189 +++-- ...eWriterBaselineTests.MiscellanousAsync.xml | 28 +- ...neTests.PointOperationsExceptionsAsync.xml | 36 +- ...EndTraceWriterBaselineTests.QueryAsync.xml | 217 +++--- ...TraceWriterBaselineTests.ReadFeedAsync.xml | 124 ++-- ...TraceWriterBaselineTests.ReadManyAsync.xml | 26 +- ...selineTests.StreamPointOperationsAsync.xml | 52 +- ...aselineTests.TypedPointOperationsAsync.xml | 52 +- .../Tracing/AssertActivity.cs | 4 +- .../Tracing/CustomListener.cs | 35 +- .../Tracing/CustomOtelExporter.cs | 10 +- .../EndToEndTraceWriterBaselineTests.cs | 10 +- .../Utils/Util.cs | 4 +- 16 files changed, 895 insertions(+), 583 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs b/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs index fee3282c1a..ca0b864d2f 100644 --- a/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs +++ b/Microsoft.Azure.Cosmos/src/Telemetry/OpenTelemetry/OpenTelemetryRecorderFactory.cs @@ -51,6 +51,8 @@ public static OpenTelemetryCoreRecorder CreateRecorder(string operationName, // Record values only when we have a valid Diagnostic Scope if (scope.IsEnabled) { + scope.SetDisplayName($"{operationName} {containerName}"); + openTelemetryRecorder = OpenTelemetryCoreRecorder.CreateOperationLevelParentActivity( operationScope: scope, operationName: operationName, diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml index 66ca36f8ba..66edf29c06 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BatchOperationsAsync.xml @@ -132,12 +132,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 ExecuteAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -155,6 +155,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 1001 + 207 + diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml index b483975a57..053f6ecc39 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.BulkOperationsAsync.xml @@ -156,12 +156,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -179,12 +179,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -202,12 +202,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -225,12 +225,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -248,12 +248,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -271,12 +271,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -294,12 +294,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -317,12 +317,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -340,12 +340,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -363,12 +363,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -386,6 +386,13 @@ Some Value + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -536,12 +543,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -559,12 +566,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -582,12 +589,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -605,12 +612,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -628,12 +635,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -651,12 +658,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -674,12 +681,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -697,12 +704,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -720,12 +727,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -743,12 +750,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -766,6 +773,13 @@ Some Value + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -916,12 +930,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -939,12 +953,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -962,12 +976,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -985,12 +999,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1008,12 +1022,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1031,12 +1045,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1054,12 +1068,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1077,12 +1091,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1100,12 +1114,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1123,12 +1137,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1146,6 +1160,13 @@ Some Value + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -1296,12 +1317,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1319,12 +1340,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1342,12 +1363,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1365,12 +1386,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1388,12 +1409,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1411,12 +1432,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1434,12 +1455,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1457,12 +1478,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1480,12 +1501,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1503,12 +1524,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1526,6 +1547,13 @@ Some Value + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -1676,12 +1704,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1699,12 +1727,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1722,12 +1750,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1745,12 +1773,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1768,12 +1796,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1791,12 +1819,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1814,12 +1842,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1837,12 +1865,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1860,12 +1888,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1883,12 +1911,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1906,6 +1934,13 @@ Some Value + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -2056,12 +2091,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2079,12 +2114,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2102,12 +2137,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2125,12 +2160,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2148,12 +2183,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2171,12 +2206,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2194,12 +2229,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2217,12 +2252,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2240,12 +2275,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2263,12 +2298,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2286,6 +2321,13 @@ Some Value + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -2436,12 +2478,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2459,12 +2501,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2482,12 +2524,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2505,12 +2547,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2528,12 +2570,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2551,12 +2593,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2574,12 +2616,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2597,12 +2639,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2620,12 +2662,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2643,12 +2685,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2666,6 +2708,13 @@ Some Value + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -2816,12 +2865,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2839,12 +2888,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2862,12 +2911,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2885,12 +2934,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2908,12 +2957,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2931,12 +2980,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2954,12 +3003,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2977,12 +3026,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3000,12 +3049,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3023,12 +3072,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3046,6 +3095,13 @@ Some Value + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -3196,12 +3252,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3219,12 +3275,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3242,12 +3298,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3265,12 +3321,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3288,12 +3344,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3311,12 +3367,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3334,12 +3390,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3357,12 +3413,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3380,12 +3436,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3403,12 +3459,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3426,6 +3482,13 @@ Some Value + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -3576,12 +3639,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3599,12 +3662,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3622,12 +3685,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3645,12 +3708,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3668,12 +3731,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3691,12 +3754,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3714,12 +3777,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3737,12 +3800,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3760,12 +3823,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3783,12 +3846,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3806,6 +3869,13 @@ Some Value + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -4547,12 +4617,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml index ffc97ea44f..379c887104 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ChangeFeedAsync.xml @@ -967,12 +967,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Iterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -990,12 +990,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Iterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1013,12 +1013,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Iterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1036,12 +1036,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Iterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1059,12 +1059,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Iterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1082,6 +1082,20 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 304 + @@ -1705,12 +1719,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1728,12 +1742,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1751,12 +1765,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1774,12 +1788,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1797,12 +1811,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1820,6 +1834,20 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 304 + @@ -2424,12 +2452,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Iterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2447,12 +2475,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Iterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2470,12 +2498,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Iterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2493,12 +2521,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Iterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2516,12 +2544,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Iterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2539,6 +2567,20 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 304 + @@ -3163,12 +3205,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3186,12 +3228,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3209,12 +3251,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3232,12 +3274,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3255,12 +3297,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3278,6 +3320,20 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 304 + @@ -3556,12 +3612,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Change Feed Estimator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3579,6 +3635,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml index df53bd53d0..7341e76cb9 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.MiscellanousAsync.xml @@ -4,7 +4,7 @@ Custom Handler - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 DeleteAsync - Some Value - Some Value + miscdbcustonhandler + cosmosdb Some Value 127.0.0.1 @@ -133,12 +133,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateDatabaseAsync - Some Value - Some Value + miscdbcustonhandler + cosmosdb Some Value 127.0.0.1 @@ -166,7 +166,7 @@ - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 DeleteAsync - Some Value - Some Value + miscdbdataplane + cosmosdb Some Value 127.0.0.1 @@ -279,12 +279,12 @@ Some Value - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateDatabaseAsync - Some Value - Some Value + miscdbdataplane + cosmosdb Some Value 127.0.0.1 diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml index 902712a2a4..4e11d5e4b7 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.PointOperationsExceptionsAsync.xml @@ -151,12 +151,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -415,12 +415,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -662,12 +662,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -941,12 +941,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1284,12 +1284,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1460,12 +1460,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml index 5075d5d3e9..8b737a419e 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.QueryAsync.xml @@ -586,12 +586,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -609,12 +609,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -632,12 +632,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -655,12 +655,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -678,6 +678,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -1291,12 +1298,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1314,12 +1321,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1337,12 +1344,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1360,12 +1367,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1383,6 +1390,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -1977,12 +1991,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2000,12 +2014,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2023,12 +2037,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2046,12 +2060,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2069,6 +2083,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -2683,12 +2704,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2706,12 +2727,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2729,12 +2750,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2752,12 +2773,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2775,6 +2796,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -3456,12 +3484,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3479,12 +3507,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3502,12 +3530,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3525,12 +3553,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -3548,6 +3576,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -4151,12 +4186,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -4174,12 +4209,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -4197,12 +4232,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -4220,12 +4255,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -4243,6 +4278,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -4866,12 +4908,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -4889,12 +4931,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -4912,12 +4954,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -4935,12 +4977,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -4958,6 +5000,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml index 2dd4424cb7..86f16841b5 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadFeedAsync.xml @@ -548,12 +548,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -571,12 +571,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -594,12 +594,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -617,12 +617,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -640,6 +640,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -1215,12 +1222,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1238,12 +1245,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1261,12 +1268,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1284,12 +1291,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1307,6 +1314,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -1863,12 +1877,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1886,12 +1900,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1909,12 +1923,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1932,12 +1946,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 FeedIterator Read Next Async - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1955,6 +1969,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -2531,12 +2552,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2554,12 +2575,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2577,12 +2598,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2600,12 +2621,12 @@ Some Value South Central US - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 Typed FeedIterator ReadNextAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -2623,6 +2644,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml index 362afa7444..42c948a0d9 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.ReadManyAsync.xml @@ -545,12 +545,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 ReadManyItemsStreamAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -568,6 +568,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -1129,12 +1136,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 ReadManyItemsAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -1152,6 +1159,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml index 8816767262..ea5327040a 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.StreamPointOperationsAsync.xml @@ -92,12 +92,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemStreamAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -115,6 +115,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 201 + @@ -205,12 +212,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 ReadItemStreamAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -228,6 +235,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -326,12 +340,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 ReplaceItemStreamAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -349,6 +363,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -442,12 +463,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 DeleteItemStreamAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -465,6 +486,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 204 + diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml index f23344b440..25b6e52364 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/EndToEndTraceWriterBaselineTests.TypedPointOperationsAsync.xml @@ -112,12 +112,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 CreateItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -135,6 +135,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 201 + @@ -230,12 +237,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 ReadItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -253,6 +260,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -361,12 +375,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 ReplaceItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -384,6 +398,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 200 + @@ -481,12 +502,12 @@ } ] }]]> - + Microsoft.DocumentDB https://opentelemetry.io/schemas/1.17.0 DeleteItemAsync - Some Value - Some Value + databaseName + containerName cosmosdb Some Value 127.0.0.1 @@ -504,6 +525,13 @@ Some Value South Central US + + Microsoft.DocumentDB + https://opentelemetry.io/schemas/1.17.0 + Some Value + 0 + 204 + diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs index b1223656f1..75153d3b88 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/AssertActivity.cs @@ -20,9 +20,7 @@ public static void IsValidOperationActivity(Activity activity) { if (string.Equals(activity.Source.Name, $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", StringComparison.OrdinalIgnoreCase)) { - Assert.IsTrue(activity.OperationName == activity.DisplayName); - - Assert.IsFalse(string.IsNullOrEmpty(activity.GetTagItem("db.cosmosdb.connection_mode").ToString()), $"connection mode is emtpy for {activity.OperationName}"); + Assert.IsFalse(string.IsNullOrEmpty(activity.GetTagItem("db.cosmosdb.connection_mode").ToString()), $"connection mode is empty for {activity.OperationName}"); if (activity.GetTagItem("db.cosmosdb.connection_mode").ToString() == ConnectionMode.Gateway.ToString()) { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs index 44d34abece..cae05fa94d 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomListener.cs @@ -242,9 +242,13 @@ private string GenerateTagForBaselineTest(Activity activity) "db.operation", "db.system", "net.peer.name", + "db.name", + "db.cosmosdb.container", "db.cosmosdb.connection_mode", "db.cosmosdb.operation_type", - "db.cosmosdb.regions_contacted" + "db.cosmosdb.regions_contacted", + "tcp.sub_status_code", + "tcp.status_code" }; StringBuilder builder = new StringBuilder(); @@ -278,18 +282,18 @@ public List GetRecordedAttributes() generatedActivityTagsForBaselineXmls.Add(this.GenerateTagForBaselineTest(activity)); } - /* List collectedNetworkActivities = new List(CustomListener.CollectedNetworkActivities); - collectedNetworkActivities = collectedNetworkActivities + HashSet collectedNetworkActivities = new HashSet(CustomListener.CollectedNetworkActivities, new NetworkActivityComparer()); + List orderedUniqueNetworkActivities = collectedNetworkActivities .OrderBy(act => act.Source.Name + act.OperationName + - act.GetTagItem("rntbd.status_code") + - act.GetTagItem("rntbd.sub_status_code")) + act.GetTagItem("tcp.status_code") + + act.GetTagItem("tcp.sub_status_code")) .ToList(); - foreach (Activity activity in collectedNetworkActivities) + foreach (Activity activity in orderedUniqueNetworkActivities) { generatedActivityTagsForBaselineXmls.Add(this.GenerateTagForBaselineTest(activity)); - }*/ + } List outputList = new List(); if(generatedActivityTagsForBaselineXmls != null && generatedActivityTagsForBaselineXmls.Count > 0) @@ -345,5 +349,22 @@ public ProducedLink(string traceparent, string tracestate) public string Traceparent { get; set; } public string Tracestate { get; set; } } + + public class NetworkActivityComparer : IEqualityComparer + { + public bool Equals(Activity x, Activity y) + { + string xData = x.Source.Name + x.OperationName + x.GetTagItem("tcp.status_code") + x.GetTagItem("tcp.sub_status_code"); + string yData = y.Source.Name + y.OperationName + y.GetTagItem("tcp.status_code") + y.GetTagItem("tcp.sub_status_code"); + + return xData.Equals(yData, StringComparison.OrdinalIgnoreCase); + } + + public int GetHashCode(Activity obj) + { + return (obj.Source.Name + obj.OperationName + obj.GetTagItem("tcp.status_code") + obj.GetTagItem("tcp.sub_status_code")).GetHashCode() ; + } + } + } } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs index 9572a298a6..eb46d83e48 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/CustomOtelExporter.cs @@ -7,6 +7,7 @@ namespace Microsoft.Azure.Cosmos.Tracing using System; using System.Collections.Generic; using System.Diagnostics; + using Microsoft.Azure.Cosmos.Telemetry; using OpenTelemetry; using OpenTelemetry.Trace; @@ -34,9 +35,12 @@ public override ExportResult Export(in Batch batch) foreach (Activity activity in batch) { - AssertActivity.IsValidOperationActivity(activity); - - CollectedActivities.Add(activity); + if (string.Equals(activity.Source.Name, $"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", StringComparison.OrdinalIgnoreCase)) + { + AssertActivity.IsValidOperationActivity(activity); + + CollectedActivities.Add(activity); + } } return ExportResult.Success; diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/EndToEndTraceWriterBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/EndToEndTraceWriterBaselineTests.cs index 63d883ef21..64bc7c015a 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/EndToEndTraceWriterBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Tracing/EndToEndTraceWriterBaselineTests.cs @@ -71,11 +71,11 @@ public static async Task ClassInitAsync(TestContext context) })); EndToEndTraceWriterBaselineTests.database = await client.CreateDatabaseAsync( - Guid.NewGuid().ToString(), + "databaseName", cancellationToken: default); EndToEndTraceWriterBaselineTests.container = await EndToEndTraceWriterBaselineTests.database.CreateContainerAsync( - id: Guid.NewGuid().ToString(), + id: "containerName", partitionKeyPath: "/id", throughput: 20000); @@ -401,7 +401,7 @@ public async Task ChangeFeedAsync() //---------------------------------------------------------------- { Container leaseContainer = await EndToEndTraceWriterBaselineTests.database.CreateContainerAsync( - id: Guid.NewGuid().ToString(), + id: "changefeedleasecontainer", partitionKeyPath: "/id"); ChangeFeedProcessor processor = container @@ -1347,7 +1347,7 @@ public async Task MiscellanousAsync() { startLineNumber = GetLineNumber(); - DatabaseResponse databaseResponse = await miscCosmosClient.CreateDatabaseAsync(Guid.NewGuid().ToString()); + DatabaseResponse databaseResponse = await miscCosmosClient.CreateDatabaseAsync("miscdbcustonhandler"); EndToEndTraceWriterBaselineTests.AssertCustomHandlerTime( databaseResponse.Diagnostics.ToString(), requestHandler.FullHandlerName, @@ -1370,7 +1370,7 @@ public async Task MiscellanousAsync() startLineNumber = GetLineNumber(); RequestOptions requestOptions = new RequestOptions(); DatabaseResponse databaseResponse = await client.CreateDatabaseAsync( - id: Guid.NewGuid().ToString(), + id: "miscdbdataplane", requestOptions: requestOptions); ITrace trace = ((CosmosTraceDiagnostics)databaseResponse.Diagnostics).Value; await databaseResponse.Database.DeleteAsync(); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs index 4773c7de96..366cc68811 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs @@ -548,11 +548,11 @@ internal static CustomListener ConfigureOpenTelemetryAndCustomListeners() // Open Telemetry Listener Util.OTelTracerProvider = Sdk.CreateTracerProviderBuilder() .AddCustomOtelExporter() // use any exporter here - .AddSource($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation") + .AddSource($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.*") .Build(); // Custom Listener - Util.TestListener = new CustomListener($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.Operation", "Azure-Cosmos-Operation-Request-Diagnostics"); + Util.TestListener = new CustomListener($"{OpenTelemetryAttributeKeys.DiagnosticNamespace}.*", "Azure-Cosmos-Operation-Request-Diagnostics"); return Util.TestListener; From df630928ca7f421177998464fd57b31ce27cd84e Mon Sep 17 00:00:00 2001 From: Sourabh Jain Date: Sat, 10 Jun 2023 01:52:17 +0530 Subject: [PATCH 29/39] [Internal] Design Docs: Adds Design Document for Client Telemetry (#3590) * sdk design for client telemetry * Otel design * update optel design * added more nformation * updated ct design * remove otel design * Client Telemetry Design * update typos * fix typos * fix typos * added limitation * updated docs * updated doc * updated text * Update docs/observability.md Co-authored-by: Kiran Kumar Kolli * Update docs/observability.md Co-authored-by: Kiran Kumar Kolli * Update docs/observability.md Co-authored-by: Kiran Kumar Kolli * Update docs/observability.md Co-authored-by: Kiran Kumar Kolli * Update docs/observability.md Co-authored-by: Kiran Kumar Kolli * move stuff here and there. --------- Co-authored-by: Kiran Kumar Kolli --- docs/observability.md | 73 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/docs/observability.md b/docs/observability.md index b74b55cd21..184d609f76 100644 --- a/docs/observability.md +++ b/docs/observability.md @@ -33,4 +33,75 @@ flowchart TD OtherLogic --> GetResponse(Get Response for the request) SendResponse --> OperationCall -``` \ No newline at end of file +``` + +## Send telemetry from SDK to service (Private Preview) + +### Introduction +When opted-in CosmosDB SDK collects below aggregated telemetry data every 10 minutes to Azure CosmosDB service. +1. Operation(CRUD APIs) Latencies and Request Units (RUs). +2. Metadata caches (ex: CollectionCache) miss statistics +3. Client System Usage (during an operation) : + * CPU usage + * Memory Usage + * Thread Starvation + * Network Connections Opened (only TCP Connections) +4. TOP 10 slower network interactions + +> Note: We don't collect any PII data as part of this feature. + +### Benefits +Enabling this feature provides numerous benefits. The telemetry data collected will allow us to identify and address potential issues. This results in a superior support experience and ensures that some issues can even be resolved before they impact your application. In short, customers with this feature enabled can expect a smoother and more reliable experience. + +### Impact of this feature enabled +* _Latency_: Customer should not see any impact on latency. +* _Total RPS_: It depends on the infrastructure the application using SDK is hosted on among other factors but the impact should not exceed 10%. +* _Any other impact_: Collector needs around 18MB of in-memory storage to hold the data and this storage is always constant (it means it doesn't grow, no matter how much data we have) +* Benchmark Numbers: https://github.com/Azure/azure-cosmos-dotnet-v3/blob/master/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Performance.Tests/Contracts/BenchmarkResults.json + +### Components + +**Telemetry Job:** Background task which collects the data and sends it to a Azure CosmosDB service every 10 minutes. + +**Collectors:** In-memory storage which keeps the telemetry data collected during an operation. There are 3 types of collectors including: +* _Operational Data Collector_: It keeps operation level latencies and request units. +* _Network Data Collector_: It keeps all the metrics related to network or TCP calls. It has its own Sampler which sample-in only slowest TCP calls for a particular replica. +* _Cache Data Collector_: It keeps all the cache call latencies. Right now, only collection cache is covered. + +**Get VM Information**: + +- Azure VM: [Azure Instance Metadata](https://learn.microsoft.com/azure/virtual-machines/instance-metadata-service?tabs=windows) call. +- Non-Azure VM: We don't collect any other information except VMID which will a Guid or Hashed Machine Name. + +**Processor**: Its responsibility is to get all the data and divide it into small chunks (<2MB) and send each chunk to the Azure CosmosDB service. + +```mermaid +flowchart TD + subgraph TelemetryJob[Telemetry Background Job] + subgraph Storage[In Memory Storage or Collectors] + subgraph NetworkDataCollector[Network Data Collector] + TcpDatapoint(Network Request Datapoint) --> NetworkHistogram[(Histogram)] + DataSampler(Sampler) + end + subgraph DataCollector[Operational Data Collector] + OpsDatapoint(Operation Datapoint) --> OperationHistogram[(Histogram)] + end + subgraph CacheCollector[Cache Data Collector] + CacheDatapoint(Cache Request Datapoint) --> CacheHistogram[(Histogram)] + end + end + subgraph TelemetryTask[Telemetry Task Every 10 min] + CacheAccountInfo(Cached Account Properties) --> VMInfo + VMInfo(Get VM Information) --> CollectSystemUsage + CollectSystemUsage(Record System Usage Information) --> GetDataFromCollector + end + subgraph Processor + GetDataFromCollector(Fetch Data from Collectors) --> Serializer + Serializer(Serialize and divide the Payload) --> SendCTOverHTTP(Send Data over HTTP to Service) + end + Storage --> |Get Aggregated data|GetDataFromCollector + end +``` + +### Limitations +1. AAD Support is not available. \ No newline at end of file From d1dbe94ee4e855ef90a6997ab075d7306413ff1e Mon Sep 17 00:00:00 2001 From: Sourabh Jain Date: Sat, 10 Jun 2023 03:06:17 +0530 Subject: [PATCH 30/39] [Internal] Design Docs: Adds Design Document for Client Telemetry Part 2 (#3903) * updated doc * Update docs/observability.md Co-authored-by: Justine Cocchi * updated text --------- Co-authored-by: Justine Cocchi --- docs/observability.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/observability.md b/docs/observability.md index 184d609f76..50ce14d33c 100644 --- a/docs/observability.md +++ b/docs/observability.md @@ -39,19 +39,19 @@ flowchart TD ### Introduction When opted-in CosmosDB SDK collects below aggregated telemetry data every 10 minutes to Azure CosmosDB service. -1. Operation(CRUD APIs) Latencies and Request Units (RUs). +1. Operation(Point, Stream, Batch and Query APIs) Latencies and Request Units (RUs). 2. Metadata caches (ex: CollectionCache) miss statistics -3. Client System Usage (during an operation) : +3. Host Resource Usage: (during an operation) : * CPU usage * Memory Usage * Thread Starvation * Network Connections Opened (only TCP Connections) -4. TOP 10 slower network interactions +4. TOP 10 slowest network interactions per endpoint > Note: We don't collect any PII data as part of this feature. ### Benefits -Enabling this feature provides numerous benefits. The telemetry data collected will allow us to identify and address potential issues. This results in a superior support experience and ensures that some issues can even be resolved before they impact your application. In short, customers with this feature enabled can expect a smoother and more reliable experience. +Enabling this feature provides numerous benefits. The telemetry data collected will allow us to identify and address potential issues. This results in a superior support experience and ensures that some issues can even be resolved before they impact your application. In short, customers with this feature enabled can expect a smoother and more reliable support experience. ### Impact of this feature enabled * _Latency_: Customer should not see any impact on latency. From 28e03c8bd490a2f3c955dea02eb1bd78b0eda61a Mon Sep 17 00:00:00 2001 From: Debdatta Kunda <87335885+kundadebdatta@users.noreply.github.com> Date: Fri, 9 Jun 2023 19:07:04 -0700 Subject: [PATCH 31/39] ConnectionPolicy: Refactors Code to Reduce Default Request Timeout to 6 Seconds. (#3902) * Code changes to reduce default request timeout to 6 seconds. * Code changes to update API doc default request timeout to 6 seconds. --- Microsoft.Azure.Cosmos/src/ConnectionPolicy.cs | 2 +- Microsoft.Azure.Cosmos/src/CosmosClientOptions.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/ConnectionPolicy.cs b/Microsoft.Azure.Cosmos/src/ConnectionPolicy.cs index 172aac4fbb..7abfd76deb 100644 --- a/Microsoft.Azure.Cosmos/src/ConnectionPolicy.cs +++ b/Microsoft.Azure.Cosmos/src/ConnectionPolicy.cs @@ -19,7 +19,7 @@ namespace Microsoft.Azure.Cosmos /// internal sealed class ConnectionPolicy { - private const int defaultRequestTimeout = 10; + private const int defaultRequestTimeout = 6; // defaultMediaRequestTimeout is based upon the blob client timeout and the retry policy. private const int defaultMediaRequestTimeout = 300; private const int defaultMaxConcurrentFanoutRequests = 32; diff --git a/Microsoft.Azure.Cosmos/src/CosmosClientOptions.cs b/Microsoft.Azure.Cosmos/src/CosmosClientOptions.cs index c826bb90d1..1fce195915 100644 --- a/Microsoft.Azure.Cosmos/src/CosmosClientOptions.cs +++ b/Microsoft.Azure.Cosmos/src/CosmosClientOptions.cs @@ -223,7 +223,7 @@ public int GatewayModeMaxConnectionLimit /// Gets the request timeout in seconds when connecting to the Azure Cosmos DB service. /// The number specifies the time to wait for response to come back from network peer. ///
- /// Default value is 1 minute. + /// Default value is 6 seconds. /// public TimeSpan RequestTimeout { get; set; } From b9242094bada0cb5b05851ff077f068019b57d7b Mon Sep 17 00:00:00 2001 From: Debdatta Kunda <87335885+kundadebdatta@users.noreply.github.com> Date: Fri, 9 Jun 2023 21:39:37 -0700 Subject: [PATCH 32/39] [Internal] Upgrade Resiliency: Adds Replica Health State Diagnostics. (#3835) * Code changes to add replica health status in diagnostics. * Code changes to fix performance test build failure. * Code changes to add health state capture logic in address cache. * Code changes to fix benchmark test execution. * Code changes to add tests to validate health state cache. * Code changes to reduce default request timeout to 5 seconds. * Revert "Code changes to reduce default request timeout to 5 seconds." This reverts commit 139f37e588fc9dfed608431f4186c567a080e622. --- .../src/Routing/GatewayAddressCache.cs | 23 +++++++ .../Tracing/TraceWriter.TraceJsonWriter.cs | 18 ++++++ .../Contracts/BenchmarkResults.json | 6 +- .../TraceWriterBaselineTests.TraceData.xml | 7 ++ .../GatewayAddressCacheTests.cs | 64 +++++++++++++++++++ .../Tracing/TraceTests.cs | 2 - 6 files changed, 115 insertions(+), 5 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Routing/GatewayAddressCache.cs b/Microsoft.Azure.Cosmos/src/Routing/GatewayAddressCache.cs index 182243ec40..14b641959a 100644 --- a/Microsoft.Azure.Cosmos/src/Routing/GatewayAddressCache.cs +++ b/Microsoft.Azure.Cosmos/src/Routing/GatewayAddressCache.cs @@ -550,10 +550,17 @@ await this.GetServerAddressesViaGatewayAsync(request, collectionRid, new[] { par } this.ValidateReplicaAddresses(transportAddressUris); + this.CaptureTransportAddressUriHealthStates( + partitionAddressInformation: mergedAddresses, + transportAddressUris: transportAddressUris); return mergedAddresses; } + this.CaptureTransportAddressUriHealthStates( + partitionAddressInformation: result.Item2, + transportAddressUris: result.Item2.Get(Protocol.Tcp)?.ReplicaTransportAddressUris); + return result.Item2; } } @@ -936,6 +943,22 @@ TransportAddressHealthState.HealthStatus.Unknown or TransportAddressHealthState.HealthStatus.UnhealthyPending); } + /// + /// The replica health status of the transport address uri will change eventually with the motonically increasing time. + /// However, the purpose of this method is to capture the health status snapshot at this moment. + /// + /// An instance of . + /// A read-only list of . + private void CaptureTransportAddressUriHealthStates( + PartitionAddressInformation partitionAddressInformation, + IReadOnlyList transportAddressUris) + { + partitionAddressInformation + .Get(Protocol.Tcp)? + .SetTransportAddressUrisHealthState( + replicaHealthStates: transportAddressUris.Select(x => x.GetCurrentHealthState().GetHealthStatusDiagnosticString()).ToList()); + } + protected virtual void Dispose(bool disposing) { if (this.disposedValue) diff --git a/Microsoft.Azure.Cosmos/src/Tracing/TraceWriter.TraceJsonWriter.cs b/Microsoft.Azure.Cosmos/src/Tracing/TraceWriter.TraceJsonWriter.cs index 74363c8ca1..247c9f2587 100644 --- a/Microsoft.Azure.Cosmos/src/Tracing/TraceWriter.TraceJsonWriter.cs +++ b/Microsoft.Azure.Cosmos/src/Tracing/TraceWriter.TraceJsonWriter.cs @@ -430,6 +430,8 @@ public void Visit(StoreResult storeResult) this.jsonWriter.WriteFieldName("BELatencyInMs"); this.WriteStringValueOrNull(storeResult.BackendRequestDurationInMs); + this.WriteJsonUriArray("ReplicaHealthStatuses", storeResult.ReplicaHealthStatuses); + this.VisitTransportRequestStats(storeResult.TransportRequestStats); this.jsonWriter.WriteFieldName("TransportException"); @@ -468,6 +470,22 @@ private void WriteJsonUriArray(string propertyName, IEnumerable replicaHealthStatuses) + { + this.jsonWriter.WriteFieldName(propertyName); + this.jsonWriter.WriteArrayStart(); + + if (replicaHealthStatuses != null) + { + foreach (string replicaHealthStatus in replicaHealthStatuses) + { + this.WriteStringValueOrNull(replicaHealthStatus); + } + } + + this.jsonWriter.WriteArrayEnd(); + } + private void WriteRegionsContactedArray(string propertyName, IEnumerable<(string, Uri)> uris) { this.jsonWriter.WriteFieldName(propertyName); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Performance.Tests/Contracts/BenchmarkResults.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Performance.Tests/Contracts/BenchmarkResults.json index c97e0b5b2c..a06dabf09c 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Performance.Tests/Contracts/BenchmarkResults.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Performance.Tests/Contracts/BenchmarkResults.json @@ -14,7 +14,7 @@ "MockedItemBenchmark.DeleteItemNotExists;[Type=OfT]": 42172.5, "MockedItemBenchmark.DeleteItemNotExists;[Type=OfTCustom]": 42174.75, "MockedItemBenchmark.DeleteItemNotExists;[Type=OfTWithClientTelemetryEnabled]": 42166.5, - "MockedItemBenchmark.DeleteItemNotExists;[Type=OfTWithDiagnosticsToString]": 56695.5, + "MockedItemBenchmark.DeleteItemNotExists;[Type=OfTWithDiagnosticsToString]": 63338, "MockedItemBenchmark.DeleteItemNotExists;[Type=Stream]": 37610, "MockedItemBenchmark.QuerySinglePartitionMultiplePages;[Type=OfT]": 13342232, "MockedItemBenchmark.QuerySinglePartitionMultiplePages;[Type=OfTCustom]": 13341058, @@ -34,12 +34,12 @@ "MockedItemBenchmark.ReadItemExists;[Type=OfT]": 33630.5, "MockedItemBenchmark.ReadItemExists;[Type=OfTCustom]": 33636.25, "MockedItemBenchmark.ReadItemExists;[Type=OfTWithClientTelemetryEnabled]": 33627.75, - "MockedItemBenchmark.ReadItemExists;[Type=OfTWithDiagnosticsToString]": 47961.25, + "MockedItemBenchmark.ReadItemExists;[Type=OfTWithDiagnosticsToString]": 55044, "MockedItemBenchmark.ReadItemExists;[Type=Stream]": 26018.25, "MockedItemBenchmark.ReadItemNotExists;[Type=OfT]": 43489.25, "MockedItemBenchmark.ReadItemNotExists;[Type=OfTCustom]": 43490, "MockedItemBenchmark.ReadItemNotExists;[Type=OfTWithClientTelemetryEnabled]": 43489.25, - "MockedItemBenchmark.ReadItemNotExists;[Type=OfTWithDiagnosticsToString]": 57420.25, + "MockedItemBenchmark.ReadItemNotExists;[Type=OfTWithDiagnosticsToString]": 58054, "MockedItemBenchmark.ReadItemNotExists;[Type=Stream]": 39044, "MockedItemBenchmark.UpdateItem;[Type=OfT]": 36591, "MockedItemBenchmark.UpdateItem;[Type=OfTCustom]": 36594.25, diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml index 8b6adc1c15..885699cb43 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml @@ -340,6 +340,12 @@ "RequestCharge": 3.14, "RetryAfterInMs": "9000", "BELatencyInMs": "4.2", + "ReplicaHealthStatuses": [ + "http://storephysicaladdress-1p.com:Connected", + "http://storephysicaladdress-2s.com:Unknown", + "http://storephysicaladdress-3s.com:Unhealthy", + "http://storephysicaladdress-4s.com:Unknown" + ], "transportRequestTimeline": { "requestTimeline": [ { @@ -529,6 +535,7 @@ "RequestCharge": 0, "RetryAfterInMs": null, "BELatencyInMs": null, + "ReplicaHealthStatuses":[], "transportRequestTimeline": null, "TransportException": null } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayAddressCacheTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayAddressCacheTests.cs index 2d0d0a5c6a..5116eb22de 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayAddressCacheTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/GatewayAddressCacheTests.cs @@ -971,6 +971,13 @@ public async Task TryGetAddressesAsync_WhenReplicaVlidationEnabled_ShouldValidat expected: TransportAddressHealthState.HealthStatus.Connected, actual: refreshedUri.GetCurrentHealthState().GetHealthStatus()); + GatewayAddressCacheTests.ValidateHealthStatesInDiagnostics( + addressInfo: addressInfo, + numberOfConnectedReplicas: 0, + numberOfUnknownReplicas: 4, + numberOfUnhealthyPendingReplicas: 0, + numberOfUnhealthyReplicas: 0); + Assert.AreEqual(4, addressInfo.AllAddresses.Count); Assert.AreEqual(1, addressInfo.AllAddresses.Count(x => x.PhysicalUri == oldAddress)); Assert.AreEqual(0, addressInfo.AllAddresses.Count(x => x.PhysicalUri == newAddress)); @@ -1008,6 +1015,14 @@ public async Task TryGetAddressesAsync_WhenReplicaVlidationEnabled_ShouldValidat actual: refreshedUri.GetCurrentHealthState().GetHealthStatus()); mockHttpHandler.VerifyAll(); + + GatewayAddressCacheTests.ValidateHealthStatesInDiagnostics( + addressInfo: addressInfo, + numberOfConnectedReplicas: 2, + numberOfUnknownReplicas: 1, + numberOfUnhealthyPendingReplicas: 1, + numberOfUnhealthyReplicas: 0); + GatewayAddressCacheTests.AssertOpenConnectionHandlerAttributes( fakeOpenConnectionHandler: fakeOpenConnectionHandler, expectedTotalFailedAddressesToOpenCount: 0, @@ -1106,6 +1121,13 @@ public async Task TryGetAddressesAsync_WhenReplicaVlidationEnabledAndUnhealthyUr manualResetEvent: manualResetEvent, shouldReset: true); + GatewayAddressCacheTests.ValidateHealthStatesInDiagnostics( + addressInfo: addressInfo, + numberOfConnectedReplicas: 0, + numberOfUnknownReplicas: 4, + numberOfUnhealthyPendingReplicas: 0, + numberOfUnhealthyReplicas: 0); + GatewayAddressCacheTests.AssertOpenConnectionHandlerAttributes( fakeOpenConnectionHandler: fakeOpenConnectionHandler, expectedTotalFailedAddressesToOpenCount: 0, @@ -1157,6 +1179,13 @@ public async Task TryGetAddressesAsync_WhenReplicaVlidationEnabledAndUnhealthyUr expected: TransportAddressHealthState.HealthStatus.Unhealthy, actual: refreshedUri.GetCurrentHealthState().GetHealthStatus()); + GatewayAddressCacheTests.ValidateHealthStatesInDiagnostics( + addressInfo: addressInfo, + numberOfConnectedReplicas: 2, + numberOfUnknownReplicas: 1, + numberOfUnhealthyPendingReplicas: 1, + numberOfUnhealthyReplicas: 0); + GatewayAddressCacheTests.AssertOpenConnectionHandlerAttributes( fakeOpenConnectionHandler: fakeOpenConnectionHandler, expectedTotalFailedAddressesToOpenCount: 1, @@ -1356,6 +1385,41 @@ private static void AssertOpenConnectionHandlerAttributes( Assert.AreEqual(expectedTotalSuccessAddressesToOpenCount, fakeOpenConnectionHandler.GetTotalSuccessfulInvocationCount()); } + /// + /// Helper method to validate and assert on the cached health states for diagnostics. + /// + /// An instance of containing the partition address information. + /// An integer containing the number of connected replicas to be validated inthe cached health status list. + /// An integer containing the number of unknown replicas to be validated inthe cached health status list. + /// An integer containing the number of unhealthy pending replicas to be validated inthe cached health status list. + /// An integer containing the number of unhealthy replicas to be validated inthe cached health status list. + private static void ValidateHealthStatesInDiagnostics( + PartitionAddressInformation addressInfo, + int numberOfConnectedReplicas, + int numberOfUnknownReplicas, + int numberOfUnhealthyPendingReplicas, + int numberOfUnhealthyReplicas) + { + IReadOnlyList replicaHealthStatuses = addressInfo.Get(Protocol.Tcp)?.ReplicaTransportAddressUrisHealthState; + + Assert.IsNotNull(replicaHealthStatuses); + Assert.AreEqual( + expected: numberOfConnectedReplicas, + actual: replicaHealthStatuses.Where(x => x.Contains("| status: Connected |")).Count()); + + Assert.AreEqual( + expected: numberOfUnknownReplicas, + actual: replicaHealthStatuses.Where(x => x.Contains("| status: Unknown |")).Count()); + + Assert.AreEqual( + expected: numberOfUnhealthyPendingReplicas, + actual: replicaHealthStatuses.Where(x => x.Contains("| status: UnhealthyPending |")).Count()); + + Assert.AreEqual( + expected: numberOfUnhealthyReplicas, + actual: replicaHealthStatuses.Where(x => x.Contains("| status: Unhealthy |")).Count()); + } + private class FakeMessageHandler : HttpMessageHandler { private bool returnFullReplicaSet; diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceTests.cs index ad21070609..7c0cca1f95 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Tracing/TraceTests.cs @@ -125,8 +125,6 @@ public void ValidateStoreResultSerialization() storeResultProperties.Remove(nameof(storeResult.Target.Exception)); storeResultProperties.Add("transportRequestTimeline"); storeResultProperties.Remove(nameof(storeResult.Target.TransportRequestStats)); - storeResultProperties.Add("ReplicaHealthStatuses"); - storeResultProperties.Remove(nameof(storeResult.Target.ReplicaHealthStatuses)); foreach (string key in jsonPropertyNames) { From ea10439d2b3b1658b8dee97186b362d5b60ae537 Mon Sep 17 00:00:00 2001 From: Nalu Tripician <27316859+NaluTripician@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:54:00 -0700 Subject: [PATCH 33/39] Subpartitioning: Fixes handling of split physical partitions (#3879) * Initial Commit DO NOT REVIEW * bug fix, needs Direct Package Changes * fix for change feed and query plus tests * clean up * query + clean up --------- Co-authored-by: Kiran Kumar Kolli --- .../FeedRanges/FeedRangePartitionKey.cs | 11 +- .../Core/QueryPlan/QueryPartitionProvider.cs | 6 +- .../Routing/PartitionRoutingHelperTest.cs | 517 ++++++++++++++++++ 3 files changed, 527 insertions(+), 7 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/FeedRange/FeedRanges/FeedRangePartitionKey.cs b/Microsoft.Azure.Cosmos/src/FeedRange/FeedRanges/FeedRangePartitionKey.cs index 47f84fd280..1a04800b50 100644 --- a/Microsoft.Azure.Cosmos/src/FeedRange/FeedRanges/FeedRangePartitionKey.cs +++ b/Microsoft.Azure.Cosmos/src/FeedRange/FeedRanges/FeedRangePartitionKey.cs @@ -4,11 +4,13 @@ namespace Microsoft.Azure.Cosmos { + using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.Azure.Cosmos.Routing; using Microsoft.Azure.Cosmos.Tracing; + using Microsoft.Azure.Documents; /// /// FeedRange that represents an exact Partition Key value. @@ -31,8 +33,13 @@ public FeedRangePartitionKey(PartitionKey partitionKey) return Task.FromResult( new List> { - Documents.Routing.Range.GetPointRange( - this.PartitionKey.InternalKey.GetEffectivePartitionKeyString(partitionKeyDefinition)) + Documents.Routing.PartitionKeyInternal.GetEffectivePartitionKeyRange( + partitionKeyDefinition, + new Documents.Routing.Range( + min: this.PartitionKey.InternalKey, + max: this.PartitionKey.InternalKey, + isMinInclusive: true, + isMaxInclusive: true)) }); } diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/QueryPlan/QueryPartitionProvider.cs b/Microsoft.Azure.Cosmos/src/Query/Core/QueryPlan/QueryPartitionProvider.cs index 6e7b0b4a8f..c62a65b27a 100644 --- a/Microsoft.Azure.Cosmos/src/Query/Core/QueryPlan/QueryPartitionProvider.cs +++ b/Microsoft.Azure.Cosmos/src/Query/Core/QueryPlan/QueryPartitionProvider.cs @@ -147,11 +147,7 @@ internal PartitionedQueryExecutionInfo ConvertPartitionedQueryExecutionInfo( List> effectiveRanges = new List>(queryInfoInternal.QueryRanges.Count); foreach (Documents.Routing.Range internalRange in queryInfoInternal.QueryRanges) { - effectiveRanges.Add(new Documents.Routing.Range( - internalRange.Min.GetEffectivePartitionKeyString(partitionKeyDefinition, false), - internalRange.Max.GetEffectivePartitionKeyString(partitionKeyDefinition, false), - internalRange.IsMinInclusive, - internalRange.IsMaxInclusive)); + effectiveRanges.Add(PartitionKeyInternal.GetEffectivePartitionKeyRange(partitionKeyDefinition, internalRange)); } effectiveRanges.Sort(Documents.Routing.Range.MinComparer.Instance); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Routing/PartitionRoutingHelperTest.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Routing/PartitionRoutingHelperTest.cs index 35ffaa65bb..792621f54a 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Routing/PartitionRoutingHelperTest.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Routing/PartitionRoutingHelperTest.cs @@ -19,6 +19,8 @@ namespace Microsoft.Azure.Cosmos.Tests.Routing using Microsoft.Azure.Cosmos.Query.Core.QueryPlan; using System.Collections.ObjectModel; using System.Net; + using Microsoft.Azure.Cosmos.Query.Core; + using Microsoft.Azure.Cosmos.Query.Core.Monads; /// /// Tests for class. @@ -246,6 +248,521 @@ public async Task TestGetPartitionRoutingInfo() } } } + [TestMethod] + public async Task TestRoutingForPrefixedPartitionKeyQueriesAsync() + { + PartitionKeyDefinition partitionKeyDefinition = new PartitionKeyDefinition() + { + Kind = PartitionKind.MultiHash, + Paths = new Collection() { "/path1", "/path2", "/path3" }, + Version = PartitionKeyDefinitionVersion.V2 + }; + + // Case 1: Query with 1 prefix path, split at 1st level. Should route to only one partition. + { + List partitionKeyRanges = new List() + { + new PartitionKeyRange() + { + Id = "0", + MinInclusive = string.Empty, + MaxExclusive = "07E4D14180A45153F00B44907886F856" //Seattle + }, + new PartitionKeyRange() + { + Id = "1", + MinInclusive = "07E4D14180A45153F00B44907886F856", //Seattle + MaxExclusive = "FF" + }, + }; + await PrefixPartitionKeyTestRunnerAsync( + partitionKeyDefinition, + $"SELECT VALUE r.id from r where r.path1 = \"Microsoft\"", + epkRanges => + { + return epkRanges.Count == 1; //Routes to only one pkRange. + }, + partitionKeyRanges); + } + + //Case 2: Query with 1 prefix path value which is split at 2nd level. Should route to two partitions. + //Case 3: Query with 2 prefix path values which is split at 2nd level. Should route to one partition. + { + List partitionKeyRanges = new List() + { + new PartitionKeyRange() + { + Id = "0", + MinInclusive = string.Empty, + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963" //[Seattle, Redmond] + }, + new PartitionKeyRange() + { + Id = "1", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963",//[Seattle, Redmond] + MaxExclusive = "FF" + }, + }; + await PrefixPartitionKeyTestRunnerAsync( + partitionKeyDefinition, + $"SELECT VALUE r.id from r where r.path1 = \"seattle\" or (r.path1 = \"seattle\" and r.path2 = \"bellevue\")", + epkRanges => + { + return epkRanges.Count == 2; //Since data is split at pkey [seattle, redmond], it should route to two pkRange. + }, + partitionKeyRanges); + await PrefixPartitionKeyTestRunnerAsync( + partitionKeyDefinition, + $"SELECT VALUE r.id from r where r.path1 = \"seattle\" and r.path2 =\"redmond\"", + epkRanges => + { + return epkRanges.Count == 1; //Since data is split at pkey [seattle, redmond], this query should route to one pkRange + }, + partitionKeyRanges); + } + + //Case 4: Query with 2 prefix path values split at the 3rd level. Should route to 2 paritions. + //Case 5: Query with 1 prefix path value split at 3rd level. Should route to 2 partitions. + { + List partitionKeyRanges = new List() + { + new PartitionKeyRange() + { + Id = "0", + MinInclusive = string.Empty, + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8"//[seattle, redmond, 5.12312419050912359123] + }, + new PartitionKeyRange() + { + Id = "1", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8",//[seattle, redmond, 5.12312419050912359123] + MaxExclusive = "FF" + }, + }; + await PrefixPartitionKeyTestRunnerAsync( + partitionKeyDefinition, + $"SELECT VALUE r.id from r where r.path1 = \"seattle\" and r.path2 =\"redmond\"", + epkRanges => + { + return epkRanges.Count == 2; //Since data is split at pkey [seattle, redmond, 5.12312419050912359123], it should route to two pkRange. + }, + partitionKeyRanges); + await PrefixPartitionKeyTestRunnerAsync( + partitionKeyDefinition, + $"SELECT VALUE r.id from r where r.path1 = \"seattle\" and r.path2 =\"redmond\" and r.path3=5.12312419050912359123", + epkRanges => + { + return epkRanges.Count == 1; + }, + partitionKeyRanges); + await PrefixPartitionKeyTestRunnerAsync( + partitionKeyDefinition, + $"SELECT VALUE r.id from r where r.path1 = \"seattle\"", + epkRanges => + { + return epkRanges.Count == 2; + }, + partitionKeyRanges); + } + + //Case 6: Query with 1 prefix path value split succesively at 2nd and then at the 3rd level. Should route to 3 partitions. + { + List partitionKeyRanges = new List() + { + new PartitionKeyRange() + { + Id = "0", + MinInclusive = string.Empty, + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963"//[seattle, redmond] + }, + new PartitionKeyRange() + { + Id = "1", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963",//[seattle, redmond] + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8"//[seattle, redmond, 5.12312419050912359123] + }, + new PartitionKeyRange() + { + Id = "2", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8",//[seattle, redmond, 5.12312419050912359123] + MaxExclusive = "FF" + }, + }; + await PrefixPartitionKeyTestRunnerAsync( + partitionKeyDefinition, + $"SELECT VALUE r.id from r where r.path1 = \"seattle\"", + epkRanges => + { + return epkRanges.Count == 3; + }, + partitionKeyRanges); + } + + //Case 7: Query with 1 prefix path value split succesively at 1st, 2nd and then at the 3rd level. Should route to 3 partitions. + //Case 8: Query with 2 prefix path value split succesively at 1st, 2nd and then at the 3rd level. Should route to 2 partitions. + //Case 9: Query with fully specfied pkey, split succesively at 1st, 2nd and then at the 3rd level. Should route to 1 partitions. + { + List partitionKeyRanges = new List() + { + new PartitionKeyRange() + { + Id = "0", + MinInclusive = string.Empty, + MaxExclusive = "07E4D14180A45153F00B44907886F856" //[seattle] + }, + new PartitionKeyRange() + { + Id = "1", + MinInclusive = "07E4D14180A45153F00B44907886F856", //[seattle] + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963" //[seattle, redmond] + }, + new PartitionKeyRange() + { + Id = "2", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963", //[seattle, redmond] + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8"//[seattle, redmond, 5.12312419050912359123] + }, + new PartitionKeyRange() + { + Id = "3", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8",//[seattle, redmond, 5.12312419050912359123] + MaxExclusive = "FF" + }, + }; + await PrefixPartitionKeyTestRunnerAsync( + partitionKeyDefinition, + $"SELECT VALUE r.id from r where r.path1 = \"seattle\"", + epkRanges => + { + return epkRanges.Count == 3; //Routes tp three pkRanges + }, + partitionKeyRanges); + await PrefixPartitionKeyTestRunnerAsync( + partitionKeyDefinition, + $"SELECT VALUE r.id from r where r.path1 = \"seattle\" and r.path2 = \"redmond\"", + epkRanges => + { + return epkRanges.Count == 2; //Routes to two pkRanges. + }, + partitionKeyRanges); + await PrefixPartitionKeyTestRunnerAsync( + partitionKeyDefinition, + $"SELECT VALUE r.id from r where r.path1 = \"seattle\" and r.path2 = \"redmond\" and r.path3 = \"98052\"", + epkRanges => + { + Assert.AreEqual(epkRanges.Count, 1); + + return epkRanges.Count == 1; //Routes to only one pkRanges. + }, + partitionKeyRanges); + } + } + + [TestMethod] + public async Task TestRoutingForPrefixedPartitionKeyChangeFeedAsync() + { + PartitionKeyDefinition partitionKeyDefinition = new PartitionKeyDefinition() + { + Kind = PartitionKind.MultiHash, + Paths = new Collection() { "/path1", "/path2", "/path3" }, + Version = PartitionKeyDefinitionVersion.V2 + }; + + // Case 1: ChangeFeed with 1 prefix path, split at 1st level. Should route to only one partition. + { + List partitionKeyRanges = new List() + { + new PartitionKeyRange() + { + Id = "0", + MinInclusive = string.Empty, + MaxExclusive = "07E4D14180A45153F00B44907886F856" //Seattle + }, + new PartitionKeyRange() + { + Id = "1", + MinInclusive = "07E4D14180A45153F00B44907886F856", //Seattle + MaxExclusive = "FF" + }, + }; + await PrefixPartitionKeyChangeFeedTestRunnerAsync( + partitionKeyDefinition, + new PartitionKeyBuilder().Add("Microsoft").Build(), + epkRanges => + { + return epkRanges.Count == 1; //Routes to only one pkRange. + }, + partitionKeyRanges); + } + + //Case 2: ChangeFeed with 1 prefix path value which is split at 2nd level. Should route to two partitions. + //Case 3: ChangeFeed with 2 prefix path values which is split at 2nd level. Should route to one partition. + { + List partitionKeyRanges = new List() + { + new PartitionKeyRange() + { + Id = "0", + MinInclusive = string.Empty, + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963" //[Seattle, Redmond] + }, + new PartitionKeyRange() + { + Id = "1", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963", //[Seattle, Redmond] + MaxExclusive = "FF" + }, + }; + await PrefixPartitionKeyChangeFeedTestRunnerAsync( + partitionKeyDefinition, + new PartitionKeyBuilder().Add("seattle").Build(), + epkRanges => + { + return epkRanges.Count == 2; //Since data is split at pkey [seattle, redmond], it should route to two pkRange. + }, + partitionKeyRanges); + await PrefixPartitionKeyChangeFeedTestRunnerAsync( + partitionKeyDefinition, + new PartitionKeyBuilder().Add("seattle").Add("redmond").Build(), + epkRanges => + { + return epkRanges.Count == 1; //Since data is split at pkey [seattle, redmond], this query should route to one pkRange + }, + partitionKeyRanges); + } + + //Case 4: ChangeFeed with 2 prefix path values split at the 3rd level. Should route to 2 paritions. + //Case 5: ChangeFeed with 1 prefix path value split at 3rd level. Should route to 2 partitions. + { + List partitionKeyRanges = new List() + { + new PartitionKeyRange() + { + Id = "0", + MinInclusive = string.Empty, + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8"//[seattle, redmond, 5.12312419050912359123] + }, + new PartitionKeyRange() + { + Id = "1", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8", //[seattle, redmond, 5.12312419050912359123] + MaxExclusive = "FF" + }, + }; + await PrefixPartitionKeyChangeFeedTestRunnerAsync( + partitionKeyDefinition, + new PartitionKeyBuilder().Add("seattle").Add("redmond").Build(), + epkRanges => + { + return epkRanges.Count == 2; //Since data is split at pkey [seattle, redmond, 5.12312419050912359123], it should route to two pkRange. + }, + partitionKeyRanges); + await PrefixPartitionKeyChangeFeedTestRunnerAsync( + partitionKeyDefinition, + new PartitionKeyBuilder().Add("seattle").Add("redmond").Add(5.12312419050912359123).Build(), + epkRanges => + { + return epkRanges.Count == 1; + }, + partitionKeyRanges); + await PrefixPartitionKeyChangeFeedTestRunnerAsync( + partitionKeyDefinition, + new PartitionKeyBuilder().Add("seattle").Build(), + epkRanges => + { + return epkRanges.Count == 2; + }, + partitionKeyRanges); + } + + //Case 6: ChangeFeed with 1 prefix path value split succesively at 2nd and then at the 3rd level. Should route to 3 partitions. + { + List partitionKeyRanges = new List() + { + new PartitionKeyRange() + { + Id = "0", + MinInclusive = string.Empty, + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963" //[seattle, redmond] + }, + new PartitionKeyRange() + { + Id = "1", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963", //[seattle, redmond] + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8" //[seattle, redmond, 5.12312419050912359123] + }, + new PartitionKeyRange() + { + Id = "2", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8", //[seattle, redmond, 5.12312419050912359123] + MaxExclusive = "FF" + }, + }; + await PrefixPartitionKeyChangeFeedTestRunnerAsync( + partitionKeyDefinition, + new PartitionKeyBuilder().Add("seattle").Build(), + epkRanges => + { + return epkRanges.Count == 3; + }, + partitionKeyRanges); + } + + //Case 7: ChangeFeed with 1 prefix path value split succesively at 1st, 2nd and then at the 3rd level. Should route to 3 partitions. + //Case 8: ChangeFeed with 2 prefix path value split succesively at 1st, 2nd and then at the 3rd level. Should route to 2 partitions. + //Case 9: ChangeFeed with fully specfied pkey, split succesively at 1st, 2nd and then at the 3rd level. Should route to 1 partitions. + { + List partitionKeyRanges = new List() + { + new PartitionKeyRange() + { + Id = "0", + MinInclusive = string.Empty, + MaxExclusive = "07E4D14180A45153F00B44907886F856" //[seattle] + }, + new PartitionKeyRange() + { + Id = "1", + MinInclusive = "07E4D14180A45153F00B44907886F856", //[seattle] + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963" //[seattle, redmond] + }, + new PartitionKeyRange() + { + Id = "2", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A5963", //[seattle, redmond] + MaxExclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8"//[seattle, redmond, 5.12312419050912359123] + }, + new PartitionKeyRange() + { + Id = "3", + MinInclusive = "07E4D14180A45153F00B44907886F85622E342F38A486A088463DFF7838A59630EF2E2D82460884AF0F6440BE4F726A8", //[seattle, redmond, 5.12312419050912359123] + MaxExclusive = "FF" + }, + }; + await PrefixPartitionKeyChangeFeedTestRunnerAsync( + partitionKeyDefinition, + new PartitionKeyBuilder().Add("seattle").Build(), + epkRanges => + { + return epkRanges.Count == 3; //Routes tp three pkRanges + }, + partitionKeyRanges); + await PrefixPartitionKeyChangeFeedTestRunnerAsync( + partitionKeyDefinition, + new PartitionKeyBuilder().Add("seattle").Add("redmond").Build(), + epkRanges => + { + return epkRanges.Count == 2; //Routes to two pkRanges. + }, + partitionKeyRanges); + await PrefixPartitionKeyChangeFeedTestRunnerAsync( + partitionKeyDefinition, + new PartitionKeyBuilder().Add("seattle").Add("redmond").Add("98052").Build(), + epkRanges => + { + Assert.AreEqual(epkRanges.Count, 1); + + return epkRanges.Count == 1; //Routes to only one pkRanges. + }, + partitionKeyRanges); + } + } + + private static async Task PrefixPartitionKeyTestRunnerAsync( + PartitionKeyDefinition partitionKeyDefinition, + string queryText, + Predicate> validator, + List partitionKeyRanges) + { + IDictionary DefaultQueryengineConfiguration = new Dictionary() + { + {"maxSqlQueryInputLength", 30720}, + {"maxJoinsPerSqlQuery", 5}, + {"maxLogicalAndPerSqlQuery", 200}, + {"maxLogicalOrPerSqlQuery", 200}, + {"maxUdfRefPerSqlQuery", 2}, + {"maxInExpressionItemsCount", 8000}, + {"queryMaxInMemorySortDocumentCount", 500}, + {"maxQueryRequestTimeoutFraction", 0.90}, + {"sqlAllowNonFiniteNumbers", false}, + {"sqlAllowAggregateFunctions", true}, + {"sqlAllowSubQuery", true}, + {"sqlAllowScalarSubQuery", false}, + {"allowNewKeywords", true}, + {"sqlAllowLike", true}, + {"sqlAllowGroupByClause", false}, + {"queryEnableMongoNativeRegex", true}, + {"maxSpatialQueryCells", 12}, + {"spatialMaxGeometryPointCount", 256}, + {"sqlDisableOptimizationFlags", 0}, + {"sqlEnableParameterExpansionCheck", true} + }; + + QueryPartitionProvider QueryPartitionProvider = new QueryPartitionProvider(DefaultQueryengineConfiguration); + + IEnumerable> rangesAndServiceIdentity = partitionKeyRanges + .Select(range => Tuple.Create(range, (ServiceIdentity)null)); + string collectionRid = string.Empty; + CollectionRoutingMap routingMap = + CollectionRoutingMap.TryCreateCompleteRoutingMap( + rangesAndServiceIdentity, + collectionRid); + + RoutingMapProvider routingMapProvider = new RoutingMapProvider(routingMap); + TryCatch tryGetQueryPlan = + QueryPartitionProvider.TryGetPartitionedQueryExecutionInfo( + querySpecJsonString: JsonConvert.SerializeObject(new SqlQuerySpec(queryText)), + partitionKeyDefinition: partitionKeyDefinition, + requireFormattableOrderByQuery: true, + isContinuationExpected: true, + allowNonValueAggregateQuery: false, + hasLogicalPartitionKey: false, + allowDCount: true, + useSystemPrefix: false, + geospatialType: Cosmos.GeospatialType.Geography); + + HashSet resolvedPKRanges = new HashSet(); + foreach (Range range in tryGetQueryPlan.Result.QueryRanges) + { + resolvedPKRanges.UnionWith(await routingMapProvider.TryGetOverlappingRangesAsync( + collectionRid, + range, + NoOpTrace.Singleton)); + } + + Assert.IsTrue(validator(resolvedPKRanges)); + } + + private static async Task PrefixPartitionKeyChangeFeedTestRunnerAsync( + PartitionKeyDefinition partitionKeyDefinition, + Cosmos.PartitionKey partitionKey, + Predicate> validator, + List partitionKeyRanges) + { + IEnumerable> rangesAndServiceIdentity = partitionKeyRanges + .Select(range => Tuple.Create(range, (ServiceIdentity)null)); + string collectionRid = string.Empty; + CollectionRoutingMap routingMap = + CollectionRoutingMap.TryCreateCompleteRoutingMap( + rangesAndServiceIdentity, + collectionRid); + + RoutingMapProvider routingMapProvider = new RoutingMapProvider(routingMap); + + HashSet resolvedPKRanges = new HashSet(); + FeedRangePartitionKey feedRangePartitionKey = new FeedRangePartitionKey(partitionKey); + List> effectiveRanges = await feedRangePartitionKey.GetEffectiveRangesAsync(routingMapProvider, null, partitionKeyDefinition, null); + foreach (Range range in effectiveRanges) + { + resolvedPKRanges.UnionWith(await routingMapProvider.TryGetOverlappingRangesAsync( + collectionRid, + range, + NoOpTrace.Singleton)); + + } + + Assert.IsTrue(validator(resolvedPKRanges)); + } [TestMethod] public void TestCrossPartitionAggregateQueries() From 8137c7758eac966e75df7ea3aa8109c7170c5dba Mon Sep 17 00:00:00 2001 From: Maya-Painter <130110800+Maya-Painter@users.noreply.github.com> Date: Tue, 13 Jun 2023 18:26:55 -0700 Subject: [PATCH 34/39] [Query] Fixes empty property name parsing exception (#3907) * inital commit * cleanup * test cleanup * PR comments * PR comment --- .../CosmosQueryExecutionContextFactory.cs | 4 +-- .../Core/QueryClient/CosmosQueryClient.cs | 2 +- .../Query/v3Query/CosmosQueryClientCore.cs | 2 +- .../src/SqlObjects/SqlPropertyName.cs | 7 +---- .../CosmosGatewayTimeoutTests.cs | 2 +- .../Query/BypassQueryParsingTests.cs | 28 ++++++++++++++++--- .../Query/MockCosmosQueryClient.cs | 2 +- ...misticDirectExecutionQueryBaselineTests.cs | 2 +- 8 files changed, 32 insertions(+), 17 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/CosmosQueryExecutionContextFactory.cs b/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/CosmosQueryExecutionContextFactory.cs index 8f35ff821a..47aa1c4490 100644 --- a/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/CosmosQueryExecutionContextFactory.cs +++ b/Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/CosmosQueryExecutionContextFactory.cs @@ -188,7 +188,7 @@ private static async Task> TryCreateCoreContextAsy // If the query would go to gateway, but we have a partition key, // then try seeing if we can execute as a passthrough using client side only logic. // This is to short circuit the need to go to the gateway to get the query plan. - if (cosmosQueryContext.QueryClient.ByPassQueryParsing() + if (cosmosQueryContext.QueryClient.BypassQueryParsing() && inputParameters.PartitionKey.HasValue) { bool parsed; @@ -586,7 +586,7 @@ private static async Task GetPartitionedQueryExec CancellationToken cancellationToken) { PartitionedQueryExecutionInfo partitionedQueryExecutionInfo; - if (cosmosQueryContext.QueryClient.ByPassQueryParsing()) + if (cosmosQueryContext.QueryClient.BypassQueryParsing()) { // For non-Windows platforms(like Linux and OSX) in .NET Core SDK, we cannot use ServiceInterop, so need to bypass in that case. // We are also now bypassing this for 32 bit host process running even on Windows as there are many 32 bit apps that will not work without this diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/QueryClient/CosmosQueryClient.cs b/Microsoft.Azure.Cosmos/src/Query/Core/QueryClient/CosmosQueryClient.cs index ac093cadce..3fa4cb90e7 100644 --- a/Microsoft.Azure.Cosmos/src/Query/Core/QueryClient/CosmosQueryClient.cs +++ b/Microsoft.Azure.Cosmos/src/Query/Core/QueryClient/CosmosQueryClient.cs @@ -98,7 +98,7 @@ public abstract Task ExecuteQueryPlanRequestAsync bool forceRefresh, ITrace trace); - public abstract bool ByPassQueryParsing(); + public abstract bool BypassQueryParsing(); public abstract Task ForceRefreshCollectionCacheAsync( string collectionLink, diff --git a/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryClientCore.cs b/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryClientCore.cs index daf47e151c..1c5a9ef21f 100644 --- a/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryClientCore.cs +++ b/Microsoft.Azure.Cosmos/src/Query/v3Query/CosmosQueryClientCore.cs @@ -285,7 +285,7 @@ public override async Task> GetTargetPartitionKeyRangesA } } - public override bool ByPassQueryParsing() + public override bool BypassQueryParsing() { return CustomTypeExtensions.ByPassQueryParsing(); } diff --git a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlPropertyName.cs b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlPropertyName.cs index 059e799d99..e7f859ff18 100644 --- a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlPropertyName.cs +++ b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlPropertyName.cs @@ -68,12 +68,7 @@ sealed class SqlPropertyName : SqlObject private SqlPropertyName(string value) { - if (string.IsNullOrWhiteSpace(value)) - { - throw new ArgumentException($"{nameof(value)} must not be null, empty, or whitespace."); - } - - this.Value = value; + this.Value = value ?? throw new ArgumentNullException(nameof(value)); } public string Value { get; } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/CosmosGatewayTimeoutTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/CosmosGatewayTimeoutTests.cs index 8b4728c122..f50319f65f 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/CosmosGatewayTimeoutTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/CosmosGatewayTimeoutTests.cs @@ -163,7 +163,7 @@ public DisableServiceInterop( { } - public override bool ByPassQueryParsing() + public override bool BypassQueryParsing() { return true; } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/BypassQueryParsingTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/BypassQueryParsingTests.cs index a0c821c72d..4db276f4ce 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/BypassQueryParsingTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/BypassQueryParsingTests.cs @@ -1,5 +1,6 @@ namespace Microsoft.Azure.Cosmos.EmulatorTests.Query { + using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -14,9 +15,28 @@ public sealed class BypassQueryParsingTests : QueryTestsBase public async Task TestBypassQueryParsingWithNonePartitionKey() { int documentCount = 400; - QueryRequestOptions feedOptions = new QueryRequestOptions { PartitionKey = PartitionKey.None }; + string query = "SELECT VALUE r.numberField FROM r"; - IReadOnlyList expected = Enumerable.Range(0, documentCount).ToList(); + IReadOnlyList expectedOutput = Enumerable.Range(0, documentCount).Select(i => i.ToString()).ToList(); + + await this.ValidateQueryBypassWithNonePartitionKey(documentCount, query, expectedOutput); + } + + [TestMethod] + [TestCategory("Query")] + public async Task TestBypassQueryParsingWithNonePartitionKeyEmptyPropertyName() + { + int documentCount = 400; + + string query = @"SELECT VALUE { """" : r.numberField } FROM r"; + IReadOnlyList expectedOutput = Enumerable.Range(0, documentCount).Select(i => String.Format("{{\"\":{0}}}", i)).ToList(); + + await this.ValidateQueryBypassWithNonePartitionKey(documentCount, query, expectedOutput); + } + + private async Task ValidateQueryBypassWithNonePartitionKey(int documentCount, string query, IReadOnlyList expectedOutput) + { + QueryRequestOptions feedOptions = new QueryRequestOptions { PartitionKey = PartitionKey.None }; async Task ImplementationAsync(Container container, IReadOnlyList documents) { @@ -34,9 +54,9 @@ async Task ImplementationAsync(Container container, IReadOnlyList cosmosQueryClientCore); List items = await RunQueryAsync(containerWithBypassParsing, query, feedOptions); - int[] actual = items.Cast().Select(x => (int)Number64.ToLong(x.Value)).ToArray(); + string[] actualOutput = items.Select(x => x.ToString()).ToArray(); - Assert.IsTrue(expected.SequenceEqual(actual)); + Assert.IsTrue(expectedOutput.SequenceEqual(actualOutput)); } IReadOnlyList documents = CreateDocuments(documentCount); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/MockCosmosQueryClient.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/MockCosmosQueryClient.cs index 11d51403b1..6dd861ec88 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/MockCosmosQueryClient.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Query/MockCosmosQueryClient.cs @@ -35,7 +35,7 @@ public MockCosmosQueryClient( public int QueryPlanCalls { get; private set; } - public override bool ByPassQueryParsing() + public override bool BypassQueryParsing() { return this.forceQueryPlanGatewayElseServiceInterop; } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs index fad65e80db..1e7d4e1e40 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs @@ -927,7 +927,7 @@ internal class TestCosmosQueryClient : CosmosQueryClient { public override Action OnExecuteScalarQueryCallback => throw new NotImplementedException(); - public override bool ByPassQueryParsing() + public override bool BypassQueryParsing() { return false; } From b200491ec789e81443990069cf2164a3e5e47ef8 Mon Sep 17 00:00:00 2001 From: akotalwar <94020786+akotalwar@users.noreply.github.com> Date: Wed, 14 Jun 2023 11:54:09 -0700 Subject: [PATCH 35/39] [Preview] Query: Refactors EnableOptimisticDirectExecution to true by default in Preview mode (#3909) * Setting EnableODE to true by default in Preview Mode. * Added seperate if block for default value * Updated property * Removed unused Usings * Updated contracts * Updated test * Updated directive indentation --- .../src/RequestOptions/QueryRequestOptions.cs | 10 +++- .../TraceWriterBaselineTests.TraceData.xml | 10 ++-- .../Contracts/DotNetPreviewSDKAPI.json | 53 ++++++++++++++++++- .../Contracts/DotNetSDKAPI.json | 38 ------------- ...misticDirectExecutionQueryBaselineTests.cs | 11 ++-- 5 files changed, 74 insertions(+), 48 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs b/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs index 4cca513013..60cea5b48c 100644 --- a/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs +++ b/Microsoft.Azure.Cosmos/src/RequestOptions/QueryRequestOptions.cs @@ -49,7 +49,15 @@ public class QueryRequestOptions : RequestOptions /// /// Direct (optimistic) execution offers improved performance for several kinds of queries such as a single partition streaming query. /// - public bool EnableOptimisticDirectExecution { get; set; } +#if PREVIEW + public +#else + internal +#endif + bool EnableOptimisticDirectExecution { get; set; } +#if PREVIEW + = true; +#endif /// /// Gets or sets the maximum number of items that can be buffered client side during diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml index 885699cb43..d1dee72a0f 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/TraceWriterBaselineTests.TraceData.xml @@ -341,10 +341,10 @@ "RetryAfterInMs": "9000", "BELatencyInMs": "4.2", "ReplicaHealthStatuses": [ - "http://storephysicaladdress-1p.com:Connected", - "http://storephysicaladdress-2s.com:Unknown", - "http://storephysicaladdress-3s.com:Unhealthy", - "http://storephysicaladdress-4s.com:Unknown" + "http://storephysicaladdress-1p.com:Connected", + "http://storephysicaladdress-2s.com:Unknown", + "http://storephysicaladdress-3s.com:Unhealthy", + "http://storephysicaladdress-4s.com:Unknown" ], "transportRequestTimeline": { "requestTimeline": [ @@ -535,7 +535,7 @@ "RequestCharge": 0, "RetryAfterInMs": null, "BELatencyInMs": null, - "ReplicaHealthStatuses":[], + "ReplicaHealthStatuses": [], "transportRequestTimeline": null, "TransportException": null } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json index de49584da2..8546a93b2f 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetPreviewSDKAPI.json @@ -496,8 +496,59 @@ }, "NestedTypes": {} }, - "Microsoft.Azure.Cosmos.RequestOptions;System.Object;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { + "Microsoft.Azure.Cosmos.QueryRequestOptions;Microsoft.Azure.Cosmos.RequestOptions;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, + "Members": { + "Boolean EnableOptimisticDirectExecution": { + "Type": "Property", + "Attributes": [], + "MethodInfo": "Boolean EnableOptimisticDirectExecution;CanRead:True;CanWrite:True;Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Boolean get_EnableOptimisticDirectExecution()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Void set_EnableOptimisticDirectExecution(Boolean)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + } + }, + "NestedTypes": {} + }, + "Microsoft.Azure.Cosmos.RequestOptions;System.Object;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { + "Subclasses": { + "Microsoft.Azure.Cosmos.QueryRequestOptions;Microsoft.Azure.Cosmos.RequestOptions;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { + "Subclasses": {}, + "Members": { + "Boolean EnableOptimisticDirectExecution": { + "Type": "Property", + "Attributes": [], + "MethodInfo": "Boolean EnableOptimisticDirectExecution;CanRead:True;CanWrite:True;Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Boolean get_EnableOptimisticDirectExecution()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Void set_EnableOptimisticDirectExecution(Boolean)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + } + }, + "NestedTypes": {} + } + }, "Members": { "System.Nullable`1[Microsoft.Azure.Cosmos.PriorityLevel] get_PriorityLevel()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { "Type": "Method", diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json index 8a3bc7b462..e5b95a7ed9 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json @@ -6279,18 +6279,6 @@ "Microsoft.Azure.Cosmos.QueryRequestOptions;Microsoft.Azure.Cosmos.RequestOptions;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, "Members": { - "Boolean EnableOptimisticDirectExecution": { - "Type": "Property", - "Attributes": [], - "MethodInfo": "Boolean EnableOptimisticDirectExecution;CanRead:True;CanWrite:True;Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, - "Boolean get_EnableOptimisticDirectExecution()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { - "Type": "Method", - "Attributes": [ - "CompilerGeneratedAttribute" - ], - "MethodInfo": "Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, "Microsoft.Azure.Cosmos.DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions": { "Type": "Property", "Attributes": [], @@ -6445,13 +6433,6 @@ ], "MethodInfo": "Void set_EnableLowPrecisionOrderBy(System.Nullable`1[System.Boolean]);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, - "Void set_EnableOptimisticDirectExecution(Boolean)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { - "Type": "Method", - "Attributes": [ - "CompilerGeneratedAttribute" - ], - "MethodInfo": "Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, "Void set_EnableScanInQuery(System.Nullable`1[System.Boolean])[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { "Type": "Method", "Attributes": [ @@ -7320,18 +7301,6 @@ "Microsoft.Azure.Cosmos.QueryRequestOptions;Microsoft.Azure.Cosmos.RequestOptions;IsAbstract:False;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, "Members": { - "Boolean EnableOptimisticDirectExecution": { - "Type": "Property", - "Attributes": [], - "MethodInfo": "Boolean EnableOptimisticDirectExecution;CanRead:True;CanWrite:True;Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, - "Boolean get_EnableOptimisticDirectExecution()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { - "Type": "Method", - "Attributes": [ - "CompilerGeneratedAttribute" - ], - "MethodInfo": "Boolean get_EnableOptimisticDirectExecution();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, "Microsoft.Azure.Cosmos.DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions": { "Type": "Property", "Attributes": [], @@ -7486,13 +7455,6 @@ ], "MethodInfo": "Void set_EnableLowPrecisionOrderBy(System.Nullable`1[System.Boolean]);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, - "Void set_EnableOptimisticDirectExecution(Boolean)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { - "Type": "Method", - "Attributes": [ - "CompilerGeneratedAttribute" - ], - "MethodInfo": "Void set_EnableOptimisticDirectExecution(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, "Void set_EnableScanInQuery(System.Nullable`1[System.Boolean])[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { "Type": "Method", "Attributes": [ diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs index 1e7d4e1e40..81c765adc4 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OptimisticDirectExecutionQueryBaselineTests.cs @@ -144,10 +144,15 @@ public void NegativeOptimisticDirectExecutionOutput() [TestMethod] public async Task TestDefaultQueryRequestOptionsSettings() { - QueryRequestOptions requestOptions = new QueryRequestOptions(); - - Assert.AreEqual(requestOptions.EnableOptimisticDirectExecution, false); + bool odeExpectedValue = +#if PREVIEW + true; +#else + false; +#endif + + Assert.AreEqual(odeExpectedValue, requestOptions.EnableOptimisticDirectExecution); } // test checks that the pipeline can take a query to the backend and returns its associated document(s). From 8684535d233ea6a7147d857fae9a6c69e467c827 Mon Sep 17 00:00:00 2001 From: Rinat Minibaev <132935507+rinatmini@users.noreply.github.com> Date: Thu, 15 Jun 2023 07:53:21 -0700 Subject: [PATCH 36/39] Documentations: Adds links to PatchItems docs (#3910) * Added links to PatchItems docs * Undo changes from internal file --- Microsoft.Azure.Cosmos/src/Resource/Container/Container.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Microsoft.Azure.Cosmos/src/Resource/Container/Container.cs b/Microsoft.Azure.Cosmos/src/Resource/Container/Container.cs index 106262a13f..2978d741bf 100644 --- a/Microsoft.Azure.Cosmos/src/Resource/Container/Container.cs +++ b/Microsoft.Azure.Cosmos/src/Resource/Container/Container.cs @@ -751,6 +751,7 @@ public abstract Task> ReadManyItemsAsync( /// ]]> /// /// + /// Supported partial document update modes public abstract Task> PatchItemAsync( string id, PartitionKey partitionKey, @@ -783,6 +784,7 @@ public abstract Task> PatchItemAsync( /// /// /// + /// Supported partial document update modes public abstract Task PatchItemStreamAsync( string id, PartitionKey partitionKey, From 69702227d91de27a8257683d4984a750057406c5 Mon Sep 17 00:00:00 2001 From: Debdatta Kunda <87335885+kundadebdatta@users.noreply.github.com> Date: Fri, 16 Jun 2023 17:29:42 -0700 Subject: [PATCH 37/39] [Internal] Direct Package Upgrade: Refactors Code to Bump Up `Cosmos.Direct` Package to `3.31.2` (#3918) * Code changes to bump up the direct version. * Code changes to mark the Israel Central region as public. * Code changes to update contracts. * Code changes to fix test failure. Some clean ups. * Code changes to add detailed message for open channels count. --- Directory.Build.props | 2 +- Microsoft.Azure.Cosmos/src/Regions.cs | 5 +++++ .../ClientCreateAndInitializeTest.cs | 10 +++++++--- .../Contracts/DotNetSDKAPI.json | 5 +++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index c8b86ceed2..6e15dbd850 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,7 +3,7 @@ 3.34.0 3.34.0 preview - 3.31.1 + 3.31.2 2.0.2 2.0.2 preview diff --git a/Microsoft.Azure.Cosmos/src/Regions.cs b/Microsoft.Azure.Cosmos/src/Regions.cs index 666ec0435b..33c258aaf7 100644 --- a/Microsoft.Azure.Cosmos/src/Regions.cs +++ b/Microsoft.Azure.Cosmos/src/Regions.cs @@ -359,5 +359,10 @@ public static class Regions /// Name of the Azure Italy North region in the Azure Cosmos DB service. /// public const string ItalyNorth = "Italy North"; + + /// + /// Name of the Azure Israel Central region in the Azure Cosmos DB service. + /// + public const string IsraelCentral = "Israel Central"; } } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ClientCreateAndInitializeTest.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ClientCreateAndInitializeTest.cs index e977a8b459..e07fe85a7e 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ClientCreateAndInitializeTest.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ClientCreateAndInitializeTest.cs @@ -205,7 +205,7 @@ public async Task InitializeContainersAsync_WhenThrowsException_ShouldDisposeCos public async Task CreateAndInitializeAsync_WithValidDatabaseAndContainer_ShouldOpenRntbdConnectionsToBackendReplicas() { // Arrange. - int httpCallsMade = 0; + int httpCallsMade = 0, maxRequestsPerConnection = 6; HttpClientHandlerHelper httpClientHandlerHelper = new () { RequestCallBack = (request, cancellationToken) => @@ -227,6 +227,7 @@ public async Task CreateAndInitializeAsync_WithValidDatabaseAndContainer_ShouldO { HttpClientFactory = () => new HttpClient(httpClientHandlerHelper), ConnectionMode = ConnectionMode.Direct, + MaxRequestsPerTcpConnection = maxRequestsPerConnection, }; // Act. @@ -275,8 +276,11 @@ public async Task CreateAndInitializeAsync_WithValidDatabaseAndContainer_ShouldO .GetValue(loadBalancingPartition); Assert.IsNotNull(openChannels); - Assert.AreEqual(30, channelCapacity); - Assert.AreEqual(1, openChannels.Count); + Assert.AreEqual(48, openChannels.Count, "Here the expected value 48 rather explains how many time we call the" + + "LoadBalancingPartition.OpenChannelAsync(). The emulator by default returns 12 partitions, and each partition has 4 replicas," + + "and by behavior the emulator uses the same URI for eac of these replica, hence 12 * 4 = 48 times we call the OpenChannelAsync()." + + "In ideal world, the value should be 1, because for each unique URI, the OpenChannelAsync() call will just be 1."); + Assert.AreEqual(openChannels.Count * maxRequestsPerConnection, channelCapacity); Documents.Rntbd.LbChannelState channelState = openChannels.First(); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json index e5b95a7ed9..7fde376d49 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json @@ -6680,6 +6680,11 @@ "Attributes": [], "MethodInfo": "System.String GermanyWestCentral;IsInitOnly:False;IsStatic:True;" }, + "System.String IsraelCentral": { + "Type": "Field", + "Attributes": [], + "MethodInfo": "System.String IsraelCentral;IsInitOnly:False;IsStatic:True;" + }, "System.String ItalyNorth": { "Type": "Field", "Attributes": [], From b97906191c98f80e0dc9cba85545dc163b7df9dc Mon Sep 17 00:00:00 2001 From: Nalu Tripician <27316859+NaluTripician@users.noreply.github.com> Date: Mon, 19 Jun 2023 14:34:32 -0400 Subject: [PATCH 38/39] SDK 3.35.0 : Adds version bump and changelog (#3920) * release PR * updated changelog.md * more changelog updates --- Directory.Build.props | 4 +- .../contracts/API_3.35.0-preview.txt | 1563 +++++++++++++++++ .../contracts/API_3.35.0.txt | 1502 ++++++++++++++++ changelog.md | 27 + 4 files changed, 3094 insertions(+), 2 deletions(-) create mode 100644 Microsoft.Azure.Cosmos/contracts/API_3.35.0-preview.txt create mode 100644 Microsoft.Azure.Cosmos/contracts/API_3.35.0.txt diff --git a/Directory.Build.props b/Directory.Build.props index 6e15dbd850..eb4940bf4b 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 3.34.0 - 3.34.0 + 3.35.0 + 3.35.0 preview 3.31.2 2.0.2 diff --git a/Microsoft.Azure.Cosmos/contracts/API_3.35.0-preview.txt b/Microsoft.Azure.Cosmos/contracts/API_3.35.0-preview.txt new file mode 100644 index 0000000000..6c989053fd --- /dev/null +++ b/Microsoft.Azure.Cosmos/contracts/API_3.35.0-preview.txt @@ -0,0 +1,1563 @@ +namespace Microsoft.Azure.Cosmos +{ + public class AccountConsistency + { + public AccountConsistency(); + public ConsistencyLevel DefaultConsistencyLevel { get; } + public int MaxStalenessIntervalInSeconds { get; } + public int MaxStalenessPrefix { get; } + } + public class AccountProperties + { + public AccountConsistency Consistency { get; } + public string ETag { get; } + public string Id { get; } + public IEnumerable ReadableRegions { get; } + public IEnumerable WritableRegions { get; } + } + public class AccountRegion + { + public AccountRegion(); + public string Endpoint { get; } + public string Name { get; } + } + public sealed class BoundingBoxProperties + { + public BoundingBoxProperties(); + public double Xmax { get; set; } + public double Xmin { get; set; } + public double Ymax { get; set; } + public double Ymin { get; set; } + } + public abstract class ChangeFeedEstimator + { + protected ChangeFeedEstimator(); + public abstract FeedIterator GetCurrentStateIterator(ChangeFeedEstimatorRequestOptions changeFeedEstimatorRequestOptions=null); + } + public sealed class ChangeFeedEstimatorRequestOptions + { + public ChangeFeedEstimatorRequestOptions(); + public Nullable MaxItemCount { get; set; } + } + public class ChangeFeedItemChange + { + public ChangeFeedItemChange(); + public T Current { get; set; } + public ChangeFeedMetadata Metadata { get; set; } + public T Previous { get; set; } + } + public class ChangeFeedMetadata + { + public ChangeFeedMetadata(DateTime conflictResolutionTimestamp, long lsn, ChangeFeedOperationType operationType, long previousLsn); + public DateTime ConflictResolutionTimestamp { get; } + public bool IsTimeToLiveExpired { get; } + public long Lsn { get; } + public ChangeFeedOperationType OperationType { get; } + public long PreviousLsn { get; } + } + public abstract class ChangeFeedMode + { + public static ChangeFeedMode AllVersionsAndDeletes { get; } + public static ChangeFeedMode Incremental { get; } + public static ChangeFeedMode LatestVersion { get; } + } + public enum ChangeFeedOperationType + { + Create = 0, + Delete = 2, + Replace = 1, + } + public sealed class ChangeFeedPolicy + { + public ChangeFeedPolicy(); + public static TimeSpan FullFidelityNoRetention { get; } + public TimeSpan FullFidelityRetention { get; set; } + } + public abstract class ChangeFeedProcessor + { + protected ChangeFeedProcessor(); + public abstract Task StartAsync(); + public abstract Task StopAsync(); + } + public class ChangeFeedProcessorBuilder + { + public ChangeFeedProcessor Build(); + public ChangeFeedProcessorBuilder WithErrorNotification(Container.ChangeFeedMonitorErrorDelegate errorDelegate); + public ChangeFeedProcessorBuilder WithInstanceName(string instanceName); + public ChangeFeedProcessorBuilder WithLeaseAcquireNotification(Container.ChangeFeedMonitorLeaseAcquireDelegate acquireDelegate); + public ChangeFeedProcessorBuilder WithLeaseConfiguration(Nullable acquireInterval=default(Nullable), Nullable expirationInterval=default(Nullable), Nullable renewInterval=default(Nullable)); + public ChangeFeedProcessorBuilder WithLeaseContainer(Container leaseContainer); + public ChangeFeedProcessorBuilder WithLeaseReleaseNotification(Container.ChangeFeedMonitorLeaseReleaseDelegate releaseDelegate); + public ChangeFeedProcessorBuilder WithMaxItems(int maxItemCount); + public ChangeFeedProcessorBuilder WithPollInterval(TimeSpan pollInterval); + public ChangeFeedProcessorBuilder WithStartTime(DateTime startTime); + } + public abstract class ChangeFeedProcessorContext + { + protected ChangeFeedProcessorContext(); + public abstract CosmosDiagnostics Diagnostics { get; } + public abstract Headers Headers { get; } + public abstract string LeaseToken { get; } + } + public sealed class ChangeFeedProcessorState + { + public ChangeFeedProcessorState(string leaseToken, long estimatedLag, string instanceName); + public long EstimatedLag { get; } + public string InstanceName { get; } + public string LeaseToken { get; } + } + public class ChangeFeedProcessorUserException : Exception + { + public ChangeFeedProcessorUserException(Exception originalException, ChangeFeedProcessorContext context); + protected ChangeFeedProcessorUserException(SerializationInfo info, StreamingContext context); + public ChangeFeedProcessorContext ChangeFeedProcessorContext { get; } + public override void GetObjectData(SerializationInfo info, StreamingContext context); + } + public sealed class ChangeFeedRequestOptions : RequestOptions + { + public ChangeFeedRequestOptions(); + public new string IfMatchEtag { get; set; } + public new string IfNoneMatchEtag { get; set; } + public Nullable PageSizeHint { get; set; } + } + public abstract class ChangeFeedStartFrom + { + public static ChangeFeedStartFrom Beginning(); + public static ChangeFeedStartFrom Beginning(FeedRange feedRange); + public static ChangeFeedStartFrom ContinuationToken(string continuationToken); + public static ChangeFeedStartFrom Now(); + public static ChangeFeedStartFrom Now(FeedRange feedRange); + public static ChangeFeedStartFrom Time(DateTime dateTimeUtc); + public static ChangeFeedStartFrom Time(DateTime dateTimeUtc, FeedRange feedRange); + } + public sealed class ClientEncryptionIncludedPath + { + public ClientEncryptionIncludedPath(); + public string ClientEncryptionKeyId { get; set; } + public string EncryptionAlgorithm { get; set; } + public string EncryptionType { get; set; } + public string Path { get; set; } + } + public abstract class ClientEncryptionKey + { + protected ClientEncryptionKey(); + public abstract string Id { get; } + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(ClientEncryptionKeyProperties clientEncryptionKeyProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class ClientEncryptionKeyProperties : IEquatable + { + protected ClientEncryptionKeyProperties(); + public ClientEncryptionKeyProperties(string id, string encryptionAlgorithm, byte[] wrappedDataEncryptionKey, EncryptionKeyWrapMetadata encryptionKeyWrapMetadata); + public Nullable CreatedTime { get; } + public string EncryptionAlgorithm { get; } + public EncryptionKeyWrapMetadata EncryptionKeyWrapMetadata { get; } + public string ETag { get; } + public string Id { get; } + public Nullable LastModified { get; } + public virtual string SelfLink { get; } + public byte[] WrappedDataEncryptionKey { get; } + public bool Equals(ClientEncryptionKeyProperties other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public class ClientEncryptionKeyResponse : Response + { + protected ClientEncryptionKeyResponse(); + public override string ActivityId { get; } + public virtual ClientEncryptionKey ClientEncryptionKey { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override ClientEncryptionKeyProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator ClientEncryptionKey (ClientEncryptionKeyResponse response); + } + public sealed class ClientEncryptionPolicy + { + public ClientEncryptionPolicy(IEnumerable includedPaths); + public ClientEncryptionPolicy(IEnumerable includedPaths, int policyFormatVersion); + public IEnumerable IncludedPaths { get; } + public int PolicyFormatVersion { get; } + } + public sealed class CompositePath + { + public CompositePath(); + public CompositePathSortOrder Order { get; set; } + public string Path { get; set; } + } + public enum CompositePathSortOrder + { + Ascending = 0, + Descending = 1, + } + public sealed class ComputedProperty + { + public ComputedProperty(); + public string Name { get; set; } + public string Query { get; set; } + } + public class ConflictProperties + { + public ConflictProperties(); + public string Id { get; } + public OperationKind OperationKind { get; } + public string SelfLink { get; } + } + public enum ConflictResolutionMode + { + Custom = 1, + LastWriterWins = 0, + } + public class ConflictResolutionPolicy + { + public ConflictResolutionPolicy(); + public ConflictResolutionMode Mode { get; set; } + public string ResolutionPath { get; set; } + public string ResolutionProcedure { get; set; } + } + public abstract class Conflicts + { + protected Conflicts(); + public abstract Task DeleteAsync(ConflictProperties conflict, PartitionKey partitionKey, CancellationToken cancellationToken=default(CancellationToken)); + public abstract FeedIterator GetConflictQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract T ReadConflictContent(ConflictProperties conflict); + public abstract Task> ReadCurrentAsync(ConflictProperties conflict, PartitionKey partitionKey, CancellationToken cancellationToken=default(CancellationToken)); + } + public enum ConnectionMode + { + Direct = 1, + Gateway = 0, + } + public enum ConsistencyLevel + { + BoundedStaleness = 1, + ConsistentPrefix = 4, + Eventual = 3, + Session = 2, + Strong = 0, + } + public abstract class Container + { + protected Container(); + public abstract Conflicts Conflicts { get; } + public abstract Database Database { get; } + public abstract string Id { get; } + public abstract Scripts Scripts { get; } + public abstract Task> CreateItemAsync(T item, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateItemStreamAsync(Stream streamPayload, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract TransactionalBatch CreateTransactionalBatch(PartitionKey partitionKey); + public abstract Task DeleteAllItemsByPartitionKeyStreamAsync(PartitionKey partitionKey, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteContainerAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteContainerStreamAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> DeleteItemAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteItemStreamAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ChangeFeedEstimator GetChangeFeedEstimator(string processorName, Container leaseContainer); + public abstract ChangeFeedProcessorBuilder GetChangeFeedEstimatorBuilder(string processorName, Container.ChangesEstimationHandler estimationDelegate, Nullable estimationPeriod=default(Nullable)); + public abstract FeedIterator GetChangeFeedIterator(ChangeFeedStartFrom changeFeedStartFrom, ChangeFeedMode changeFeedMode, ChangeFeedRequestOptions changeFeedRequestOptions=null); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangeFeedStreamHandler onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilderWithManualCheckpoint(string processorName, Container.ChangeFeedStreamHandlerWithManualCheckpoint onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilderWithManualCheckpoint(string processorName, Container.ChangeFeedHandlerWithManualCheckpoint onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangeFeedHandler onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangesHandler onChangesDelegate); + public abstract FeedIterator GetChangeFeedStreamIterator(ChangeFeedStartFrom changeFeedStartFrom, ChangeFeedMode changeFeedMode, ChangeFeedRequestOptions changeFeedRequestOptions=null); + public abstract Task> GetFeedRangesAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract IOrderedQueryable GetItemLinqQueryable(bool allowSynchronousQueryExecution=false, string continuationToken=null, QueryRequestOptions requestOptions=null, CosmosLinqSerializerOptions linqSerializerOptions=null); + public abstract FeedIterator GetItemQueryIterator(FeedRange feedRange, QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(FeedRange feedRange, QueryDefinition queryDefinition, string continuationToken, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task> GetPartitionKeyRangesAsync(FeedRange feedRange, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> PatchItemAsync(string id, PartitionKey partitionKey, IReadOnlyList patchOperations, PatchItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task PatchItemStreamAsync(string id, PartitionKey partitionKey, IReadOnlyList patchOperations, PatchItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadContainerAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadContainerStreamAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadItemAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadItemStreamAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadManyItemsAsync(IReadOnlyList> items, ReadManyRequestOptions readManyRequestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadManyItemsStreamAsync(IReadOnlyList> items, ReadManyRequestOptions readManyRequestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadThroughputAsync(RequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadThroughputAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceContainerAsync(ContainerProperties containerProperties, ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceContainerStreamAsync(ContainerProperties containerProperties, ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReplaceItemAsync(T item, string id, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceItemStreamAsync(Stream streamPayload, string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(int throughput, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> UpsertItemAsync(T item, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertItemStreamAsync(Stream streamPayload, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public delegate Task ChangeFeedHandlerWithManualCheckpoint(ChangeFeedProcessorContext context, IReadOnlyCollection changes, Func checkpointAsync, CancellationToken cancellationToken); + public delegate Task ChangeFeedHandler(ChangeFeedProcessorContext context, IReadOnlyCollection changes, CancellationToken cancellationToken); + public delegate Task ChangeFeedMonitorErrorDelegate(string leaseToken, Exception exception); + public delegate Task ChangeFeedMonitorLeaseAcquireDelegate(string leaseToken); + public delegate Task ChangeFeedMonitorLeaseReleaseDelegate(string leaseToken); + public delegate Task ChangeFeedStreamHandler(ChangeFeedProcessorContext context, Stream changes, CancellationToken cancellationToken); + public delegate Task ChangeFeedStreamHandlerWithManualCheckpoint(ChangeFeedProcessorContext context, Stream changes, Func checkpointAsync, CancellationToken cancellationToken); + public delegate Task ChangesEstimationHandler(long estimatedPendingChanges, CancellationToken cancellationToken); + public delegate Task ChangesHandler(IReadOnlyCollection changes, CancellationToken cancellationToken); + } + public class ContainerProperties + { + public ContainerProperties(); + public ContainerProperties(string id, IReadOnlyList partitionKeyPaths); + public ContainerProperties(string id, string partitionKeyPath); + public Nullable AnalyticalStoreTimeToLiveInSeconds { get; set; } + public ChangeFeedPolicy ChangeFeedPolicy { get; set; } + public ClientEncryptionPolicy ClientEncryptionPolicy { get; set; } + public Collection ComputedProperties { get; set; } + public ConflictResolutionPolicy ConflictResolutionPolicy { get; set; } + public Nullable DefaultTimeToLive { get; set; } + public string ETag { get; } + public GeospatialConfig GeospatialConfig { get; set; } + public string Id { get; set; } + public IndexingPolicy IndexingPolicy { get; set; } + public Nullable LastModified { get; } + public Nullable PartitionKeyDefinitionVersion { get; set; } + public string PartitionKeyPath { get; set; } + public IReadOnlyList PartitionKeyPaths { get; set; } + public string SelfLink { get; } + public string TimeToLivePropertyPath { get; set; } + public UniqueKeyPolicy UniqueKeyPolicy { get; set; } + } + public class ContainerRequestOptions : RequestOptions + { + public ContainerRequestOptions(); + public bool PopulateQuotaInfo { get; set; } + } + public class ContainerResponse : Response + { + protected ContainerResponse(); + public override string ActivityId { get; } + public virtual Container Container { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override ContainerProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Container (ContainerResponse response); + } + public class CosmosClient : IDisposable + { + protected CosmosClient(); + public CosmosClient(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, CosmosClientOptions clientOptions=null); + public CosmosClient(string accountEndpoint, TokenCredential tokenCredential, CosmosClientOptions clientOptions=null); + public CosmosClient(string connectionString, CosmosClientOptions clientOptions=null); + public CosmosClient(string accountEndpoint, string authKeyOrResourceToken, CosmosClientOptions clientOptions=null); + public virtual CosmosClientOptions ClientOptions { get; } + public virtual Uri Endpoint { get; } + public virtual CosmosResponseFactory ResponseFactory { get; } + public static Task CreateAndInitializeAsync(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string accountEndpoint, TokenCredential tokenCredential, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string connectionString, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string accountEndpoint, string authKeyOrResourceToken, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseAsync(string id, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseAsync(string id, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseIfNotExistsAsync(string id, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseIfNotExistsAsync(string id, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseStreamAsync(DatabaseProperties databaseProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual Container GetContainer(string databaseId, string containerId); + public virtual Database GetDatabase(string id); + public virtual FeedIterator GetDatabaseQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual Task ReadAccountAsync(); + } + public class CosmosClientOptions + { + public CosmosClientOptions(); + public bool AllowBulkExecution { get; set; } + public string ApplicationName { get; set; } + public IReadOnlyList ApplicationPreferredRegions { get; set; } + public string ApplicationRegion { get; set; } + public ConnectionMode ConnectionMode { get; set; } + public Nullable ConsistencyLevel { get; set; } + public Collection CustomHandlers { get; } + public Nullable EnableContentResponseOnWrite { get; set; } + public bool EnableTcpConnectionEndpointRediscovery { get; set; } + public int GatewayModeMaxConnectionLimit { get; set; } + public Func HttpClientFactory { get; set; } + public Nullable IdleTcpConnectionTimeout { get; set; } + public bool IsDistributedTracingEnabled { get; set; } + public bool LimitToEndpoint { get; set; } + public Nullable MaxRequestsPerTcpConnection { get; set; } + public Nullable MaxRetryAttemptsOnRateLimitedRequests { get; set; } + public Nullable MaxRetryWaitTimeOnRateLimitedRequests { get; set; } + public Nullable MaxTcpConnectionsPerEndpoint { get; set; } + public Nullable OpenTcpConnectionTimeout { get; set; } + public Nullable PortReuseMode { get; set; } + public TimeSpan RequestTimeout { get; set; } + public CosmosSerializer Serializer { get; set; } + public CosmosSerializationOptions SerializerOptions { get; set; } + public Func ServerCertificateCustomValidationCallback { get; set; } + public Nullable TokenCredentialBackgroundRefreshInterval { get; set; } + public IWebProxy WebProxy { get; set; } + } + public abstract class CosmosDiagnostics + { + protected CosmosDiagnostics(); + public virtual TimeSpan GetClientElapsedTime(); + public abstract IReadOnlyList> GetContactedRegions(); + public virtual int GetFailedRequestCount(); + public virtual Nullable GetStartTimeUtc(); + public abstract override string ToString(); + } + public class CosmosException : Exception + { + public CosmosException(string message, HttpStatusCode statusCode, int subStatusCode, string activityId, double requestCharge); + public virtual string ActivityId { get; } + public virtual CosmosDiagnostics Diagnostics { get; } + public virtual Headers Headers { get; } + public override string Message { get; } + public virtual double RequestCharge { get; } + public virtual string ResponseBody { get; } + public virtual Nullable RetryAfter { get; } + public override string StackTrace { get; } + public virtual HttpStatusCode StatusCode { get; } + public virtual int SubStatusCode { get; } + public override string ToString(); + public virtual bool TryGetHeader(string headerName, out string value); + } + public sealed class CosmosLinqSerializerOptions + { + public CosmosLinqSerializerOptions(); + public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } + } + public class CosmosOperationCanceledException : OperationCanceledException + { + public CosmosOperationCanceledException(OperationCanceledException originalException, CosmosDiagnostics diagnostics); + protected CosmosOperationCanceledException(SerializationInfo info, StreamingContext context); + public override IDictionary Data { get; } + public CosmosDiagnostics Diagnostics { get; } + public override string HelpLink { get; set; } + public override string Message { get; } + public override string Source { get; set; } + public override string StackTrace { get; } + public override Exception GetBaseException(); + public override void GetObjectData(SerializationInfo info, StreamingContext context); + public override string ToString(); + } + public enum CosmosPropertyNamingPolicy + { + CamelCase = 1, + Default = 0, + } + public abstract class CosmosResponseFactory + { + protected CosmosResponseFactory(); + public abstract FeedResponse CreateItemFeedResponse(ResponseMessage responseMessage); + public abstract ItemResponse CreateItemResponse(ResponseMessage responseMessage); + public abstract StoredProcedureExecuteResponse CreateStoredProcedureExecuteResponse(ResponseMessage responseMessage); + } + public sealed class CosmosSerializationOptions + { + public CosmosSerializationOptions(); + public bool IgnoreNullValues { get; set; } + public bool Indented { get; set; } + public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } + } + public abstract class CosmosSerializer + { + protected CosmosSerializer(); + public abstract T FromStream(Stream stream); + public abstract Stream ToStream(T input); + } + public abstract class Database + { + protected Database(); + public abstract CosmosClient Client { get; } + public abstract string Id { get; } + public abstract Task CreateClientEncryptionKeyAsync(ClientEncryptionKeyProperties clientEncryptionKeyProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(string id, string partitionKeyPath, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(string id, string partitionKeyPath, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerStreamAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerStreamAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateUserAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ContainerBuilder DefineContainer(string name, string partitionKeyPath); + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteStreamAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ClientEncryptionKey GetClientEncryptionKey(string id); + public abstract FeedIterator GetClientEncryptionKeyQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Container GetContainer(string id); + public abstract FeedIterator GetContainerQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract User GetUser(string id); + public abstract FeedIterator GetUserQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadStreamAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadThroughputAsync(RequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadThroughputAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(int throughput, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertUserAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class DatabaseProperties + { + public DatabaseProperties(); + public DatabaseProperties(string id); + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class DatabaseResponse : Response + { + protected DatabaseResponse(); + public override string ActivityId { get; } + public virtual Database Database { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override DatabaseProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Database (DatabaseResponse response); + } + public enum DataType + { + LineString = 3, + MultiPolygon = 5, + Number = 0, + Point = 2, + Polygon = 4, + String = 1, + } + public class DedicatedGatewayRequestOptions + { + public DedicatedGatewayRequestOptions(); + public Nullable BypassIntegratedCache { get; set; } + public Nullable MaxIntegratedCacheStaleness { get; set; } + } + public class EncryptionKeyWrapMetadata : IEquatable + { + public EncryptionKeyWrapMetadata(EncryptionKeyWrapMetadata source); + public EncryptionKeyWrapMetadata(string type, string name, string value, string algorithm); + public string Algorithm { get; } + public string Name { get; } + public string Type { get; } + public string Value { get; } + public bool Equals(EncryptionKeyWrapMetadata other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class ExcludedPath + { + public ExcludedPath(); + public string Path { get; set; } + } + public abstract class FeedIterator : IDisposable + { + protected FeedIterator(); + public abstract bool HasMoreResults { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public abstract Task ReadNextAsync(CancellationToken cancellationToken=default(CancellationToken)); + } + public abstract class FeedIterator : IDisposable + { + protected FeedIterator(); + public abstract bool HasMoreResults { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public abstract Task> ReadNextAsync(CancellationToken cancellationToken=default(CancellationToken)); + } + public abstract class FeedRange + { + protected FeedRange(); + public static FeedRange FromJsonString(string toStringValue); + public static FeedRange FromPartitionKey(PartitionKey partitionKey); + public abstract string ToJsonString(); + } + public abstract class FeedResponse : IEnumerable, IEnumerable + { + protected FeedResponse(); + public override string ActivityId { get; } + public abstract string ContinuationToken { get; } + public abstract int Count { get; } + public override string ETag { get; } + public abstract string IndexMetrics { get; } + public override double RequestCharge { get; } + public abstract IEnumerator GetEnumerator(); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + } + public sealed class GeospatialConfig + { + public GeospatialConfig(); + public GeospatialConfig(GeospatialType geospatialType); + public GeospatialType GeospatialType { get; set; } + } + public enum GeospatialType + { + Geography = 0, + Geometry = 1, + } + public class Headers : IEnumerable + { + public Headers(); + public virtual string ActivityId { get; } + public virtual string ContentLength { get; set; } + public virtual string ContentType { get; } + public virtual string ContinuationToken { get; } + public virtual string ETag { get; } + public virtual string this[string headerName] { get; set; } + public virtual string Location { get; } + public virtual double RequestCharge { get; } + public virtual string Session { get; } + public virtual void Add(string headerName, IEnumerable values); + public virtual void Add(string headerName, string value); + public virtual string[] AllKeys(); + public virtual string Get(string headerName); + public virtual IEnumerator GetEnumerator(); + public virtual T GetHeaderValue(string headerName); + public virtual string GetValueOrDefault(string headerName); + public virtual void Remove(string headerName); + public virtual void Set(string headerName, string value); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + public virtual bool TryGetValue(string headerName, out string value); + } + public sealed class IncludedPath + { + public IncludedPath(); + public string Path { get; set; } + } + public enum IndexingDirective + { + Default = 0, + Exclude = 2, + Include = 1, + } + public enum IndexingMode + { + Consistent = 0, + Lazy = 1, + None = 2, + } + public sealed class IndexingPolicy + { + public IndexingPolicy(); + public bool Automatic { get; set; } + public Collection> CompositeIndexes { get; } + public Collection ExcludedPaths { get; } + public Collection IncludedPaths { get; } + public IndexingMode IndexingMode { get; set; } + public Collection SpatialIndexes { get; } + } + public enum IndexKind + { + Hash = 0, + Range = 1, + Spatial = 2, + } + public class ItemRequestOptions : RequestOptions + { + public ItemRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions { get; set; } + public Nullable EnableContentResponseOnWrite { get; set; } + public Nullable IndexingDirective { get; set; } + public IEnumerable PostTriggers { get; set; } + public IEnumerable PreTriggers { get; set; } + public string SessionToken { get; set; } + } + public class ItemResponse : Response + { + protected ItemResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override T Resource { get; } + public override HttpStatusCode StatusCode { get; } + } + public enum OperationKind + { + Create = 1, + Delete = 3, + Invalid = 0, + Read = 4, + Replace = 2, + } + public struct PartitionKey : IEquatable + { + public static readonly PartitionKey None; + public static readonly PartitionKey Null; + public static readonly string SystemKeyName; + public static readonly string SystemKeyPath; + public PartitionKey(bool partitionKeyValue); + public PartitionKey(double partitionKeyValue); + public PartitionKey(string partitionKeyValue); + public bool Equals(PartitionKey other); + public override bool Equals(object obj); + public override int GetHashCode(); + public static bool operator ==(PartitionKey left, PartitionKey right); + public static bool operator !=(PartitionKey left, PartitionKey right); + public override string ToString(); + } + public sealed class PartitionKeyBuilder + { + public PartitionKeyBuilder(); + public PartitionKeyBuilder Add(bool val); + public PartitionKeyBuilder Add(double val); + public PartitionKeyBuilder Add(string val); + public PartitionKeyBuilder AddNoneType(); + public PartitionKeyBuilder AddNullValue(); + public PartitionKey Build(); + } + public enum PartitionKeyDefinitionVersion + { + V1 = 1, + V2 = 2, + } + public sealed class PatchItemRequestOptions : ItemRequestOptions + { + public PatchItemRequestOptions(); + public string FilterPredicate { get; set; } + } + public abstract class PatchOperation + { + protected PatchOperation(); + public virtual string From { get; set; } + public abstract PatchOperationType OperationType { get; } + public abstract string Path { get; } + public static PatchOperation Add(string path, T value); + public static PatchOperation Increment(string path, double value); + public static PatchOperation Increment(string path, long value); + public static PatchOperation Move(string from, string path); + public static PatchOperation Remove(string path); + public static PatchOperation Replace(string path, T value); + public static PatchOperation Set(string path, T value); + public virtual bool TrySerializeValueParameter(CosmosSerializer cosmosSerializer, out Stream valueParam); + } + public enum PatchOperationType + { + Add = 0, + Increment = 4, + Move = 5, + Remove = 1, + Replace = 2, + Set = 3, + } + public abstract class PatchOperation : PatchOperation + { + protected PatchOperation(); + public abstract T Value { get; } + } + public abstract class Permission + { + protected Permission(); + public abstract string Id { get; } + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadAsync(Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public enum PermissionMode : byte + { + All = (byte)2, + Read = (byte)1, + } + public class PermissionProperties + { + public PermissionProperties(string id, PermissionMode permissionMode, Container container, PartitionKey resourcePartitionKey, string itemId); + public PermissionProperties(string id, PermissionMode permissionMode, Container container, Nullable resourcePartitionKey=default(Nullable)); + public string ETag { get; } + public string Id { get; } + public Nullable LastModified { get; } + public PermissionMode PermissionMode { get; } + public Nullable ResourcePartitionKey { get; set; } + public string ResourceUri { get; } + public string SelfLink { get; } + public string Token { get; } + } + public class PermissionResponse : Response + { + protected PermissionResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public virtual Permission Permission { get; } + public override double RequestCharge { get; } + public override PermissionProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Permission (PermissionResponse response); + } + public enum PortReuseMode + { + PrivatePortPool = 1, + ReuseUnicastPort = 0, + } + public enum PriorityLevel + { + High = 1, + Low = 2, + } + public class QueryDefinition + { + public QueryDefinition(string query); + public string QueryText { get; } + public IReadOnlyList> GetQueryParameters(); + public QueryDefinition WithParameter(string name, object value); + public QueryDefinition WithParameterStream(string name, Stream valueStream); + } + public class QueryRequestOptions : RequestOptions + { + public QueryRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions { get; set; } + public Nullable EnableLowPrecisionOrderBy { get; set; } + public bool EnableOptimisticDirectExecution { get; set; } + public Nullable EnableScanInQuery { get; set; } + public Nullable MaxBufferedItemCount { get; set; } + public Nullable MaxConcurrency { get; set; } + public Nullable MaxItemCount { get; set; } + public Nullable PartitionKey { get; set; } + public Nullable PopulateIndexMetrics { get; set; } + public Nullable ResponseContinuationTokenLimitInKb { get; set; } + public string SessionToken { get; set; } + } + public class ReadManyRequestOptions : RequestOptions + { + public ReadManyRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public string SessionToken { get; set; } + } + public static class Regions + { + public const string AustraliaCentral = "Australia Central"; + public const string AustraliaCentral2 = "Australia Central 2"; + public const string AustraliaEast = "Australia East"; + public const string AustraliaSoutheast = "Australia Southeast"; + public const string BrazilSouth = "Brazil South"; + public const string BrazilSoutheast = "Brazil Southeast"; + public const string CanadaCentral = "Canada Central"; + public const string CanadaEast = "Canada East"; + public const string CentralIndia = "Central India"; + public const string CentralUS = "Central US"; + public const string CentralUSEUAP = "Central US EUAP"; + public const string ChinaEast = "China East"; + public const string ChinaEast2 = "China East 2"; + public const string ChinaEast3 = "China East 3"; + public const string ChinaNorth = "China North"; + public const string ChinaNorth2 = "China North 2"; + public const string ChinaNorth3 = "China North 3"; + public const string EastAsia = "East Asia"; + public const string EastUS = "East US"; + public const string EastUS2 = "East US 2"; + public const string EastUS2EUAP = "East US 2 EUAP"; + public const string EastUSSLV = "East US SLV"; + public const string FranceCentral = "France Central"; + public const string FranceSouth = "France South"; + public const string GermanyCentral = "Germany Central"; + public const string GermanyNorth = "Germany North"; + public const string GermanyNortheast = "Germany Northeast"; + public const string GermanyWestCentral = "Germany West Central"; + public const string IsraelCentral = "Israel Central"; + public const string ItalyNorth = "Italy North"; + public const string JapanEast = "Japan East"; + public const string JapanWest = "Japan West"; + public const string JioIndiaCentral = "Jio India Central"; + public const string JioIndiaWest = "Jio India West"; + public const string KoreaCentral = "Korea Central"; + public const string KoreaSouth = "Korea South"; + public const string MalaysiaSouth = "Malaysia South"; + public const string NorthCentralUS = "North Central US"; + public const string NorthEurope = "North Europe"; + public const string NorwayEast = "Norway East"; + public const string NorwayWest = "Norway West"; + public const string PolandCentral = "Poland Central"; + public const string QatarCentral = "Qatar Central"; + public const string SouthAfricaNorth = "South Africa North"; + public const string SouthAfricaWest = "South Africa West"; + public const string SouthCentralUS = "South Central US"; + public const string SoutheastAsia = "Southeast Asia"; + public const string SouthIndia = "South India"; + public const string SwedenCentral = "Sweden Central"; + public const string SwedenSouth = "Sweden South"; + public const string SwitzerlandNorth = "Switzerland North"; + public const string SwitzerlandWest = "Switzerland West"; + public const string UAECentral = "UAE Central"; + public const string UAENorth = "UAE North"; + public const string UKSouth = "UK South"; + public const string UKWest = "UK West"; + public const string USDoDCentral = "USDoD Central"; + public const string USDoDEast = "USDoD East"; + public const string USGovArizona = "USGov Arizona"; + public const string USGovTexas = "USGov Texas"; + public const string USGovVirginia = "USGov Virginia"; + public const string USNatEast = "USNat East"; + public const string USNatWest = "USNat West"; + public const string USSecEast = "USSec East"; + public const string USSecWest = "USSec West"; + public const string WestCentralUS = "West Central US"; + public const string WestEurope = "West Europe"; + public const string WestIndia = "West India"; + public const string WestUS = "West US"; + public const string WestUS2 = "West US 2"; + public const string WestUS3 = "West US 3"; + } + public abstract class RequestHandler + { + protected RequestHandler(); + public RequestHandler InnerHandler { get; set; } + public virtual Task SendAsync(RequestMessage request, CancellationToken cancellationToken); + } + public class RequestMessage : IDisposable + { + public RequestMessage(); + public RequestMessage(HttpMethod method, Uri requestUri); + public virtual Stream Content { get; set; } + public virtual Headers Headers { get; } + public virtual HttpMethod Method { get; } + public virtual Dictionary Properties { get; } + public virtual Uri RequestUri { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + } + public class RequestOptions + { + public RequestOptions(); + public Action AddRequestHeaders { get; set; } + public string IfMatchEtag { get; set; } + public string IfNoneMatchEtag { get; set; } + public Nullable PriorityLevel { get; set; } + public IReadOnlyDictionary Properties { get; set; } + public RequestOptions ShallowCopy(); + } + public class ResponseMessage : IDisposable + { + public ResponseMessage(); + public ResponseMessage(HttpStatusCode statusCode, RequestMessage requestMessage=null, string errorMessage=null); + public virtual Stream Content { get; set; } + public virtual string ContinuationToken { get; } + public virtual CosmosDiagnostics Diagnostics { get; set; } + public virtual string ErrorMessage { get; } + public virtual Headers Headers { get; } + public string IndexMetrics { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual RequestMessage RequestMessage { get; } + public virtual HttpStatusCode StatusCode { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual ResponseMessage EnsureSuccessStatusCode(); + } + public abstract class Response + { + protected Response(); + public abstract string ActivityId { get; } + public abstract CosmosDiagnostics Diagnostics { get; } + public abstract string ETag { get; } + public abstract Headers Headers { get; } + public abstract double RequestCharge { get; } + public abstract T Resource { get; } + public abstract HttpStatusCode StatusCode { get; } + public static implicit operator T (Response response); + } + public sealed class SpatialPath + { + public SpatialPath(); + public BoundingBoxProperties BoundingBox { get; set; } + public string Path { get; set; } + public Collection SpatialTypes { get; } + } + public enum SpatialType + { + LineString = 1, + MultiPolygon = 3, + Point = 0, + Polygon = 2, + } + public class ThroughputProperties + { + public Nullable AutoscaleMaxThroughput { get; } + public string ETag { get; } + public Nullable LastModified { get; } + public string SelfLink { get; } + public Nullable Throughput { get; } + public static ThroughputProperties CreateAutoscaleThroughput(int autoscaleMaxThroughput); + public static ThroughputProperties CreateManualThroughput(int throughput); + } + public class ThroughputResponse : Response + { + protected ThroughputResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public Nullable IsReplacePending { get; } + public Nullable MinThroughput { get; } + public override double RequestCharge { get; } + public override ThroughputProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator ThroughputProperties (ThroughputResponse response); + } + public abstract class TransactionalBatch + { + protected TransactionalBatch(); + public abstract TransactionalBatch CreateItemStream(Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch CreateItem(T item, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch DeleteItem(string id, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract Task ExecuteAsync(TransactionalBatchRequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract TransactionalBatch PatchItem(string id, IReadOnlyList patchOperations, TransactionalBatchPatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReadItem(string id, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReplaceItemStream(string id, Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReplaceItem(string id, T item, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch UpsertItemStream(Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch UpsertItem(T item, TransactionalBatchItemRequestOptions requestOptions=null); + } + public class TransactionalBatchItemRequestOptions : RequestOptions + { + public TransactionalBatchItemRequestOptions(); + public Nullable EnableContentResponseOnWrite { get; set; } + public Nullable IndexingDirective { get; set; } + } + public class TransactionalBatchOperationResult + { + protected TransactionalBatchOperationResult(); + public virtual string ETag { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual Stream ResourceStream { get; } + public virtual TimeSpan RetryAfter { get; } + public virtual HttpStatusCode StatusCode { get; } + } + public class TransactionalBatchOperationResult : TransactionalBatchOperationResult + { + protected TransactionalBatchOperationResult(); + public virtual T Resource { get; set; } + } + public class TransactionalBatchPatchItemRequestOptions : TransactionalBatchItemRequestOptions + { + public TransactionalBatchPatchItemRequestOptions(); + public string FilterPredicate { get; set; } + } + public class TransactionalBatchRequestOptions : RequestOptions + { + public TransactionalBatchRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public string SessionToken { get; set; } + } + public class TransactionalBatchResponse : IDisposable, IEnumerable, IEnumerable, IReadOnlyCollection, IReadOnlyList + { + protected TransactionalBatchResponse(); + public virtual string ActivityId { get; } + public virtual int Count { get; } + public virtual CosmosDiagnostics Diagnostics { get; } + public virtual string ErrorMessage { get; } + public virtual Headers Headers { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual TransactionalBatchOperationResult this[int index] { get; } + public virtual double RequestCharge { get; } + public virtual Nullable RetryAfter { get; } + public virtual HttpStatusCode StatusCode { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual IEnumerator GetEnumerator(); + public virtual TransactionalBatchOperationResult GetOperationResultAtIndex(int index); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + } + public class UniqueKey + { + public UniqueKey(); + public Collection Paths { get; } + } + public sealed class UniqueKeyPolicy + { + public UniqueKeyPolicy(); + public Collection UniqueKeys { get; } + } + public abstract class User + { + protected User(); + public abstract string Id { get; } + public abstract Task CreatePermissionAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Permission GetPermission(string id); + public abstract FeedIterator GetPermissionQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetPermissionQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(UserProperties userProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertPermissionAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class UserProperties + { + protected UserProperties(); + public UserProperties(string id); + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class UserResponse : Response + { + protected UserResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override UserProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public virtual User User { get; } + public static implicit operator User (UserResponse response); + } +} +namespace Microsoft.Azure.Cosmos.Fluent +{ + public class ChangeFeedPolicyDefinition + { + public ContainerBuilder Attach(); + } + public sealed class ClientEncryptionPolicyDefinition + { + public ContainerBuilder Attach(); + public ClientEncryptionPolicyDefinition WithIncludedPath(ClientEncryptionIncludedPath path); + } + public class CompositeIndexDefinition + { + public T Attach(); + public CompositeIndexDefinition Path(string path); + public CompositeIndexDefinition Path(string path, CompositePathSortOrder sortOrder); + } + public class ComputedPropertiesDefinition + { + public T Attach(); + public ComputedPropertiesDefinition WithComputedProperty(string name, string query); + } + public class ConflictResolutionDefinition + { + public ContainerBuilder Attach(); + public ConflictResolutionDefinition WithCustomStoredProcedureResolution(string conflictResolutionProcedure); + public ConflictResolutionDefinition WithLastWriterWinsResolution(string conflictResolutionPath); + } + public class ContainerBuilder : ContainerDefinition + { + protected ContainerBuilder(); + public ContainerBuilder(Database database, string name, string partitionKeyPath); + public new ContainerProperties Build(); + public Task CreateAsync(ThroughputProperties throughputProperties, CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateAsync(Nullable throughput=default(Nullable), CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateIfNotExistsAsync(ThroughputProperties throughputProperties, CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateIfNotExistsAsync(Nullable throughput=default(Nullable), CancellationToken cancellationToken=default(CancellationToken)); + public ChangeFeedPolicyDefinition WithChangeFeedPolicy(TimeSpan retention); + public ClientEncryptionPolicyDefinition WithClientEncryptionPolicy(); + public ClientEncryptionPolicyDefinition WithClientEncryptionPolicy(int policyFormatVersion); + public ConflictResolutionDefinition WithConflictResolution(); + public UniqueKeyDefinition WithUniqueKey(); + } + public abstract class ContainerDefinition where T : ContainerDefinition + { + public ContainerDefinition(); + public ContainerProperties Build(); + public ComputedPropertiesDefinition WithComputedProperties(); + public T WithDefaultTimeToLive(int defaultTtlInSeconds); + public T WithDefaultTimeToLive(TimeSpan defaultTtlTimeSpan); + public IndexingPolicyDefinition WithIndexingPolicy(); + public T WithPartitionKeyDefinitionVersion(PartitionKeyDefinitionVersion partitionKeyDefinitionVersion); + public T WithTimeToLivePropertyPath(string propertyPath); + } + public class CosmosClientBuilder + { + public CosmosClientBuilder(string connectionString); + public CosmosClientBuilder(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential); + public CosmosClientBuilder(string accountEndpoint, TokenCredential tokenCredential); + public CosmosClientBuilder(string accountEndpoint, string authKeyOrResourceToken); + public CosmosClientBuilder AddCustomHandlers(params RequestHandler[] customHandlers); + public CosmosClient Build(); + public Task BuildAndInitializeAsync(IReadOnlyList> containers, CancellationToken cancellationToken=default(CancellationToken)); + public CosmosClientBuilder WithApplicationName(string applicationName); + public CosmosClientBuilder WithApplicationPreferredRegions(IReadOnlyList applicationPreferredRegions); + public CosmosClientBuilder WithApplicationRegion(string applicationRegion); + public CosmosClientBuilder WithBulkExecution(bool enabled); + public CosmosClientBuilder WithConnectionModeDirect(); + public CosmosClientBuilder WithConnectionModeDirect(Nullable idleTcpConnectionTimeout=default(Nullable), Nullable openTcpConnectionTimeout=default(Nullable), Nullable maxRequestsPerTcpConnection=default(Nullable), Nullable maxTcpConnectionsPerEndpoint=default(Nullable), Nullable portReuseMode=default(Nullable), Nullable enableTcpConnectionEndpointRediscovery=default(Nullable)); + public CosmosClientBuilder WithConnectionModeGateway(Nullable maxConnectionLimit=default(Nullable), IWebProxy webProxy=null); + public CosmosClientBuilder WithConsistencyLevel(ConsistencyLevel consistencyLevel); + public CosmosClientBuilder WithContentResponseOnWrite(bool contentResponseOnWrite); + public CosmosClientBuilder WithCustomSerializer(CosmosSerializer cosmosJsonSerializer); + public CosmosClientBuilder WithDistributedTracing(bool isEnabled=true); + public CosmosClientBuilder WithHttpClientFactory(Func httpClientFactory); + public CosmosClientBuilder WithLimitToEndpoint(bool limitToEndpoint); + public CosmosClientBuilder WithRequestTimeout(TimeSpan requestTimeout); + public CosmosClientBuilder WithSerializerOptions(CosmosSerializationOptions cosmosSerializerOptions); + public CosmosClientBuilder WithThrottlingRetryOptions(TimeSpan maxRetryWaitTimeOnThrottledRequests, int maxRetryAttemptsOnThrottledRequests); + } + public class IndexingPolicyDefinition + { + public IndexingPolicyDefinition(); + public T Attach(); + public IndexingPolicyDefinition WithAutomaticIndexing(bool enabled); + public CompositeIndexDefinition> WithCompositeIndex(); + public PathsDefinition> WithExcludedPaths(); + public PathsDefinition> WithIncludedPaths(); + public IndexingPolicyDefinition WithIndexingMode(IndexingMode indexingMode); + public SpatialIndexDefinition> WithSpatialIndex(); + } + public class PathsDefinition + { + public T Attach(); + public PathsDefinition Path(string path); + } + public class SpatialIndexDefinition + { + public T Attach(); + public SpatialIndexDefinition Path(string path); + public SpatialIndexDefinition Path(string path, params SpatialType[] spatialTypes); + } + public class UniqueKeyDefinition + { + public ContainerBuilder Attach(); + public UniqueKeyDefinition Path(string path); + } +} +namespace Microsoft.Azure.Cosmos.Linq +{ + public static class CosmosLinq + { + public static object InvokeUserDefinedFunction(string udfName, params object[] arguments); + } + public static class CosmosLinqExtensions + { + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> CountAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static bool IsArray(this object obj); + public static bool IsBool(this object obj); + public static bool IsDefined(this object obj); + public static bool IsNull(this object obj); + public static bool IsNumber(this object obj); + public static bool IsObject(this object obj); + public static bool IsPrimitive(this object obj); + public static bool IsString(this object obj); + public static Task> MaxAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> MinAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static FeedIterator ToFeedIterator(this IQueryable query); + public static QueryDefinition ToQueryDefinition(this IQueryable query); + public static QueryDefinition ToQueryDefinition(this IQueryable query, IDictionary namedParameters); + public static FeedIterator ToStreamIterator(this IQueryable query); + } +} +namespace Microsoft.Azure.Cosmos.Scripts +{ + public abstract class Scripts + { + protected Scripts(); + public abstract Task CreateStoredProcedureAsync(StoredProcedureProperties storedProcedureProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateTriggerAsync(TriggerProperties triggerProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateUserDefinedFunctionAsync(UserDefinedFunctionProperties userDefinedFunctionProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteStoredProcedureAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteTriggerAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteUserDefinedFunctionAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ExecuteStoredProcedureAsync(string storedProcedureId, PartitionKey partitionKey, dynamic parameters, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteStoredProcedureStreamAsync(string storedProcedureId, PartitionKey partitionKey, dynamic parameters, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteStoredProcedureStreamAsync(string storedProcedureId, Stream streamPayload, PartitionKey partitionKey, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract FeedIterator GetStoredProcedureQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadStoredProcedureAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadTriggerAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadUserDefinedFunctionAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceStoredProcedureAsync(StoredProcedureProperties storedProcedureProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceTriggerAsync(TriggerProperties triggerProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceUserDefinedFunctionAsync(UserDefinedFunctionProperties userDefinedFunctionProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class StoredProcedureExecuteResponse : Response + { + protected StoredProcedureExecuteResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override T Resource { get; } + public virtual string ScriptLog { get; } + public virtual string SessionToken { get; } + public override HttpStatusCode StatusCode { get; } + } + public class StoredProcedureProperties + { + public StoredProcedureProperties(); + public StoredProcedureProperties(string id, string body); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class StoredProcedureRequestOptions : RequestOptions + { + public StoredProcedureRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public bool EnableScriptLogging { get; set; } + public string SessionToken { get; set; } + } + public class StoredProcedureResponse : Response + { + protected StoredProcedureResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override StoredProcedureProperties Resource { get; } + public virtual string SessionToken { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator StoredProcedureProperties (StoredProcedureResponse response); + } + public enum TriggerOperation : short + { + All = (short)0, + Create = (short)1, + Delete = (short)3, + Replace = (short)4, + Update = (short)2, + } + public class TriggerProperties + { + public TriggerProperties(); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public string SelfLink { get; } + public TriggerOperation TriggerOperation { get; set; } + public TriggerType TriggerType { get; set; } + } + public class TriggerResponse : Response + { + protected TriggerResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override TriggerProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator TriggerProperties (TriggerResponse response); + } + public enum TriggerType : byte + { + Post = (byte)1, + Pre = (byte)0, + } + public class UserDefinedFunctionProperties + { + public UserDefinedFunctionProperties(); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public string SelfLink { get; } + } + public class UserDefinedFunctionResponse : Response + { + protected UserDefinedFunctionResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override UserDefinedFunctionProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator UserDefinedFunctionProperties (UserDefinedFunctionResponse response); + } +} +namespace Microsoft.Azure.Cosmos.Spatial +{ + public sealed class BoundingBox : IEquatable + { + public BoundingBox(Position min, Position max); + public Position Max { get; } + public Position Min { get; } + public bool Equals(BoundingBox other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public abstract class Crs + { + protected Crs(CrsType type); + public static Crs Default { get; } + public CrsType Type { get; } + public static Crs Unspecified { get; } + public static LinkedCrs Linked(string href); + public static LinkedCrs Linked(string href, string type); + public static NamedCrs Named(string name); + } + public enum CrsType + { + Linked = 1, + Named = 0, + Unspecified = 2, + } + public abstract class Geometry + { + protected Geometry(GeometryType type, GeometryParams geometryParams); + public IDictionary AdditionalProperties { get; } + public BoundingBox BoundingBox { get; } + public Crs Crs { get; } + public GeometryType Type { get; } + public double Distance(Geometry to); + public override bool Equals(object obj); + public override int GetHashCode(); + public bool Intersects(Geometry geometry2); + public bool IsValid(); + public GeometryValidationResult IsValidDetailed(); + public bool Within(Geometry outer); + } + public class GeometryParams + { + public GeometryParams(); + public IDictionary AdditionalProperties { get; set; } + public BoundingBox BoundingBox { get; set; } + public Crs Crs { get; set; } + } + public enum GeometryShape + { + GeometryCollection = 6, + LineString = 2, + MultiLineString = 3, + MultiPoint = 1, + MultiPolygon = 5, + Point = 0, + Polygon = 4, + } + public enum GeometryType + { + GeometryCollection = 6, + LineString = 2, + MultiLineString = 3, + MultiPoint = 1, + MultiPolygon = 5, + Point = 0, + Polygon = 4, + } + public class GeometryValidationResult + { + public GeometryValidationResult(); + public bool IsValid { get; } + public string Reason { get; } + } + public sealed class LinearRing : IEquatable + { + public LinearRing(IList coordinates); + public ReadOnlyCollection Positions { get; } + public bool Equals(LinearRing other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class LineString : Geometry, IEquatable + { + public LineString(IList coordinates); + public LineString(IList coordinates, GeometryParams geometryParams); + public ReadOnlyCollection Positions { get; } + public bool Equals(LineString other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class LinkedCrs : Crs, IEquatable + { + public string Href { get; } + public string HrefType { get; } + public bool Equals(LinkedCrs other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class MultiPolygon : Geometry, IEquatable + { + public MultiPolygon(IList polygons); + public MultiPolygon(IList polygons, GeometryParams geometryParams); + public ReadOnlyCollection Polygons { get; } + public bool Equals(MultiPolygon other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class NamedCrs : Crs, IEquatable + { + public string Name { get; } + public bool Equals(NamedCrs other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Point : Geometry, IEquatable + { + public Point(Position position); + public Point(Position position, GeometryParams geometryParams); + public Point(double longitude, double latitude); + public Position Position { get; } + public bool Equals(Point other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Polygon : Geometry, IEquatable + { + public Polygon(IList rings); + public Polygon(IList rings, GeometryParams geometryParams); + public Polygon(IList externalRingPositions); + public ReadOnlyCollection Rings { get; } + public bool Equals(Polygon other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class PolygonCoordinates : IEquatable + { + public PolygonCoordinates(IList rings); + public ReadOnlyCollection Rings { get; } + public bool Equals(PolygonCoordinates other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Position : IEquatable + { + public Position(IList coordinates); + public Position(double longitude, double latitude); + public Position(double longitude, double latitude, Nullable altitude); + public Nullable Altitude { get; } + public ReadOnlyCollection Coordinates { get; } + public double Latitude { get; } + public double Longitude { get; } + public bool Equals(Position other); + public override bool Equals(object obj); + public override int GetHashCode(); + } +} diff --git a/Microsoft.Azure.Cosmos/contracts/API_3.35.0.txt b/Microsoft.Azure.Cosmos/contracts/API_3.35.0.txt new file mode 100644 index 0000000000..c0dc3e280f --- /dev/null +++ b/Microsoft.Azure.Cosmos/contracts/API_3.35.0.txt @@ -0,0 +1,1502 @@ +namespace Microsoft.Azure.Cosmos +{ + public class AccountConsistency + { + public AccountConsistency(); + public ConsistencyLevel DefaultConsistencyLevel { get; } + public int MaxStalenessIntervalInSeconds { get; } + public int MaxStalenessPrefix { get; } + } + public class AccountProperties + { + public AccountConsistency Consistency { get; } + public string ETag { get; } + public string Id { get; } + public IEnumerable ReadableRegions { get; } + public IEnumerable WritableRegions { get; } + } + public class AccountRegion + { + public AccountRegion(); + public string Endpoint { get; } + public string Name { get; } + } + public sealed class BoundingBoxProperties + { + public BoundingBoxProperties(); + public double Xmax { get; set; } + public double Xmin { get; set; } + public double Ymax { get; set; } + public double Ymin { get; set; } + } + public abstract class ChangeFeedEstimator + { + protected ChangeFeedEstimator(); + public abstract FeedIterator GetCurrentStateIterator(ChangeFeedEstimatorRequestOptions changeFeedEstimatorRequestOptions=null); + } + public sealed class ChangeFeedEstimatorRequestOptions + { + public ChangeFeedEstimatorRequestOptions(); + public Nullable MaxItemCount { get; set; } + } + public abstract class ChangeFeedMode + { + public static ChangeFeedMode Incremental { get; } + public static ChangeFeedMode LatestVersion { get; } + } + public abstract class ChangeFeedProcessor + { + protected ChangeFeedProcessor(); + public abstract Task StartAsync(); + public abstract Task StopAsync(); + } + public class ChangeFeedProcessorBuilder + { + public ChangeFeedProcessor Build(); + public ChangeFeedProcessorBuilder WithErrorNotification(Container.ChangeFeedMonitorErrorDelegate errorDelegate); + public ChangeFeedProcessorBuilder WithInstanceName(string instanceName); + public ChangeFeedProcessorBuilder WithLeaseAcquireNotification(Container.ChangeFeedMonitorLeaseAcquireDelegate acquireDelegate); + public ChangeFeedProcessorBuilder WithLeaseConfiguration(Nullable acquireInterval=default(Nullable), Nullable expirationInterval=default(Nullable), Nullable renewInterval=default(Nullable)); + public ChangeFeedProcessorBuilder WithLeaseContainer(Container leaseContainer); + public ChangeFeedProcessorBuilder WithLeaseReleaseNotification(Container.ChangeFeedMonitorLeaseReleaseDelegate releaseDelegate); + public ChangeFeedProcessorBuilder WithMaxItems(int maxItemCount); + public ChangeFeedProcessorBuilder WithPollInterval(TimeSpan pollInterval); + public ChangeFeedProcessorBuilder WithStartTime(DateTime startTime); + } + public abstract class ChangeFeedProcessorContext + { + protected ChangeFeedProcessorContext(); + public abstract CosmosDiagnostics Diagnostics { get; } + public abstract Headers Headers { get; } + public abstract string LeaseToken { get; } + } + public sealed class ChangeFeedProcessorState + { + public ChangeFeedProcessorState(string leaseToken, long estimatedLag, string instanceName); + public long EstimatedLag { get; } + public string InstanceName { get; } + public string LeaseToken { get; } + } + public class ChangeFeedProcessorUserException : Exception + { + public ChangeFeedProcessorUserException(Exception originalException, ChangeFeedProcessorContext context); + protected ChangeFeedProcessorUserException(SerializationInfo info, StreamingContext context); + public ChangeFeedProcessorContext ChangeFeedProcessorContext { get; } + public override void GetObjectData(SerializationInfo info, StreamingContext context); + } + public sealed class ChangeFeedRequestOptions : RequestOptions + { + public ChangeFeedRequestOptions(); + public new string IfMatchEtag { get; set; } + public new string IfNoneMatchEtag { get; set; } + public Nullable PageSizeHint { get; set; } + } + public abstract class ChangeFeedStartFrom + { + public static ChangeFeedStartFrom Beginning(); + public static ChangeFeedStartFrom Beginning(FeedRange feedRange); + public static ChangeFeedStartFrom ContinuationToken(string continuationToken); + public static ChangeFeedStartFrom Now(); + public static ChangeFeedStartFrom Now(FeedRange feedRange); + public static ChangeFeedStartFrom Time(DateTime dateTimeUtc); + public static ChangeFeedStartFrom Time(DateTime dateTimeUtc, FeedRange feedRange); + } + public sealed class ClientEncryptionIncludedPath + { + public ClientEncryptionIncludedPath(); + public string ClientEncryptionKeyId { get; set; } + public string EncryptionAlgorithm { get; set; } + public string EncryptionType { get; set; } + public string Path { get; set; } + } + public abstract class ClientEncryptionKey + { + protected ClientEncryptionKey(); + public abstract string Id { get; } + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(ClientEncryptionKeyProperties clientEncryptionKeyProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class ClientEncryptionKeyProperties : IEquatable + { + protected ClientEncryptionKeyProperties(); + public ClientEncryptionKeyProperties(string id, string encryptionAlgorithm, byte[] wrappedDataEncryptionKey, EncryptionKeyWrapMetadata encryptionKeyWrapMetadata); + public Nullable CreatedTime { get; } + public string EncryptionAlgorithm { get; } + public EncryptionKeyWrapMetadata EncryptionKeyWrapMetadata { get; } + public string ETag { get; } + public string Id { get; } + public Nullable LastModified { get; } + public virtual string SelfLink { get; } + public byte[] WrappedDataEncryptionKey { get; } + public bool Equals(ClientEncryptionKeyProperties other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public class ClientEncryptionKeyResponse : Response + { + protected ClientEncryptionKeyResponse(); + public override string ActivityId { get; } + public virtual ClientEncryptionKey ClientEncryptionKey { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override ClientEncryptionKeyProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator ClientEncryptionKey (ClientEncryptionKeyResponse response); + } + public sealed class ClientEncryptionPolicy + { + public ClientEncryptionPolicy(IEnumerable includedPaths); + public ClientEncryptionPolicy(IEnumerable includedPaths, int policyFormatVersion); + public IEnumerable IncludedPaths { get; } + public int PolicyFormatVersion { get; } + } + public sealed class CompositePath + { + public CompositePath(); + public CompositePathSortOrder Order { get; set; } + public string Path { get; set; } + } + public enum CompositePathSortOrder + { + Ascending = 0, + Descending = 1, + } + public class ConflictProperties + { + public ConflictProperties(); + public string Id { get; } + public OperationKind OperationKind { get; } + public string SelfLink { get; } + } + public enum ConflictResolutionMode + { + Custom = 1, + LastWriterWins = 0, + } + public class ConflictResolutionPolicy + { + public ConflictResolutionPolicy(); + public ConflictResolutionMode Mode { get; set; } + public string ResolutionPath { get; set; } + public string ResolutionProcedure { get; set; } + } + public abstract class Conflicts + { + protected Conflicts(); + public abstract Task DeleteAsync(ConflictProperties conflict, PartitionKey partitionKey, CancellationToken cancellationToken=default(CancellationToken)); + public abstract FeedIterator GetConflictQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetConflictQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract T ReadConflictContent(ConflictProperties conflict); + public abstract Task> ReadCurrentAsync(ConflictProperties conflict, PartitionKey partitionKey, CancellationToken cancellationToken=default(CancellationToken)); + } + public enum ConnectionMode + { + Direct = 1, + Gateway = 0, + } + public enum ConsistencyLevel + { + BoundedStaleness = 1, + ConsistentPrefix = 4, + Eventual = 3, + Session = 2, + Strong = 0, + } + public abstract class Container + { + protected Container(); + public abstract Conflicts Conflicts { get; } + public abstract Database Database { get; } + public abstract string Id { get; } + public abstract Scripts Scripts { get; } + public abstract Task> CreateItemAsync(T item, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateItemStreamAsync(Stream streamPayload, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract TransactionalBatch CreateTransactionalBatch(PartitionKey partitionKey); + public abstract Task DeleteContainerAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteContainerStreamAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> DeleteItemAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteItemStreamAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ChangeFeedEstimator GetChangeFeedEstimator(string processorName, Container leaseContainer); + public abstract ChangeFeedProcessorBuilder GetChangeFeedEstimatorBuilder(string processorName, Container.ChangesEstimationHandler estimationDelegate, Nullable estimationPeriod=default(Nullable)); + public abstract FeedIterator GetChangeFeedIterator(ChangeFeedStartFrom changeFeedStartFrom, ChangeFeedMode changeFeedMode, ChangeFeedRequestOptions changeFeedRequestOptions=null); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangeFeedStreamHandler onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilderWithManualCheckpoint(string processorName, Container.ChangeFeedStreamHandlerWithManualCheckpoint onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilderWithManualCheckpoint(string processorName, Container.ChangeFeedHandlerWithManualCheckpoint onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangeFeedHandler onChangesDelegate); + public abstract ChangeFeedProcessorBuilder GetChangeFeedProcessorBuilder(string processorName, Container.ChangesHandler onChangesDelegate); + public abstract FeedIterator GetChangeFeedStreamIterator(ChangeFeedStartFrom changeFeedStartFrom, ChangeFeedMode changeFeedMode, ChangeFeedRequestOptions changeFeedRequestOptions=null); + public abstract Task> GetFeedRangesAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract IOrderedQueryable GetItemLinqQueryable(bool allowSynchronousQueryExecution=false, string continuationToken=null, QueryRequestOptions requestOptions=null, CosmosLinqSerializerOptions linqSerializerOptions=null); + public abstract FeedIterator GetItemQueryIterator(FeedRange feedRange, QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(FeedRange feedRange, QueryDefinition queryDefinition, string continuationToken, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetItemQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task> PatchItemAsync(string id, PartitionKey partitionKey, IReadOnlyList patchOperations, PatchItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task PatchItemStreamAsync(string id, PartitionKey partitionKey, IReadOnlyList patchOperations, PatchItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadContainerAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadContainerStreamAsync(ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadItemAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadItemStreamAsync(string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadManyItemsAsync(IReadOnlyList> items, ReadManyRequestOptions readManyRequestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadManyItemsStreamAsync(IReadOnlyList> items, ReadManyRequestOptions readManyRequestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadThroughputAsync(RequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadThroughputAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceContainerAsync(ContainerProperties containerProperties, ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceContainerStreamAsync(ContainerProperties containerProperties, ContainerRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReplaceItemAsync(T item, string id, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceItemStreamAsync(Stream streamPayload, string id, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(int throughput, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> UpsertItemAsync(T item, Nullable partitionKey=default(Nullable), ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertItemStreamAsync(Stream streamPayload, PartitionKey partitionKey, ItemRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public delegate Task ChangeFeedHandlerWithManualCheckpoint(ChangeFeedProcessorContext context, IReadOnlyCollection changes, Func checkpointAsync, CancellationToken cancellationToken); + public delegate Task ChangeFeedHandler(ChangeFeedProcessorContext context, IReadOnlyCollection changes, CancellationToken cancellationToken); + public delegate Task ChangeFeedMonitorErrorDelegate(string leaseToken, Exception exception); + public delegate Task ChangeFeedMonitorLeaseAcquireDelegate(string leaseToken); + public delegate Task ChangeFeedMonitorLeaseReleaseDelegate(string leaseToken); + public delegate Task ChangeFeedStreamHandler(ChangeFeedProcessorContext context, Stream changes, CancellationToken cancellationToken); + public delegate Task ChangeFeedStreamHandlerWithManualCheckpoint(ChangeFeedProcessorContext context, Stream changes, Func checkpointAsync, CancellationToken cancellationToken); + public delegate Task ChangesEstimationHandler(long estimatedPendingChanges, CancellationToken cancellationToken); + public delegate Task ChangesHandler(IReadOnlyCollection changes, CancellationToken cancellationToken); + } + public class ContainerProperties + { + public ContainerProperties(); + public ContainerProperties(string id, IReadOnlyList partitionKeyPaths); + public ContainerProperties(string id, string partitionKeyPath); + public Nullable AnalyticalStoreTimeToLiveInSeconds { get; set; } + public ClientEncryptionPolicy ClientEncryptionPolicy { get; set; } + public ConflictResolutionPolicy ConflictResolutionPolicy { get; set; } + public Nullable DefaultTimeToLive { get; set; } + public string ETag { get; } + public GeospatialConfig GeospatialConfig { get; set; } + public string Id { get; set; } + public IndexingPolicy IndexingPolicy { get; set; } + public Nullable LastModified { get; } + public Nullable PartitionKeyDefinitionVersion { get; set; } + public string PartitionKeyPath { get; set; } + public IReadOnlyList PartitionKeyPaths { get; set; } + public string SelfLink { get; } + public string TimeToLivePropertyPath { get; set; } + public UniqueKeyPolicy UniqueKeyPolicy { get; set; } + } + public class ContainerRequestOptions : RequestOptions + { + public ContainerRequestOptions(); + public bool PopulateQuotaInfo { get; set; } + } + public class ContainerResponse : Response + { + protected ContainerResponse(); + public override string ActivityId { get; } + public virtual Container Container { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override ContainerProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Container (ContainerResponse response); + } + public class CosmosClient : IDisposable + { + protected CosmosClient(); + public CosmosClient(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, CosmosClientOptions clientOptions=null); + public CosmosClient(string accountEndpoint, TokenCredential tokenCredential, CosmosClientOptions clientOptions=null); + public CosmosClient(string connectionString, CosmosClientOptions clientOptions=null); + public CosmosClient(string accountEndpoint, string authKeyOrResourceToken, CosmosClientOptions clientOptions=null); + public virtual CosmosClientOptions ClientOptions { get; } + public virtual Uri Endpoint { get; } + public virtual CosmosResponseFactory ResponseFactory { get; } + public static Task CreateAndInitializeAsync(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string accountEndpoint, TokenCredential tokenCredential, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string connectionString, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public static Task CreateAndInitializeAsync(string accountEndpoint, string authKeyOrResourceToken, IReadOnlyList> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseAsync(string id, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseAsync(string id, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseIfNotExistsAsync(string id, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseIfNotExistsAsync(string id, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual Task CreateDatabaseStreamAsync(DatabaseProperties databaseProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual Container GetContainer(string databaseId, string containerId); + public virtual Database GetDatabase(string id); + public virtual FeedIterator GetDatabaseQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual FeedIterator GetDatabaseQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public virtual Task ReadAccountAsync(); + } + public class CosmosClientOptions + { + public CosmosClientOptions(); + public bool AllowBulkExecution { get; set; } + public string ApplicationName { get; set; } + public IReadOnlyList ApplicationPreferredRegions { get; set; } + public string ApplicationRegion { get; set; } + public ConnectionMode ConnectionMode { get; set; } + public Nullable ConsistencyLevel { get; set; } + public Collection CustomHandlers { get; } + public Nullable EnableContentResponseOnWrite { get; set; } + public bool EnableTcpConnectionEndpointRediscovery { get; set; } + public int GatewayModeMaxConnectionLimit { get; set; } + public Func HttpClientFactory { get; set; } + public Nullable IdleTcpConnectionTimeout { get; set; } + public bool LimitToEndpoint { get; set; } + public Nullable MaxRequestsPerTcpConnection { get; set; } + public Nullable MaxRetryAttemptsOnRateLimitedRequests { get; set; } + public Nullable MaxRetryWaitTimeOnRateLimitedRequests { get; set; } + public Nullable MaxTcpConnectionsPerEndpoint { get; set; } + public Nullable OpenTcpConnectionTimeout { get; set; } + public Nullable PortReuseMode { get; set; } + public TimeSpan RequestTimeout { get; set; } + public CosmosSerializer Serializer { get; set; } + public CosmosSerializationOptions SerializerOptions { get; set; } + public Func ServerCertificateCustomValidationCallback { get; set; } + public Nullable TokenCredentialBackgroundRefreshInterval { get; set; } + public IWebProxy WebProxy { get; set; } + } + public abstract class CosmosDiagnostics + { + protected CosmosDiagnostics(); + public virtual TimeSpan GetClientElapsedTime(); + public abstract IReadOnlyList> GetContactedRegions(); + public virtual int GetFailedRequestCount(); + public virtual Nullable GetStartTimeUtc(); + public abstract override string ToString(); + } + public class CosmosException : Exception + { + public CosmosException(string message, HttpStatusCode statusCode, int subStatusCode, string activityId, double requestCharge); + public virtual string ActivityId { get; } + public virtual CosmosDiagnostics Diagnostics { get; } + public virtual Headers Headers { get; } + public override string Message { get; } + public virtual double RequestCharge { get; } + public virtual string ResponseBody { get; } + public virtual Nullable RetryAfter { get; } + public override string StackTrace { get; } + public virtual HttpStatusCode StatusCode { get; } + public virtual int SubStatusCode { get; } + public override string ToString(); + public virtual bool TryGetHeader(string headerName, out string value); + } + public sealed class CosmosLinqSerializerOptions + { + public CosmosLinqSerializerOptions(); + public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } + } + public class CosmosOperationCanceledException : OperationCanceledException + { + public CosmosOperationCanceledException(OperationCanceledException originalException, CosmosDiagnostics diagnostics); + protected CosmosOperationCanceledException(SerializationInfo info, StreamingContext context); + public override IDictionary Data { get; } + public CosmosDiagnostics Diagnostics { get; } + public override string HelpLink { get; set; } + public override string Message { get; } + public override string Source { get; set; } + public override string StackTrace { get; } + public override Exception GetBaseException(); + public override void GetObjectData(SerializationInfo info, StreamingContext context); + public override string ToString(); + } + public enum CosmosPropertyNamingPolicy + { + CamelCase = 1, + Default = 0, + } + public abstract class CosmosResponseFactory + { + protected CosmosResponseFactory(); + public abstract FeedResponse CreateItemFeedResponse(ResponseMessage responseMessage); + public abstract ItemResponse CreateItemResponse(ResponseMessage responseMessage); + public abstract StoredProcedureExecuteResponse CreateStoredProcedureExecuteResponse(ResponseMessage responseMessage); + } + public sealed class CosmosSerializationOptions + { + public CosmosSerializationOptions(); + public bool IgnoreNullValues { get; set; } + public bool Indented { get; set; } + public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } + } + public abstract class CosmosSerializer + { + protected CosmosSerializer(); + public abstract T FromStream(Stream stream); + public abstract Stream ToStream(T input); + } + public abstract class Database + { + protected Database(); + public abstract CosmosClient Client { get; } + public abstract string Id { get; } + public abstract Task CreateClientEncryptionKeyAsync(ClientEncryptionKeyProperties clientEncryptionKeyProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerAsync(string id, string partitionKeyPath, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerIfNotExistsAsync(string id, string partitionKeyPath, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerStreamAsync(ContainerProperties containerProperties, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateContainerStreamAsync(ContainerProperties containerProperties, Nullable throughput=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateUserAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ContainerBuilder DefineContainer(string name, string partitionKeyPath); + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteStreamAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract ClientEncryptionKey GetClientEncryptionKey(string id); + public abstract FeedIterator GetClientEncryptionKeyQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Container GetContainer(string id); + public abstract FeedIterator GetContainerQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetContainerQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract User GetUser(string id); + public abstract FeedIterator GetUserQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadStreamAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadThroughputAsync(RequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ReadThroughputAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceThroughputAsync(int throughput, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertUserAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class DatabaseProperties + { + public DatabaseProperties(); + public DatabaseProperties(string id); + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class DatabaseResponse : Response + { + protected DatabaseResponse(); + public override string ActivityId { get; } + public virtual Database Database { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override DatabaseProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Database (DatabaseResponse response); + } + public enum DataType + { + LineString = 3, + MultiPolygon = 5, + Number = 0, + Point = 2, + Polygon = 4, + String = 1, + } + public class DedicatedGatewayRequestOptions + { + public DedicatedGatewayRequestOptions(); + public Nullable MaxIntegratedCacheStaleness { get; set; } + } + public class EncryptionKeyWrapMetadata : IEquatable + { + public EncryptionKeyWrapMetadata(EncryptionKeyWrapMetadata source); + public EncryptionKeyWrapMetadata(string type, string name, string value, string algorithm); + public string Algorithm { get; } + public string Name { get; } + public string Type { get; } + public string Value { get; } + public bool Equals(EncryptionKeyWrapMetadata other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class ExcludedPath + { + public ExcludedPath(); + public string Path { get; set; } + } + public abstract class FeedIterator : IDisposable + { + protected FeedIterator(); + public abstract bool HasMoreResults { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public abstract Task ReadNextAsync(CancellationToken cancellationToken=default(CancellationToken)); + } + public abstract class FeedIterator : IDisposable + { + protected FeedIterator(); + public abstract bool HasMoreResults { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public abstract Task> ReadNextAsync(CancellationToken cancellationToken=default(CancellationToken)); + } + public abstract class FeedRange + { + protected FeedRange(); + public static FeedRange FromJsonString(string toStringValue); + public static FeedRange FromPartitionKey(PartitionKey partitionKey); + public abstract string ToJsonString(); + } + public abstract class FeedResponse : IEnumerable, IEnumerable + { + protected FeedResponse(); + public override string ActivityId { get; } + public abstract string ContinuationToken { get; } + public abstract int Count { get; } + public override string ETag { get; } + public abstract string IndexMetrics { get; } + public override double RequestCharge { get; } + public abstract IEnumerator GetEnumerator(); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + } + public sealed class GeospatialConfig + { + public GeospatialConfig(); + public GeospatialConfig(GeospatialType geospatialType); + public GeospatialType GeospatialType { get; set; } + } + public enum GeospatialType + { + Geography = 0, + Geometry = 1, + } + public class Headers : IEnumerable + { + public Headers(); + public virtual string ActivityId { get; } + public virtual string ContentLength { get; set; } + public virtual string ContentType { get; } + public virtual string ContinuationToken { get; } + public virtual string ETag { get; } + public virtual string this[string headerName] { get; set; } + public virtual string Location { get; } + public virtual double RequestCharge { get; } + public virtual string Session { get; } + public virtual void Add(string headerName, IEnumerable values); + public virtual void Add(string headerName, string value); + public virtual string[] AllKeys(); + public virtual string Get(string headerName); + public virtual IEnumerator GetEnumerator(); + public virtual T GetHeaderValue(string headerName); + public virtual string GetValueOrDefault(string headerName); + public virtual void Remove(string headerName); + public virtual void Set(string headerName, string value); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + public virtual bool TryGetValue(string headerName, out string value); + } + public sealed class IncludedPath + { + public IncludedPath(); + public string Path { get; set; } + } + public enum IndexingDirective + { + Default = 0, + Exclude = 2, + Include = 1, + } + public enum IndexingMode + { + Consistent = 0, + Lazy = 1, + None = 2, + } + public sealed class IndexingPolicy + { + public IndexingPolicy(); + public bool Automatic { get; set; } + public Collection> CompositeIndexes { get; } + public Collection ExcludedPaths { get; } + public Collection IncludedPaths { get; } + public IndexingMode IndexingMode { get; set; } + public Collection SpatialIndexes { get; } + } + public enum IndexKind + { + Hash = 0, + Range = 1, + Spatial = 2, + } + public class ItemRequestOptions : RequestOptions + { + public ItemRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions { get; set; } + public Nullable EnableContentResponseOnWrite { get; set; } + public Nullable IndexingDirective { get; set; } + public IEnumerable PostTriggers { get; set; } + public IEnumerable PreTriggers { get; set; } + public string SessionToken { get; set; } + } + public class ItemResponse : Response + { + protected ItemResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override T Resource { get; } + public override HttpStatusCode StatusCode { get; } + } + public enum OperationKind + { + Create = 1, + Delete = 3, + Invalid = 0, + Read = 4, + Replace = 2, + } + public struct PartitionKey : IEquatable + { + public static readonly PartitionKey None; + public static readonly PartitionKey Null; + public static readonly string SystemKeyName; + public static readonly string SystemKeyPath; + public PartitionKey(bool partitionKeyValue); + public PartitionKey(double partitionKeyValue); + public PartitionKey(string partitionKeyValue); + public bool Equals(PartitionKey other); + public override bool Equals(object obj); + public override int GetHashCode(); + public static bool operator ==(PartitionKey left, PartitionKey right); + public static bool operator !=(PartitionKey left, PartitionKey right); + public override string ToString(); + } + public sealed class PartitionKeyBuilder + { + public PartitionKeyBuilder(); + public PartitionKeyBuilder Add(bool val); + public PartitionKeyBuilder Add(double val); + public PartitionKeyBuilder Add(string val); + public PartitionKeyBuilder AddNoneType(); + public PartitionKeyBuilder AddNullValue(); + public PartitionKey Build(); + } + public enum PartitionKeyDefinitionVersion + { + V1 = 1, + V2 = 2, + } + public sealed class PatchItemRequestOptions : ItemRequestOptions + { + public PatchItemRequestOptions(); + public string FilterPredicate { get; set; } + } + public abstract class PatchOperation + { + protected PatchOperation(); + public virtual string From { get; set; } + public abstract PatchOperationType OperationType { get; } + public abstract string Path { get; } + public static PatchOperation Add(string path, T value); + public static PatchOperation Increment(string path, double value); + public static PatchOperation Increment(string path, long value); + public static PatchOperation Move(string from, string path); + public static PatchOperation Remove(string path); + public static PatchOperation Replace(string path, T value); + public static PatchOperation Set(string path, T value); + public virtual bool TrySerializeValueParameter(CosmosSerializer cosmosSerializer, out Stream valueParam); + } + public enum PatchOperationType + { + Add = 0, + Increment = 4, + Move = 5, + Remove = 1, + Replace = 2, + Set = 3, + } + public abstract class PatchOperation : PatchOperation + { + protected PatchOperation(); + public abstract T Value { get; } + } + public abstract class Permission + { + protected Permission(); + public abstract string Id { get; } + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadAsync(Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public enum PermissionMode : byte + { + All = (byte)2, + Read = (byte)1, + } + public class PermissionProperties + { + public PermissionProperties(string id, PermissionMode permissionMode, Container container, PartitionKey resourcePartitionKey, string itemId); + public PermissionProperties(string id, PermissionMode permissionMode, Container container, Nullable resourcePartitionKey=default(Nullable)); + public string ETag { get; } + public string Id { get; } + public Nullable LastModified { get; } + public PermissionMode PermissionMode { get; } + public Nullable ResourcePartitionKey { get; set; } + public string ResourceUri { get; } + public string SelfLink { get; } + public string Token { get; } + } + public class PermissionResponse : Response + { + protected PermissionResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public virtual Permission Permission { get; } + public override double RequestCharge { get; } + public override PermissionProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator Permission (PermissionResponse response); + } + public enum PortReuseMode + { + PrivatePortPool = 1, + ReuseUnicastPort = 0, + } + public class QueryDefinition + { + public QueryDefinition(string query); + public string QueryText { get; } + public IReadOnlyList> GetQueryParameters(); + public QueryDefinition WithParameter(string name, object value); + public QueryDefinition WithParameterStream(string name, Stream valueStream); + } + public class QueryRequestOptions : RequestOptions + { + public QueryRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public DedicatedGatewayRequestOptions DedicatedGatewayRequestOptions { get; set; } + public Nullable EnableLowPrecisionOrderBy { get; set; } + public Nullable EnableScanInQuery { get; set; } + public Nullable MaxBufferedItemCount { get; set; } + public Nullable MaxConcurrency { get; set; } + public Nullable MaxItemCount { get; set; } + public Nullable PartitionKey { get; set; } + public Nullable PopulateIndexMetrics { get; set; } + public Nullable ResponseContinuationTokenLimitInKb { get; set; } + public string SessionToken { get; set; } + } + public class ReadManyRequestOptions : RequestOptions + { + public ReadManyRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public string SessionToken { get; set; } + } + public static class Regions + { + public const string AustraliaCentral = "Australia Central"; + public const string AustraliaCentral2 = "Australia Central 2"; + public const string AustraliaEast = "Australia East"; + public const string AustraliaSoutheast = "Australia Southeast"; + public const string BrazilSouth = "Brazil South"; + public const string BrazilSoutheast = "Brazil Southeast"; + public const string CanadaCentral = "Canada Central"; + public const string CanadaEast = "Canada East"; + public const string CentralIndia = "Central India"; + public const string CentralUS = "Central US"; + public const string CentralUSEUAP = "Central US EUAP"; + public const string ChinaEast = "China East"; + public const string ChinaEast2 = "China East 2"; + public const string ChinaEast3 = "China East 3"; + public const string ChinaNorth = "China North"; + public const string ChinaNorth2 = "China North 2"; + public const string ChinaNorth3 = "China North 3"; + public const string EastAsia = "East Asia"; + public const string EastUS = "East US"; + public const string EastUS2 = "East US 2"; + public const string EastUS2EUAP = "East US 2 EUAP"; + public const string EastUSSLV = "East US SLV"; + public const string FranceCentral = "France Central"; + public const string FranceSouth = "France South"; + public const string GermanyCentral = "Germany Central"; + public const string GermanyNorth = "Germany North"; + public const string GermanyNortheast = "Germany Northeast"; + public const string GermanyWestCentral = "Germany West Central"; + public const string IsraelCentral = "Israel Central"; + public const string ItalyNorth = "Italy North"; + public const string JapanEast = "Japan East"; + public const string JapanWest = "Japan West"; + public const string JioIndiaCentral = "Jio India Central"; + public const string JioIndiaWest = "Jio India West"; + public const string KoreaCentral = "Korea Central"; + public const string KoreaSouth = "Korea South"; + public const string MalaysiaSouth = "Malaysia South"; + public const string NorthCentralUS = "North Central US"; + public const string NorthEurope = "North Europe"; + public const string NorwayEast = "Norway East"; + public const string NorwayWest = "Norway West"; + public const string PolandCentral = "Poland Central"; + public const string QatarCentral = "Qatar Central"; + public const string SouthAfricaNorth = "South Africa North"; + public const string SouthAfricaWest = "South Africa West"; + public const string SouthCentralUS = "South Central US"; + public const string SoutheastAsia = "Southeast Asia"; + public const string SouthIndia = "South India"; + public const string SwedenCentral = "Sweden Central"; + public const string SwedenSouth = "Sweden South"; + public const string SwitzerlandNorth = "Switzerland North"; + public const string SwitzerlandWest = "Switzerland West"; + public const string UAECentral = "UAE Central"; + public const string UAENorth = "UAE North"; + public const string UKSouth = "UK South"; + public const string UKWest = "UK West"; + public const string USDoDCentral = "USDoD Central"; + public const string USDoDEast = "USDoD East"; + public const string USGovArizona = "USGov Arizona"; + public const string USGovTexas = "USGov Texas"; + public const string USGovVirginia = "USGov Virginia"; + public const string USNatEast = "USNat East"; + public const string USNatWest = "USNat West"; + public const string USSecEast = "USSec East"; + public const string USSecWest = "USSec West"; + public const string WestCentralUS = "West Central US"; + public const string WestEurope = "West Europe"; + public const string WestIndia = "West India"; + public const string WestUS = "West US"; + public const string WestUS2 = "West US 2"; + public const string WestUS3 = "West US 3"; + } + public abstract class RequestHandler + { + protected RequestHandler(); + public RequestHandler InnerHandler { get; set; } + public virtual Task SendAsync(RequestMessage request, CancellationToken cancellationToken); + } + public class RequestMessage : IDisposable + { + public RequestMessage(); + public RequestMessage(HttpMethod method, Uri requestUri); + public virtual Stream Content { get; set; } + public virtual Headers Headers { get; } + public virtual HttpMethod Method { get; } + public virtual Dictionary Properties { get; } + public virtual Uri RequestUri { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + } + public class RequestOptions + { + public RequestOptions(); + public Action AddRequestHeaders { get; set; } + public string IfMatchEtag { get; set; } + public string IfNoneMatchEtag { get; set; } + public IReadOnlyDictionary Properties { get; set; } + public RequestOptions ShallowCopy(); + } + public class ResponseMessage : IDisposable + { + public ResponseMessage(); + public ResponseMessage(HttpStatusCode statusCode, RequestMessage requestMessage=null, string errorMessage=null); + public virtual Stream Content { get; set; } + public virtual string ContinuationToken { get; } + public virtual CosmosDiagnostics Diagnostics { get; set; } + public virtual string ErrorMessage { get; } + public virtual Headers Headers { get; } + public string IndexMetrics { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual RequestMessage RequestMessage { get; } + public virtual HttpStatusCode StatusCode { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual ResponseMessage EnsureSuccessStatusCode(); + } + public abstract class Response + { + protected Response(); + public abstract string ActivityId { get; } + public abstract CosmosDiagnostics Diagnostics { get; } + public abstract string ETag { get; } + public abstract Headers Headers { get; } + public abstract double RequestCharge { get; } + public abstract T Resource { get; } + public abstract HttpStatusCode StatusCode { get; } + public static implicit operator T (Response response); + } + public sealed class SpatialPath + { + public SpatialPath(); + public BoundingBoxProperties BoundingBox { get; set; } + public string Path { get; set; } + public Collection SpatialTypes { get; } + } + public enum SpatialType + { + LineString = 1, + MultiPolygon = 3, + Point = 0, + Polygon = 2, + } + public class ThroughputProperties + { + public Nullable AutoscaleMaxThroughput { get; } + public string ETag { get; } + public Nullable LastModified { get; } + public string SelfLink { get; } + public Nullable Throughput { get; } + public static ThroughputProperties CreateAutoscaleThroughput(int autoscaleMaxThroughput); + public static ThroughputProperties CreateManualThroughput(int throughput); + } + public class ThroughputResponse : Response + { + protected ThroughputResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public Nullable IsReplacePending { get; } + public Nullable MinThroughput { get; } + public override double RequestCharge { get; } + public override ThroughputProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator ThroughputProperties (ThroughputResponse response); + } + public abstract class TransactionalBatch + { + protected TransactionalBatch(); + public abstract TransactionalBatch CreateItemStream(Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch CreateItem(T item, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch DeleteItem(string id, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract Task ExecuteAsync(TransactionalBatchRequestOptions requestOptions, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteAsync(CancellationToken cancellationToken=default(CancellationToken)); + public abstract TransactionalBatch PatchItem(string id, IReadOnlyList patchOperations, TransactionalBatchPatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReadItem(string id, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReplaceItemStream(string id, Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch ReplaceItem(string id, T item, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch UpsertItemStream(Stream streamPayload, TransactionalBatchItemRequestOptions requestOptions=null); + public abstract TransactionalBatch UpsertItem(T item, TransactionalBatchItemRequestOptions requestOptions=null); + } + public class TransactionalBatchItemRequestOptions : RequestOptions + { + public TransactionalBatchItemRequestOptions(); + public Nullable EnableContentResponseOnWrite { get; set; } + public Nullable IndexingDirective { get; set; } + } + public class TransactionalBatchOperationResult + { + protected TransactionalBatchOperationResult(); + public virtual string ETag { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual Stream ResourceStream { get; } + public virtual TimeSpan RetryAfter { get; } + public virtual HttpStatusCode StatusCode { get; } + } + public class TransactionalBatchOperationResult : TransactionalBatchOperationResult + { + protected TransactionalBatchOperationResult(); + public virtual T Resource { get; set; } + } + public class TransactionalBatchPatchItemRequestOptions : TransactionalBatchItemRequestOptions + { + public TransactionalBatchPatchItemRequestOptions(); + public string FilterPredicate { get; set; } + } + public class TransactionalBatchRequestOptions : RequestOptions + { + public TransactionalBatchRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public string SessionToken { get; set; } + } + public class TransactionalBatchResponse : IDisposable, IEnumerable, IEnumerable, IReadOnlyCollection, IReadOnlyList + { + protected TransactionalBatchResponse(); + public virtual string ActivityId { get; } + public virtual int Count { get; } + public virtual CosmosDiagnostics Diagnostics { get; } + public virtual string ErrorMessage { get; } + public virtual Headers Headers { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual TransactionalBatchOperationResult this[int index] { get; } + public virtual double RequestCharge { get; } + public virtual Nullable RetryAfter { get; } + public virtual HttpStatusCode StatusCode { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual IEnumerator GetEnumerator(); + public virtual TransactionalBatchOperationResult GetOperationResultAtIndex(int index); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + } + public class UniqueKey + { + public UniqueKey(); + public Collection Paths { get; } + } + public sealed class UniqueKeyPolicy + { + public UniqueKeyPolicy(); + public Collection UniqueKeys { get; } + } + public abstract class User + { + protected User(); + public abstract string Id { get; } + public abstract Task CreatePermissionAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Permission GetPermission(string id); + public abstract FeedIterator GetPermissionQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetPermissionQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadAsync(RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceAsync(UserProperties userProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task UpsertPermissionAsync(PermissionProperties permissionProperties, Nullable tokenExpiryInSeconds=default(Nullable), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class UserProperties + { + protected UserProperties(); + public UserProperties(string id); + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class UserResponse : Response + { + protected UserResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override UserProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public virtual User User { get; } + public static implicit operator User (UserResponse response); + } +} +namespace Microsoft.Azure.Cosmos.Fluent +{ + public sealed class ClientEncryptionPolicyDefinition + { + public ContainerBuilder Attach(); + public ClientEncryptionPolicyDefinition WithIncludedPath(ClientEncryptionIncludedPath path); + } + public class CompositeIndexDefinition + { + public T Attach(); + public CompositeIndexDefinition Path(string path); + public CompositeIndexDefinition Path(string path, CompositePathSortOrder sortOrder); + } + public class ConflictResolutionDefinition + { + public ContainerBuilder Attach(); + public ConflictResolutionDefinition WithCustomStoredProcedureResolution(string conflictResolutionProcedure); + public ConflictResolutionDefinition WithLastWriterWinsResolution(string conflictResolutionPath); + } + public class ContainerBuilder : ContainerDefinition + { + protected ContainerBuilder(); + public ContainerBuilder(Database database, string name, string partitionKeyPath); + public new ContainerProperties Build(); + public Task CreateAsync(ThroughputProperties throughputProperties, CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateAsync(Nullable throughput=default(Nullable), CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateIfNotExistsAsync(ThroughputProperties throughputProperties, CancellationToken cancellationToken=default(CancellationToken)); + public Task CreateIfNotExistsAsync(Nullable throughput=default(Nullable), CancellationToken cancellationToken=default(CancellationToken)); + public ClientEncryptionPolicyDefinition WithClientEncryptionPolicy(); + public ClientEncryptionPolicyDefinition WithClientEncryptionPolicy(int policyFormatVersion); + public ConflictResolutionDefinition WithConflictResolution(); + public UniqueKeyDefinition WithUniqueKey(); + } + public abstract class ContainerDefinition where T : ContainerDefinition + { + public ContainerDefinition(); + public ContainerProperties Build(); + public T WithDefaultTimeToLive(int defaultTtlInSeconds); + public T WithDefaultTimeToLive(TimeSpan defaultTtlTimeSpan); + public IndexingPolicyDefinition WithIndexingPolicy(); + public T WithPartitionKeyDefinitionVersion(PartitionKeyDefinitionVersion partitionKeyDefinitionVersion); + public T WithTimeToLivePropertyPath(string propertyPath); + } + public class CosmosClientBuilder + { + public CosmosClientBuilder(string connectionString); + public CosmosClientBuilder(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential); + public CosmosClientBuilder(string accountEndpoint, TokenCredential tokenCredential); + public CosmosClientBuilder(string accountEndpoint, string authKeyOrResourceToken); + public CosmosClientBuilder AddCustomHandlers(params RequestHandler[] customHandlers); + public CosmosClient Build(); + public Task BuildAndInitializeAsync(IReadOnlyList> containers, CancellationToken cancellationToken=default(CancellationToken)); + public CosmosClientBuilder WithApplicationName(string applicationName); + public CosmosClientBuilder WithApplicationPreferredRegions(IReadOnlyList applicationPreferredRegions); + public CosmosClientBuilder WithApplicationRegion(string applicationRegion); + public CosmosClientBuilder WithBulkExecution(bool enabled); + public CosmosClientBuilder WithConnectionModeDirect(); + public CosmosClientBuilder WithConnectionModeDirect(Nullable idleTcpConnectionTimeout=default(Nullable), Nullable openTcpConnectionTimeout=default(Nullable), Nullable maxRequestsPerTcpConnection=default(Nullable), Nullable maxTcpConnectionsPerEndpoint=default(Nullable), Nullable portReuseMode=default(Nullable), Nullable enableTcpConnectionEndpointRediscovery=default(Nullable)); + public CosmosClientBuilder WithConnectionModeGateway(Nullable maxConnectionLimit=default(Nullable), IWebProxy webProxy=null); + public CosmosClientBuilder WithConsistencyLevel(ConsistencyLevel consistencyLevel); + public CosmosClientBuilder WithContentResponseOnWrite(bool contentResponseOnWrite); + public CosmosClientBuilder WithCustomSerializer(CosmosSerializer cosmosJsonSerializer); + public CosmosClientBuilder WithHttpClientFactory(Func httpClientFactory); + public CosmosClientBuilder WithLimitToEndpoint(bool limitToEndpoint); + public CosmosClientBuilder WithRequestTimeout(TimeSpan requestTimeout); + public CosmosClientBuilder WithSerializerOptions(CosmosSerializationOptions cosmosSerializerOptions); + public CosmosClientBuilder WithThrottlingRetryOptions(TimeSpan maxRetryWaitTimeOnThrottledRequests, int maxRetryAttemptsOnThrottledRequests); + } + public class IndexingPolicyDefinition + { + public IndexingPolicyDefinition(); + public T Attach(); + public IndexingPolicyDefinition WithAutomaticIndexing(bool enabled); + public CompositeIndexDefinition> WithCompositeIndex(); + public PathsDefinition> WithExcludedPaths(); + public PathsDefinition> WithIncludedPaths(); + public IndexingPolicyDefinition WithIndexingMode(IndexingMode indexingMode); + public SpatialIndexDefinition> WithSpatialIndex(); + } + public class PathsDefinition + { + public T Attach(); + public PathsDefinition Path(string path); + } + public class SpatialIndexDefinition + { + public T Attach(); + public SpatialIndexDefinition Path(string path); + public SpatialIndexDefinition Path(string path, params SpatialType[] spatialTypes); + } + public class UniqueKeyDefinition + { + public ContainerBuilder Attach(); + public UniqueKeyDefinition Path(string path); + } +} +namespace Microsoft.Azure.Cosmos.Linq +{ + public static class CosmosLinq + { + public static object InvokeUserDefinedFunction(string udfName, params object[] arguments); + } + public static class CosmosLinqExtensions + { + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> AverageAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> AverageAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> CountAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static bool IsArray(this object obj); + public static bool IsBool(this object obj); + public static bool IsDefined(this object obj); + public static bool IsNull(this object obj); + public static bool IsNumber(this object obj); + public static bool IsObject(this object obj); + public static bool IsPrimitive(this object obj); + public static bool IsString(this object obj); + public static Task> MaxAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> MinAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task>> SumAsync(this IQueryable> source, CancellationToken cancellationToken=default(CancellationToken)); + public static Task> SumAsync(this IQueryable source, CancellationToken cancellationToken=default(CancellationToken)); + public static FeedIterator ToFeedIterator(this IQueryable query); + public static QueryDefinition ToQueryDefinition(this IQueryable query); + public static FeedIterator ToStreamIterator(this IQueryable query); + } +} +namespace Microsoft.Azure.Cosmos.Scripts +{ + public abstract class Scripts + { + protected Scripts(); + public abstract Task CreateStoredProcedureAsync(StoredProcedureProperties storedProcedureProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateTriggerAsync(TriggerProperties triggerProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task CreateUserDefinedFunctionAsync(UserDefinedFunctionProperties userDefinedFunctionProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteStoredProcedureAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteTriggerAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task DeleteUserDefinedFunctionAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task> ExecuteStoredProcedureAsync(string storedProcedureId, PartitionKey partitionKey, dynamic parameters, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteStoredProcedureStreamAsync(string storedProcedureId, PartitionKey partitionKey, dynamic parameters, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ExecuteStoredProcedureStreamAsync(string storedProcedureId, Stream streamPayload, PartitionKey partitionKey, StoredProcedureRequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract FeedIterator GetStoredProcedureQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetStoredProcedureQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetTriggerQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryStreamIterator(QueryDefinition queryDefinition, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract FeedIterator GetUserDefinedFunctionQueryStreamIterator(string queryText=null, string continuationToken=null, QueryRequestOptions requestOptions=null); + public abstract Task ReadStoredProcedureAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadTriggerAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReadUserDefinedFunctionAsync(string id, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceStoredProcedureAsync(StoredProcedureProperties storedProcedureProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceTriggerAsync(TriggerProperties triggerProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public abstract Task ReplaceUserDefinedFunctionAsync(UserDefinedFunctionProperties userDefinedFunctionProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + } + public class StoredProcedureExecuteResponse : Response + { + protected StoredProcedureExecuteResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override T Resource { get; } + public virtual string ScriptLog { get; } + public virtual string SessionToken { get; } + public override HttpStatusCode StatusCode { get; } + } + public class StoredProcedureProperties + { + public StoredProcedureProperties(); + public StoredProcedureProperties(string id, string body); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public Nullable LastModified { get; } + public string SelfLink { get; } + } + public class StoredProcedureRequestOptions : RequestOptions + { + public StoredProcedureRequestOptions(); + public Nullable ConsistencyLevel { get; set; } + public bool EnableScriptLogging { get; set; } + public string SessionToken { get; set; } + } + public class StoredProcedureResponse : Response + { + protected StoredProcedureResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override StoredProcedureProperties Resource { get; } + public virtual string SessionToken { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator StoredProcedureProperties (StoredProcedureResponse response); + } + public enum TriggerOperation : short + { + All = (short)0, + Create = (short)1, + Delete = (short)3, + Replace = (short)4, + Update = (short)2, + } + public class TriggerProperties + { + public TriggerProperties(); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public string SelfLink { get; } + public TriggerOperation TriggerOperation { get; set; } + public TriggerType TriggerType { get; set; } + } + public class TriggerResponse : Response + { + protected TriggerResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override TriggerProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator TriggerProperties (TriggerResponse response); + } + public enum TriggerType : byte + { + Post = (byte)1, + Pre = (byte)0, + } + public class UserDefinedFunctionProperties + { + public UserDefinedFunctionProperties(); + public string Body { get; set; } + public string ETag { get; } + public string Id { get; set; } + public string SelfLink { get; } + } + public class UserDefinedFunctionResponse : Response + { + protected UserDefinedFunctionResponse(); + public override string ActivityId { get; } + public override CosmosDiagnostics Diagnostics { get; } + public override string ETag { get; } + public override Headers Headers { get; } + public override double RequestCharge { get; } + public override UserDefinedFunctionProperties Resource { get; } + public override HttpStatusCode StatusCode { get; } + public static implicit operator UserDefinedFunctionProperties (UserDefinedFunctionResponse response); + } +} +namespace Microsoft.Azure.Cosmos.Spatial +{ + public sealed class BoundingBox : IEquatable + { + public BoundingBox(Position min, Position max); + public Position Max { get; } + public Position Min { get; } + public bool Equals(BoundingBox other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public abstract class Crs + { + protected Crs(CrsType type); + public static Crs Default { get; } + public CrsType Type { get; } + public static Crs Unspecified { get; } + public static LinkedCrs Linked(string href); + public static LinkedCrs Linked(string href, string type); + public static NamedCrs Named(string name); + } + public enum CrsType + { + Linked = 1, + Named = 0, + Unspecified = 2, + } + public abstract class Geometry + { + protected Geometry(GeometryType type, GeometryParams geometryParams); + public IDictionary AdditionalProperties { get; } + public BoundingBox BoundingBox { get; } + public Crs Crs { get; } + public GeometryType Type { get; } + public double Distance(Geometry to); + public override bool Equals(object obj); + public override int GetHashCode(); + public bool Intersects(Geometry geometry2); + public bool IsValid(); + public GeometryValidationResult IsValidDetailed(); + public bool Within(Geometry outer); + } + public class GeometryParams + { + public GeometryParams(); + public IDictionary AdditionalProperties { get; set; } + public BoundingBox BoundingBox { get; set; } + public Crs Crs { get; set; } + } + public enum GeometryShape + { + GeometryCollection = 6, + LineString = 2, + MultiLineString = 3, + MultiPoint = 1, + MultiPolygon = 5, + Point = 0, + Polygon = 4, + } + public enum GeometryType + { + GeometryCollection = 6, + LineString = 2, + MultiLineString = 3, + MultiPoint = 1, + MultiPolygon = 5, + Point = 0, + Polygon = 4, + } + public class GeometryValidationResult + { + public GeometryValidationResult(); + public bool IsValid { get; } + public string Reason { get; } + } + public sealed class LinearRing : IEquatable + { + public LinearRing(IList coordinates); + public ReadOnlyCollection Positions { get; } + public bool Equals(LinearRing other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class LineString : Geometry, IEquatable + { + public LineString(IList coordinates); + public LineString(IList coordinates, GeometryParams geometryParams); + public ReadOnlyCollection Positions { get; } + public bool Equals(LineString other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class LinkedCrs : Crs, IEquatable + { + public string Href { get; } + public string HrefType { get; } + public bool Equals(LinkedCrs other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class MultiPolygon : Geometry, IEquatable + { + public MultiPolygon(IList polygons); + public MultiPolygon(IList polygons, GeometryParams geometryParams); + public ReadOnlyCollection Polygons { get; } + public bool Equals(MultiPolygon other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class NamedCrs : Crs, IEquatable + { + public string Name { get; } + public bool Equals(NamedCrs other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Point : Geometry, IEquatable + { + public Point(Position position); + public Point(Position position, GeometryParams geometryParams); + public Point(double longitude, double latitude); + public Position Position { get; } + public bool Equals(Point other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Polygon : Geometry, IEquatable + { + public Polygon(IList rings); + public Polygon(IList rings, GeometryParams geometryParams); + public Polygon(IList externalRingPositions); + public ReadOnlyCollection Rings { get; } + public bool Equals(Polygon other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class PolygonCoordinates : IEquatable + { + public PolygonCoordinates(IList rings); + public ReadOnlyCollection Rings { get; } + public bool Equals(PolygonCoordinates other); + public override bool Equals(object obj); + public override int GetHashCode(); + } + public sealed class Position : IEquatable + { + public Position(IList coordinates); + public Position(double longitude, double latitude); + public Position(double longitude, double latitude, Nullable altitude); + public Nullable Altitude { get; } + public ReadOnlyCollection Coordinates { get; } + public double Latitude { get; } + public double Longitude { get; } + public bool Equals(Position other); + public override bool Equals(object obj); + public override int GetHashCode(); + } +} diff --git a/changelog.md b/changelog.md index b1b3139828..01e3703c89 100644 --- a/changelog.md +++ b/changelog.md @@ -12,6 +12,33 @@ Preview features are treated as a separate branch and will not be included in th The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +### [3.35.0-preview](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.35.0-preview) - 2023-06-19 + +### Added +- [3836](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3836) Integrated cache: Adds BypassIntegratedCache to DedicatedGatewayRequestOptions +- [3909](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3909) Query: Adds EnableOptimisticDirectExecution in QueryRequestOptions enabled by default + +### [3.35.0](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.35.0) - 2023-06-19 + +#### Fixed +- [3864](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3864) NugetPackage: Removes ThirdPartyNotice.txt from content and contentFiles folders +- [3866](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3866) CosmosClient: Fixes missing Trace when converting HTTP Timeout to 503 +- [3879](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3879) Subpartitioning: Fixes handling of split physical partitions +- [3907](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3907) Query: Fixes empty property name parsing exception + +#### Added +- [3860](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3860) Documentation: Adds see also link to Container.CreateTransactionalBatch +- [3852](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3852) Query: Adds type-markers with count and length for large arrays +- [3838](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3838) Benchmarking: Adds use of ARM Templates for benchmarking +- [3877](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3877) Regions: Adds Malaysia South, Isreal Central, and Italy North +- [3877](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3877) Distributed Tracing: Enables Distributing Tracing for Operations +- [3874](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3874) Client Encryption: Adds Microsoft.Azure.Cosmos compatibility to version 3.34.0 +- [3891](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3891) Documentation: Adds additional remarks to CosmosClient +- [3902](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3902) ConnectionPolicy: Refactors Code to Reduce Default Request Timeout to 6 Seconds +- [3910](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3910) Documentations: Adds links to PatchItems docs +- [3918](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3918) Regions: Adds Israel Central +- [3918](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3918) CosmosClient: Fixes SynchronizationLockException when disposing client with requests in-flight. + ### [3.34.0-preview](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.34.0-preview) - 2023-05-17 ### Added From b1d313452cdb4318b9239fe9b39668667f6cf034 Mon Sep 17 00:00:00 2001 From: Nalu Tripician <27316859+NaluTripician@users.noreply.github.com> Date: Mon, 19 Jun 2023 15:35:53 -0400 Subject: [PATCH 39/39] [Internal] Last minute fix to changelog for 3.35.0 (#3921) * release PR * updated changelog.md * more changelog updates * changelog fix * Update changelog.md * Update changelog.md --- changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 01e3703c89..bd5c29c32c 100644 --- a/changelog.md +++ b/changelog.md @@ -31,7 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [3852](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3852) Query: Adds type-markers with count and length for large arrays - [3838](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3838) Benchmarking: Adds use of ARM Templates for benchmarking - [3877](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3877) Regions: Adds Malaysia South, Isreal Central, and Italy North -- [3877](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3877) Distributed Tracing: Enables Distributing Tracing for Operations +- [3887](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3887) Distributed Tracing: Setting DisplayName for an operation level activity as `` - [3874](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3874) Client Encryption: Adds Microsoft.Azure.Cosmos compatibility to version 3.34.0 - [3891](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3891) Documentation: Adds additional remarks to CosmosClient - [3902](https://github.com/Azure/azure-cosmos-dotnet-v3/pull/3902) ConnectionPolicy: Refactors Code to Reduce Default Request Timeout to 6 Seconds