Skip to content

Commit 7074c1b

Browse files
authored
[MetricsAdvisor] Added samples for non-core scenarios (Azure#16167)
1 parent 6d63d29 commit 7074c1b

27 files changed

+1585
-440
lines changed

sdk/metricsadvisor/Azure.AI.MetricsAdvisor/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
### Breaking Changes
66
- In `MetricsAdvisorClient`, changed return types of sync and async methods `GetIncidentRootCauses`, `GetMetricEnrichedSeriesData`, and `GetMetricSeriesData` to pageables.
77
- In `MetricsAdvisorAdministrationClient`, changed return types of sync and async methods `GetAnomalyAlertConfigurations` and `GetMetricAnomalyDetectionConfigurations` to pageables.
8+
- In `MetricsAdvisorAdministrationClient`, renamed parameter `alertConfigurationId` to `detectionConfigurationId` in sync and async `GetAnomalyAlertConfigurations` methods.
9+
- In `MetricEnrichedSeriesData`, made elements of `ExpectedValues`, `Periods`, `IsAnomaly`, `LowerBoundaries` and `UpperBoundaries` nullables.
810

911
## 1.0.0-beta.1 (2020-10-08)
1012

sdk/metricsadvisor/Azure.AI.MetricsAdvisor/README.md

Lines changed: 80 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ The following section provides several code snippets illustrating common pattern
154154

155155
Metrics Advisor supports multiple types of data sources. In this sample we'll illustrate how to create a [`DataFeed`](#data-feed) that extracts data from a SQL server.
156156

157-
```C# Snippet:CreateDataFeedFromDataSource
157+
```C# Snippet:CreateDataFeedAsync
158158
string sqlServerConnectionString = "<connectionString>";
159159
string sqlServerQuery = "<query>";
160160

@@ -186,14 +186,16 @@ Response<DataFeed> response = await adminClient.CreateDataFeedAsync(dataFeedName
186186
DataFeed dataFeed = response.Value;
187187

188188
Console.WriteLine($"Data feed ID: {dataFeed.Id}");
189+
```
189190

190-
// Only the ID of the data feed is known at this point. You can perform another service
191-
// call to get more information, such as status, created time, the list of administrators,
192-
// or the metric IDs.
191+
Note that only the ID of the data feed is known at this point. You can performa another service call to `GetDataFeedAsync` or `GetDataFeed` to get more information, such as status, created time, the list of administrators, or the metric IDs.
193192

194-
response = await adminClient.GetDataFeedAsync(dataFeed.Id);
193+
```C# Snippet:GetDataFeedAsync
194+
string dataFeedId = "<dataFeedId>";
195195

196-
dataFeed = response.Value;
196+
Response<DataFeed> response = await adminClient.GetDataFeedAsync(dataFeedId);
197+
198+
DataFeed dataFeed = response.Value;
197199

198200
Console.WriteLine($"Data feed status: {dataFeed.Status.Value}");
199201
Console.WriteLine($"Data feed created time: {dataFeed.CreatedTime.Value}");
@@ -215,12 +217,15 @@ foreach (DataFeedMetric metric in dataFeed.Schema.MetricColumns)
215217

216218
Check the ingestion status of a previously created [`DataFeed`](#data-feed).
217219

218-
```C# Snippet:CheckIngestionStatusOfDataFeed
220+
```C# Snippet:GetDataFeedIngestionStatusesAsync
219221
string dataFeedId = "<dataFeedId>";
220222

221223
var startTime = DateTimeOffset.Parse("2020-01-01T00:00:00Z");
222224
var endTime = DateTimeOffset.Parse("2020-09-09T00:00:00Z");
223-
var options = new GetDataFeedIngestionStatusesOptions(startTime, endTime);
225+
var options = new GetDataFeedIngestionStatusesOptions(startTime, endTime)
226+
{
227+
TopCount = 5
228+
};
224229

225230
Console.WriteLine("Ingestion statuses:");
226231
Console.WriteLine();
@@ -234,8 +239,8 @@ await foreach (DataFeedIngestionStatus ingestionStatus in adminClient.GetDataFee
234239
Console.WriteLine($"Service message: {ingestionStatus.Message}");
235240
Console.WriteLine();
236241

237-
// Print at most 10 statuses.
238-
if (++statusCount >= 10)
242+
// Print at most 5 statuses.
243+
if (++statusCount >= 5)
239244
{
240245
break;
241246
}
@@ -246,7 +251,7 @@ await foreach (DataFeedIngestionStatus ingestionStatus in adminClient.GetDataFee
246251

247252
Create an [`AnomalyDetectionConfiguration`](#data-anomaly) to tell the service which data points should be considered anomalies.
248253

249-
```C# Snippet:CreateAnomalyDetectionConfiguration
254+
```C# Snippet:CreateAnomalyDetectionConfigurationAsync
250255
string metricId = "<metricId>";
251256
string configurationName = "Sample anomaly detection configuration";
252257

@@ -279,7 +284,7 @@ Console.WriteLine($"Anomaly detection configuration ID: {detectionConfiguration.
279284

280285
Metrics Advisor supports the [`EmailHook` and `WebHook`](#alerting-hook) classes as means of subscribing to [alerts](#anomaly-alert) notifications. In this example we'll illustrate how to create an `EmailHook`. Note that you need to pass the hook to an anomaly alert configuration to start getting notifications. See the sample [Create an anomaly alert configuration](#create-an-anomaly-alert-configuration) below for more information.
281286

282-
```C# Snippet:CreateHookForReceivingAnomalyAlerts
287+
```C# Snippet:CreateHookAsync
283288
string hookName = "Sample hook";
284289
var emailsToAlert = new List<string>()
285290
{
@@ -289,7 +294,7 @@ var emailsToAlert = new List<string>()
289294

290295
var emailHook = new EmailHook(hookName, emailsToAlert);
291296

292-
Response<AlertingHook> response = adminClient.CreateHook(emailHook);
297+
Response<AlertingHook> response = await adminClient.CreateHookAsync(emailHook);
293298

294299
AlertingHook hook = response.Value;
295300

@@ -300,7 +305,7 @@ Console.WriteLine($"Hook ID: {hook.Id}");
300305

301306
Create an [`AnomalyAlertConfiguration`](#anomaly-alert) to tell the service which anomalies should trigger alerts.
302307

303-
```C# Snippet:CreateAnomalyAlertConfiguration
308+
```C# Snippet:CreateAnomalyAlertConfigurationAsync
304309
string hookId = "<hookId>";
305310
string anomalyDetectionConfigurationId = "<anomalyDetectionConfigurationId>";
306311

@@ -324,40 +329,64 @@ Console.WriteLine($"Alert configuration ID: {alertConfiguration.Id}");
324329

325330
### Query detected anomalies and triggered alerts
326331

327-
Look through the [alerts](#anomaly-alert) created by a given anomaly alert configuration, and list the [anomalies](#data-anomaly) that triggered these alerts.
332+
Look through the [alerts](#anomaly-alert) created by a given anomaly alert configuration.
328333

329-
```C# Snippet:QueryDetectedAnomaliesAndTriggeredAlerts
334+
```C# Snippet:GetAlertsAsync
330335
string anomalyAlertConfigurationId = "<anomalyAlertConfigurationId>";
331336

332337
var startTime = DateTimeOffset.Parse("2020-01-01T00:00:00Z");
333338
var endTime = DateTimeOffset.UtcNow;
334-
var options = new GetAlertsOptions(startTime, endTime, TimeMode.AnomalyTime);
339+
var options = new GetAlertsOptions(startTime, endTime, TimeMode.AnomalyTime)
340+
{
341+
TopCount = 5
342+
};
335343

336344
int alertCount = 0;
337345

338346
await foreach (AnomalyAlert alert in client.GetAlertsAsync(anomalyAlertConfigurationId, options))
339347
{
348+
Console.WriteLine($"Alert created at: {alert.CreatedTime}");
340349
Console.WriteLine($"Alert at timestamp: {alert.Timestamp}");
341350
Console.WriteLine($"Id: {alert.Id}");
342-
Console.WriteLine($"Anomalies that triggered this alert:");
351+
Console.WriteLine();
343352

344-
await foreach (DataAnomaly anomaly in client.GetAnomaliesForAlertAsync(anomalyAlertConfigurationId, alert.Id))
353+
// Print at most 5 alerts.
354+
if (++alertCount >= 5)
345355
{
346-
Console.WriteLine(" Anomaly:");
347-
Console.WriteLine($" Status: {anomaly.Status.Value}");
348-
Console.WriteLine($" Severity: {anomaly.Severity}");
349-
Console.WriteLine($" Series key:");
356+
break;
357+
}
358+
}
359+
```
360+
361+
Once you know an alert's ID, list the [anomalies](#data-anomaly) that triggered this alert.
362+
363+
```C# Snippet:GetAnomaliesForAlertAsync
364+
string alertConfigurationId = "<alertConfigurationId>";
365+
string alertId = "<alertId>";
350366

351-
foreach (KeyValuePair<string, string> keyValuePair in anomaly.SeriesKey.AsDictionary())
352-
{
353-
Console.WriteLine($" Dimension '{keyValuePair.Key}': {keyValuePair.Value}");
354-
}
367+
var options = new GetAnomaliesForAlertOptions() { TopCount = 3 };
355368

356-
Console.WriteLine();
369+
int anomalyCount = 0;
370+
371+
await foreach (DataAnomaly anomaly in client.GetAnomaliesForAlertAsync(alertConfigurationId, alertId, options))
372+
{
373+
Console.WriteLine($"Anomaly detection configuration ID: {anomaly.AnomalyDetectionConfigurationId}");
374+
Console.WriteLine($"Metric ID: {anomaly.MetricId}");
375+
Console.WriteLine($"Anomaly at timestamp: {anomaly.Timestamp}");
376+
Console.WriteLine($"Anomaly detected at: {anomaly.CreatedTime}");
377+
Console.WriteLine($"Status: {anomaly.Status}");
378+
Console.WriteLine($"Severity: {anomaly.Severity}");
379+
Console.WriteLine("Series key:");
380+
381+
foreach (KeyValuePair<string, string> keyValuePair in anomaly.SeriesKey.AsDictionary())
382+
{
383+
Console.WriteLine($" Dimension '{keyValuePair.Key}': {keyValuePair.Value}");
357384
}
358385

359-
// Print at most 3 alerts.
360-
if (++alertCount >= 3)
386+
Console.WriteLine();
387+
388+
// Print at most 3 anomalies.
389+
if (++anomalyCount >= 3)
361390
{
362391
break;
363392
}
@@ -422,12 +451,16 @@ To learn more about other logging mechanisms see [Diagnostics Samples][logging].
422451

423452
Samples showing how to use the Cognitive Services Metrics Advisor library are available in this GitHub repository. Samples are provided for each main functional area:
424453

425-
- [Create a data feed from a data source][metricsadv-sample1]
426-
- [Check the ingestion status of a data feed][metricsadv-sample2]
427-
- [Create an anomaly detection configuration][metricsadv-sample3]
428-
- [Create a hook for receiving anomaly alerts][metricsadv-sample4]
429-
- [Create an anomaly alert configuration][metricsadv-sample5]
430-
- [Query detected anomalies and triggered alerts][metricsadv-sample6]
454+
- [Data feed CRUD operations][metricsadv-sample1]
455+
- [Data feed ingestion operations][metricsadv-sample2]
456+
- [Anomaly detection configuration CRUD operations][metricsadv-sample3]
457+
- [Hook CRUD operations][metricsadv-sample4]
458+
- [Anomaly alert configuration CRUD operations][metricsadv-sample5]
459+
- [Query triggered alerts][metricsadv-sample6]
460+
- [Query detected anomalies][metricsadv-sample7]
461+
- [Query incidents and their root causes][metricsadv-sample8]
462+
- [Query time series information][metricsadv-sample9]
463+
- [Feedback CRUD operations][metricsadv-sample10]
431464

432465
## Contributing
433466

@@ -442,7 +475,7 @@ This project has adopted the [Microsoft Open Source Code of Conduct][code_of_con
442475
<!-- LINKS -->
443476
[metricsadv_client_src]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/src
444477
[metricsadv_docs]: https://docs.microsoft.com/azure/cognitive-services/metrics-advisor
445-
[metricsadv_nuget_package]: https://www.nuget.org/packages?q=Azure.AI.MetricsAdvisor
478+
[metricsadv_nuget_package]: https://www.nuget.org/packages/Azure.AI.MetricsAdvisor
446479
[metricsadv_refdocs]: https://aka.ms/azsdk/net/docs/ref/metricsadvisor
447480
[metricsadv_rest_api]: https://westus2.dev.cognitive.microsoft.com/docs/services/MetricsAdvisor
448481
[metricsadv_samples]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/samples/README.md
@@ -451,12 +484,16 @@ This project has adopted the [Microsoft Open Source Code of Conduct][code_of_con
451484
[metrics_advisor_admin_client_class]: https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/src/MetricsAdvisorAdministrationClient.cs
452485
[metrics_advisor_client_class]: https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/src/MetricsAdvisorClient.cs
453486

454-
[metricsadv-sample1]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample1_CreateDataFeedFromDataSource.cs
455-
[metricsadv-sample2]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample2_CheckIngestionStatusOfDataFeed.cs
456-
[metricsadv-sample3]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample3_CreateAnomalyDetectionConfiguration.cs
457-
[metricsadv-sample4]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample4_CreateHookForReceivingAnomalyAlerts.cs
458-
[metricsadv-sample5]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample5_CreateAnomalyAlertConfiguration.cs
459-
[metricsadv-sample6]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample6_QueryDetectedAnomaliesAndTriggeredAlerts.cs
487+
[metricsadv-sample1]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample01_DataFeedCrudOperations.cs
488+
[metricsadv-sample2]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample02_DataFeedIngestionOperations.cs
489+
[metricsadv-sample3]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample03_AnomalyDetectionConfigurationCrudOperations.cs
490+
[metricsadv-sample4]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample04_HookCrudOperations.cs
491+
[metricsadv-sample5]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample05_AnomalyAlertConfigurationCrudOperations.cs
492+
[metricsadv-sample6]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample06_QueryTriggeredAlerts.cs
493+
[metricsadv-sample7]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample07_QueryDetectedAnomalies.cs
494+
[metricsadv-sample8]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample08_QueryIncidentsAndRootCauses.cs
495+
[metricsadv-sample9]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample09_QueryTimeSeriesInformation.cs
496+
[metricsadv-sample10]: https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/tests/Samples/Sample10_FeedbackCrudOperations.cs
460497

461498
[cognitive_resource_cli]: https://docs.microsoft.com/azure/cognitive-services/cognitive-services-apis-create-account-cli
462499
[cognitive_resource_portal]: https://docs.microsoft.com/azure/cognitive-services/cognitive-services-apis-create-account

sdk/metricsadvisor/Azure.AI.MetricsAdvisor/api/Azure.AI.MetricsAdvisor.netstandard2.0.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ public MetricsAdvisorAdministrationClient(System.Uri endpoint, Azure.AI.MetricsA
7777
public virtual System.Threading.Tasks.Task<Azure.Response> DeleteMetricAnomalyDetectionConfigurationAsync(string detectionConfigurationId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
7878
public virtual Azure.Response<Azure.AI.MetricsAdvisor.Models.AnomalyAlertConfiguration> GetAnomalyAlertConfiguration(string alertConfigurationId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
7979
public virtual System.Threading.Tasks.Task<Azure.Response<Azure.AI.MetricsAdvisor.Models.AnomalyAlertConfiguration>> GetAnomalyAlertConfigurationAsync(string alertConfigurationId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
80-
public virtual Azure.Pageable<Azure.AI.MetricsAdvisor.Models.AnomalyAlertConfiguration> GetAnomalyAlertConfigurations(string alertConfigurationId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
81-
public virtual Azure.AsyncPageable<Azure.AI.MetricsAdvisor.Models.AnomalyAlertConfiguration> GetAnomalyAlertConfigurationsAsync(string alertConfigurationId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
80+
public virtual Azure.Pageable<Azure.AI.MetricsAdvisor.Models.AnomalyAlertConfiguration> GetAnomalyAlertConfigurations(string detectionConfigurationId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
81+
public virtual Azure.AsyncPageable<Azure.AI.MetricsAdvisor.Models.AnomalyAlertConfiguration> GetAnomalyAlertConfigurationsAsync(string detectionConfigurationId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
8282
public virtual Azure.Response<Azure.AI.MetricsAdvisor.Models.DataFeed> GetDataFeed(string dataFeedId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
8383
public virtual System.Threading.Tasks.Task<Azure.Response<Azure.AI.MetricsAdvisor.Models.DataFeed>> GetDataFeedAsync(string dataFeedId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
8484
public virtual Azure.Response<Azure.AI.MetricsAdvisor.Models.DataFeedIngestionProgress> GetDataFeedIngestionProgress(string dataFeedId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
@@ -959,13 +959,13 @@ public MetricDimension(string dimensionName) { }
959959
public partial class MetricEnrichedSeriesData
960960
{
961961
internal MetricEnrichedSeriesData() { }
962-
public System.Collections.Generic.IReadOnlyList<double> ExpectedValues { get { throw null; } }
963-
public System.Collections.Generic.IReadOnlyList<bool> IsAnomaly { get { throw null; } }
964-
public System.Collections.Generic.IReadOnlyList<double> LowerBoundaries { get { throw null; } }
965-
public System.Collections.Generic.IReadOnlyList<int> Periods { get { throw null; } }
962+
public System.Collections.Generic.IReadOnlyList<double?> ExpectedValues { get { throw null; } }
963+
public System.Collections.Generic.IReadOnlyList<bool?> IsAnomaly { get { throw null; } }
964+
public System.Collections.Generic.IReadOnlyList<double?> LowerBoundaries { get { throw null; } }
965+
public System.Collections.Generic.IReadOnlyList<int?> Periods { get { throw null; } }
966966
public Azure.AI.MetricsAdvisor.Models.DimensionKey SeriesKey { get { throw null; } }
967967
public System.Collections.Generic.IReadOnlyList<System.DateTimeOffset> Timestamps { get { throw null; } }
968-
public System.Collections.Generic.IReadOnlyList<double> UpperBoundaries { get { throw null; } }
968+
public System.Collections.Generic.IReadOnlyList<double?> UpperBoundaries { get { throw null; } }
969969
public System.Collections.Generic.IReadOnlyList<double> Values { get { throw null; } }
970970
}
971971
public partial class MetricFeedback

0 commit comments

Comments
 (0)