Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Metric Advisor: Replace reflection based private field setting with helper-pattern #16781

Merged
merged 1 commit into from
Oct 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import com.azure.ai.metricsadvisor.implementation.util.AnomalyTransforms;
import com.azure.ai.metricsadvisor.implementation.AzureCognitiveServiceMetricsAdvisorRestAPIOpenAPIV2Impl;
import com.azure.ai.metricsadvisor.implementation.util.DetectionConfigurationTransforms;
import com.azure.ai.metricsadvisor.implementation.util.IncidentHelper;
import com.azure.ai.metricsadvisor.implementation.util.IncidentRootCauseTransforms;
import com.azure.ai.metricsadvisor.implementation.util.IncidentTransforms;
import com.azure.ai.metricsadvisor.implementation.util.MetricEnrichedSeriesDataTransformations;
import com.azure.ai.metricsadvisor.implementation.models.AlertingResultQuery;
Expand All @@ -24,18 +26,16 @@
import com.azure.ai.metricsadvisor.implementation.models.DimensionGroupIdentity;
import com.azure.ai.metricsadvisor.implementation.models.EnrichmentStatusQueryOption;
import com.azure.ai.metricsadvisor.implementation.models.FeedbackDimensionFilter;
import com.azure.ai.metricsadvisor.implementation.models.MetricDataList;
import com.azure.ai.metricsadvisor.implementation.models.MetricDataQueryOptions;
import com.azure.ai.metricsadvisor.implementation.models.MetricDimensionQueryOptions;
import com.azure.ai.metricsadvisor.implementation.models.MetricFeedbackFilter;
import com.azure.ai.metricsadvisor.implementation.models.MetricSeriesItem;
import com.azure.ai.metricsadvisor.implementation.models.MetricSeriesQueryOptions;
import com.azure.ai.metricsadvisor.implementation.models.PeriodFeedback;
import com.azure.ai.metricsadvisor.implementation.models.PeriodFeedbackValue;
import com.azure.ai.metricsadvisor.implementation.models.RootCause;
import com.azure.ai.metricsadvisor.implementation.models.SeriesIdentity;
import com.azure.ai.metricsadvisor.implementation.util.MetricFeedbackTransforms;
import com.azure.ai.metricsadvisor.implementation.util.PrivateFieldAccessHelper;
import com.azure.ai.metricsadvisor.implementation.util.MetricSeriesDataTransforms;
import com.azure.ai.metricsadvisor.implementation.util.MetricSeriesDefinitionTransforms;
import com.azure.ai.metricsadvisor.models.Alert;
import com.azure.ai.metricsadvisor.models.Anomaly;
import com.azure.ai.metricsadvisor.models.DimensionKey;
Expand Down Expand Up @@ -171,13 +171,7 @@ private Mono<PagedResponse<MetricSeriesDefinition>> listMetricSeriesDefinitionSi
.doOnRequest(ignoredValue -> logger.info("Listing information metric series definitions"))
.doOnSuccess(response -> logger.info("Listed metric series definitions - {}", response))
.doOnError(error -> logger.warning("Failed to list metric series definitions information - {}", error))
.map(res -> new PagedResponseBase<>(
res.getRequest(),
res.getStatusCode(),
res.getHeaders(),
toMetricSeriesDefinition(res.getValue()),
res.getContinuationToken(),
null));
.map(res -> MetricSeriesDefinitionTransforms.fromInnerResponse(res));
}

private Mono<PagedResponse<MetricSeriesDefinition>> listMetricSeriesDefinitionNextPageAsync(String nextPageLink,
Expand All @@ -197,34 +191,7 @@ private Mono<PagedResponse<MetricSeriesDefinition>> listMetricSeriesDefinitionNe
.doOnSuccess(response -> logger.info("Retrieved the next listing page - Page {}", nextPageLink))
.doOnError(error -> logger.warning("Failed to retrieve the next listing page - Page {}", nextPageLink,
error))
.map(res -> new PagedResponseBase<>(
res.getRequest(),
res.getStatusCode(),
res.getHeaders(),
toMetricSeriesDefinition(res.getValue()),
res.getContinuationToken(),
null));
}

/**
* Helper method to convert service {@link com.azure.ai.metricsadvisor.implementation.models.MetricSeriesItem}
* to {@link MetricSeriesDefinition}.
*
* @param serviceSeriesDefinitions the
* service {@link com.azure.ai.metricsadvisor.implementation.models.MetricSeriesItem}
*
* @return {@link MetricSeriesDefinition}
*/
private static List<MetricSeriesDefinition>
toMetricSeriesDefinition(List<MetricSeriesItem> serviceSeriesDefinitions) {
return serviceSeriesDefinitions.stream().map(serviceSeriesDefinition -> {
MetricSeriesDefinition seriesDefinition = new MetricSeriesDefinition();
PrivateFieldAccessHelper.set(seriesDefinition, "seriesKey",
new DimensionKey(serviceSeriesDefinition.getDimension()));
PrivateFieldAccessHelper.set(seriesDefinition, "metricId",
serviceSeriesDefinition.getMetricId().toString());
return seriesDefinition;
}).collect(Collectors.toList());
.map(res -> MetricSeriesDefinitionTransforms.fromInnerResponse(res));
}

/**
Expand Down Expand Up @@ -282,32 +249,7 @@ private Mono<PagedResponse<MetricSeriesData>> listMetricSeriesDataInternal(Strin

return service.getMetricDataWithResponseAsync(UUID.fromString(metricId), metricDataQueryOptions,
context)
.map(response -> {
final MetricDataList result = response.getValue();
return new PagedResponseBase<>(response.getRequest(),
response.getStatusCode(), response.getHeaders(), toMetricSeriesData(result.getValue()), null, null);
});
}

/**
* Transforms the service level metric series data to SDK model.
*
* @param serviceMetricSeriesData the service level metric series data
*
* @return the transformed SDK equivalent model for metric series data.
*/
private List<MetricSeriesData> toMetricSeriesData(
List<com.azure.ai.metricsadvisor.implementation.models.MetricSeriesData> serviceMetricSeriesData) {
return serviceMetricSeriesData.stream().map(seriesData -> {
MetricSeriesData metricSeriesData = new MetricSeriesData();
PrivateFieldAccessHelper.set(metricSeriesData, "metricId",
seriesData.getId().getMetricId().toString());
PrivateFieldAccessHelper.set(metricSeriesData, "seriesKey",
new DimensionKey(seriesData.getId().getDimension()));
PrivateFieldAccessHelper.set(metricSeriesData, "timestampList", seriesData.getTimestampList());
PrivateFieldAccessHelper.set(metricSeriesData, "valueList", seriesData.getValueList());
return metricSeriesData;
}).collect(Collectors.toList());
.map(response -> MetricSeriesDataTransforms.fromInnerResponse(response));
}

/**
Expand Down Expand Up @@ -821,8 +763,8 @@ public PagedFlux<IncidentRootCause> listIncidentRootCauses(
String detectionConfigurationId,
String incidentId) {
Incident incident = new Incident();
PrivateFieldAccessHelper.set(incident, "id", incidentId);
PrivateFieldAccessHelper.set(incident, "detectionConfigurationId", detectionConfigurationId);
IncidentHelper.setId(incident, incidentId);
IncidentHelper.setDetectionConfigurationId(incident, detectionConfigurationId);
try {
return new PagedFlux<>(() ->
withContext(context -> listIncidentRootCausesInternal(incident, context)), null);
Expand All @@ -835,8 +777,8 @@ PagedFlux<IncidentRootCause> listIncidentRootCauses(
String detectionConfigurationId,
String incidentId, Context context) {
Incident incident = new Incident();
PrivateFieldAccessHelper.set(incident, "id", incidentId);
PrivateFieldAccessHelper.set(incident, "detectionConfigurationId", detectionConfigurationId);
IncidentHelper.setId(incident, incidentId);
IncidentHelper.setDetectionConfigurationId(incident, detectionConfigurationId);
try {
return new PagedFlux<>(() -> listIncidentRootCausesInternal(incident, context), null);
} catch (RuntimeException ex) {
Expand Down Expand Up @@ -887,32 +829,7 @@ private Mono<PagedResponse<IncidentRootCause>> listIncidentRootCausesInternal(In
.doOnSuccess(response -> logger.info("Retrieved the IncidentRootCauses - {}", response))
.doOnError(error -> logger.warning("Failed to retrieve the incident root causes - {}",
incident.getDetectionConfigurationId(), error))
.map(res -> new PagedResponseBase<>(
res.getRequest(),
res.getStatusCode(),
res.getHeaders(),
toIncidentRootCause(res.getValue().getValue()),
null,
null));
}

/**
* Helper method to transform {@link RootCause service reponse} to SDK level {@link IncidentRootCause}
*
* @param rootCauseList the service returned root causes object list .
*
* @return the list of {@link IncidentRootCause root causes}.
*/
private List<IncidentRootCause> toIncidentRootCause(List<RootCause> rootCauseList) {
return rootCauseList.stream().map(rootCause -> {
final IncidentRootCause incidentRootCause = new IncidentRootCause();
PrivateFieldAccessHelper.set(incidentRootCause, "seriesKey",
new DimensionKey(rootCause.getRootCause().getDimension()));
PrivateFieldAccessHelper.set(incidentRootCause, "paths", rootCause.getPath());
PrivateFieldAccessHelper.set(incidentRootCause, "confidenceScore", rootCause.getScore());
PrivateFieldAccessHelper.set(incidentRootCause, "description", rootCause.getDescription());
return incidentRootCause;
}).collect(Collectors.toList());
.map(res -> IncidentRootCauseTransforms.fromInnerResponse(res));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,9 +186,9 @@ public static AnomalyAlertConfiguration fromInner(
.getCrossMetricsOperator()
.toString()));
}
PrivateFieldAccessHelper.set(alertConfiguration,
"id",
AnomalyAlertConfigurationHelper.setId(alertConfiguration,
innerAlertConfiguration.getAnomalyAlertingConfigurationId().toString());

alertConfiguration.setDescription(innerAlertConfiguration.getDescription());
alertConfiguration.setIdOfHooksToAlert(innerAlertConfiguration
.getHookIds()
Expand Down Expand Up @@ -228,23 +228,18 @@ public static AnomalyAlertConfiguration fromInner(
ValueCondition innerValueCondition = innerMetricAlertConfiguration.getValueFilter();
if (innerValueCondition != null) {
MetricBoundaryCondition boundaryCondition = new MetricBoundaryCondition();
PrivateFieldAccessHelper.set(boundaryCondition,
"lowerBoundary",
MetricBoundaryConditionHelper.setLowerBoundary(boundaryCondition,
innerValueCondition.getLower());
PrivateFieldAccessHelper.set(boundaryCondition,
"upperBoundary",
MetricBoundaryConditionHelper.setUpperBoundary(boundaryCondition,
innerValueCondition.getUpper());
if (innerValueCondition.getDirection() == Direction.DOWN) {
PrivateFieldAccessHelper.set(boundaryCondition,
"boundaryDirection",
MetricBoundaryConditionHelper.setBoundaryDirection(boundaryCondition,
BoundaryDirection.LOWER);
} else if (innerValueCondition.getDirection() == Direction.UP) {
PrivateFieldAccessHelper.set(boundaryCondition,
"boundaryDirection",
MetricBoundaryConditionHelper.setBoundaryDirection(boundaryCondition,
BoundaryDirection.UPPER);
} else if (innerValueCondition.getDirection() == Direction.BOTH) {
PrivateFieldAccessHelper.set(boundaryCondition,
"boundaryDirection",
MetricBoundaryConditionHelper.setBoundaryDirection(boundaryCondition,
BoundaryDirection.BOTH);
}
if (innerValueCondition.getMetricId() != null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
// Code generated by Microsoft (R) AutoRest Code Generator.

package com.azure.ai.metricsadvisor.implementation.util;

import com.azure.ai.metricsadvisor.models.AnomalyAlertConfiguration;

/**
* The helper class to set the non-public properties of an {@link AnomalyAlertConfiguration} instance.
*/
public final class AnomalyAlertConfigurationHelper {
private static AnomalyAlertConfigurationAccessor accessor;

private AnomalyAlertConfigurationHelper() { }

/**
* Type defining the methods to set the non-public properties of an {@link AnomalyAlertConfiguration} instance.
*/
public interface AnomalyAlertConfigurationAccessor {
void setId(AnomalyAlertConfiguration configuration, String id);
}

/**
* The method called from {@link AnomalyAlertConfiguration} to set it's accessor.
*
* @param configurationAccessor The accessor.
*/
public static void setAccessor(final AnomalyAlertConfigurationAccessor configurationAccessor) {
accessor = configurationAccessor;
}

static void setId(AnomalyAlertConfiguration configuration, String id) {
accessor.setId(configuration, id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.ai.metricsadvisor.implementation.util;

import com.azure.ai.metricsadvisor.models.AnomalyDetectionConfiguration;

/**
* The helper class to set the non-public properties of an {@link AnomalyDetectionConfiguration} instance.
*/
public final class AnomalyDetectionConfigurationHelper {
private static AnomalyDetectionConfigurationAccessor accessor;

private AnomalyDetectionConfigurationHelper() { }

/**
* Type defining the methods to set the non-public properties of an {@link AnomalyDetectionConfiguration} instance.
*/
public interface AnomalyDetectionConfigurationAccessor {
void setId(AnomalyDetectionConfiguration configuration, String id);
void setMetricId(AnomalyDetectionConfiguration configuration, String metricId);
}

/**
* The method called from {@link AnomalyDetectionConfiguration} to set it's accessor.
*
* @param configurationAccessor The accessor.
*/
public static void setAccessor(final AnomalyDetectionConfigurationAccessor configurationAccessor) {
accessor = configurationAccessor;
}

static void setId(AnomalyDetectionConfiguration configuration, String id) {
accessor.setId(configuration, id);
}

static void setMetricId(AnomalyDetectionConfiguration configuration, String metricId) {
accessor.setMetricId(configuration, metricId);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.ai.metricsadvisor.implementation.util;

import com.azure.ai.metricsadvisor.models.Anomaly;
import com.azure.ai.metricsadvisor.models.AnomalyStatus;
import com.azure.ai.metricsadvisor.models.DimensionKey;
import com.azure.ai.metricsadvisor.models.Severity;

import java.time.OffsetDateTime;

/**
* The helper class to set the non-public properties of an {@link Anomaly} instance.
*/
public final class AnomalyHelper {
private static AnomalyAccessor accessor;

private AnomalyHelper() { }

/**
* Type defining the methods to set the non-public properties of an {@link Anomaly} instance.
*/
public interface AnomalyAccessor {
void setMetricId(Anomaly anomaly, String metricId);
void setSeriesKey(Anomaly anomaly, DimensionKey seriesKey);
void setDetectionConfigurationId(Anomaly anomaly, String detectionConfigurationId);
void setSeverity(Anomaly anomaly, Severity severity);
void setStatus(Anomaly anomaly, AnomalyStatus status);
void setTimeStamp(Anomaly anomaly, OffsetDateTime timeStamp);
void setCreatedTime(Anomaly anomaly, OffsetDateTime createdTime);
void setModifiedTime(Anomaly anomaly, OffsetDateTime modifiedTime);
}

/**
* The method called from {@link Anomaly} to set it's accessor.
*
* @param anomalyAccessor The accessor.
*/
public static void setAccessor(final AnomalyAccessor anomalyAccessor) {
accessor = anomalyAccessor;
}

static void setMetricId(Anomaly anomaly, String metricId) {
accessor.setMetricId(anomaly, metricId);
}

static void setSeriesKey(Anomaly anomaly, DimensionKey seriesKey) {
accessor.setSeriesKey(anomaly, seriesKey);
}

static void setDetectionConfigurationId(Anomaly anomaly, String detectionConfigurationId) {
accessor.setDetectionConfigurationId(anomaly, detectionConfigurationId);
}

static void setSeverity(Anomaly anomaly, Severity severity) {
accessor.setSeverity(anomaly, severity);
}

static void setStatus(Anomaly anomaly, AnomalyStatus status) {
accessor.setStatus(anomaly, status);
}

static void setTimeStamp(Anomaly anomaly, OffsetDateTime timeStamp) {
accessor.setTimeStamp(anomaly, timeStamp);
}

static void setCreatedTime(Anomaly anomaly, OffsetDateTime createdTime) {
accessor.setCreatedTime(anomaly, createdTime);
}

static void setModifiedTime(Anomaly anomaly, OffsetDateTime modifiedTime) {
accessor.setModifiedTime(anomaly, modifiedTime);
}
}
Loading