Skip to content

Commit 8a3883e

Browse files
authored
[Internal] Client Telemetry: Fixes tests leaking environment variables (#3517)
* Adding log lines * More logs * Debugging further * Removing other builds * And more debugging * Wrong build parameters * Wrong category * Removing noise * Fixing test * Adding utils * Adding test with client telemetry enabled * Fixing leak in Client Telemetry Tests * Reenabling test * cpu monitor initialization * Adding name details * Undo another file
1 parent f5effce commit 8a3883e

File tree

4 files changed

+97
-22
lines changed

4 files changed

+97
-22
lines changed

Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/ClientTelemetryTests.cs

+11-16
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ namespace Microsoft.Azure.Cosmos.SDK.EmulatorTests
3030
[TestClass]
3131
public class ClientTelemetryTests : BaseCosmosClientHelper
3232
{
33-
private const string telemetryEndpointUrl = "http://dummy.telemetry.endpoint/";
3433
private const int scheduledInSeconds = 1;
3534
private static readonly object jsonObject = JsonConvert.DeserializeObject("{\"compute\":{\"azEnvironment\":\"AzurePublicCloud\",\"customData\":\"\",\"isHostCompatibilityLayerVm\":\"false\",\"licenseType\":\"\",\"location\":\"eastus\",\"name\":\"sourabh-testing\",\"offer\":\"UbuntuServer\",\"osProfile\":{\"adminUsername\":\"azureuser\",\"computerName\":\"sourabh-testing\"},\"osType\":\"Linux\",\"placementGroupId\":\"\",\"plan\":{\"name\":\"\",\"product\":\"\",\"publisher\":\"\"},\"platformFaultDomain\":\"0\",\"platformUpdateDomain\":\"0\",\"provider\":\"Microsoft.Compute\",\"publicKeys\":[{\"keyData\":\"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC5uCeOAm3ehmhI+2PbMoMl17Eo\r\nqfHKCycSaBJsv9qxlmBOuFheSJc1XknJleXUSsuTO016/d1PyWpevnqOZNRksWoa\r\nJvQ23sDTxcK+X2OP3QlCUeX4cMjPXqlL8z1UYzU4Bx3fFvf8fs67G3N72sxWBw5P\r\nZyuXyhBm0NCe/2NYMKgEDT4ma8XszO0ikbhoPKbMbgHAQk/ktWQHNcqYOPQKEWqp\r\nEK1R0rjS2nmtovfScP/ZGXcvOpJ1/NDBo4dh1K+OxOGM/4PSH/F448J5Zy4eAyEk\r\nscys+IpeIOTOlRUy/703SNIX0LEWlnYqbyL9c1ypcYLQqF76fKkDfzzFI/OWVlGw\r\nhj/S9uP8iMsR+fhGIbn6MAa7O4DWPWLuedSp7KDYyjY09gqNJsfuaAJN4LiC6bPy\r\nhknm0PVLK3ux7EUOt+cZrHCdIFWbdOtxiPNIl1tkv9kV5aE5Aj2gJm4MeB9uXYhS\r\nOuksboBc0wyUGrl9+XZJ1+NlZOf7IjVi86CieK8= generated-by-azure\r\n\",\"path\":\"/home/azureuser/.ssh/authorized_keys\"}],\"publisher\":\"Canonical\",\"resourceGroupName\":\"sourabh-telemetry-sdk\",\"resourceId\":\"/subscriptions/8fba6d4f-7c37-4d13-9063-fd58ad2b86e2/resourceGroups/sourabh-telemetry-sdk/providers/Microsoft.Compute/virtualMachines/sourabh-testing\",\"securityProfile\":{\"secureBootEnabled\":\"false\",\"virtualTpmEnabled\":\"false\"},\"sku\":\"18.04-LTS\",\"storageProfile\":{\"dataDisks\":[],\"imageReference\":{\"id\":\"\",\"offer\":\"UbuntuServer\",\"publisher\":\"Canonical\",\"sku\":\"18.04-LTS\",\"version\":\"latest\"},\"osDisk\":{\"caching\":\"ReadWrite\",\"createOption\":\"FromImage\",\"diffDiskSettings\":{\"option\":\"\"},\"diskSizeGB\":\"30\",\"encryptionSettings\":{\"enabled\":\"false\"},\"image\":{\"uri\":\"\"},\"managedDisk\":{\"id\":\"/subscriptions/8fba6d4f-7c37-4d13-9063-fd58ad2b86e2/resourceGroups/sourabh-telemetry-sdk/providers/Microsoft.Compute/disks/sourabh-testing_OsDisk_1_9a54abfc5ba149c6a106bd9e5b558c2a\",\"storageAccountType\":\"Premium_LRS\"},\"name\":\"sourabh-testing_OsDisk_1_9a54abfc5ba149c6a106bd9e5b558c2a\",\"osType\":\"Linux\",\"vhd\":{\"uri\":\"\"},\"writeAcceleratorEnabled\":\"false\"}},\"subscriptionId\":\"8fba6d4f-7c37-4d13-9063-fd58ad2b86e2\",\"tags\":\"azsecpack:nonprod;platformsettings.host_environment.service.platform_optedin_for_rootcerts:true\",\"tagsList\":[{\"name\":\"azsecpack\",\"value\":\"nonprod\"},{\"name\":\"platformsettings.host_environment.service.platform_optedin_for_rootcerts\",\"value\":\"true\"}],\"version\":\"18.04.202103250\",\"vmId\":\"d0cb93eb-214b-4c2b-bd3d-cc93e90d9efd\",\"vmScaleSetName\":\"\",\"vmSize\":\"Standard_D2s_v3\",\"zone\":\"1\"},\"network\":{\"interface\":[{\"ipv4\":{\"ipAddress\":[{\"privateIpAddress\":\"10.0.7.5\",\"publicIpAddress\":\"\"}],\"subnet\":[{\"address\":\"10.0.7.0\",\"prefix\":\"24\"}]},\"ipv6\":{\"ipAddress\":[]},\"macAddress\":\"000D3A8F8BA0\"}]}}");
3635

@@ -46,12 +45,8 @@ public class ClientTelemetryTests : BaseCosmosClientHelper
4645
private HttpClientHandlerHelper httpHandlerForNonAzureInstance;
4746

4847
[ClassInitialize]
49-
public static void ClassInitialize(TestContext context)
48+
public static void ClassInitialize(TestContext _)
5049
{
51-
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetryEnabled, "true");
52-
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetrySchedulingInSeconds, "1");
53-
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetryEndpoint, telemetryEndpointUrl);
54-
5550
SystemUsageMonitor oldSystemUsageMonitor = (SystemUsageMonitor)typeof(DiagnosticsHandlerHelper)
5651
.GetField("systemUsageMonitor", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(DiagnosticsHandlerHelper.Instance);
5752
oldSystemUsageMonitor.Stop();
@@ -62,6 +57,8 @@ public static void ClassInitialize(TestContext context)
6257
[TestInitialize]
6358
public void TestInitialize()
6459
{
60+
Util.EnableClientTelemetryEnvironmentVariables();
61+
6562
this.actualInfo = new List<ClientTelemetryProperties>();
6663

6764
this.httpHandler = new HttpClientHandlerHelper
@@ -134,16 +131,6 @@ public void TestInitialize()
134131
.WithApplicationPreferredRegions(this.preferredRegionList);
135132
}
136133

137-
[ClassCleanup]
138-
public static void FinalCleanup()
139-
{
140-
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetryEnabled, null);
141-
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetrySchedulingInSeconds, null);
142-
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetryEndpoint, null);
143-
144-
ClientTelemetryTests.ResetSystemUsageMonitor(false);
145-
}
146-
147134
private static void ResetSystemUsageMonitor(bool isTelemetryEnabled)
148135
{
149136
ClientTelemetryTests.systemUsageMonitor?.Stop();
@@ -186,6 +173,14 @@ public async Task Cleanup()
186173
azMetadataField.SetValue(null, null);
187174

188175
await base.TestCleanup();
176+
177+
Util.DisableClientTelemetryEnvironmentVariables();
178+
}
179+
180+
[ClassCleanup]
181+
public static void FinalCleanup()
182+
{
183+
ClientTelemetryTests.ResetSystemUsageMonitor(false);
189184
}
190185

191186
[TestMethod]

Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/PartitionKeyRangeCacheTests.cs

+12-2
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,21 @@ public class PartitionKeyRangeCacheTests
1919
{
2020
private bool loopBackgroundOperaitons = false;
2121

22-
[TestMethod]
23-
public async Task VerifyPkRangeCacheRefreshOnSplitWithErrorsAsync()
22+
[TestInitialize]
23+
public void TestInitialize()
24+
{
25+
this.loopBackgroundOperaitons = false;
26+
}
27+
28+
[TestCleanup]
29+
public void TestCleanup()
2430
{
2531
this.loopBackgroundOperaitons = false;
32+
}
2633

34+
[TestMethod]
35+
public async Task VerifyPkRangeCacheRefreshOnSplitWithErrorsAsync()
36+
{
2737
int throwOnPkRefreshCount = 3;
2838
int pkRangeCalls = 0;
2939
bool causeSplitExceptionInRntbdCall = false;

Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/SynchronizationContextTests.cs

+18-4
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,17 @@ namespace Microsoft.Azure.Cosmos.SDK.EmulatorTests
1313
[TestClass]
1414
public class SynchronizationContextTests
1515
{
16-
[TestMethod]
16+
[DataTestMethod]
17+
[DataRow(false, DisplayName = "SynchronizationContextTests - Client Telemetry disabled")]
18+
[DataRow(true, DisplayName = "SynchronizationContextTests - Client Telemetry enabled")]
1719
[Timeout(30000)]
18-
public void VerifySynchronizationContextDoesNotLock()
20+
public void VerifySynchronizationContextDoesNotLock(bool withClientTelemetry)
1921
{
22+
if (withClientTelemetry)
23+
{
24+
Util.EnableClientTelemetryEnvironmentVariables();
25+
}
26+
2027
string databaseId = Guid.NewGuid().ToString();
2128
SynchronizationContext prevContext = SynchronizationContext.Current;
2229
try
@@ -29,7 +36,6 @@ public void VerifySynchronizationContextDoesNotLock()
2936
{
3037
Cosmos.Database database = client.CreateDatabaseAsync(databaseId).GetAwaiter().GetResult();
3138
database = client.CreateDatabaseIfNotExistsAsync(databaseId).GetAwaiter().GetResult();
32-
3339
database.ReadStreamAsync().ConfigureAwait(false).GetAwaiter().GetResult();
3440
database.ReadAsync().ConfigureAwait(false).GetAwaiter().GetResult();
3541

@@ -118,7 +124,7 @@ public void VerifySynchronizationContextDoesNotLock()
118124

119125
double cost = container.GetItemLinqQueryable<ToDoActivity>(
120126
allowSynchronousQueryExecution: true).Select(x => x.cost).Sum();
121-
127+
122128
ItemResponse<ToDoActivity> deleteResponse = container.DeleteItemAsync<ToDoActivity>(partitionKey: new Cosmos.PartitionKey(testItem.pk), id: testItem.id).ConfigureAwait(false).GetAwaiter().GetResult();
123129
Assert.IsNotNull(deleteResponse);
124130
}
@@ -127,13 +133,21 @@ public void VerifySynchronizationContextDoesNotLock()
127133
finally
128134
{
129135
SynchronizationContext.SetSynchronizationContext(prevContext);
136+
130137
using (CosmosClient client = TestCommon.CreateCosmosClient())
131138
{
132139
client.GetDatabase(databaseId).DeleteAsync().GetAwaiter().GetResult();
133140
}
141+
142+
if (withClientTelemetry)
143+
{
144+
Util.DisableClientTelemetryEnvironmentVariables();
145+
}
134146
}
135147
}
136148

149+
150+
137151
public class TestSynchronizationContext : SynchronizationContext
138152
{
139153
private object locker = new object();

Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Utils/Util.cs

+56
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@ namespace Microsoft.Azure.Cosmos.SDK.EmulatorTests
55
{
66
using System;
77
using System.Collections.Generic;
8+
using System.Diagnostics;
89
using System.Globalization;
10+
using System.IO;
911
using System.Linq;
1012
using System.Net;
13+
using System.Text;
1114
using System.Threading.Tasks;
1215
using Microsoft.Azure.Cosmos.Services.Management.Tests;
16+
using Microsoft.Azure.Cosmos.Telemetry;
1317
using Microsoft.Azure.Documents;
1418
using Microsoft.Azure.Documents.Client;
1519
using Microsoft.Azure.Documents.Collections;
@@ -514,5 +518,57 @@ internal static void LogRequestOptions(RequestOptions options, bool shouldLogOff
514518
options.OfferType,
515519
options.OfferThroughput);
516520
}
521+
522+
internal static void EnableClientTelemetryEnvironmentVariables()
523+
{
524+
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetryEnabled, "true");
525+
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetrySchedulingInSeconds, "1");
526+
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetryEndpoint, "http://dummy.telemetry.endpoint/");
527+
}
528+
529+
internal static void DisableClientTelemetryEnvironmentVariables()
530+
{
531+
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetryEnabled, null);
532+
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetrySchedulingInSeconds, null);
533+
Environment.SetEnvironmentVariable(ClientTelemetryOptions.EnvPropsClientTelemetryEndpoint, null);
534+
}
535+
536+
/// <summary>
537+
/// Enables traces for local debugging
538+
/// </summary>
539+
internal static void EnableTracesForDebugging()
540+
{
541+
Type defaultTrace = Type.GetType("Microsoft.Azure.Cosmos.Core.Trace.DefaultTrace,Microsoft.Azure.Cosmos.Direct");
542+
TraceSource traceSource = (TraceSource)defaultTrace.GetProperty("TraceSource").GetValue(null);
543+
traceSource.Switch.Level = SourceLevels.All;
544+
traceSource.Listeners.Clear();
545+
traceSource.Listeners.Add(new DirectToConsoleTraceListener());
546+
}
547+
548+
public class DirectToConsoleTraceListener : TextWriterTraceListener
549+
{
550+
public DirectToConsoleTraceListener() : base(new DirectToConsoleTextWriter())
551+
{
552+
}
553+
554+
public override void Close()
555+
{
556+
}
557+
}
558+
559+
public class DirectToConsoleTextWriter : TextWriter
560+
{
561+
public override Encoding Encoding => Console.Out.Encoding;
562+
563+
public override void Write(string value)
564+
{
565+
Logger.LogLine(value);
566+
}
567+
568+
public override void WriteLine(string value)
569+
{
570+
Logger.LogLine(value);
571+
}
572+
}
517573
}
518574
}

0 commit comments

Comments
 (0)