Skip to content

Commit f2d6d48

Browse files
committed
fix issue with multiple aggregated counter for monitoring
1 parent 25b5c2e commit f2d6d48

File tree

4 files changed

+40
-9
lines changed

4 files changed

+40
-9
lines changed

Hangfire.MemoryStorage.nuspec

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
33
<metadata>
44
<id>Hangfire.MemoryStorage</id>
5-
<version>1.8.0.0</version>
5+
<version>1.8.1.0</version>
66
<title>Hangfire.MemoryStorage</title>
77
<authors>PERRICHOT Florian</authors>
88
<owners>PERRICHOT Florian</owners>
9-
<license type="expression">APACHE LICENSE, VERSION 2.0</license>
9+
<licenseUrl>https://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
1010
<projectUrl>https://github.com/perrich/Hangfire.MemoryStorage</projectUrl>
1111
<requireLicenseAcceptance>false</requireLicenseAcceptance>
1212
<description>A memory storage for Hangfire</description>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
using Hangfire.MemoryStorage.Database;
3+
using Hangfire.MemoryStorage.Dto;
4+
using Hangfire.MemoryStorage;
5+
6+
namespace Hangfire.MemoryStorage.UnitTest;
7+
8+
public class MemoryStorageMonitoringApiTests
9+
{
10+
private Data data;
11+
private MemoryStorageMonitoringApi monitoringApi;
12+
13+
public MemoryStorageMonitoringApiTests()
14+
{
15+
data = new Data();
16+
monitoringApi = new MemoryStorageMonitoringApi(data);
17+
}
18+
19+
[Fact]
20+
public void MonitoringShouldReturnSumOfCounterIfTwoAggregatedCounterDtoHaveSameKey()
21+
{
22+
var key = string.Format("stats:succeeded:{0}", DateTime.UtcNow.AddHours(-2).ToString("yyyy-MM-dd-HH"));
23+
data.Create(new AggregatedCounterDto { Id = 1, Key = key, Value = 5 });
24+
data.Create(new AggregatedCounterDto { Id = 2, Key = key, Value = 2 }); // Creation in CountersAggregator can produce two object in concurrent environment
25+
26+
var stats = monitoringApi.HourlySucceededJobs().ToArray();
27+
Assert.Equal(7, stats[2].Value);
28+
}
29+
}

src/Hangfire.MemoryStorage/Hangfire.MemoryStorage.csproj

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
<PropertyGroup>
44
<Description>A memory storage for Hangfire</Description>
5-
<Copyright>Copyright 2015-2023</Copyright>
5+
<Copyright>Copyright 2015-2024</Copyright>
66
<AssemblyTitle>Hangfire.MemoryStorage</AssemblyTitle>
7-
<VersionPrefix>1.8.0</VersionPrefix>
7+
<VersionPrefix>1.8.1</VersionPrefix>
88
<Authors>PERRICHOT Florian</Authors>
99
<TargetFrameworks>net45;netstandard1.3</TargetFrameworks>
1010
<AssemblyName>Hangfire.MemoryStorage</AssemblyName>
@@ -14,8 +14,8 @@
1414
<RepositoryType>git</RepositoryType>
1515
<RepositoryUrl>https://github.com/perrich/Hangfire.MemoryStorage</RepositoryUrl>
1616
<NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
17-
<Version>1.8.0</Version>
18-
<AssemblyVersion>1.8.0.0</AssemblyVersion>
17+
<Version>1.8.1</Version>
18+
<AssemblyVersion>1.8.1.0</AssemblyVersion>
1919
</PropertyGroup>
2020

2121
<ItemGroup>

src/Hangfire.MemoryStorage/MemoryStorageMonitoringApi.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,11 @@ private Dictionary<DateTime, long> GetTimelineStats(List<DateTime> dates,
285285
var counters = _data.GetEnumeration<AggregatedCounterDto>();
286286
var keyMap = dates.ToDictionary(formatorAction, x => x);
287287

288-
var valuesMap = (from c in counters
289-
where keyMap.Keys.Contains(c.Key)
290-
select c).ToDictionary(o => o.Key, o => o.Value);
288+
var valuesMap = counters
289+
.Where(c => keyMap.Keys.Contains(c.Key))
290+
.GroupBy(c => c.Key)
291+
.Select(g => new { g.Key, Sum = g.Sum(c => c.Value) })
292+
.ToDictionary(o => o.Key, o => o.Sum);
291293

292294
foreach (var key in keyMap.Keys.Where(key => !valuesMap.ContainsKey(key)))
293295
{

0 commit comments

Comments
 (0)