17
17
package com .netflix .hollow .api .consumer .metrics ;
18
18
19
19
import static com .netflix .hollow .core .HollowConstants .VERSION_NONE ;
20
+ import static com .netflix .hollow .core .HollowStateEngine .HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER ;
20
21
import static com .netflix .hollow .core .HollowStateEngine .HEADER_TAG_METRIC_ANNOUNCEMENT ;
21
22
import static com .netflix .hollow .core .HollowStateEngine .HEADER_TAG_METRIC_CYCLE_START ;
22
23
@@ -59,12 +60,15 @@ public abstract class AbstractRefreshMetricsListener extends AbstractRefreshList
59
60
private final Map <Long , Long > announcementTimestamps ;
60
61
private volatile boolean namespacePinnedPreviously ;
61
62
63
+ private final Map <Long , Long > cycleVersionDeltaCounters ; // delta chain version counter for each cycle version
64
+
62
65
public AbstractRefreshMetricsListener () {
63
66
lastRefreshTimeNanoOptional = OptionalLong .empty ();
64
67
consecutiveFailures = 0l ;
65
68
cycleVersionStartTimes = new HashMap <>();
66
69
announcementTimestamps = new HashMap <>();
67
70
namespacePinnedPreviously = false ;
71
+ cycleVersionDeltaCounters = new HashMap <>();
68
72
}
69
73
70
74
public void refreshStarted (long currentVersion , long requestedVersion ) {
@@ -73,7 +77,9 @@ public void refreshStarted(long currentVersion, long requestedVersion) {
73
77
refreshMetricsBuilder = new ConsumerRefreshMetrics .Builder ();
74
78
refreshMetricsBuilder .setIsInitialLoad (currentVersion == VERSION_NONE );
75
79
refreshMetricsBuilder .setUpdatePlanDetails (updatePlanDetails );
76
- cycleVersionStartTimes .clear (); // clear map to avoid accumulation over time
80
+ // clear maps to avoid accumulation over time
81
+ cycleVersionStartTimes .clear ();
82
+ cycleVersionDeltaCounters .clear ();
77
83
}
78
84
79
85
@ Override
@@ -91,7 +97,7 @@ public void versionDetected(HollowConsumer.VersionInfo requestedVersionInfo) {
91
97
// or for the newVersion). Don't record this metric when a namespace was pinned previously and gets unpinned
92
98
// in the next cycle because this metric will record the refresh duration from the latest announced version.
93
99
if (!(namespacePinnedPreviously || isPinned )) {
94
- trackTimestampsFromHeaders (requestedVersionInfo .getVersion (),
100
+ trackHeaderTagInVersion (requestedVersionInfo .getVersion (),
95
101
requestedVersionInfo .getAnnouncementMetadata ().get (), HEADER_TAG_METRIC_ANNOUNCEMENT , announcementTimestamps );
96
102
}
97
103
namespacePinnedPreviously = isPinned ;
@@ -160,6 +166,9 @@ public void refreshSuccessful(long beforeVersion, long afterVersion, long reques
160
166
if (cycleVersionStartTimes .containsKey (afterVersion )) {
161
167
refreshMetricsBuilder .setCycleStartTimestamp (cycleVersionStartTimes .get (afterVersion ));
162
168
}
169
+ if (cycleVersionDeltaCounters .containsKey (afterVersion )) {
170
+ refreshMetricsBuilder .setDeltaChainVersionCounter (cycleVersionDeltaCounters .get (afterVersion ));
171
+ }
163
172
164
173
if (afterVersion == requestedVersion && announcementTimestamps .containsKey (afterVersion )) {
165
174
refreshMetricsBuilder .setAnnouncementTimestamp (announcementTimestamps .get (afterVersion ));
@@ -186,32 +195,37 @@ public void refreshFailed(long beforeVersion, long afterVersion, long requestedV
186
195
if (cycleVersionStartTimes .containsKey (afterVersion )) {
187
196
refreshMetricsBuilder .setCycleStartTimestamp (cycleVersionStartTimes .get (afterVersion ));
188
197
}
198
+ if (cycleVersionDeltaCounters .containsKey (afterVersion )) {
199
+ refreshMetricsBuilder .setDeltaChainVersionCounter (cycleVersionDeltaCounters .get (afterVersion ));
200
+ }
189
201
190
202
noFailRefreshEndMetricsReporting (refreshMetricsBuilder .build ());
191
203
}
192
204
193
205
@ Override
194
206
public void snapshotUpdateOccurred (HollowAPI refreshAPI , HollowReadStateEngine stateEngine , long version ) {
195
- trackTimestampsFromHeaders (version , stateEngine .getHeaderTags (), HEADER_TAG_METRIC_CYCLE_START , cycleVersionStartTimes );
207
+ trackHeaderTagInVersion (version , stateEngine .getHeaderTags (), HEADER_TAG_METRIC_CYCLE_START , cycleVersionStartTimes );
208
+ trackHeaderTagInVersion (version , stateEngine .getHeaderTags (), HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER , cycleVersionDeltaCounters );
196
209
}
197
210
198
211
@ Override
199
212
public void deltaUpdateOccurred (HollowAPI refreshAPI , HollowReadStateEngine stateEngine , long version ) {
200
- trackTimestampsFromHeaders (version , stateEngine .getHeaderTags (), HEADER_TAG_METRIC_CYCLE_START , cycleVersionStartTimes );
213
+ trackHeaderTagInVersion (version , stateEngine .getHeaderTags (), HEADER_TAG_METRIC_CYCLE_START , cycleVersionStartTimes );
214
+ trackHeaderTagInVersion (version , stateEngine .getHeaderTags (), HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER , cycleVersionDeltaCounters );
201
215
}
202
216
203
217
/**
204
- * If the blob header contains the timestamps like producer cycle start and announcement then save those values in
205
- * the maps tracking version to cycle start time and version to announcement respectively .
218
+ * If the blob header contains a value for the given header tag ( like producer cycle start time) then save that value in
219
+ * a maps tracking the value per version in this refresh .
206
220
*/
207
- private void trackTimestampsFromHeaders (long version , Map <String , String > headers , String headerTag , Map <Long , Long > timestampsMap ) {
221
+ private void trackHeaderTagInVersion (long version , Map <String , String > headers , String headerTag , Map <Long , Long > tracker ) {
208
222
if (headers != null ) {
209
223
String headerTagValue = headers .get (headerTag );
210
224
if (headerTagValue != null && !headerTagValue .isEmpty ()) {
211
225
try {
212
- Long timestamp = Long .valueOf (headerTagValue );
213
- if (timestamp != null ) {
214
- timestampsMap .put (version , timestamp );
226
+ Long val = Long .valueOf (headerTagValue );
227
+ if (val != null ) {
228
+ tracker .put (version , val );
215
229
}
216
230
} catch (NumberFormatException e ) {
217
231
log .log (Level .WARNING , "Blob header contained " + headerTag + " but its value could"
0 commit comments