Skip to content

Commit b790256

Browse files
authored
Track the count of failed invocations since last successful policy snapshot (#88398)
Add tracking for the number of invocations that have passed between a successful SLM snapshot and the most recent failure. These stats would be helpful for reporting on SLM policy health.
1 parent ba46bd4 commit b790256

File tree

4 files changed

+43
-6
lines changed

4 files changed

+43
-6
lines changed

docs/changelog/88398.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 88398
2+
summary: Track the count of failed invocations since last successful policy snapshot
3+
area: ILM+SLM
4+
type: enhancement
5+
issues: []

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/slm/SnapshotLifecyclePolicyMetadata.java

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package org.elasticsearch.xpack.core.slm;
99

10+
import org.elasticsearch.Version;
1011
import org.elasticsearch.cluster.SimpleDiffable;
1112
import org.elasticsearch.common.io.stream.StreamInput;
1213
import org.elasticsearch.common.io.stream.StreamOutput;
@@ -40,6 +41,7 @@ public class SnapshotLifecyclePolicyMetadata implements SimpleDiffable<SnapshotL
4041
static final ParseField MODIFIED_DATE = new ParseField("modified_date");
4142
static final ParseField LAST_SUCCESS = new ParseField("last_success");
4243
static final ParseField LAST_FAILURE = new ParseField("last_failure");
44+
static final ParseField INVOCATIONS_SINCE_LAST_SUCCESS = new ParseField("invocations_since_last_success");
4345
static final ParseField NEXT_EXECUTION_MILLIS = new ParseField("next_execution_millis");
4446
static final ParseField NEXT_EXECUTION = new ParseField("next_execution");
4547

@@ -51,6 +53,7 @@ public class SnapshotLifecyclePolicyMetadata implements SimpleDiffable<SnapshotL
5153
private final SnapshotInvocationRecord lastSuccess;
5254
@Nullable
5355
private final SnapshotInvocationRecord lastFailure;
56+
private final long invocationsSinceLastSuccess;
5457

5558
@SuppressWarnings("unchecked")
5659
public static final ConstructingObjectParser<SnapshotLifecyclePolicyMetadata, String> PARSER = new ConstructingObjectParser<>(
@@ -66,6 +69,7 @@ public class SnapshotLifecyclePolicyMetadata implements SimpleDiffable<SnapshotL
6669
.setModifiedDate((long) a[3])
6770
.setLastSuccess(lastSuccess)
6871
.setLastFailure(lastFailure)
72+
.setInvocationsSinceLastSuccess(a[6] == null ? 0L : ((long) a[6]))
6973
.build();
7074
}
7175
);
@@ -77,6 +81,7 @@ public class SnapshotLifecyclePolicyMetadata implements SimpleDiffable<SnapshotL
7781
PARSER.declareLong(ConstructingObjectParser.constructorArg(), MODIFIED_DATE_MILLIS);
7882
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), SnapshotInvocationRecord::parse, LAST_SUCCESS);
7983
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), SnapshotInvocationRecord::parse, LAST_FAILURE);
84+
PARSER.declareLong(ConstructingObjectParser.optionalConstructorArg(), INVOCATIONS_SINCE_LAST_SUCCESS);
8085
}
8186

8287
public static SnapshotLifecyclePolicyMetadata parse(XContentParser parser, String name) {
@@ -89,7 +94,8 @@ public static SnapshotLifecyclePolicyMetadata parse(XContentParser parser, Strin
8994
long version,
9095
long modifiedDate,
9196
SnapshotInvocationRecord lastSuccess,
92-
SnapshotInvocationRecord lastFailure
97+
SnapshotInvocationRecord lastFailure,
98+
long invocationsSinceLastSuccess
9399
) {
94100
this.policy = policy;
95101
this.headers = headers;
@@ -98,6 +104,7 @@ public static SnapshotLifecyclePolicyMetadata parse(XContentParser parser, Strin
98104
this.modifiedDate = modifiedDate;
99105
this.lastSuccess = lastSuccess;
100106
this.lastFailure = lastFailure;
107+
this.invocationsSinceLastSuccess = invocationsSinceLastSuccess;
101108
}
102109

103110
@SuppressWarnings("unchecked")
@@ -109,6 +116,7 @@ public static SnapshotLifecyclePolicyMetadata parse(XContentParser parser, Strin
109116
this.modifiedDate = in.readVLong();
110117
this.lastSuccess = in.readOptionalWriteable(SnapshotInvocationRecord::new);
111118
this.lastFailure = in.readOptionalWriteable(SnapshotInvocationRecord::new);
119+
this.invocationsSinceLastSuccess = in.getVersion().onOrAfter(Version.V_8_4_0) ? in.readVLong() : 0L;
112120
}
113121

114122
@Override
@@ -119,6 +127,9 @@ public void writeTo(StreamOutput out) throws IOException {
119127
out.writeVLong(this.modifiedDate);
120128
out.writeOptionalWriteable(this.lastSuccess);
121129
out.writeOptionalWriteable(this.lastFailure);
130+
if (out.getVersion().onOrAfter(Version.V_8_4_0)) {
131+
out.writeVLong(this.invocationsSinceLastSuccess);
132+
}
122133
}
123134

124135
public static Builder builder() {
@@ -134,7 +145,8 @@ public static Builder builder(SnapshotLifecyclePolicyMetadata metadata) {
134145
.setVersion(metadata.getVersion())
135146
.setModifiedDate(metadata.getModifiedDate())
136147
.setLastSuccess(metadata.getLastSuccess())
137-
.setLastFailure(metadata.getLastFailure());
148+
.setLastFailure(metadata.getLastFailure())
149+
.setInvocationsSinceLastSuccess(metadata.getInvocationsSinceLastSuccess());
138150
}
139151

140152
public Map<String, String> getHeaders() {
@@ -165,6 +177,10 @@ public SnapshotInvocationRecord getLastFailure() {
165177
return lastFailure;
166178
}
167179

180+
public long getInvocationsSinceLastSuccess() {
181+
return invocationsSinceLastSuccess;
182+
}
183+
168184
@Override
169185
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
170186
builder.startObject();
@@ -178,13 +194,14 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
178194
if (Objects.nonNull(lastFailure)) {
179195
builder.field(LAST_FAILURE.getPreferredName(), lastFailure);
180196
}
197+
builder.field(INVOCATIONS_SINCE_LAST_SUCCESS.getPreferredName(), invocationsSinceLastSuccess);
181198
builder.endObject();
182199
return builder;
183200
}
184201

185202
@Override
186203
public int hashCode() {
187-
return Objects.hash(policy, headers, version, modifiedDate, lastSuccess, lastFailure);
204+
return Objects.hash(policy, headers, version, modifiedDate, lastSuccess, lastFailure, invocationsSinceLastSuccess);
188205
}
189206

190207
@Override
@@ -201,7 +218,8 @@ public boolean equals(Object obj) {
201218
&& Objects.equals(version, other.version)
202219
&& Objects.equals(modifiedDate, other.modifiedDate)
203220
&& Objects.equals(lastSuccess, other.lastSuccess)
204-
&& Objects.equals(lastFailure, other.lastFailure);
221+
&& Objects.equals(lastFailure, other.lastFailure)
222+
&& Objects.equals(invocationsSinceLastSuccess, other.invocationsSinceLastSuccess);
205223
}
206224

207225
@Override
@@ -222,6 +240,7 @@ private Builder() {}
222240
private Long modifiedDate;
223241
private SnapshotInvocationRecord lastSuccessDate;
224242
private SnapshotInvocationRecord lastFailureDate;
243+
private long invocationsSinceLastSuccess = 0L;
225244

226245
public Builder setPolicy(SnapshotLifecyclePolicy policy) {
227246
this.policy = policy;
@@ -253,14 +272,20 @@ public Builder setLastFailure(SnapshotInvocationRecord lastFailure) {
253272
return this;
254273
}
255274

275+
public Builder setInvocationsSinceLastSuccess(long invocationsSinceLastSuccess) {
276+
this.invocationsSinceLastSuccess = invocationsSinceLastSuccess;
277+
return this;
278+
}
279+
256280
public SnapshotLifecyclePolicyMetadata build() {
257281
return new SnapshotLifecyclePolicyMetadata(
258282
Objects.requireNonNull(policy),
259283
Optional.ofNullable(headers).orElse(new HashMap<>()),
260284
version,
261285
Objects.requireNonNull(modifiedDate, "modifiedDate must be set"),
262286
lastSuccessDate,
263-
lastFailureDate
287+
lastFailureDate,
288+
invocationsSinceLastSuccess
264289
);
265290
}
266291
}

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/slm/SnapshotLifecyclePolicyMetadataTests.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,16 @@ public static SnapshotLifecyclePolicyMetadata createRandomPolicyMetadata(String
8484
if (randomBoolean()) {
8585
builder.setHeaders(randomHeaders());
8686
}
87-
if (randomBoolean()) {
87+
boolean hasSuccess = randomBoolean();
88+
if (hasSuccess) {
8889
builder.setLastSuccess(randomSnapshotInvocationRecord());
90+
builder.setInvocationsSinceLastSuccess(0L);
8991
}
9092
if (randomBoolean()) {
9193
builder.setLastFailure(randomSnapshotInvocationRecord());
94+
if (hasSuccess) {
95+
builder.setInvocationsSinceLastSuccess(randomLongBetween(1, Long.MAX_VALUE));
96+
}
9297
}
9398
return builder.build();
9499
}

x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/slm/SnapshotLifecycleTask.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,11 @@ public ClusterState execute(ClusterState currentState) throws Exception {
276276
exception.map(SnapshotLifecycleTask::exceptionToString).orElse(null)
277277
)
278278
);
279+
newPolicyMetadata.setInvocationsSinceLastSuccess(policyMetadata.getInvocationsSinceLastSuccess() + 1L);
279280
} else {
280281
stats.snapshotTaken(policyName);
281282
newPolicyMetadata.setLastSuccess(new SnapshotInvocationRecord(snapshotName, snapshotStartTime, snapshotFinishTime, null));
283+
newPolicyMetadata.setInvocationsSinceLastSuccess(0L);
282284
}
283285

284286
snapLifecycles.put(policyName, newPolicyMetadata.build());

0 commit comments

Comments
 (0)