use of org.opensearch.ad.feature.Features in project anomaly-detection by opensearch-project.
the class PreviewAnomalyDetectorTransportActionTests method testPreviewTransportActionWithDetector.
@SuppressWarnings("unchecked")
@Test
public void testPreviewTransportActionWithDetector() throws IOException, InterruptedException {
final CountDownLatch inProgressLatch = new CountDownLatch(1);
CreateIndexResponse createResponse = TestHelpers.createIndex(client().admin(), AnomalyDetector.ANOMALY_DETECTORS_INDEX, AnomalyDetectionIndices.getAnomalyDetectorMappings());
Assert.assertNotNull(createResponse);
AnomalyDetector detector = TestHelpers.randomAnomalyDetector(ImmutableMap.of("testKey", "testValue"), Instant.now());
IndexRequest indexRequest = new IndexRequest(AnomalyDetector.ANOMALY_DETECTORS_INDEX).setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).source(detector.toXContent(XContentFactory.jsonBuilder(), RestHandlerUtils.XCONTENT_WITH_TYPE));
IndexResponse indexResponse = client().index(indexRequest).actionGet(5_000);
assertEquals(RestStatus.CREATED, indexResponse.status());
PreviewAnomalyDetectorRequest request = new PreviewAnomalyDetectorRequest(null, indexResponse.getId(), Instant.now(), Instant.now());
ActionListener<PreviewAnomalyDetectorResponse> previewResponse = new ActionListener<PreviewAnomalyDetectorResponse>() {
@Override
public void onResponse(PreviewAnomalyDetectorResponse response) {
try {
XContentBuilder previewBuilder = response.toXContent(TestHelpers.builder(), ToXContent.EMPTY_PARAMS);
Assert.assertNotNull(previewBuilder);
Map<String, Object> map = TestHelpers.XContentBuilderToMap(previewBuilder);
List<AnomalyResult> results = (List<AnomalyResult>) map.get("anomaly_result");
Assert.assertNotNull(results);
Assert.assertTrue(results.size() > 0);
inProgressLatch.countDown();
} catch (IOException e) {
// Should not reach here
Assert.assertTrue(false);
}
}
@Override
public void onFailure(Exception e) {
// onFailure should not be called
Assert.assertTrue(false);
}
};
doReturn(TestHelpers.randomThresholdingResults()).when(modelManager).getPreviewResults(any(), anyInt());
doAnswer(responseMock -> {
Long startTime = responseMock.getArgument(1);
ActionListener<Features> listener = responseMock.getArgument(3);
listener.onResponse(TestHelpers.randomFeatures());
return null;
}).when(featureManager).getPreviewFeatures(anyObject(), anyLong(), anyLong(), any());
action.doExecute(task, request, previewResponse);
assertTrue(inProgressLatch.await(100, TimeUnit.SECONDS));
}
use of org.opensearch.ad.feature.Features in project anomaly-detection by opensearch-project.
the class PreviewAnomalyDetectorTransportActionTests method testPreviewTransportAction.
@SuppressWarnings("unchecked")
@Test
public void testPreviewTransportAction() throws IOException, InterruptedException {
final CountDownLatch inProgressLatch = new CountDownLatch(1);
AnomalyDetector detector = TestHelpers.randomAnomalyDetector(ImmutableMap.of("testKey", "testValue"), Instant.now());
PreviewAnomalyDetectorRequest request = new PreviewAnomalyDetectorRequest(detector, detector.getDetectorId(), Instant.now(), Instant.now());
ActionListener<PreviewAnomalyDetectorResponse> previewResponse = new ActionListener<PreviewAnomalyDetectorResponse>() {
@Override
public void onResponse(PreviewAnomalyDetectorResponse response) {
try {
XContentBuilder previewBuilder = response.toXContent(TestHelpers.builder(), ToXContent.EMPTY_PARAMS);
Assert.assertNotNull(previewBuilder);
Map<String, Object> map = TestHelpers.XContentBuilderToMap(previewBuilder);
List<AnomalyResult> results = (List<AnomalyResult>) map.get("anomaly_result");
Assert.assertNotNull(results);
Assert.assertTrue(results.size() > 0);
inProgressLatch.countDown();
} catch (IOException e) {
// Should not reach here
Assert.assertTrue(false);
}
}
@Override
public void onFailure(Exception e) {
// onFailure should not be called
Assert.assertTrue(false);
}
};
doReturn(TestHelpers.randomThresholdingResults()).when(modelManager).getPreviewResults(any(), anyInt());
doAnswer(responseMock -> {
Long startTime = responseMock.getArgument(1);
ActionListener<Features> listener = responseMock.getArgument(3);
listener.onResponse(TestHelpers.randomFeatures());
return null;
}).when(featureManager).getPreviewFeatures(anyObject(), anyLong(), anyLong(), any());
action.doExecute(task, request, previewResponse);
assertTrue(inProgressLatch.await(100, TimeUnit.SECONDS));
}
use of org.opensearch.ad.feature.Features in project anomaly-detection by opensearch-project.
the class AnomalyDetectorRunner method executeDetector.
/**
* run anomaly detector and return anomaly result.
*
* @param detector anomaly detector instance
* @param startTime detection period start time
* @param endTime detection period end time
* @param context stored thread context
* @param listener handle anomaly result
* @throws IOException - if a user gives wrong query input when defining a detector
*/
public void executeDetector(AnomalyDetector detector, Instant startTime, Instant endTime, ThreadContext.StoredContext context, ActionListener<List<AnomalyResult>> listener) throws IOException {
context.restore();
List<String> categoryField = detector.getCategoryField();
if (categoryField != null && !categoryField.isEmpty()) {
featureManager.getPreviewEntities(detector, startTime.toEpochMilli(), endTime.toEpochMilli(), ActionListener.wrap(entities -> {
if (entities == null || entities.isEmpty()) {
// TODO return exception like IllegalArgumentException to explain data is not enough for preview
// This also requires front-end change to handle error message correspondingly
// We return empty list for now to avoid breaking front-end
listener.onResponse(Collections.emptyList());
return;
}
ActionListener<EntityAnomalyResult> entityAnomalyResultListener = ActionListener.wrap(entityAnomalyResult -> {
listener.onResponse(entityAnomalyResult.getAnomalyResults());
}, e -> onFailure(e, listener, detector.getDetectorId()));
MultiResponsesDelegateActionListener<EntityAnomalyResult> multiEntitiesResponseListener = new MultiResponsesDelegateActionListener<EntityAnomalyResult>(entityAnomalyResultListener, entities.size(), String.format(Locale.ROOT, "Fail to get preview result for multi entity detector %s", detector.getDetectorId()), true);
for (Entity entity : entities) {
featureManager.getPreviewFeaturesForEntity(detector, entity, startTime.toEpochMilli(), endTime.toEpochMilli(), ActionListener.wrap(features -> {
List<ThresholdingResult> entityResults = modelManager.getPreviewResults(features.getProcessedFeatures(), detector.getShingleSize());
List<AnomalyResult> sampledEntityResults = sample(parsePreviewResult(detector, features, entityResults, entity), maxPreviewResults);
multiEntitiesResponseListener.onResponse(new EntityAnomalyResult(sampledEntityResults));
}, e -> multiEntitiesResponseListener.onFailure(e)));
}
}, e -> onFailure(e, listener, detector.getDetectorId())));
} else {
featureManager.getPreviewFeatures(detector, startTime.toEpochMilli(), endTime.toEpochMilli(), ActionListener.wrap(features -> {
try {
List<ThresholdingResult> results = modelManager.getPreviewResults(features.getProcessedFeatures(), detector.getShingleSize());
listener.onResponse(sample(parsePreviewResult(detector, features, results, null), maxPreviewResults));
} catch (Exception e) {
onFailure(e, listener, detector.getDetectorId());
}
}, e -> onFailure(e, listener, detector.getDetectorId())));
}
}
Aggregations