Skip to content

Commit 4393733

Browse files
committed
initial set of working instrumentation
1 parent 8d9f14b commit 4393733

File tree

20 files changed

+3466
-0
lines changed

20 files changed

+3466
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
2+
// Build.gradle generated for instrumentation module opensearch-high-level-rest-client
3+
4+
apply plugin: 'java'
5+
6+
dependencies {
7+
implementation 'org.opensearch.client:opensearch-rest-high-level-client:2.0.0'
8+
9+
// New Relic Java Agent dependencies
10+
implementation 'com.newrelic.agent.java:newrelic-agent:8.4.0'
11+
implementation 'com.newrelic.agent.java:newrelic-api:8.4.0'
12+
implementation fileTree(include: ['*.jar'], dir: '../libs')
13+
implementation fileTree(include: ['*.jar'], dir: '../test-lib')
14+
}
15+
16+
jar {
17+
manifest {
18+
attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.opensearch-high-level-rest-client'
19+
attributes 'Implementation-Vendor': 'New Relic Labs'
20+
attributes 'Implementation-Vendor-Id': 'com.newrelic.labs'
21+
attributes 'Implementation-Version': 1.0
22+
}
23+
}
24+
25+
verifyInstrumentation {
26+
passes 'org.opensearch.client:opensearch-rest-high-level-client:[1.0.0,2.10.0)'
27+
// Verifier plugin documentation:
28+
// https://github.com/newrelic/newrelic-gradle-verify-instrumentation
29+
// Example:
30+
// passes 'javax.servlet:servlet-api:[2.2,2.5]'
31+
// exclude 'javax.servlet:servlet-api:2.4.public_draft'
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.newrelic.instrumentation.labs.opensearch.highlevelrest;
2+
3+
import org.opensearch.action.ActionListener;
4+
5+
import com.newrelic.api.agent.DatastoreParameters;
6+
import com.newrelic.api.agent.NewRelic;
7+
import com.newrelic.api.agent.Segment;
8+
9+
public class NRActionListener<Response> implements ActionListener<Response> {
10+
11+
private ActionListener<Response> delegate = null;
12+
private Segment segment = null;
13+
private DatastoreParameters params = null;
14+
15+
public NRActionListener(ActionListener<Response> d, DatastoreParameters p) {
16+
delegate = d;
17+
params = p;
18+
segment = NewRelic.getAgent().getTransaction().startSegment("OpenSearch-Call");
19+
}
20+
21+
@Override
22+
public void onResponse(Response response) {
23+
if(segment != null) {
24+
if(params != null) {
25+
segment.reportAsExternal(params);
26+
}
27+
segment.end();
28+
segment = null;
29+
}
30+
if(delegate != null) {
31+
delegate.onResponse(response);
32+
}
33+
}
34+
35+
@Override
36+
public void onFailure(Exception e) {
37+
NewRelic.noticeError(e);
38+
if(segment != null) {
39+
segment.ignore();
40+
segment = null;
41+
}
42+
if(delegate != null) {
43+
delegate.onFailure(e);
44+
}
45+
}
46+
47+
}
Lines changed: 264 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
1+
package com.newrelic.instrumentation.labs.opensearch.highlevelrest;
2+
3+
import java.util.Arrays;
4+
import java.util.HashSet;
5+
import java.util.List;
6+
import java.util.Set;
7+
8+
import org.opensearch.action.admin.cluster.storedscripts.DeleteStoredScriptRequest;
9+
import org.opensearch.action.admin.cluster.storedscripts.GetStoredScriptRequest;
10+
import org.opensearch.action.admin.cluster.storedscripts.PutStoredScriptRequest;
11+
import org.opensearch.action.delete.DeleteRequest;
12+
import org.opensearch.action.get.GetRequest;
13+
import org.opensearch.action.get.MultiGetRequest;
14+
import org.opensearch.action.get.MultiGetRequest.Item;
15+
import org.opensearch.action.index.IndexRequest;
16+
import org.opensearch.action.search.MultiSearchRequest;
17+
import org.opensearch.action.search.SearchRequest;
18+
import org.opensearch.action.search.SearchScrollRequest;
19+
import org.opensearch.action.update.UpdateRequest;
20+
import org.opensearch.client.core.CountRequest;
21+
import org.opensearch.client.core.GetSourceRequest;
22+
import org.opensearch.client.core.TermVectorsRequest;
23+
import org.opensearch.common.transport.TransportAddress;
24+
import org.opensearch.index.rankeval.RankEvalRequest;
25+
import org.opensearch.index.reindex.DeleteByQueryRequest;
26+
import org.opensearch.index.reindex.ReindexRequest;
27+
import org.opensearch.index.reindex.UpdateByQueryRequest;
28+
import org.opensearch.script.mustache.MultiSearchTemplateRequest;
29+
import org.opensearch.script.mustache.SearchTemplateRequest;
30+
31+
import com.newrelic.api.agent.DatastoreParameters;
32+
33+
public class Utils {
34+
35+
public static DatastoreParameters getParamsFromGet(GetRequest request, String type) {
36+
return getParamsFromGetRequest(request, type);
37+
}
38+
39+
public static DatastoreParameters getParamsFromRequest(Object requestObj) {
40+
if(requestObj instanceof GetRequest) {
41+
return getParamsFromGetRequest((GetRequest)requestObj, "Get");
42+
}
43+
44+
if(requestObj instanceof SearchRequest) {
45+
return getParamsFromSearchRequest((SearchRequest)requestObj);
46+
}
47+
48+
if(requestObj instanceof UpdateRequest) {
49+
return getParamsFromUpdateRequest((UpdateRequest)requestObj);
50+
}
51+
52+
if(requestObj instanceof DeleteRequest) {
53+
return getParamsFromDeleteRequest((DeleteRequest)requestObj);
54+
}
55+
56+
if(requestObj instanceof CountRequest) {
57+
return getParamsFromCountRequest((CountRequest)requestObj);
58+
}
59+
60+
if(requestObj instanceof IndexRequest) {
61+
return getParamsFromIndexRequest((IndexRequest)requestObj);
62+
}
63+
64+
if(requestObj instanceof DeleteByQueryRequest) {
65+
return getParamsFromDeleteByQueryRequest((DeleteByQueryRequest)requestObj);
66+
}
67+
68+
if(requestObj instanceof DeleteStoredScriptRequest) {
69+
return getParamsFromDeleteStoredScriptRequest((DeleteStoredScriptRequest)requestObj);
70+
}
71+
72+
if(requestObj instanceof GetSourceRequest) {
73+
return getParamsFromGetSourceRequest((GetSourceRequest)requestObj);
74+
}
75+
76+
if(requestObj instanceof GetStoredScriptRequest) {
77+
return getParamsFromGetStoredScriptRequest((GetStoredScriptRequest)requestObj);
78+
}
79+
80+
if(requestObj instanceof MultiGetRequest) {
81+
return getParamsFromMultiGetRequest((MultiGetRequest)requestObj);
82+
}
83+
84+
if(requestObj instanceof MultiSearchRequest) {
85+
return getParamsFromMultiSearchRequest((MultiSearchRequest)requestObj);
86+
}
87+
88+
if(requestObj instanceof MultiSearchTemplateRequest) {
89+
return getParamsFromMultiSearchTemplateRequest((MultiSearchTemplateRequest)requestObj);
90+
}
91+
92+
if(requestObj instanceof PutStoredScriptRequest) {
93+
return getParamsFromPutStoredScriptRequest((PutStoredScriptRequest)requestObj);
94+
}
95+
96+
if(requestObj instanceof RankEvalRequest) {
97+
return getParamsFromRankEvalRequest((RankEvalRequest)requestObj);
98+
}
99+
100+
if(requestObj instanceof ReindexRequest) {
101+
return getParamsFromReindexRequest((ReindexRequest)requestObj);
102+
}
103+
104+
if(requestObj instanceof SearchScrollRequest) {
105+
return getParamsFromSearchScrollRequest((SearchScrollRequest)requestObj);
106+
}
107+
108+
if(requestObj instanceof SearchTemplateRequest) {
109+
return getParamsFromSearchTemplateRequest((SearchTemplateRequest)requestObj);
110+
}
111+
112+
if(requestObj instanceof TermVectorsRequest) {
113+
return getParamsFromTermVectorsRequest((TermVectorsRequest)requestObj);
114+
}
115+
116+
if(requestObj instanceof UpdateByQueryRequest) {
117+
return getParamsFromUpdateByQueryRequest((UpdateByQueryRequest)requestObj);
118+
}
119+
120+
121+
return null;
122+
}
123+
124+
private static String getCollectionFromArray(String[] array) {
125+
StringBuffer sb = new StringBuffer();
126+
int size = array.length;
127+
for(int i=0;i<size;i++) {
128+
sb.append(array[i]);
129+
if(i < size - 1) {
130+
sb.append(',');
131+
}
132+
}
133+
return sb.toString();
134+
}
135+
136+
private static DatastoreParameters getParams(String collection, String operation, TransportAddress address) {
137+
138+
if(address != null) {
139+
return DatastoreParameters.product("OpenSearch").collection(collection).operation(operation).instance(address.getAddress(), address.getPort()).build();
140+
} else {
141+
return DatastoreParameters.product("OpenSearch").collection(collection).operation(operation).build();
142+
}
143+
144+
}
145+
146+
private static DatastoreParameters getParamsFromCountRequest(CountRequest req) {
147+
return getParams(getCollectionFromArray(req.indices()), "Count", req.remoteAddress());
148+
}
149+
150+
private static DatastoreParameters getParamsFromDeleteRequest(DeleteRequest req) {
151+
return getParams(req.index(), "Delete", req.remoteAddress());
152+
}
153+
154+
private static DatastoreParameters getParamsFromGetRequest(GetRequest req, String type) {
155+
return getParams(req.index(),type,req.remoteAddress());
156+
}
157+
158+
private static DatastoreParameters getParamsFromDeleteByQueryRequest(DeleteByQueryRequest req) {
159+
return getParams(getCollectionFromArray(req.indices()), "DeleteByQuery", req.remoteAddress());
160+
}
161+
162+
private static DatastoreParameters getParamsFromDeleteStoredScriptRequest(DeleteStoredScriptRequest req) {
163+
return getParams(req.id(), "DeleteStoredScript", req.remoteAddress());
164+
}
165+
166+
private static DatastoreParameters getParamsFromGetSourceRequest(GetSourceRequest req) {
167+
return getParams(req.index(), "GetSource", null);
168+
}
169+
170+
private static DatastoreParameters getParamsFromGetStoredScriptRequest(GetStoredScriptRequest req) {
171+
return getParams(req.id(), "GetStoredScript", req.remoteAddress());
172+
}
173+
174+
private static DatastoreParameters getParamsFromIndexRequest(IndexRequest req) {
175+
return getParams(req.index(), "Index", req.remoteAddress());
176+
}
177+
178+
private static DatastoreParameters getParamsFromMultiGetRequest(MultiGetRequest req) {
179+
List<Item> items = req.getItems();
180+
int size = items.size();
181+
String[] itemIndexes = new String[size];
182+
183+
int i = 0;
184+
for(Item item : items) {
185+
itemIndexes[i] = item.index();
186+
i++;
187+
}
188+
return getParams(getCollectionFromArray(itemIndexes), "MultiGet", req.remoteAddress());
189+
}
190+
191+
private static DatastoreParameters getParamsFromMultiSearchRequest(MultiSearchRequest req) {
192+
List<SearchRequest> searchRequests = req.requests();
193+
int size = searchRequests.size();
194+
Set<String> allIndices = new HashSet<String>();
195+
196+
for(int i=0;i<size;i++) {
197+
SearchRequest searchReq = searchRequests.get(i);
198+
String[] indices = searchReq.indices();
199+
allIndices.addAll(Arrays.asList(indices));
200+
}
201+
String[] collections = new String[allIndices.size()];
202+
allIndices.toArray(collections);
203+
204+
return getParams(getCollectionFromArray(collections), "MultiSearch", req.remoteAddress());
205+
}
206+
207+
private static DatastoreParameters getParamsFromMultiSearchTemplateRequest(MultiSearchTemplateRequest req) {
208+
List<SearchTemplateRequest> requests = req.requests();
209+
int size = requests.size();
210+
Set<String> allIndices = new HashSet<String>();
211+
212+
for(int i=0;i<size;i++) {
213+
SearchTemplateRequest tRequest = requests.get(i);
214+
SearchRequest searchReq = tRequest.getRequest();
215+
String[] indices = searchReq.indices();
216+
allIndices.addAll(Arrays.asList(indices));
217+
}
218+
String[] collections = new String[allIndices.size()];
219+
allIndices.toArray(collections);
220+
221+
return getParams(getCollectionFromArray(collections), "MultiSearchTemplate", req.remoteAddress());
222+
}
223+
224+
private static DatastoreParameters getParamsFromRankEvalRequest(RankEvalRequest req) {
225+
return getParams(getCollectionFromArray(req.indices()), "RankEvalRequest", req.remoteAddress());
226+
}
227+
228+
private static DatastoreParameters getParamsFromReindexRequest(ReindexRequest req) {
229+
IndexRequest indexReq = req.getDestination();
230+
231+
return getParams(indexReq.index(), "ReIndex", req.remoteAddress());
232+
}
233+
234+
private static DatastoreParameters getParamsFromSearchScrollRequest(SearchScrollRequest req) {
235+
return getParams(req.scrollId(), "SearchScroll", req.remoteAddress());
236+
}
237+
238+
private static DatastoreParameters getParamsFromSearchRequest(SearchRequest req) {
239+
return getParams(getCollectionFromArray(req.indices()), "Search", req.remoteAddress());
240+
}
241+
242+
private static DatastoreParameters getParamsFromSearchTemplateRequest(SearchTemplateRequest req) {
243+
SearchRequest searchRequest = req.getRequest();
244+
return getParams(getCollectionFromArray(searchRequest.indices()), "SearchTemplate", req.remoteAddress());
245+
}
246+
247+
private static DatastoreParameters getParamsFromUpdateByQueryRequest(UpdateByQueryRequest req) {
248+
return getParams(getCollectionFromArray(req.indices()), "UpdateByQuery", req.remoteAddress());
249+
}
250+
251+
private static DatastoreParameters getParamsFromPutStoredScriptRequest(PutStoredScriptRequest req) {
252+
return getParams(req.id(), "PutStoredScript", req.remoteAddress());
253+
}
254+
255+
private static DatastoreParameters getParamsFromTermVectorsRequest(TermVectorsRequest req) {
256+
return getParams(req.getIndex(), "TermVectors", null);
257+
}
258+
259+
private static DatastoreParameters getParamsFromUpdateRequest(UpdateRequest req) {
260+
return getParams(req.index(), "Update", req.remoteAddress());
261+
}
262+
263+
264+
}

0 commit comments

Comments
 (0)