Родитель
8b4461b2cd
Коммит
d0ce00d173
|
@ -8,6 +8,7 @@
|
|||
using System.Net;
|
||||
using System.Runtime.Serialization.Json;
|
||||
using System.Threading;
|
||||
|
||||
using Microsoft.ApplicationInsights.Extensibility.Filtering;
|
||||
using Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing;
|
||||
using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.Implementation.QuickPulse.Helpers;
|
||||
|
@ -86,6 +87,7 @@
|
|||
DateTimeOffset timestamp,
|
||||
string configurationETag,
|
||||
string authApiKey,
|
||||
string authToken,
|
||||
out CollectionConfigurationInfo configurationInfo,
|
||||
out TimeSpan? servicePollingIntervalHint)
|
||||
{
|
||||
|
@ -100,6 +102,7 @@
|
|||
true,
|
||||
configurationETag,
|
||||
authApiKey,
|
||||
authToken,
|
||||
out configurationInfo,
|
||||
out servicePollingIntervalHint,
|
||||
requestStream => this.WritePingData(timestamp, requestStream));
|
||||
|
@ -110,6 +113,7 @@
|
|||
string instrumentationKey,
|
||||
string configurationETag,
|
||||
string authApiKey,
|
||||
string authToken,
|
||||
out CollectionConfigurationInfo configurationInfo,
|
||||
CollectionConfigurationError[] collectionConfigurationErrors)
|
||||
{
|
||||
|
@ -124,6 +128,7 @@
|
|||
false,
|
||||
configurationETag,
|
||||
authApiKey,
|
||||
authToken,
|
||||
out configurationInfo,
|
||||
out _,
|
||||
requestStream => this.WriteSamples(samples, instrumentationKey, requestStream, collectionConfigurationErrors));
|
||||
|
@ -138,6 +143,7 @@
|
|||
bool includeIdentityHeaders,
|
||||
string configurationETag,
|
||||
string authApiKey,
|
||||
string authToken,
|
||||
out CollectionConfigurationInfo configurationInfo,
|
||||
out TimeSpan? servicePollingIntervalHint,
|
||||
Action<Stream> onWriteRequestBody)
|
||||
|
@ -148,7 +154,7 @@
|
|||
request.Method = "POST";
|
||||
request.Timeout = (int)this.timeout.TotalMilliseconds;
|
||||
|
||||
this.AddHeaders(request, includeIdentityHeaders, configurationETag, authApiKey);
|
||||
this.AddHeaders(request, includeIdentityHeaders, configurationETag, authApiKey, authToken);
|
||||
|
||||
using (Stream requestStream = request.GetRequestStream())
|
||||
{
|
||||
|
@ -360,7 +366,7 @@
|
|||
};
|
||||
}
|
||||
|
||||
private void AddHeaders(HttpWebRequest request, bool includeIdentityHeaders, string configurationETag, string authApiKey)
|
||||
private void AddHeaders(HttpWebRequest request, bool includeIdentityHeaders, string configurationETag, string authApiKey, string authToken)
|
||||
{
|
||||
request.Headers.Add(QuickPulseConstants.XMsQpsTransmissionTimeHeaderName, this.timeProvider.UtcNow.Ticks.ToString(CultureInfo.InvariantCulture));
|
||||
|
||||
|
@ -381,6 +387,11 @@
|
|||
request.Headers.Add(QuickPulseConstants.XMsQpsInvariantVersionHeaderName,
|
||||
MonitoringDataPoint.CurrentInvariantVersion.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(authToken))
|
||||
{
|
||||
request.Headers.Add(QuickPulseConstants.AuthorizationHeaderName, QuickPulseConstants.AuthorizationTokenPrefix + authToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
DateTimeOffset timestamp,
|
||||
string configurationETag,
|
||||
string authApiKey,
|
||||
string authToken,
|
||||
out CollectionConfigurationInfo configurationInfo,
|
||||
out TimeSpan? servicePollingIntervalHint)
|
||||
{
|
||||
|
@ -106,6 +107,7 @@
|
|||
true,
|
||||
configurationETag,
|
||||
authApiKey,
|
||||
authToken,
|
||||
out configurationInfo,
|
||||
out servicePollingIntervalHint,
|
||||
requestStream => this.WritePingData(timestamp, requestStream));
|
||||
|
@ -116,6 +118,7 @@
|
|||
string instrumentationKey,
|
||||
string configurationETag,
|
||||
string authApiKey,
|
||||
string authToken,
|
||||
out CollectionConfigurationInfo configurationInfo,
|
||||
CollectionConfigurationError[] collectionConfigurationErrors)
|
||||
{
|
||||
|
@ -130,6 +133,7 @@
|
|||
false,
|
||||
configurationETag,
|
||||
authApiKey,
|
||||
authToken,
|
||||
out configurationInfo,
|
||||
out _,
|
||||
requestStream => this.WriteSamples(samples, instrumentationKey, requestStream, collectionConfigurationErrors));
|
||||
|
@ -146,6 +150,7 @@
|
|||
bool includeIdentityHeaders,
|
||||
string configurationETag,
|
||||
string authApiKey,
|
||||
string authToken,
|
||||
out CollectionConfigurationInfo configurationInfo,
|
||||
out TimeSpan? servicePollingIntervalHint,
|
||||
Action<Stream> onWriteRequestBody)
|
||||
|
@ -154,7 +159,7 @@
|
|||
{
|
||||
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, requestUri))
|
||||
{
|
||||
this.AddHeaders(request, includeIdentityHeaders, configurationETag, authApiKey);
|
||||
this.AddHeaders(request, includeIdentityHeaders, configurationETag, authApiKey, authToken);
|
||||
|
||||
using (MemoryStream stream = new MemoryStream())
|
||||
{
|
||||
|
@ -254,7 +259,7 @@
|
|||
}
|
||||
|
||||
private void WritePingData(DateTimeOffset timestamp, Stream stream)
|
||||
{
|
||||
{
|
||||
var dataPoint = new MonitoringDataPoint
|
||||
{
|
||||
Version = this.version,
|
||||
|
@ -293,7 +298,7 @@
|
|||
|
||||
ProcessCpuData[] topCpuProcesses =
|
||||
sample.TopCpuData.Select(p => new ProcessCpuData() { ProcessName = p.Item1, CpuPercentage = p.Item2, }).ToArray();
|
||||
|
||||
|
||||
var dataPoint = new MonitoringDataPoint
|
||||
{
|
||||
Version = this.version,
|
||||
|
@ -389,7 +394,7 @@
|
|||
};
|
||||
}
|
||||
|
||||
private void AddHeaders(HttpRequestMessage request, bool includeIdentityHeaders, string configurationETag, string authApiKey)
|
||||
private void AddHeaders(HttpRequestMessage request, bool includeIdentityHeaders, string configurationETag, string authApiKey, string authToken)
|
||||
{
|
||||
request.Headers.TryAddWithoutValidation(QuickPulseConstants.XMsQpsTransmissionTimeHeaderName, this.timeProvider.UtcNow.Ticks.ToString(CultureInfo.InvariantCulture));
|
||||
|
||||
|
@ -410,6 +415,11 @@
|
|||
request.Headers.TryAddWithoutValidation(QuickPulseConstants.XMsQpsInvariantVersionHeaderName,
|
||||
MonitoringDataPoint.CurrentInvariantVersion.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(authToken))
|
||||
{
|
||||
request.Headers.TryAddWithoutValidation(QuickPulseConstants.AuthorizationHeaderName, QuickPulseConstants.AuthorizationTokenPrefix + authToken);
|
||||
}
|
||||
}
|
||||
|
||||
private void Dispose(bool disposing)
|
||||
|
@ -420,4 +430,4 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
DateTimeOffset timestamp,
|
||||
string configurationETag,
|
||||
string authApiKey,
|
||||
string authToken,
|
||||
out CollectionConfigurationInfo configurationInfo,
|
||||
out TimeSpan? servicePollingIntervalHint)
|
||||
{
|
||||
|
@ -107,6 +108,7 @@
|
|||
string instrumentationKey,
|
||||
string configurationETag,
|
||||
string authApiKey,
|
||||
string authToken,
|
||||
out CollectionConfigurationInfo configurationInfo,
|
||||
CollectionConfigurationError[] collectionConfigurationErrors)
|
||||
{
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using Microsoft.ApplicationInsights.Extensibility;
|
||||
using Microsoft.ApplicationInsights.Extensibility.Filtering;
|
||||
using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.Implementation;
|
||||
using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.Implementation.QuickPulse;
|
||||
|
@ -22,10 +23,10 @@
|
|||
private const string UpdatedConfigurationMessage = "UpdatedConfiguration";
|
||||
|
||||
private static readonly CollectionConfigurationInfo EmptyCollectionConfigurationInfo = new CollectionConfigurationInfo()
|
||||
{
|
||||
ETag = string.Empty,
|
||||
Metrics = new CalculatedMetricInfo[0]
|
||||
};
|
||||
{
|
||||
ETag = string.Empty,
|
||||
Metrics = new CalculatedMetricInfo[0]
|
||||
};
|
||||
|
||||
[TestMethod]
|
||||
public void QuickPulseCollectionStateManagerDoesNothingWithoutInstrumentationKey()
|
||||
|
@ -54,6 +55,7 @@
|
|||
var serviceClient = new QuickPulseServiceClientMock();
|
||||
|
||||
var manager = new QuickPulseCollectionStateManager(
|
||||
TelemetryConfiguration.CreateDefault(),
|
||||
serviceClient,
|
||||
new Clock(),
|
||||
QuickPulseTimings.Default,
|
||||
|
@ -334,7 +336,7 @@
|
|||
timeProvider.FastForward(TimeSpan.FromSeconds(2));
|
||||
Assert.AreEqual(timings.ServicePollingBackedOffInterval, manager.UpdateState("some ikey", string.Empty));
|
||||
}
|
||||
|
||||
|
||||
[TestMethod]
|
||||
public void QuickPulseCollectionStateManagerPingDoesNotBackOffOnFirstPing()
|
||||
{
|
||||
|
@ -378,7 +380,7 @@
|
|||
// ASSERT
|
||||
Assert.AreEqual(timings.ServicePollingInterval, manager.UpdateState(string.Empty, string.Empty));
|
||||
}
|
||||
|
||||
|
||||
[TestMethod]
|
||||
public void QuickPulseCollectionStateManagerSubmitBacksOff()
|
||||
{
|
||||
|
@ -680,7 +682,7 @@
|
|||
Assert.AreEqual(Predicate.Equal.ToString(), errors[3].Data["FilterPredicate"]);
|
||||
Assert.AreEqual("Request1", errors[3].Data["FilterComparand"]);
|
||||
}
|
||||
|
||||
|
||||
[TestMethod]
|
||||
public void QuickPulseCollectionStateManagerRespectsServicePollingIntervalHint()
|
||||
{
|
||||
|
@ -693,7 +695,7 @@
|
|||
var manager = CreateManager(serviceClient, timeProvider, actions, returnedSamples, timings);
|
||||
TimeSpan intervalHint1 = TimeSpan.FromSeconds(65);
|
||||
TimeSpan intervalHint2 = TimeSpan.FromSeconds(75);
|
||||
|
||||
|
||||
// ACT
|
||||
serviceClient.ReturnValueFromPing = false;
|
||||
|
||||
|
@ -726,20 +728,21 @@
|
|||
List<CollectionConfigurationInfo> collectionConfigurationInfos = null)
|
||||
{
|
||||
var manager = new QuickPulseCollectionStateManager(
|
||||
TelemetryConfiguration.CreateDefault(),
|
||||
serviceClient,
|
||||
timeProvider,
|
||||
timings ?? QuickPulseTimings.Default,
|
||||
() => actions.Add(StartCollectionMessage),
|
||||
() => actions.Add(StopCollectionMessage),
|
||||
() =>
|
||||
{
|
||||
actions.Add(CollectMessage);
|
||||
{
|
||||
actions.Add(CollectMessage);
|
||||
|
||||
CollectionConfigurationError[] errors;
|
||||
var now = DateTimeOffset.UtcNow;
|
||||
return
|
||||
new[]
|
||||
{
|
||||
CollectionConfigurationError[] errors;
|
||||
var now = DateTimeOffset.UtcNow;
|
||||
return
|
||||
new[]
|
||||
{
|
||||
new QuickPulseDataSample(
|
||||
new QuickPulseDataAccumulator(
|
||||
new CollectionConfiguration(EmptyCollectionConfigurationInfo, out errors, timeProvider))
|
||||
|
@ -751,21 +754,21 @@
|
|||
new Dictionary<string, Tuple<PerformanceCounterData, double>>(),
|
||||
Enumerable.Empty<Tuple<string, int>>(),
|
||||
false)
|
||||
}.ToList();
|
||||
},
|
||||
}.ToList();
|
||||
},
|
||||
samples =>
|
||||
{
|
||||
returnedSamples?.AddRange(samples);
|
||||
},
|
||||
{
|
||||
returnedSamples?.AddRange(samples);
|
||||
},
|
||||
collectionConfigurationInfo =>
|
||||
{
|
||||
actions.Add(UpdatedConfigurationMessage);
|
||||
collectionConfigurationInfos?.Add(collectionConfigurationInfo);
|
||||
{
|
||||
actions.Add(UpdatedConfigurationMessage);
|
||||
collectionConfigurationInfos?.Add(collectionConfigurationInfo);
|
||||
|
||||
CollectionConfigurationError[] errors;
|
||||
new CollectionConfiguration(collectionConfigurationInfo, out errors, timeProvider);
|
||||
return errors;
|
||||
},
|
||||
CollectionConfigurationError[] errors;
|
||||
new CollectionConfiguration(collectionConfigurationInfo, out errors, timeProvider);
|
||||
return errors;
|
||||
},
|
||||
_ => { });
|
||||
|
||||
return manager;
|
||||
|
@ -773,4 +776,4 @@
|
|||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -101,24 +101,24 @@
|
|||
this.emulateTimeout = false;
|
||||
|
||||
this.pingResponse = response =>
|
||||
{
|
||||
response.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
{
|
||||
response.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
|
||||
foreach (string headerName in QuickPulseConstants.XMsQpsAuthOpaqueHeaderNames)
|
||||
{
|
||||
response.Headers.Add(headerName, opaqueAuthHeaderValuesToRespondWith[headerName]);
|
||||
}
|
||||
};
|
||||
foreach (string headerName in QuickPulseConstants.XMsQpsAuthOpaqueHeaderNames)
|
||||
{
|
||||
response.Headers.Add(headerName, opaqueAuthHeaderValuesToRespondWith[headerName]);
|
||||
}
|
||||
};
|
||||
|
||||
this.submitResponse = response =>
|
||||
{
|
||||
response.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
{
|
||||
response.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
|
||||
foreach (string headerName in QuickPulseConstants.XMsQpsAuthOpaqueHeaderNames)
|
||||
{
|
||||
response.Headers.Add(headerName, opaqueAuthHeaderValuesToRespondWith[headerName]);
|
||||
}
|
||||
};
|
||||
foreach (string headerName in QuickPulseConstants.XMsQpsAuthOpaqueHeaderNames)
|
||||
{
|
||||
response.Headers.Add(headerName, opaqueAuthHeaderValuesToRespondWith[headerName]);
|
||||
}
|
||||
};
|
||||
|
||||
// dynamic port range is [49152, 65535]
|
||||
int port;
|
||||
|
@ -172,9 +172,9 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping(string.Empty, timestamp, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(string.Empty, timestamp, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(string.Empty, timestamp, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(string.Empty, timestamp, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(string.Empty, timestamp, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(string.Empty, timestamp, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 3);
|
||||
|
@ -244,6 +244,7 @@
|
|||
string.Empty,
|
||||
string.Empty,
|
||||
string.Empty,
|
||||
null,
|
||||
out configurationInfo,
|
||||
new CollectionConfigurationError[0]);
|
||||
|
||||
|
@ -319,6 +320,7 @@
|
|||
string.Empty,
|
||||
string.Empty,
|
||||
string.Empty,
|
||||
null,
|
||||
out configurationInfo,
|
||||
new CollectionConfigurationError[0]);
|
||||
|
||||
|
@ -362,7 +364,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample1 }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample1 }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -412,7 +414,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample1, sample2 }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample1, sample2 }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -486,7 +488,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -553,7 +555,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample1, sample2 }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample1, sample2 }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -581,7 +583,7 @@
|
|||
// ACT
|
||||
this.pingResponse = r => { r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString()); };
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -608,7 +610,7 @@
|
|||
// ACT
|
||||
this.pingResponse = r => { r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, false.ToString()); };
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -635,7 +637,7 @@
|
|||
// ACT
|
||||
this.pingResponse = r => { r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, "bla"); };
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -662,7 +664,7 @@
|
|||
// ACT
|
||||
this.pingResponse = r => { };
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
bool? response = serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -694,6 +696,7 @@
|
|||
string.Empty,
|
||||
string.Empty,
|
||||
string.Empty,
|
||||
null,
|
||||
out configurationInfo,
|
||||
new CollectionConfigurationError[0]);
|
||||
|
||||
|
@ -727,6 +730,7 @@
|
|||
string.Empty,
|
||||
string.Empty,
|
||||
string.Empty,
|
||||
null,
|
||||
out configurationInfo,
|
||||
new CollectionConfigurationError[0]);
|
||||
|
||||
|
@ -760,6 +764,7 @@
|
|||
string.Empty,
|
||||
string.Empty,
|
||||
string.Empty,
|
||||
null,
|
||||
out configurationInfo,
|
||||
new CollectionConfigurationError[0]);
|
||||
|
||||
|
@ -793,6 +798,7 @@
|
|||
string.Empty,
|
||||
string.Empty,
|
||||
string.Empty,
|
||||
null,
|
||||
out configurationInfo,
|
||||
new CollectionConfigurationError[0]);
|
||||
|
||||
|
@ -823,7 +829,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(string.Empty, DateTimeOffset.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -857,6 +863,7 @@
|
|||
string.Empty,
|
||||
string.Empty,
|
||||
string.Empty,
|
||||
null,
|
||||
out configurationInfo,
|
||||
new CollectionConfigurationError[0]);
|
||||
|
||||
|
@ -884,23 +891,23 @@
|
|||
0);
|
||||
|
||||
this.pingResponse = r =>
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, false.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo()
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, false.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo()
|
||||
{
|
||||
ETag = "ETag2",
|
||||
Metrics = new[] { new CalculatedMetricInfo() { Id = "Id1" } }
|
||||
};
|
||||
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
ETag = "ETag2",
|
||||
Metrics = new[] { new CalculatedMetricInfo() { Id = "Id1" } }
|
||||
};
|
||||
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
};
|
||||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping("ikey", now, "ETag1", string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping("ikey", now, "ETag1", string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -933,23 +940,23 @@
|
|||
false);
|
||||
|
||||
this.submitResponse = r =>
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, false.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo()
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, false.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo()
|
||||
{
|
||||
ETag = "ETag2",
|
||||
Metrics = new[] { new CalculatedMetricInfo() { Id = "Id1" } }
|
||||
};
|
||||
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
ETag = "ETag2",
|
||||
Metrics = new[] { new CalculatedMetricInfo() { Id = "Id1" } }
|
||||
};
|
||||
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
};
|
||||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -975,23 +982,23 @@
|
|||
0);
|
||||
|
||||
this.pingResponse = r =>
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo()
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo()
|
||||
{
|
||||
ETag = "ETag2",
|
||||
Metrics = new[] { new CalculatedMetricInfo() { Id = "Id1" } }
|
||||
};
|
||||
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
ETag = "ETag2",
|
||||
Metrics = new[] { new CalculatedMetricInfo() { Id = "Id1" } }
|
||||
};
|
||||
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
};
|
||||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping("ikey", now, "ETag1", string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping("ikey", now, "ETag1", string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1026,23 +1033,23 @@
|
|||
false);
|
||||
|
||||
this.submitResponse = r =>
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo()
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo()
|
||||
{
|
||||
ETag = "ETag2",
|
||||
Metrics = new[] { new CalculatedMetricInfo() { Id = "Id1" } }
|
||||
};
|
||||
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
ETag = "ETag2",
|
||||
Metrics = new[] { new CalculatedMetricInfo() { Id = "Id1" } }
|
||||
};
|
||||
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
};
|
||||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1070,19 +1077,19 @@
|
|||
0);
|
||||
|
||||
this.pingResponse = r =>
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo() { ETag = "ETag2", Metrics = null };
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo() { ETag = "ETag2", Metrics = null };
|
||||
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
};
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
};
|
||||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping("ikey", now, "ETag2", string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping("ikey", now, "ETag2", string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1115,19 +1122,19 @@
|
|||
false);
|
||||
|
||||
this.submitResponse = r =>
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
{
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsSubscribedHeaderName, true.ToString());
|
||||
r.Headers.Add(QuickPulseConstants.XMsQpsConfigurationETagHeaderName, "ETag2");
|
||||
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo() { ETag = "ETag2", Metrics = null };
|
||||
var collectionConfigurationInfo = new CollectionConfigurationInfo() { ETag = "ETag2", Metrics = null };
|
||||
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
};
|
||||
var serializer = new DataContractJsonSerializer(typeof(CollectionConfigurationInfo));
|
||||
serializer.WriteObject(r.OutputStream, collectionConfigurationInfo);
|
||||
};
|
||||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag2", string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag2", string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1195,7 +1202,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1229,7 +1236,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1258,7 +1265,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
|
||||
// ASSERT
|
||||
|
@ -1293,7 +1300,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1323,7 +1330,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1360,7 +1367,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1388,7 +1395,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1424,7 +1431,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1451,7 +1458,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1486,7 +1493,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1514,7 +1521,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), timeProvider.UtcNow, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping(Guid.NewGuid().ToString(), timeProvider.UtcNow, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1552,7 +1559,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1581,7 +1588,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping("some ikey", now, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping("some ikey", now, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1616,7 +1623,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1646,7 +1653,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping("some ikey", now, string.Empty, authApiKey, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping("some ikey", now, string.Empty, authApiKey, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1681,7 +1688,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, authApiKey, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, authApiKey, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1714,10 +1721,10 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.Ping("some ikey", now, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping("some ikey", now, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// received the proper headers, now re-submit them
|
||||
serviceClient.Ping("some ikey", now, string.Empty, string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.Ping("some ikey", now, string.Empty, string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 2);
|
||||
|
@ -1761,10 +1768,10 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// received the proper headers, now re-submit them
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 2);
|
||||
|
@ -1802,8 +1809,8 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.Ping(string.Empty, now, "ETag1", string.Empty, out configurationInfo, out TimeSpan? _);
|
||||
serviceClient.SubmitSamples(new[] { sample }, string.Empty, "ETag1", string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.Ping(string.Empty, now, "ETag1", string.Empty, null, out configurationInfo, out TimeSpan? _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1855,6 +1862,7 @@
|
|||
string.Empty,
|
||||
string.Empty,
|
||||
string.Empty,
|
||||
null,
|
||||
out configurationInfo,
|
||||
collectionConfigurationErrors);
|
||||
|
||||
|
@ -1902,7 +1910,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1937,7 +1945,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -1972,7 +1980,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -2009,7 +2017,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -2049,7 +2057,7 @@
|
|||
|
||||
// ACT
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
serviceClient.SubmitSamples(new[] { sample }, ikey, string.Empty, string.Empty, null, out configurationInfo, new CollectionConfigurationError[0]);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(requestCount: 1);
|
||||
|
@ -2083,7 +2091,7 @@
|
|||
};
|
||||
|
||||
// ACT
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, out _, out TimeSpan? servicePollingIntervalHint);
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, null, out _, out TimeSpan? servicePollingIntervalHint);
|
||||
|
||||
// ASSERT
|
||||
Assert.AreEqual(TimeSpan.FromMilliseconds(ms), servicePollingIntervalHint);
|
||||
|
@ -2112,7 +2120,7 @@
|
|||
};
|
||||
|
||||
// ACT
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, out _, out TimeSpan? servicePollingIntervalHint);
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, null, out _, out TimeSpan? servicePollingIntervalHint);
|
||||
|
||||
// ASSERT
|
||||
Assert.IsNull(servicePollingIntervalHint);
|
||||
|
@ -2141,7 +2149,7 @@
|
|||
};
|
||||
|
||||
// ACT
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, out _, out TimeSpan? servicePollingIntervalHint);
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, null, out _, out TimeSpan? servicePollingIntervalHint);
|
||||
|
||||
// ASSERT
|
||||
Assert.IsNull(servicePollingIntervalHint);
|
||||
|
@ -2171,7 +2179,7 @@
|
|||
};
|
||||
|
||||
// ACT
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, out _, out _);
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, null, out _, out _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(1);
|
||||
|
@ -2205,7 +2213,7 @@
|
|||
};
|
||||
|
||||
// ACT
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, out _, out _);
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, null, out _, out _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(1);
|
||||
|
@ -2239,7 +2247,7 @@
|
|||
};
|
||||
|
||||
// ACT
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, out _, out _);
|
||||
serviceClient.Ping("ikey", now, string.Empty, string.Empty, null, out _, out _);
|
||||
|
||||
// SYNC
|
||||
this.WaitForProcessing(1);
|
||||
|
@ -2401,4 +2409,4 @@
|
|||
public string RoleName { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
/// <param name="timestamp">Timestamp to pass to the server.</param>
|
||||
/// <param name="configurationETag">Current configuration ETag that the client has.</param>
|
||||
/// <param name="authApiKey">Authentication API key.</param>
|
||||
/// <param name="authToken">Authorization token to be included on Http messages.</param>
|
||||
/// <param name="configurationInfo">When available, the deserialized response data received from the server.</param>
|
||||
/// <param name="servicePollingIntervalHint">When available, a hint regarding what the period should be when pinging the server going forward.</param>
|
||||
/// <returns><b>true</b> if data is expected, otherwise <b>false</b>.</returns>
|
||||
|
@ -28,6 +29,7 @@
|
|||
DateTimeOffset timestamp,
|
||||
string configurationETag,
|
||||
string authApiKey,
|
||||
string authToken,
|
||||
out CollectionConfigurationInfo configurationInfo,
|
||||
out TimeSpan? servicePollingIntervalHint);
|
||||
|
||||
|
@ -38,6 +40,7 @@
|
|||
/// <param name="instrumentationKey">InstrumentationKey for which to submit data samples.</param>
|
||||
/// <param name="configurationETag">Current configuration ETag that the client has.</param>
|
||||
/// <param name="authApiKey">Authentication API key.</param>
|
||||
/// <param name="authToken">Authorization token to be included on Http messages.</param>
|
||||
/// <param name="configurationInfo">When available, the deserialized response data received from the server.</param>
|
||||
/// <param name="collectionConfigurationErrors">Errors to be reported back to the server.</param>
|
||||
/// <returns><b>true</b> if the client is expected to keep sending data samples, <b>false</b> otherwise.</returns>
|
||||
|
@ -46,7 +49,8 @@
|
|||
string instrumentationKey,
|
||||
string configurationETag,
|
||||
string authApiKey,
|
||||
string authToken,
|
||||
out CollectionConfigurationInfo configurationInfo,
|
||||
CollectionConfigurationError[] collectionConfigurationErrors);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,8 +34,10 @@
|
|||
|
||||
private readonly List<CollectionConfigurationError> collectionConfigurationErrors = new List<CollectionConfigurationError>();
|
||||
|
||||
private readonly TelemetryConfiguration telemetryConfiguration;
|
||||
|
||||
private DateTimeOffset lastSuccessfulPing;
|
||||
|
||||
|
||||
private DateTimeOffset lastSuccessfulSubmit;
|
||||
|
||||
private bool isCollectingData;
|
||||
|
@ -47,74 +49,31 @@
|
|||
private TimeSpan? latestServicePollingIntervalHint = null;
|
||||
|
||||
public QuickPulseCollectionStateManager(
|
||||
IQuickPulseServiceClient serviceClient,
|
||||
Clock timeProvider,
|
||||
QuickPulseTimings timings,
|
||||
Action onStartCollection,
|
||||
Action onStopCollection,
|
||||
Func<IList<QuickPulseDataSample>> onSubmitSamples,
|
||||
TelemetryConfiguration telemetryConfiguration,
|
||||
IQuickPulseServiceClient serviceClient,
|
||||
Clock timeProvider,
|
||||
QuickPulseTimings timings,
|
||||
Action onStartCollection,
|
||||
Action onStopCollection,
|
||||
Func<IList<QuickPulseDataSample>> onSubmitSamples,
|
||||
Action<IList<QuickPulseDataSample>> onReturnFailedSamples,
|
||||
Func<CollectionConfigurationInfo, CollectionConfigurationError[]> onUpdatedConfiguration,
|
||||
Action<Uri> onUpdatedServiceEndpoint)
|
||||
{
|
||||
if (serviceClient == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(serviceClient));
|
||||
}
|
||||
|
||||
if (timeProvider == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(timeProvider));
|
||||
}
|
||||
|
||||
if (timings == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(timings));
|
||||
}
|
||||
|
||||
if (onStartCollection == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(onStartCollection));
|
||||
}
|
||||
|
||||
if (onStopCollection == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(onStopCollection));
|
||||
}
|
||||
|
||||
if (onSubmitSamples == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(onSubmitSamples));
|
||||
}
|
||||
|
||||
if (onReturnFailedSamples == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(onReturnFailedSamples));
|
||||
}
|
||||
|
||||
if (onUpdatedConfiguration == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(onUpdatedConfiguration));
|
||||
}
|
||||
|
||||
if (onUpdatedServiceEndpoint == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(onUpdatedServiceEndpoint));
|
||||
}
|
||||
|
||||
this.serviceClient = serviceClient;
|
||||
this.timeProvider = timeProvider;
|
||||
this.timings = timings;
|
||||
this.onStartCollection = onStartCollection;
|
||||
this.onStopCollection = onStopCollection;
|
||||
this.onSubmitSamples = onSubmitSamples;
|
||||
this.onReturnFailedSamples = onReturnFailedSamples;
|
||||
this.onUpdatedConfiguration = onUpdatedConfiguration;
|
||||
this.onUpdatedServiceEndpoint = onUpdatedServiceEndpoint;
|
||||
this.telemetryConfiguration = telemetryConfiguration ?? throw new ArgumentNullException(nameof(telemetryConfiguration));
|
||||
this.serviceClient = serviceClient ?? throw new ArgumentNullException(nameof(serviceClient));
|
||||
this.timeProvider = timeProvider ?? throw new ArgumentNullException(nameof(timeProvider));
|
||||
this.timings = timings ?? throw new ArgumentNullException(nameof(timings));
|
||||
this.onStartCollection = onStartCollection ?? throw new ArgumentNullException(nameof(onStartCollection));
|
||||
this.onStopCollection = onStopCollection ?? throw new ArgumentNullException(nameof(onStopCollection));
|
||||
this.onSubmitSamples = onSubmitSamples ?? throw new ArgumentNullException(nameof(onSubmitSamples));
|
||||
this.onReturnFailedSamples = onReturnFailedSamples ?? throw new ArgumentNullException(nameof(onReturnFailedSamples));
|
||||
this.onUpdatedConfiguration = onUpdatedConfiguration ?? throw new ArgumentNullException(nameof(onUpdatedConfiguration));
|
||||
this.onUpdatedServiceEndpoint = onUpdatedServiceEndpoint ?? throw new ArgumentNullException(nameof(onUpdatedServiceEndpoint));
|
||||
|
||||
this.coolDownTimeout = TimeSpan.FromMilliseconds(timings.CollectionInterval.TotalMilliseconds / 20);
|
||||
}
|
||||
|
||||
|
||||
public bool IsCollectingData
|
||||
{
|
||||
get
|
||||
|
@ -148,6 +107,18 @@
|
|||
this.firstStateUpdate = false;
|
||||
}
|
||||
|
||||
string authToken = null;
|
||||
if (this.telemetryConfiguration.CredentialEnvelope != null)
|
||||
{
|
||||
authToken = this.telemetryConfiguration.CredentialEnvelope.GetToken();
|
||||
if (authToken == null)
|
||||
{
|
||||
// If a credential has been set on the configuration and we fail to get a token, do net send.
|
||||
QuickPulseEventSource.Log.FailedToGetAuthToken();
|
||||
return this.DetermineBackOffs();
|
||||
}
|
||||
}
|
||||
|
||||
CollectionConfigurationInfo configurationInfo;
|
||||
if (this.IsCollectingData)
|
||||
{
|
||||
|
@ -179,6 +150,7 @@
|
|||
instrumentationKey,
|
||||
this.currentConfigurationETag,
|
||||
authApiKey,
|
||||
authToken,
|
||||
out configurationInfo,
|
||||
this.collectionConfigurationErrors.ToArray());
|
||||
|
||||
|
@ -213,11 +185,12 @@
|
|||
this.timeProvider.UtcNow,
|
||||
this.currentConfigurationETag,
|
||||
authApiKey,
|
||||
authToken,
|
||||
out configurationInfo,
|
||||
out TimeSpan? servicePollingIntervalHint);
|
||||
|
||||
this.latestServicePollingIntervalHint = servicePollingIntervalHint ?? this.latestServicePollingIntervalHint;
|
||||
|
||||
|
||||
QuickPulseEventSource.Log.PingSentEvent(this.currentConfigurationETag, configurationInfo?.ETag, startCollection.ToString());
|
||||
|
||||
switch (startCollection)
|
||||
|
@ -280,7 +253,7 @@
|
|||
this.currentConfigurationETag = configurationInfo.ETag;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private TimeSpan DetermineBackOffs()
|
||||
{
|
||||
if (this.IsCollectingData)
|
||||
|
@ -318,4 +291,4 @@
|
|||
this.lastSuccessfulSubmit = this.timeProvider.UtcNow;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,10 @@
|
|||
/// </summary>
|
||||
internal static class QuickPulseConstants
|
||||
{
|
||||
internal const string AuthorizationHeaderName = "Authorization";
|
||||
|
||||
internal const string AuthorizationTokenPrefix = "Bearer ";
|
||||
|
||||
/// <summary>
|
||||
/// Subscribed header.
|
||||
/// </summary>
|
||||
|
|
|
@ -161,6 +161,16 @@
|
|||
this.WriteEvent(23, oldEtag ?? string.Empty, newEtag ?? string.Empty, configuration ?? string.Empty, e ?? string.Empty, this.applicationNameProvider.Name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Logs an error indicating that the QuickPulseServiceClient could not acquire an auth token.
|
||||
/// Full exception is logged in the Base SDK at <see cref="Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.CoreEventSource.FailedToGetToken"/>.
|
||||
/// </summary>
|
||||
[Event(24, Message = "QuickPulse failed to get an auth token. Check 'CoreEventSource.FailedToGetToken' for full exception.", Level = EventLevel.Error)]
|
||||
public void FailedToGetAuthToken(string applicationName = "dummy")
|
||||
{
|
||||
this.WriteEvent(24, this.applicationNameProvider.Name);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public class Keywords
|
||||
|
|
|
@ -195,6 +195,7 @@
|
|||
this.InitializeServiceClient(configuration);
|
||||
|
||||
this.stateManager = new QuickPulseCollectionStateManager(
|
||||
configuration,
|
||||
this.ServiceClient,
|
||||
this.timeProvider,
|
||||
this.timings,
|
||||
|
|
Загрузка…
Ссылка в новой задаче