99
1010package org .elasticsearch .index .reindex ;
1111
12+ import org .elasticsearch .ElasticsearchStatusException ;
13+ import org .elasticsearch .common .bytes .BytesArray ;
14+ import org .elasticsearch .common .settings .Settings ;
1215import org .elasticsearch .index .query .QueryBuilders ;
1316import org .elasticsearch .plugins .Plugin ;
1417import org .elasticsearch .plugins .PluginsService ;
1518import org .elasticsearch .reindex .BulkIndexByScrollResponseMatcher ;
1619import org .elasticsearch .reindex .ReindexPlugin ;
20+ import org .elasticsearch .reindex .TransportReindexAction ;
21+ import org .elasticsearch .rest .root .MainRestPlugin ;
1722import org .elasticsearch .search .sort .SortOrder ;
1823import org .elasticsearch .telemetry .Measurement ;
1924import org .elasticsearch .telemetry .TestTelemetryPlugin ;
2025import org .elasticsearch .test .ESIntegTestCase ;
2126
27+ import java .net .InetSocketAddress ;
2228import java .util .Arrays ;
2329import java .util .Collection ;
2430import java .util .List ;
31+ import java .util .Map ;
2532
2633import static org .elasticsearch .index .query .QueryBuilders .termQuery ;
2734import static org .elasticsearch .reindex .DeleteByQueryMetrics .DELETE_BY_QUERY_TIME_HISTOGRAM ;
28- import static org .elasticsearch .reindex .ReindexMetrics .REINDEX_FAILURE_HISTOGRAM ;
29- import static org .elasticsearch .reindex .ReindexMetrics .REINDEX_FAILURE_HISTOGRAM_REMOTE ;
30- import static org .elasticsearch .reindex .ReindexMetrics .REINDEX_SUCCESS_HISTOGRAM ;
31- import static org .elasticsearch .reindex .ReindexMetrics .REINDEX_SUCCESS_HISTOGRAM_REMOTE ;
35+ import static org .elasticsearch .reindex .ReindexMetrics .ATTRIBUTE_NAME_ERROR_TYPE ;
36+ import static org .elasticsearch .reindex .ReindexMetrics .ATTRIBUTE_NAME_SOURCE ;
37+ import static org .elasticsearch .reindex .ReindexMetrics .ATTRIBUTE_VALUE_SOURCE_LOCAL ;
38+ import static org .elasticsearch .reindex .ReindexMetrics .ATTRIBUTE_VALUE_SOURCE_REMOTE ;
39+ import static org .elasticsearch .reindex .ReindexMetrics .REINDEX_COMPLETION_HISTOGRAM ;
3240import static org .elasticsearch .reindex .ReindexMetrics .REINDEX_TIME_HISTOGRAM ;
33- import static org .elasticsearch .reindex .ReindexMetrics .REINDEX_TIME_HISTOGRAM_REMOTE ;
3441import static org .elasticsearch .reindex .UpdateByQueryMetrics .UPDATE_BY_QUERY_TIME_HISTOGRAM ;
3542import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .assertHitCount ;
3643import static org .hamcrest .Matchers .equalTo ;
4047public class ReindexPluginMetricsIT extends ESIntegTestCase {
4148 @ Override
4249 protected Collection <Class <? extends Plugin >> nodePlugins () {
43- return Arrays .asList (ReindexPlugin .class , TestTelemetryPlugin .class );
50+ return Arrays .asList (ReindexPlugin .class , TestTelemetryPlugin .class , MainRestPlugin .class );
51+ }
52+
53+ @ Override
54+ protected boolean addMockHttpTransport () {
55+ return false ;
56+ }
57+
58+ @ Override
59+ protected Settings nodeSettings (int nodeOrdinal , Settings otherSettings ) {
60+ return Settings .builder ()
61+ .put (super .nodeSettings (nodeOrdinal , otherSettings ))
62+ .put (TransportReindexAction .REMOTE_CLUSTER_WHITELIST .getKey (), "*:*" )
63+ .build ();
4464 }
4565
4666 protected ReindexRequestBuilder reindex () {
@@ -59,6 +79,62 @@ public static BulkIndexByScrollResponseMatcher matcher() {
5979 return new BulkIndexByScrollResponseMatcher ();
6080 }
6181
82+ public void testReindexFromRemoteMetrics () throws Exception {
83+ final String dataNodeName = internalCluster ().startNode ();
84+
85+ InetSocketAddress remoteAddress = randomFrom (cluster ().httpAddresses ());
86+ RemoteInfo remote = new RemoteInfo (
87+ "http" ,
88+ remoteAddress .getHostString (),
89+ remoteAddress .getPort (),
90+ null ,
91+ new BytesArray ("{\" match_all\" :{}}" ),
92+ null ,
93+ null ,
94+ Map .of (),
95+ RemoteInfo .DEFAULT_SOCKET_TIMEOUT ,
96+ RemoteInfo .DEFAULT_CONNECT_TIMEOUT
97+ );
98+
99+ final TestTelemetryPlugin testTelemetryPlugin = internalCluster ().getInstance (PluginsService .class , dataNodeName )
100+ .filterPlugins (TestTelemetryPlugin .class )
101+ .findFirst ()
102+ .orElseThrow ();
103+
104+ var expectedException = assertThrows (
105+ "Source index not created yet, should throw not found exception" ,
106+ ElasticsearchStatusException .class ,
107+ () -> reindex ().source ("source" ).setRemoteInfo (remote ).destination ("dest" ).get ()
108+ );
109+
110+ // assert failure metrics
111+ assertBusy (() -> {
112+ testTelemetryPlugin .collect ();
113+ assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM ).size (), equalTo (1 ));
114+ List <Measurement > completions = testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_COMPLETION_HISTOGRAM );
115+ assertThat (completions .size (), equalTo (1 ));
116+ assertThat (completions .getFirst ().attributes ().get (ATTRIBUTE_NAME_ERROR_TYPE ), equalTo (expectedException .status ().name ()));
117+ assertThat (completions .getFirst ().attributes ().get (ATTRIBUTE_NAME_SOURCE ), equalTo (ATTRIBUTE_VALUE_SOURCE_REMOTE ));
118+ });
119+
120+ // now create the source index
121+ indexRandom (true , prepareIndex ("source" ).setId ("1" ).setSource ("foo" , "a" ));
122+ assertHitCount (prepareSearch ("source" ).setSize (0 ), 1 );
123+
124+ reindex ().source ("source" ).setRemoteInfo (remote ).destination ("dest" ).get ();
125+
126+ // assert success metrics
127+ assertBusy (() -> {
128+ testTelemetryPlugin .collect ();
129+ assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM ).size (), equalTo (2 ));
130+ List <Measurement > completions = testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_COMPLETION_HISTOGRAM );
131+ assertThat (completions .size (), equalTo (2 ));
132+ assertNull (completions .get (1 ).attributes ().get (ATTRIBUTE_NAME_ERROR_TYPE ));
133+ assertThat (completions .get (1 ).attributes ().get (ATTRIBUTE_NAME_SOURCE ), equalTo (ATTRIBUTE_VALUE_SOURCE_REMOTE ));
134+ });
135+
136+ }
137+
62138 public void testReindexMetrics () throws Exception {
63139 final String dataNodeName = internalCluster ().startNode ();
64140
@@ -82,11 +158,7 @@ public void testReindexMetrics() throws Exception {
82158 assertBusy (() -> {
83159 testTelemetryPlugin .collect ();
84160 assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM ).size (), equalTo (1 ));
85- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
86- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_SUCCESS_HISTOGRAM ).size (), equalTo (1 ));
87- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_SUCCESS_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
88- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_FAILURE_HISTOGRAM ).size (), equalTo (0 ));
89- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_FAILURE_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
161+ assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_COMPLETION_HISTOGRAM ).size (), equalTo (1 ));
90162 });
91163
92164 // Now none of them
@@ -95,35 +167,29 @@ public void testReindexMetrics() throws Exception {
95167 assertBusy (() -> {
96168 testTelemetryPlugin .collect ();
97169 assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM ).size (), equalTo (2 ));
98- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
99- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_SUCCESS_HISTOGRAM ).size (), equalTo (2 ));
100- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_SUCCESS_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
101- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_FAILURE_HISTOGRAM ).size (), equalTo (0 ));
102- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_FAILURE_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
170+ assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_COMPLETION_HISTOGRAM ).size (), equalTo (2 ));
103171 });
104172
105173 // Now half of them
106174 reindex ().source ("source" ).destination ("dest_half" ).filter (termQuery ("foo" , "a" )).get ();
107175 assertBusy (() -> {
108176 testTelemetryPlugin .collect ();
109177 assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM ).size (), equalTo (3 ));
110- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
111- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_SUCCESS_HISTOGRAM ).size (), equalTo (3 ));
112- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_SUCCESS_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
113- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_FAILURE_HISTOGRAM ).size (), equalTo (0 ));
114- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_FAILURE_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
178+ assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_COMPLETION_HISTOGRAM ).size (), equalTo (3 ));
115179 });
116180
117181 // Limit with maxDocs
118182 reindex ().source ("source" ).destination ("dest_size_one" ).maxDocs (1 ).get ();
119183 assertBusy (() -> {
120184 testTelemetryPlugin .collect ();
121185 assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM ).size (), equalTo (4 ));
122- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
123- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_SUCCESS_HISTOGRAM ).size (), equalTo (4 ));
124- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_SUCCESS_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
125- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_FAILURE_HISTOGRAM ).size (), equalTo (0 ));
126- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_FAILURE_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
186+ assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_COMPLETION_HISTOGRAM ).size (), equalTo (4 ));
187+
188+ // asset all metric attributes are correct
189+ testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_COMPLETION_HISTOGRAM ).forEach (m -> {
190+ assertNull (m .attributes ().get (ATTRIBUTE_NAME_ERROR_TYPE ));
191+ assertThat (m .attributes ().get (ATTRIBUTE_NAME_SOURCE ), equalTo (ATTRIBUTE_VALUE_SOURCE_LOCAL ));
192+ });
127193 });
128194 }
129195
@@ -144,11 +210,14 @@ public void testReindexMetricsWithBulkFailure() throws Exception {
144210 assertBusy (() -> {
145211 testTelemetryPlugin .collect ();
146212 assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM ).size (), equalTo (1 ));
147- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_TIME_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
148- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_SUCCESS_HISTOGRAM ).size (), equalTo (0 ));
149- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_SUCCESS_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
150- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_FAILURE_HISTOGRAM ).size (), equalTo (1 ));
151- assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_FAILURE_HISTOGRAM_REMOTE ).size (), equalTo (0 ));
213+ assertThat (testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_COMPLETION_HISTOGRAM ).size (), equalTo (1 ));
214+ assertThat (
215+ testTelemetryPlugin .getLongHistogramMeasurement (REINDEX_COMPLETION_HISTOGRAM )
216+ .getFirst ()
217+ .attributes ()
218+ .get (ATTRIBUTE_NAME_ERROR_TYPE ),
219+ equalTo ("org.elasticsearch.index.mapper.DocumentParsingException" )
220+ );
152221 });
153222 }
154223
0 commit comments