Skip to content

Commit 55fe623

Browse files
authored
Merge branch 'master' into config_restart
2 parents fdaf294 + 53172dc commit 55fe623

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed

Cognite.Extensions/CogniteUtils.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
using System.Threading;
88
using System.Threading.Tasks;
99
using Cognite.Extensions.DataModels;
10+
using Cognite.Extensions.DataModels.CogniteExtractorExtensions;
1011
using Cognite.Extractor.Common;
1112
using CogniteSdk;
12-
using CogniteSdk.Alpha;
1313
using Microsoft.Extensions.DependencyInjection;
1414
using Microsoft.Extensions.Logging;
1515
using Microsoft.Extensions.Logging.Abstractions;
@@ -665,6 +665,8 @@ public static void AddExtensionLoggers(this IServiceProvider provider)
665665
EventExtensions.SetLogger(logger);
666666
SequenceExtensions.SetLogger(logger);
667667
StreamRecordExtensions.SetLogger(logger);
668+
DataModelUtils.SetLogger(logger);
669+
DataPointExtensionsWithInstanceId.SetLogger(logger);
668670
}
669671
}
670672

ExtractorUtils.Test/TestUtilities.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Threading;
66
using System.Threading.Tasks;
77
using Cognite.Extractor.StateStorage;
8+
using Microsoft.Extensions.Logging;
89
using Moq;
910
using Moq.Protected;
1011
using Xunit;
@@ -29,6 +30,24 @@ public static (Mock<IHttpClientFactory> factory, Mock<HttpMessageHandler> handle
2930
}
3031
}
3132

33+
#nullable enable
34+
public sealed class FakeLogger<T> : ILogger<T>
35+
{
36+
public List<(LogLevel Level, string Message)> Entries { get; } = new List<(LogLevel Level, string Message)>();
37+
38+
IDisposable ILogger.BeginScope<TState>(TState state) => NullScope.Instance;
39+
bool ILogger.IsEnabled(LogLevel logLevel) => true;
40+
void ILogger.Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
41+
=> Entries.Add((logLevel, formatter(state, exception)));
42+
43+
private sealed class NullScope : IDisposable
44+
{
45+
public static readonly NullScope Instance = new NullScope();
46+
public void Dispose() { }
47+
}
48+
}
49+
#nullable restore
50+
3251
public class DummyExtractionStore : IExtractionStateStore
3352
{
3453
public int DeleteRequests { get; private set; }

ExtractorUtils.Test/unit/MetricsTest.cs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
using System.Threading;
66
using System.Threading.Tasks;
77
using Microsoft.Extensions.DependencyInjection;
8+
using Microsoft.Extensions.Logging;
89
using Moq;
910
using Moq.Protected;
1011
using Prometheus;
1112
using Xunit;
12-
using Cognite.Extractor.Logging;
1313
using Cognite.Extractor.Metrics;
1414
using Cognite.Extractor.Utils;
1515
using System.Reflection;
@@ -245,6 +245,65 @@ public async Task TestMultipeGatewaysAsync()
245245
File.Delete(path);
246246
}
247247

248+
[Fact]
249+
public async Task TestRetryPolicyRetriesOnTransientErrorAsync()
250+
{
251+
Metrics.SuppressDefaultMetrics();
252+
var callCount = 0;
253+
var (provider, logger) = BuildRetryTestServices((request, token) =>
254+
{
255+
var status = callCount++ == 0 ? HttpStatusCode.ServiceUnavailable : HttpStatusCode.OK;
256+
return Task.FromResult(new HttpResponseMessage(status));
257+
});
258+
259+
using (provider)
260+
await provider.GetRequiredService<IHttpClientFactory>()
261+
.CreateClient("prometheus-httpclient").GetAsync("http://example.com/test");
262+
263+
Assert.Equal(2, callCount);
264+
Assert.Contains(logger.Entries, e => e.Level == LogLevel.Warning && e.Message.Contains("failed with status code"));
265+
}
266+
267+
[Fact]
268+
public async Task TestRetryPolicyRetriesOnExceptionAsync()
269+
{
270+
Metrics.SuppressDefaultMetrics();
271+
var callCount = 0;
272+
var (provider, logger) = BuildRetryTestServices((request, token) =>
273+
{
274+
if (callCount++ == 0)
275+
throw new HttpRequestException("connection failed", new Exception("inner failure"));
276+
return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK));
277+
});
278+
279+
using (provider)
280+
await provider.GetRequiredService<IHttpClientFactory>()
281+
.CreateClient("prometheus-httpclient").GetAsync("http://example.com/test");
282+
283+
Assert.Equal(2, callCount);
284+
Assert.Contains(logger.Entries, e => e.Level == LogLevel.Warning && e.Message.Contains("connection failed"));
285+
Assert.Contains(logger.Entries, e => e.Level == LogLevel.Debug && e.Message.Contains("inner failure"));
286+
}
287+
288+
private (ServiceProvider provider, FakeLogger<MetricServer> logger) BuildRetryTestServices(
289+
Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> handler)
290+
{
291+
var fakeLogger = new FakeLogger<MetricServer>();
292+
var services = new ServiceCollection();
293+
services.AddTestLogging(_output);
294+
services.AddSingleton<ILogger<MetricServer>>(fakeLogger);
295+
services.AddCogniteMetrics();
296+
services.AddHttpClient("prometheus-httpclient")
297+
.ConfigurePrimaryHttpMessageHandler(() => new TestHttpHandler(handler));
298+
return (services.BuildServiceProvider(), fakeLogger);
299+
}
300+
301+
private sealed class TestHttpHandler(Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> handler) : HttpMessageHandler
302+
{
303+
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
304+
=> handler(request, cancellationToken);
305+
}
306+
248307
[Fact]
249308
public void TestVersion()
250309
{
@@ -257,5 +316,6 @@ public void TestVersion()
257316
// Assert.False(string.IsNullOrWhiteSpace(desc));
258317
// Assert.NotEqual(version.Trim(), desc.Trim());
259318
}
319+
260320
}
261321
}

version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.40.0
1+
1.41.0

0 commit comments

Comments
 (0)