Skip to content

Commit f428655

Browse files
committed
Fix only returning events once
1 parent ceb86af commit f428655

File tree

4 files changed

+34
-35
lines changed

4 files changed

+34
-35
lines changed

source/Octopus.Tentacle.Contracts/ScriptStatusResponse.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using Newtonsoft.Json;
45

56
namespace Octopus.Tentacle.Contracts
@@ -18,6 +19,7 @@ public enum ProcessOutputSource
1819
Debug
1920
}
2021

22+
[DebuggerDisplay("{Occurred} | {Source} | {Text}")]
2123
public class ProcessOutput
2224
{
2325
public ProcessOutput(ProcessOutputSource source, string text) : this(source, text, DateTimeOffset.UtcNow)

source/Octopus.Tentacle/Kubernetes/EventHelpers.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,6 @@ public static class EventHelpers
1818
.OrderByDescending(dt => dt!.Value)
1919
.FirstOrDefault();
2020
}
21-
22-
23-
public static DateTime? GetEarliestTimestampInEvent(Corev1Event kEvent)
24-
{
25-
return new List<DateTime?>
26-
{
27-
kEvent.EventTime,
28-
kEvent.LastTimestamp,
29-
kEvent.FirstTimestamp
30-
}.Where(dt => dt.HasValue)
31-
.OrderByDescending(dt => dt!.Value)
32-
.FirstOrDefault();
33-
}
3421

3522
public static string MetricSourceMapper(Corev1Event kEvent)
3623
{

source/Octopus.Tentacle/Kubernetes/IKubernetesPodLogService.cs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public KubernetesPodLogService(
5151
if (podLogs.Outputs.Any())
5252
{
5353
var nextSinceTime = podLogs.Outputs.Max(o => o.Occurred);
54-
scriptPodSinceTimeStore.UpdateSinceTime(scriptTicket, nextSinceTime);
54+
scriptPodSinceTimeStore.UpdatePodLogsSinceTime(scriptTicket, nextSinceTime);
5555

5656
//We can use our EOS marker to detect completion quicker than the Pod status
5757
if (podLogs.ExitCode != null)
@@ -72,7 +72,7 @@ public KubernetesPodLogService(
7272

7373
async Task<(IReadOnlyCollection<ProcessOutput> Outputs, long NextSequenceNumber, int? ExitCode)> GetPodLogs()
7474
{
75-
var sinceTime = scriptPodSinceTimeStore.GetSinceTime(scriptTicket);
75+
var sinceTime = scriptPodSinceTimeStore.GetPodLogsSinceTime(scriptTicket);
7676
try
7777
{
7878
return await GetPodLogsWithSinceTime(sinceTime);
@@ -103,7 +103,7 @@ public KubernetesPodLogService(
103103

104104
async Task<IEnumerable<ProcessOutput>> GetPodEvents(ScriptTicket scriptTicket, string podName, CancellationToken cancellationToken)
105105
{
106-
var sinceTime = scriptPodSinceTimeStore.GetSinceTime(scriptTicket);
106+
var sinceTime = scriptPodSinceTimeStore.GetPodEventsSinceTime(scriptTicket);
107107

108108
var allEvents = await eventService.FetchAllEventsAsync(KubernetesConfig.Namespace, podName, cancellationToken);
109109
if (allEvents is null)
@@ -112,18 +112,26 @@ async Task<IEnumerable<ProcessOutput>> GetPodEvents(ScriptTicket scriptTicket, s
112112
}
113113

114114
var relevantEvents = allEvents.Items
115-
.Select(e=> (e, EventHelpers.GetEarliestTimestampInEvent(e)))
116-
.Where(x => x.Item2.HasValue)
117-
.Select(x => (x.e, new DateTimeOffset(x.Item2!.Value, TimeSpan.Zero)))
118-
.OrderBy(x => x.Item2)
119-
.SkipWhile(e => e.Item2 < sinceTime);
115+
.Select(e=> (Event: e, Occurred: EventHelpers.GetLatestTimestampInEvent(e)))
116+
.Where(x => x.Occurred.HasValue)
117+
.Select(x => (x.Event, Occurred: new DateTimeOffset(x.Occurred!.Value, TimeSpan.Zero)))
118+
.OrderBy(x => x.Occurred)
119+
.SkipWhile(e => e.Occurred <= sinceTime);
120120

121-
return relevantEvents.Select((x) =>
121+
var events = relevantEvents.Select((x) =>
122122
{
123123
var (ev, occurred) = x;
124-
return new ProcessOutput(ProcessOutputSource.Debug, $"{ev.Reason} - {ev.Message}", occurred);
124+
return new ProcessOutput(ProcessOutputSource.Debug, $"{ev.Reason} | {ev.Message} (Count: {ev.Count})", occurred);
125125
})
126126
.ToArray();
127+
128+
if (events.Any())
129+
{
130+
//update the events since time, so we don't get duplicate events
131+
scriptPodSinceTimeStore.UpdatePodEventsSinceTime(scriptTicket,events.Max(o => o.Occurred));
132+
}
133+
134+
return events;
127135
}
128136

129137
async Task<Stream?> GetLogStream(string podName, DateTimeOffset? sinceTime, CancellationToken cancellationToken)

source/Octopus.Tentacle/Kubernetes/ScriptPodSinceTimeStore.cs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,30 @@ namespace Octopus.Tentacle.Kubernetes
66
{
77
public interface IScriptPodSinceTimeStore
88
{
9-
DateTimeOffset? GetSinceTime(ScriptTicket scriptTicket);
10-
void UpdateSinceTime(ScriptTicket scriptTicket, DateTimeOffset nextSinceTime);
9+
DateTimeOffset? GetPodLogsSinceTime(ScriptTicket scriptTicket);
10+
void UpdatePodLogsSinceTime(ScriptTicket scriptTicket, DateTimeOffset nextSinceTime);
11+
DateTimeOffset? GetPodEventsSinceTime(ScriptTicket scriptTicket);
12+
void UpdatePodEventsSinceTime(ScriptTicket scriptTicket, DateTimeOffset nextSinceTime);
1113
void Delete(ScriptTicket scriptTicket);
1214
}
1315

1416
public class ScriptPodSinceTimeStore : IScriptPodSinceTimeStore
1517
{
16-
readonly ConcurrentDictionary<ScriptTicket, DateTimeOffset?> sinceTimes = new();
18+
readonly ConcurrentDictionary<ScriptTicket, DateTimeOffset?> logsSinceTimes = new();
19+
readonly ConcurrentDictionary<ScriptTicket, DateTimeOffset?> eventsSinceTimes = new();
1720

18-
public DateTimeOffset? GetSinceTime(ScriptTicket scriptTicket)
19-
{
20-
return sinceTimes.GetOrAdd(scriptTicket, _ => null);
21-
}
21+
public DateTimeOffset? GetPodLogsSinceTime(ScriptTicket scriptTicket) => logsSinceTimes.GetOrAdd(scriptTicket, _ => null);
2222

23-
public void UpdateSinceTime(ScriptTicket scriptTicket, DateTimeOffset nextSinceTime)
24-
{
25-
sinceTimes[scriptTicket] = nextSinceTime;
26-
}
23+
public void UpdatePodLogsSinceTime(ScriptTicket scriptTicket, DateTimeOffset nextSinceTime) => logsSinceTimes[scriptTicket] = nextSinceTime;
24+
25+
public DateTimeOffset? GetPodEventsSinceTime(ScriptTicket scriptTicket) => eventsSinceTimes.GetOrAdd(scriptTicket, _ => null);
26+
27+
public void UpdatePodEventsSinceTime(ScriptTicket scriptTicket, DateTimeOffset nextSinceTime)=> eventsSinceTimes[scriptTicket] = nextSinceTime;
2728

2829
public void Delete(ScriptTicket scriptTicket)
2930
{
30-
sinceTimes.TryRemove(scriptTicket, out _);
31+
logsSinceTimes.TryRemove(scriptTicket, out _);
32+
eventsSinceTimes.TryRemove(scriptTicket, out _);
3133
}
3234
}
3335
}

0 commit comments

Comments
 (0)