Skip to content

Commit f70f6cc

Browse files
author
Conor Landry
committed
expose external refresh stats through rest api
1 parent 6e0242e commit f70f6cc

File tree

10 files changed

+94
-29
lines changed

10 files changed

+94
-29
lines changed

rest-api-spec/src/main/resources/rest-api-spec/test/cat.shards/10_basic.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
merges.total_time .+ \n
5353
refresh.total .+ \n
5454
refresh.time .+ \n
55+
refresh.external_total .+ \n
56+
refresh.external_time .+ \n
5557
refresh.listeners .+ \n
5658
search.fetch_current .+ \n
5759
search.fetch_time .+ \n

server/src/main/java/org/elasticsearch/index/refresh/RefreshStats.java

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public class RefreshStats implements Streamable, ToXContentFragment {
3636

3737
private long totalTimeInMillis;
3838

39+
private long externalTotal;
40+
41+
private long externalTotalTimeInMillis;
42+
3943
/**
4044
* Number of waiting refresh listeners.
4145
*/
@@ -45,9 +49,11 @@ public RefreshStats() {
4549

4650
}
4751

48-
public RefreshStats(long total, long totalTimeInMillis, int listeners) {
52+
public RefreshStats(long total, long totalTimeInMillis, long externalTotal, long externalTotalTimeInMillis, int listeners) {
4953
this.total = total;
5054
this.totalTimeInMillis = totalTimeInMillis;
55+
this.externalTotal = externalTotal;
56+
this.externalTotalTimeInMillis = externalTotalTimeInMillis;
5157
this.listeners = listeners;
5258
}
5359

@@ -61,6 +67,8 @@ public void addTotals(RefreshStats refreshStats) {
6167
}
6268
this.total += refreshStats.total;
6369
this.totalTimeInMillis += refreshStats.totalTimeInMillis;
70+
this.externalTotal += refreshStats.externalTotal;
71+
this.externalTotalTimeInMillis += refreshStats.externalTotalTimeInMillis;
6472
this.listeners += refreshStats.listeners;
6573
}
6674

@@ -71,20 +79,38 @@ public long getTotal() {
7179
return this.total;
7280
}
7381

82+
/*
83+
* The total number of external refresh executed.
84+
*/
85+
public long getExternalTotal() { return this.externalTotal; }
86+
7487
/**
75-
* The total time merges have been executed (in milliseconds).
88+
* The total time spent executing refreshes (in milliseconds).
7689
*/
7790
public long getTotalTimeInMillis() {
7891
return this.totalTimeInMillis;
7992
}
8093

8194
/**
82-
* The total time merges have been executed.
95+
* The total time spent executing external refreshes (in milliseconds).
96+
*/
97+
public long getExternalTotalTimeInMillis() {
98+
return this.externalTotalTimeInMillis;
99+
}
100+
101+
/**
102+
* The total time refreshes have been executed.
83103
*/
84104
public TimeValue getTotalTime() {
85105
return new TimeValue(totalTimeInMillis);
86106
}
87107

108+
/**
109+
* The total time external refreshes have been executed.
110+
*/
111+
public TimeValue getExternalTotalTime() {
112+
return new TimeValue(externalTotalTimeInMillis);
113+
}
88114
/**
89115
* The number of waiting refresh listeners.
90116
*/
@@ -97,6 +123,8 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
97123
builder.startObject("refresh");
98124
builder.field("total", total);
99125
builder.humanReadableField("total_time_in_millis", "total_time", getTotalTime());
126+
builder.field("external_total", externalTotal);
127+
builder.humanReadableField("external_total_time_in_millis", "external_total_time", getExternalTotalTime());
100128
builder.field("listeners", listeners);
101129
builder.endObject();
102130
return builder;
@@ -106,13 +134,17 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
106134
public void readFrom(StreamInput in) throws IOException {
107135
total = in.readVLong();
108136
totalTimeInMillis = in.readVLong();
137+
externalTotal = in.readVLong();
138+
externalTotalTimeInMillis = in.readVLong();
109139
listeners = in.readVInt();
110140
}
111141

112142
@Override
113143
public void writeTo(StreamOutput out) throws IOException {
114144
out.writeVLong(total);
115145
out.writeVLong(totalTimeInMillis);
146+
out.writeVLong(externalTotal);
147+
out.writeVLong(externalTotalTimeInMillis);
116148
out.writeVInt(listeners);
117149
}
118150

@@ -124,11 +156,13 @@ public boolean equals(Object obj) {
124156
RefreshStats rhs = (RefreshStats) obj;
125157
return total == rhs.total
126158
&& totalTimeInMillis == rhs.totalTimeInMillis
159+
&& externalTotal == rhs.externalTotal
160+
&& externalTotalTimeInMillis == rhs.externalTotalTimeInMillis
127161
&& listeners == rhs.listeners;
128162
}
129163

130164
@Override
131165
public int hashCode() {
132-
return Objects.hash(total, totalTimeInMillis, listeners);
166+
return Objects.hash(total, totalTimeInMillis, externalTotal, externalTotalTimeInMillis, listeners);
133167
}
134168
}

server/src/main/java/org/elasticsearch/index/shard/IndexShard.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,10 +221,8 @@ Runnable getGlobalCheckpointSyncer() {
221221
private RecoveryState recoveryState;
222222

223223
private final RecoveryStats recoveryStats = new RecoveryStats();
224-
225224
private final MeanMetric refreshMetric = new MeanMetric();
226225
private final MeanMetric externalRefreshMetric = new MeanMetric();
227-
228226
private final MeanMetric flushMetric = new MeanMetric();
229227
private final CounterMetric periodicFlushMetric = new CounterMetric();
230228

@@ -933,12 +931,12 @@ public long getWritingBytes() {
933931

934932
public RefreshStats refreshStats() {
935933
int listeners = refreshListeners.pendingCount();
936-
return new RefreshStats(refreshMetric.count(), TimeUnit.NANOSECONDS.toMillis(refreshMetric.sum()), listeners);
937-
}
938-
939-
public RefreshStats externalRefreshStats() {
940-
int listeners = refreshListeners.pendingCount();
941-
return new RefreshStats(externalRefreshMetric.count(), TimeUnit.NANOSECONDS.toMillis(externalRefreshMetric.sum()), listeners);
934+
return new RefreshStats(
935+
refreshMetric.count(),
936+
TimeUnit.NANOSECONDS.toMillis(refreshMetric.sum()),
937+
externalRefreshMetric.count(),
938+
TimeUnit.NANOSECONDS.toMillis(externalRefreshMetric.sum()),
939+
listeners);
942940
}
943941

944942
public FlushStats flushStats() {

server/src/main/java/org/elasticsearch/indices/IndicesService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,7 @@ static class OldShardsStats implements IndexEventListener {
699699
final GetStats getStats = new GetStats();
700700
final IndexingStats indexingStats = new IndexingStats();
701701
final MergeStats mergeStats = new MergeStats();
702+
final RefreshStats externalRefreshStats = new RefreshStats();
702703
final RefreshStats refreshStats = new RefreshStats();
703704
final FlushStats flushStats = new FlushStats();
704705
final RecoveryStats recoveryStats = new RecoveryStats();

server/src/main/java/org/elasticsearch/rest/action/cat/RestIndicesAction.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,14 @@ protected Table getTableWithHeader(final RestRequest request) {
288288
table.addCell("refresh.time", "sibling:pri;alias:rti,refreshTime;default:false;text-align:right;desc:time spent in refreshes");
289289
table.addCell("pri.refresh.time", "default:false;text-align:right;desc:time spent in refreshes");
290290

291+
table.addCell("refresh.external_total",
292+
"sibling:pri;alias:rto,refreshTotal;default:false;text-align:right;desc:total external refreshes");
293+
table.addCell("pri.refresh.external_total", "default:false;text-align:right;desc:total external refreshes");
294+
295+
table.addCell("refresh.external_time",
296+
"sibling:pri;alias:rti,refreshTime;default:false;text-align:right;desc:time spent in external refreshes");
297+
table.addCell("pri.refresh.external_time", "default:false;text-align:right;desc:time spent in external refreshes");
298+
291299
table.addCell("refresh.listeners",
292300
"sibling:pri;alias:rli,refreshListeners;default:false;text-align:right;desc:number of pending refresh listeners");
293301
table.addCell("pri.refresh.listeners", "default:false;text-align:right;desc:number of pending refresh listeners");
@@ -553,6 +561,12 @@ Table buildTable(RestRequest request, IndexMetaData[] indicesMetaData, ClusterHe
553561
table.addCell(totalStats.getRefresh() == null ? null : totalStats.getRefresh().getTotalTime());
554562
table.addCell(primaryStats.getRefresh() == null ? null : primaryStats.getRefresh().getTotalTime());
555563

564+
table.addCell(totalStats.getRefresh() == null ? null : totalStats.getRefresh().getExternalTotal());
565+
table.addCell(primaryStats.getRefresh() == null ? null : primaryStats.getRefresh().getExternalTotal());
566+
567+
table.addCell(totalStats.getRefresh() == null ? null : totalStats.getRefresh().getExternalTotalTime());
568+
table.addCell(primaryStats.getRefresh() == null ? null : primaryStats.getRefresh().getExternalTotalTime());
569+
556570
table.addCell(totalStats.getRefresh() == null ? null : totalStats.getRefresh().getListeners());
557571
table.addCell(primaryStats.getRefresh() == null ? null : primaryStats.getRefresh().getListeners());
558572

server/src/main/java/org/elasticsearch/rest/action/cat/RestNodesAction.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ protected Table getTableWithHeader(final RestRequest request) {
201201

202202
table.addCell("refresh.total", "alias:rto,refreshTotal;default:false;text-align:right;desc:total refreshes");
203203
table.addCell("refresh.time", "alias:rti,refreshTime;default:false;text-align:right;desc:time spent in refreshes");
204+
table.addCell("refresh.external_total", "alias:rto,refreshTotal;default:false;text-align:right;desc:total external refreshes");
205+
table.addCell("refresh.external_time",
206+
"alias:rti,refreshTime;default:false;text-align:right;desc:time spent in external refreshes");
204207
table.addCell("refresh.listeners", "alias:rli,refreshListeners;default:false;text-align:right;"
205208
+ "desc:number of pending refresh listeners");
206209

@@ -378,6 +381,8 @@ Table buildTable(boolean fullId, RestRequest req, ClusterStateResponse state, No
378381
RefreshStats refreshStats = indicesStats == null ? null : indicesStats.getRefresh();
379382
table.addCell(refreshStats == null ? null : refreshStats.getTotal());
380383
table.addCell(refreshStats == null ? null : refreshStats.getTotalTime());
384+
table.addCell(refreshStats == null ? null : refreshStats.getExternalTotal());
385+
table.addCell(refreshStats == null ? null : refreshStats.getExternalTotalTime());
381386
table.addCell(refreshStats == null ? null : refreshStats.getListeners());
382387

383388
ScriptStats scriptStats = stats == null ? null : stats.getScriptStats();

server/src/main/java/org/elasticsearch/rest/action/cat/RestShardsAction.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@ protected Table getTableWithHeader(final RestRequest request) {
164164

165165
table.addCell("refresh.total", "alias:rto,refreshTotal;default:false;text-align:right;desc:total refreshes");
166166
table.addCell("refresh.time", "alias:rti,refreshTime;default:false;text-align:right;desc:time spent in refreshes");
167+
table.addCell("refresh.external_total", "alias:rto,refreshTotal;default:false;text-align:right;desc:total external refreshes");
168+
table.addCell("refresh.external_time",
169+
"alias:rti,refreshTime;default:false;text-align:right;desc:time spent in external refreshes");
167170
table.addCell("refresh.listeners",
168171
"alias:rli,refreshListeners;default:false;text-align:right;desc:number of pending refresh listeners");
169172

@@ -319,6 +322,8 @@ private Table buildTable(RestRequest request, ClusterStateResponse state, Indice
319322

320323
table.addCell(getOrNull(commonStats, CommonStats::getRefresh, RefreshStats::getTotal));
321324
table.addCell(getOrNull(commonStats, CommonStats::getRefresh, RefreshStats::getTotalTime));
325+
table.addCell(getOrNull(commonStats, CommonStats::getRefresh, RefreshStats::getExternalTotal));
326+
table.addCell(getOrNull(commonStats, CommonStats::getRefresh, RefreshStats::getExternalTotalTime));
322327
table.addCell(getOrNull(commonStats, CommonStats::getRefresh, RefreshStats::getListeners));
323328

324329
table.addCell(getOrNull(commonStats, CommonStats::getSearch, i -> i.getTotal().getFetchCurrent()));

server/src/test/java/org/elasticsearch/index/refresh/RefreshStatsTests.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
public class RefreshStatsTests extends AbstractStreamableTestCase<RefreshStats> {
2525
@Override
2626
protected RefreshStats createTestInstance() {
27-
return new RefreshStats(randomNonNegativeLong(), randomNonNegativeLong(), between(0, Integer.MAX_VALUE));
27+
return new RefreshStats(randomNonNegativeLong(), randomNonNegativeLong(),
28+
randomNonNegativeLong(), randomNonNegativeLong(), between(0, Integer.MAX_VALUE));
2829
}
2930

3031
@Override
@@ -36,19 +37,23 @@ protected RefreshStats createBlankInstance() {
3637
protected RefreshStats mutateInstance(RefreshStats instance) {
3738
long total = instance.getTotal();
3839
long totalInMillis = instance.getTotalTimeInMillis();
40+
long externalTotal = instance.getExternalTotal();
41+
long externalTotalInMillis = instance.getExternalTotalTimeInMillis();
3942
int listeners = instance.getListeners();
4043
switch (randomInt(2)) {
4144
case 0:
42-
total += between(1, 2000);
45+
externalTotal += between(1, 2000);
46+
total += externalTotal + between(1, 2000);
4347
break;
4448
case 1:
45-
totalInMillis += between(1, 2000);
49+
externalTotalInMillis += between(1,2000);
50+
totalInMillis += externalTotalInMillis + between(1, 2000);
4651
break;
4752
case 2:
4853
default:
4954
listeners += between(1, 2000);
5055
break;
5156
}
52-
return new RefreshStats(total, totalInMillis, listeners);
57+
return new RefreshStats(total, totalInMillis, externalTotal, externalTotalInMillis, listeners);
5358
}
5459
}

server/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1513,28 +1513,28 @@ public void testRefreshMetric() throws IOException {
15131513

15141514
public void testExternalRefreshMetric() throws IOException {
15151515
IndexShard shard = newStartedShard();
1516-
assertThat(shard.externalRefreshStats().getTotal(), equalTo(2L)); // refresh on: finalize and end of recovery
1517-
long initialTotalTime = shard.externalRefreshStats().getTotalTimeInMillis();
1516+
assertThat(shard.refreshStats().getExternalTotal(), equalTo(2L)); // refresh on: finalize and end of recovery
1517+
long initialTotalTime = shard.refreshStats().getExternalTotalTimeInMillis();
15181518
// check time advances
1519-
for (int i = 1; shard.externalRefreshStats().getTotalTimeInMillis() == initialTotalTime; i++) {
1519+
for (int i = 1; shard.refreshStats().getExternalTotalTimeInMillis() == initialTotalTime; i++) {
15201520
indexDoc(shard, "_doc", "test");
1521-
assertThat(shard.externalRefreshStats().getTotal(), equalTo(2L + i - 1));
1521+
assertThat(shard.refreshStats().getExternalTotal(), equalTo(2L + i - 1));
15221522
shard.refresh("test");
1523-
assertThat(shard.externalRefreshStats().getTotal(), equalTo(2L + i));
1524-
assertThat(shard.externalRefreshStats().getTotalTimeInMillis(), greaterThanOrEqualTo(initialTotalTime));
1523+
assertThat(shard.refreshStats().getExternalTotal(), equalTo(2L + i));
1524+
assertThat(shard.refreshStats().getExternalTotalTimeInMillis(), greaterThanOrEqualTo(initialTotalTime));
15251525
}
1526-
long externalRefreshCount = shard.externalRefreshStats().getTotal();
1526+
long externalRefreshCount = shard.refreshStats().getExternalTotal();
15271527

15281528
indexDoc(shard, "_doc", "test");
15291529
try (Engine.GetResult ignored = shard.get(new Engine.Get(true, false, "_doc", "test",
15301530
new Term(IdFieldMapper.NAME, Uid.encodeId("test"))))) {
1531-
assertThat(shard.externalRefreshStats().getTotal(), equalTo(externalRefreshCount));
1532-
assertThat(shard.externalRefreshStats().getTotal(), equalTo(shard.refreshStats().getTotal() - 1));
1531+
assertThat(shard.refreshStats().getExternalTotal(), equalTo(externalRefreshCount));
1532+
assertThat(shard.refreshStats().getExternalTotal(), equalTo(shard.refreshStats().getTotal() - 1));
15331533
}
15341534
indexDoc(shard, "_doc", "test");
15351535
shard.writeIndexingBuffer();
1536-
assertThat(shard.externalRefreshStats().getTotal(), equalTo(externalRefreshCount));
1537-
assertThat(shard.externalRefreshStats().getTotal(), equalTo(shard.refreshStats().getTotal() - 2));
1536+
assertThat(shard.refreshStats().getExternalTotal(), equalTo(externalRefreshCount));
1537+
assertThat(shard.refreshStats().getExternalTotal(), equalTo(shard.refreshStats().getTotal() - 2));
15381538
closeShards(shard);
15391539
}
15401540

x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/indices/IndexStatsMonitoringDocTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ public void testToXContent() throws IOException {
160160
+ "\"total_size_in_bytes\":4"
161161
+ "},"
162162
+ "\"refresh\":{"
163-
+ "\"total_time_in_millis\":14"
163+
+ "\"total_time_in_millis\":14,"
164+
+ "\"external_total_time_in_millis\":14"
164165
+ "},"
165166
+ "\"query_cache\":{"
166167
+ "\"memory_size_in_bytes\":5,"
@@ -322,7 +323,7 @@ private static CommonStats mockCommonStats() {
322323
commonStats.getQueryCache().add(new QueryCacheStats(++iota, ++iota, ++iota, ++iota, no));
323324
commonStats.getRequestCache().add(new RequestCacheStats(++iota, ++iota, ++iota, ++iota));
324325
commonStats.getStore().add(new StoreStats(++iota));
325-
commonStats.getRefresh().add(new RefreshStats(no, ++iota, (int) no));
326+
commonStats.getRefresh().add(new RefreshStats(no, ++iota, no, ++iota, (int) no));
326327

327328
final IndexingStats.Stats indexingStats = new IndexingStats.Stats(++iota, ++iota, no, no, no, no, no, no, false, ++iota);
328329
commonStats.getIndexing().add(new IndexingStats(indexingStats, null));

0 commit comments

Comments
 (0)