Skip to content

Commit

Permalink
Fix live test pipeline for Metrics Advisor (#18816)
Browse files Browse the repository at this point in the history
  • Loading branch information
samvaity authored Feb 1, 2021
1 parent d0f337a commit db50916
Show file tree
Hide file tree
Showing 31 changed files with 153 additions and 48 deletions.
86 changes: 70 additions & 16 deletions sdk/metricsadvisor/azure-ai-metricsadvisor/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,9 @@ of business dataFeedMetrics.
#### Create a Metrics Advisor resource

### Authenticate the client
You will need two keys to authenticate the client:

- The subscription key to your Metrics Advisor resource. You can find this in the Keys and Endpoint section of your resource in the Azure portal.
- The API key for your Metrics Advisor instance. You can find this on the web portal for Metrics Advisor, in API keys on the left navigation menu.

We can use the keys to create a new `MetricsAdvisorClient` or `MetricsAdvisorAdministrationClient`.
In order to interact with the Metrics Advisor service, you will need to create an instance of the Metrics Advisor client.
Both the asynchronous and synchronous clients can be created by using `MetricsAdvisorClientBuilder`. Invoking `buildClient()`
will create the synchronous client, while invoking `buildAsyncClient` will create its asynchronous counterpart.

##### Looking up the endpoint
You can find the **endpoint** for your Metric Advisor resource in the [Azure Portal][azure_portal],
Expand All @@ -43,8 +40,16 @@ or [Azure CLI][azure_cli_endpoint].
az cognitiveservices account show --name "resource-name" --resource-group "resource-group-name" --query "endpoint"
```

#### Create a MetricsAdvisor client using MetricsAdvisorKeyCredential
You will need two keys to authenticate the client:

- The subscription key to your Metrics Advisor resource. You can find this in the Keys and Endpoint section of your resource in the Azure portal.
- The API key for your Metrics Advisor instance. You can find this on the web portal for Metrics Advisor, in API keys on the left navigation menu.

Once you have the two keys and endpoint, you can use the `MetricsAdvisorKeyCredential` class to authenticate the clients as follows:

#### Create a Metrics Advisor client using MetricsAdvisorKeyCredential
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L62-L66-->
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L64-L68-->
```java
MetricsAdvisorKeyCredential credential = new MetricsAdvisorKeyCredential("subscription_key", "api_key");
MetricsAdvisorClient metricsAdvisorClient = new MetricsAdvisorClientBuilder()
Expand All @@ -54,7 +59,7 @@ MetricsAdvisorClient metricsAdvisorClient = new MetricsAdvisorClientBuilder()
```

#### Create a Metrics Administration client using MetricsAdvisorKeyCredential
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L73-L78 -->
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L75-L80 -->
```java
MetricsAdvisorKeyCredential credential = new MetricsAdvisorKeyCredential("subscription_key", "api_key");
MetricsAdvisorAdministrationClient metricsAdvisorAdminClient =
Expand All @@ -64,6 +69,54 @@ MetricsAdvisorAdministrationClient metricsAdvisorAdminClient =
.buildClient();
```

#### Create a MetricsAdvisor client using Azure Service Directory
Azure SDK for Java supports an Azure Identity package, making it easy to get credentials from Microsoft identity
platform.

Authentication with AAD requires some initial setup:
* Add the Azure Identity package

[//]: # ({x-version-update-start;com.azure:azure-identity;dependency})
```xml
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.2.2</version>
</dependency>
```
[//]: # ({x-version-update-end})
* [Register a new Azure Active Directory application][register_AAD_application]
* [Grant access][grant_access] to Metrics Advisor by assigning the `"Cognitive Services User"` role to your service principal.

After the setup, you can choose which type of [credential][azure_identity_credential_type] from azure.identity to use.
As an example, [DefaultAzureCredential][wiki_identity] can be used to authenticate the client:
Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables:
AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET.

Authorization is easiest using [DefaultAzureCredential][wiki_identity]. It finds the best credential to use in its
running environment. For more information about using Azure Active Directory authorization with Metrics Advisor, please
refer to [the associated documentation][aad_authorization].
#### Create a Metrics Advisor client using AAD authentication
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L87-L91 -->
```java
TokenCredential credential = new DefaultAzureCredentialBuilder().build();
MetricsAdvisorClient metricsAdvisorClient = new MetricsAdvisorClientBuilder()
.endpoint("{endpoint}")
.credential(credential)
.buildClient();
```

#### Create a Metrics Administration client using AAD authentication
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L98-L103 -->
```java
TokenCredential credential = new DefaultAzureCredentialBuilder().build();
MetricsAdvisorAdministrationClient metricsAdvisorAdminClient =
new MetricsAdvisorAdministrationClientBuilder()
.endpoint("{endpoint}")
.credential(credential)
.buildClient();
```

## Key concepts
### MetricsAdvisorClient
`MetricsAdvisorClient` helps with:
Expand Down Expand Up @@ -121,7 +174,7 @@ A notification hook is the entry point that allows the users to subscribe to rea

#### Add a data feed from a sample or data source
This example ingests the user specified `SQLServerDataFeedSource` data feed source data to the service.
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L85-L122 -->
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L110-L147 -->
```java
DataFeed dataFeed = new DataFeed()
.setName("dataFeedName")
Expand Down Expand Up @@ -165,7 +218,7 @@ if (SQL_SERVER_DB == createdSqlDataFeed.getSourceType()) {
#### Check ingestion status
This example checks the ingestion status of a previously provided data feed source.

<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L129-L140 -->
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L154-L165 -->
```java
String dataFeedId = "3d48er30-6e6e-4391-b78f-b00dfee1e6f5";

Expand All @@ -184,7 +237,7 @@ metricsAdvisorAdminClient.listDataFeedIngestionStatus(
#### Configure anomaly detection configuration
This example demonstrates how a user can configure an anomaly detection configuration for their data.

<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L147-L177 -->
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L172-L202 -->
```java
String metricId = "3d48er30-6e6e-4391-b78f-b00dfee1e6f5";

Expand Down Expand Up @@ -221,7 +274,7 @@ final AnomalyDetectionConfiguration anomalyDetectionConfiguration =

### Add hooks for receiving anomaly alerts
This example creates an email hook that receives anomaly incident alerts.
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L184-L196 -->
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L209-L221 -->
```java
NotificationHook emailNotificationHook = new EmailNotificationHook("email Hook")
.setDescription("my email Hook")
Expand All @@ -240,8 +293,8 @@ System.out.printf("Email Hook emails to alert: %s%n",

#### Configure an anomaly alert configuration
This example demonstrates how a user can configure an alerting configuration for detected anomalies in their data.
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L228-L248 -->

<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L203-L223 -->
```java
String detectionConfigurationId1 = "9ol48er30-6e6e-4391-b78f-b00dfee1e6f5";
String detectionConfigurationId2 = "3e58er30-6e6e-4391-b78f-b00dfee1e6f5";
Expand All @@ -265,7 +318,6 @@ final AnomalyAlertConfiguration anomalyAlertConfiguration
.setCrossMetricsOperator(MetricAnomalyAlertConfigurationsOperator.AND)
.setIdOfHooksToAlert(Arrays.asList(hookId1, hookId2)));
```

#### Query anomaly detection results
This example demonstrates how a user can query alerts triggered for an anomaly detection configuration and get anomalies for that anomalyAlert.

Expand Down Expand Up @@ -299,7 +351,7 @@ Metrics Advisor clients raises `HttpResponseException` [exceptions][http_respons
to provide a non existing feedback Id an `HttpResponseException` would be raised with an error indicating the failure cause.
In the following code snippet, the error is handled
gracefully by catching the exception and display the additional information about the error.
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L257-L261 -->
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L282-L286 -->
```java
try {
metricsAdvisorClient.getFeedback("non_existing_feedback_id");
Expand All @@ -324,7 +376,7 @@ For more details see the [samples README][samples_readme].
#### Async APIs
All the examples shown so far have been using synchronous APIs, but we provide full support for async APIs as well.
You'll need to use `MetricsAdvisorAsyncClient`
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L268-L272 -->
<!-- embedme ./src/samples/java/com/azure/ai/metricsadvisor/ReadmeSamples.java#L293-L297 -->
```java
MetricsAdvisorKeyCredential credential = new MetricsAdvisorKeyCredential("subscription_key", "api_key");
MetricsAdvisorAsyncClient metricsAdvisorAsyncClient = new MetricsAdvisorClientBuilder()
Expand Down Expand Up @@ -362,12 +414,14 @@ This project has adopted the [Microsoft Open Source Code of Conduct][coc]. For m
[create_new_resource]: https://docs.microsoft.com/azure/cognitive-services/cognitive-services-apis-create-account?tabs=multiservice%2Cwindows#create-a-new-azure-cognitive-services-resource
[http_clients_wiki]: https://github.com/Azure/azure-sdk-for-java/wiki/HTTP-clients
[jdk_link]: https://docs.microsoft.com/java/azure/jdk/?view=azure-java-stable
[register_AAD_application]: https://docs.microsoft.com/azure/cognitive-services/authentication#assign-a-role-to-a-service-principal
[metrics_advisor_account]: https://ms.portal.azure.com/#create/Microsoft.CognitiveServicesMetricsAdvisor
[metrics_advisor_doc]: https://docs.microsoft.com/azure/cognitive-services/Metrics-advisor/glossary
[mvn_package]: https://search.maven.org/artifact/com.azure/azure-ai-metricsadvisor/1.0.0-beta.1/jar
[product_documentation]: https://docs.microsoft.com/azure/cognitive-services/metrics-advisor/overview
[source_code]: https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/metricsadvisor/azure-ai-metricsadvisor/src
[samples]: https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples
[samples_readme]: https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/metricsadvisor/azure-ai-metricsadvisor/src/samples/README.md
[wiki_identity]: https://github.com/Azure/azure-sdk-for-java/wiki/Identity-and-Authentication

![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%metricsadvisor%2Fazure-ai-metricsadvisor%2FREADME.png)
5 changes: 0 additions & 5 deletions sdk/metricsadvisor/azure-ai-metricsadvisor/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,6 @@
--add-exports com.azure.core/com.azure.core.implementation.http=ALL-UNNAMED
--add-opens com.azure.ai.metricsadvisor/com.azure.ai.metricsadvisor=ALL-UNNAMED
</argLine>
<systemPropertyVariables>
<!-- Parallel runs disabled due to subscriber timeout issue causing failures in tests. -->
<!-- https://github.com/Azure/azure-sdk-for-java/issues/17069 -->
<junit.jupiter.execution.parallel.enabled>false</junit.jupiter.execution.parallel.enabled>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import com.azure.ai.metricsadvisor.models.DetectionConditionsOperator;
import com.azure.ai.metricsadvisor.models.EmailNotificationHook;
import com.azure.ai.metricsadvisor.models.HardThresholdCondition;
import com.azure.ai.metricsadvisor.models.NotificationHook;
import com.azure.ai.metricsadvisor.models.ListDataFeedIngestionOptions;
import com.azure.ai.metricsadvisor.models.MetricAnomalyAlertConditions;
import com.azure.ai.metricsadvisor.models.MetricAnomalyAlertConfiguration;
Expand All @@ -32,11 +31,14 @@
import com.azure.ai.metricsadvisor.models.MetricWholeSeriesDetectionCondition;
import com.azure.ai.metricsadvisor.models.MetricsAdvisorKeyCredential;
import com.azure.ai.metricsadvisor.models.MySqlDataFeedSource;
import com.azure.ai.metricsadvisor.models.NotificationHook;
import com.azure.ai.metricsadvisor.models.SQLServerDataFeedSource;
import com.azure.ai.metricsadvisor.models.SeverityCondition;
import com.azure.ai.metricsadvisor.models.SmartDetectionCondition;
import com.azure.ai.metricsadvisor.models.SuppressCondition;
import com.azure.core.credential.TokenCredential;
import com.azure.core.exception.HttpResponseException;
import com.azure.identity.DefaultAzureCredentialBuilder;

import java.time.OffsetDateTime;
import java.util.Arrays;
Expand Down Expand Up @@ -78,6 +80,29 @@ public void getMetricsAdvisorAdministrationClient() {
.buildClient();
}

/**
* Code snippet for getting advisor client using AAD Authentication.
*/
public void useAADAuthentication() {
TokenCredential credential = new DefaultAzureCredentialBuilder().build();
MetricsAdvisorClient metricsAdvisorClient = new MetricsAdvisorClientBuilder()
.endpoint("{endpoint}")
.credential(credential)
.buildClient();
}

/**
* Code snippet for getting administration client using AAD Authentication.
*/
public void metricsAdvisorAdministrationClientAAD() {
TokenCredential credential = new DefaultAzureCredentialBuilder().build();
MetricsAdvisorAdministrationClient metricsAdvisorAdminClient =
new MetricsAdvisorAdministrationClientBuilder()
.endpoint("{endpoint}")
.credential(credential)
.buildClient();
}

/**
* Code snippet for creating a data feed.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@

import java.time.Duration;

import static com.azure.ai.metricsadvisor.TestUtils.DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS;
import static com.azure.ai.metricsadvisor.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;

public final class AlertAsyncTest extends AlertTestBase {

@BeforeAll
static void beforeAll() {
TestBase.setupClass();
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30));
StepVerifier.setDefaultTimeout(Duration.ofSeconds(DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS));
}

@AfterAll
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@

import java.time.Duration;

import static com.azure.ai.metricsadvisor.TestUtils.DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS;
import static com.azure.ai.metricsadvisor.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;

public final class AlertTest extends AlertTestBase {

@BeforeAll
static void beforeAll() {
TestBase.setupClass();
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30));
StepVerifier.setDefaultTimeout(Duration.ofSeconds(DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS));
}

@AfterAll
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;

import static com.azure.ai.metricsadvisor.TestUtils.DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS;
import static com.azure.ai.metricsadvisor.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;
import static com.azure.ai.metricsadvisor.TestUtils.INCORRECT_UUID;
import static com.azure.ai.metricsadvisor.TestUtils.INCORRECT_UUID_ERROR;
Expand All @@ -42,7 +43,7 @@ public class AnomalyAlertAsyncTest extends AnomalyAlertTestBase {
@BeforeAll
static void beforeAll() {
TestBase.setupClass();
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30));
StepVerifier.setDefaultTimeout(Duration.ofSeconds(DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS));
}

@AfterAll
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;

import static com.azure.ai.metricsadvisor.TestUtils.DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS;
import static com.azure.ai.metricsadvisor.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;
import static com.azure.ai.metricsadvisor.TestUtils.INCORRECT_UUID;
import static com.azure.ai.metricsadvisor.TestUtils.INCORRECT_UUID_ERROR;
Expand All @@ -43,7 +44,7 @@ public final class AnomalyAlertTest extends AnomalyAlertTestBase {
@BeforeAll
static void beforeAll() {
TestBase.setupClass();
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30));
StepVerifier.setDefaultTimeout(Duration.ofSeconds(DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS));
}

@AfterAll
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@

import java.time.Duration;

import static com.azure.ai.metricsadvisor.TestUtils.DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS;
import static com.azure.ai.metricsadvisor.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;

public final class AnomalyDimensionValuesAsyncTest extends AnomalyDimensionValuesTestBase {
@BeforeAll
static void beforeAll() {
TestBase.setupClass();
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30));
StepVerifier.setDefaultTimeout(Duration.ofSeconds(DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS));
}

@AfterAll
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@

import java.time.Duration;

import static com.azure.ai.metricsadvisor.TestUtils.DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS;
import static com.azure.ai.metricsadvisor.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;

public final class AnomalyDimensionValuesTest extends AnomalyDimensionValuesTestBase {
@BeforeAll
static void beforeAll() {
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30));
StepVerifier.setDefaultTimeout(Duration.ofSeconds(DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS));
}

@AfterAll
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import java.time.Duration;

import static com.azure.ai.metricsadvisor.TestUtils.DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS;
import static com.azure.ai.metricsadvisor.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;
import static org.junit.jupiter.api.Assertions.assertEquals;

Expand All @@ -25,7 +26,7 @@ public class AnomalyIncidentDetectedAsyncTest extends IncidentDetectedTestBase {
@BeforeAll
static void beforeAll() {
TestBase.setupClass();
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30));
StepVerifier.setDefaultTimeout(Duration.ofSeconds(DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS));
}

@AfterAll
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@

import java.time.Duration;

import static com.azure.ai.metricsadvisor.TestUtils.DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS;
import static com.azure.ai.metricsadvisor.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;

public class AnomalyIncidentDetectedTest extends IncidentDetectedTestBase {

@BeforeAll
static void beforeAll() {
TestBase.setupClass();
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30));
StepVerifier.setDefaultTimeout(Duration.ofSeconds(DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS));
}

@AfterAll
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,14 @@

import java.time.Duration;

import static com.azure.ai.metricsadvisor.TestUtils.DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS;
import static com.azure.ai.metricsadvisor.TestUtils.DISPLAY_NAME_WITH_ARGUMENTS;

public class AnomalyIncidentForAlertAsyncTest extends IncidentForAlertTestBase {
@BeforeAll
static void beforeAll() {
TestBase.setupClass();
StepVerifier.setDefaultTimeout(Duration.ofSeconds(30));
StepVerifier.setDefaultTimeout(Duration.ofSeconds(DEFAULT_SUBSCRIBER_TIMEOUT_SECONDS));
}

@AfterAll
Expand Down
Loading

0 comments on commit db50916

Please sign in to comment.