Skip to content
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
2 changes: 1 addition & 1 deletion sdk/metricsadvisor/Azure.AI.MetricsAdvisor/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ dataFeed.Schema = new DataFeedSchema();
dataFeed.Schema.MetricColumns.Add(new DataFeedMetric("cost"));
dataFeed.Schema.MetricColumns.Add(new DataFeedMetric("revenue"));
dataFeed.Schema.DimensionColumns.Add(new DataFeedDimension("category"));
dataFeed.Schema.DimensionColumns.Add(new DataFeedDimension("city"));
dataFeed.Schema.DimensionColumns.Add(new DataFeedDimension("region"));

dataFeed.IngestionSettings = new DataFeedIngestionSettings(DateTimeOffset.Parse("2020-01-01T00:00:00Z"));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ public async Task GetAnomaliesForDetectionConfigurationWithOptionalFilter()
Filter = new AnomalyFilter(AnomalySeverity.Medium, AnomalySeverity.Medium)
};

var dimensions = new Dictionary<string, string>() { { "city", "Delhi" }, { "category", "Handmade" } };
var dimensions = new Dictionary<string, string>() { { "region", "Delhi" }, { "category", "Handmade" } };
var groupKey1 = new DimensionKey(dimensions);

dimensions = new Dictionary<string, string>() { { "city", "Kolkata" } };
dimensions = new Dictionary<string, string>() { { "region", "Kolkata" } };
var groupKey2 = new DimensionKey(dimensions);

options.Filter.DimensionKeys.Add(groupKey1);
Expand All @@ -88,10 +88,10 @@ public async Task GetAnomaliesForDetectionConfigurationWithOptionalFilter()

ValidateSeriesKey(anomaly.SeriesKey);

anomaly.SeriesKey.TryGetValue("city", out string city);
anomaly.SeriesKey.TryGetValue("region", out string region);
anomaly.SeriesKey.TryGetValue("category", out string category);

Assert.That((city == "Delhi" && category == "Handmade") || city == "Kolkata");
Assert.That((region == "Delhi" && category == "Handmade") || region == "Kolkata");

if (++anomalyCount >= MaximumSamplesCount)
{
Expand Down Expand Up @@ -144,10 +144,10 @@ public async Task GetIncidentsForDetectionConfigurationWithOptionalDimensionFilt

var options = new GetIncidentsForDetectionConfigurationOptions(SamplingStartTime, SamplingEndTime);

var dimensions = new Dictionary<string, string>() { { "city", "Delhi" }, { "category", "Handmade" } };
var dimensions = new Dictionary<string, string>() { { "region", "Delhi" }, { "category", "Handmade" } };
var groupKey1 = new DimensionKey(dimensions);

dimensions = new Dictionary<string, string>() { { "city", "Kolkata" } };
dimensions = new Dictionary<string, string>() { { "region", "Kolkata" } };
var groupKey2 = new DimensionKey(dimensions);

options.DimensionKeys.Add(groupKey1);
Expand All @@ -170,10 +170,10 @@ public async Task GetIncidentsForDetectionConfigurationWithOptionalDimensionFilt

ValidateSeriesKey(incident.RootSeriesKey);

incident.RootSeriesKey.TryGetValue("city", out string city);
incident.RootSeriesKey.TryGetValue("region", out string region);
incident.RootSeriesKey.TryGetValue("category", out string category);

Assert.That((city == "Delhi" && category == "Handmade") || city == "Kolkata");
Assert.That((region == "Delhi" && category == "Handmade") || region == "Kolkata");

if (++incidentCount >= MaximumSamplesCount)
{
Expand Down Expand Up @@ -217,7 +217,7 @@ public async Task GetIncidentRootCausesForIncidentFromDetectionConfiguration()
// We already know the the incident we want to get, so apply filters to make the
// service call cheaper.

var dimensions = new Dictionary<string, string>() { { "city", "__SUM__" }, { "category", "Grocery & Gourmet Food" } };
var dimensions = new Dictionary<string, string>() { { "region", "__SUM__" }, { "category", "Grocery & Gourmet Food" } };
var groupKey = new DimensionKey(dimensions);

options.DimensionKeys.Add(groupKey);
Expand Down Expand Up @@ -251,7 +251,7 @@ public async Task GetIncidentRootCausesForIncidentFromDetectionConfiguration()
[RecordedTest]
public async Task GetIncidentRootCausesForIncidentFromAlert()
{
const string incidentId = "5a0692283edccf37ce825b3a8d475f4e-17571a77000";
const string incidentId = "30612c95b4c216ef418956c5c6162691-17bbd8dec00";

MetricsAdvisorClient client = GetMetricsAdvisorClient();

Expand Down Expand Up @@ -293,7 +293,7 @@ public async Task GetIncidentRootCausesForIncidentFromAlert()
[TestCase(false)]
public async Task GetAnomalyDimensionValuesWithMinimumSetup(bool useTokenCredential)
{
const string dimensionName = "city";
const string dimensionName = "region";

MetricsAdvisorClient client = GetMetricsAdvisorClient(useTokenCredential);

Expand All @@ -317,7 +317,7 @@ public async Task GetAnomalyDimensionValuesWithMinimumSetup(bool useTokenCredent
[RecordedTest]
public async Task GetAnomalyDimensionValuesWithOptionalDimensionFilter()
{
const string dimensionName = "city";
const string dimensionName = "region";

MetricsAdvisorClient client = GetMetricsAdvisorClient();

Expand Down Expand Up @@ -349,10 +349,10 @@ public async Task GetMetricEnrichedSeriesData(bool useTokenCredential)
{
MetricsAdvisorClient client = GetMetricsAdvisorClient(useTokenCredential);

var dimensions = new Dictionary<string, string>() { { "city", "Delhi" }, { "category", "Handmade" } };
var dimensions = new Dictionary<string, string>() { { "region", "Delhi" }, { "category", "Handmade" } };
var seriesKey1 = new DimensionKey(dimensions);

dimensions = new Dictionary<string, string>() { { "city", "Kolkata" }, { "category", "__SUM__" } };
dimensions = new Dictionary<string, string>() { { "region", "Kolkata" }, { "category", "__SUM__" } };
var seriesKey2 = new DimensionKey(dimensions);

var seriesKeys = new List<DimensionKey>() { seriesKey1, seriesKey2 };
Expand Down Expand Up @@ -387,10 +387,19 @@ public async Task GetMetricEnrichedSeriesData(bool useTokenCredential)
returnedKeys.Add(seriesData.SeriesKey);
}

IEnumerable<List<KeyValuePair<string, string>>> expectedKvps = seriesKeys.Select(key => key.ToList());
IEnumerable<List<KeyValuePair<string, string>>> returnedKvps = returnedKeys.Select(key => key.ToList());
// Making sure count is exactly 2 because the logic below relies on that.
Assert.That(seriesKeys.Count, Is.EqualTo(2));
Assert.That(returnedKeys.Count, Is.EqualTo(2));

Assert.That(returnedKvps, Is.EquivalentTo(expectedKvps));
if (AreSame(seriesKeys[0], returnedKeys[0]))
{
Assert.That(seriesKeys[1], Is.EquivalentTo(returnedKeys[1]));
}
else
{
Assert.That(seriesKeys[0], Is.EquivalentTo(returnedKeys[1]));
Assert.That(seriesKeys[1], Is.EquivalentTo(returnedKeys[0]));
}
}

private void ValidateIncidentRootCause(IncidentRootCause rootCause)
Expand All @@ -406,5 +415,23 @@ private void ValidateIncidentRootCause(IncidentRootCause rootCause)

ValidateSeriesKey(rootCause.SeriesKey);
}

private bool AreSame(DimensionKey left, DimensionKey right)
{
if (left.Dimension.Count != right.Dimension.Count)
{
return false;
}

foreach (KeyValuePair<string, string> kvp in left)
{
if (!right.TryGetValue(kvp.Key, out string value) || value != kvp.Value)
{
return false;
}
}

return true;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ namespace Azure.AI.MetricsAdvisor.Tests
{
public class MetricFeedbackLiveTests : MetricsAdvisorLiveTestBase
{
private const string ExpectedCity = "Delhi";
private const string ExpectedRegion = "Cairo";

private const string ExpectedCategory = "Handmade";
private const string ExpectedCategory = "Shoes Handbags & Sunglasses";

public MetricFeedbackLiveTests(bool isAsync) : base(isAsync)
{
Expand All @@ -31,7 +31,7 @@ public async Task AddAndGetAnomalyFeedbackWithMinimumSetup(bool useTokenCredenti
{
MetricsAdvisorClient client = GetMetricsAdvisorClient(useTokenCredential);

var dimensions = new Dictionary<string, string>() { { "city", ExpectedCity }, { "category", ExpectedCategory } };
var dimensions = new Dictionary<string, string>() { { "region", ExpectedRegion }, { "category", ExpectedCategory } };
var dimensionKey = new DimensionKey(dimensions);

var feedbackToAdd = new MetricAnomalyFeedback(MetricId, dimensionKey, CreatedFeedbackStartTime, CreatedFeedbackEndTime, AnomalyValue.AutoDetect);
Expand All @@ -58,7 +58,7 @@ public async Task AddAndGetAnomalyFeedbackWithOptionalDetectionConfigurationFilt
{
MetricsAdvisorClient client = GetMetricsAdvisorClient();

var dimensions = new Dictionary<string, string>() { { "city", ExpectedCity }, { "category", ExpectedCategory } };
var dimensions = new Dictionary<string, string>() { { "region", ExpectedRegion }, { "category", ExpectedCategory } };
var dimensionKey = new DimensionKey(dimensions);

var feedbackToAdd = new MetricAnomalyFeedback(MetricId, dimensionKey, CreatedFeedbackStartTime, CreatedFeedbackEndTime, AnomalyValue.AutoDetect)
Expand Down Expand Up @@ -88,7 +88,7 @@ public async Task AddAndGetChangePointFeedback()
{
MetricsAdvisorClient client = GetMetricsAdvisorClient();

var dimensions = new Dictionary<string, string>() { { "city", ExpectedCity }, { "category", ExpectedCategory } };
var dimensions = new Dictionary<string, string>() { { "region", ExpectedRegion }, { "category", ExpectedCategory } };
var dimensionKey = new DimensionKey(dimensions);

var feedbackToAdd = new MetricChangePointFeedback(MetricId, dimensionKey, CreatedFeedbackStartTime, CreatedFeedbackEndTime, ChangePointValue.AutoDetect);
Expand Down Expand Up @@ -118,7 +118,7 @@ public async Task AddAndGetCommentFeedbackWithMinimumSetup()
{
MetricsAdvisorClient client = GetMetricsAdvisorClient();

var dimensions = new Dictionary<string, string>() { { "city", ExpectedCity }, { "category", ExpectedCategory } };
var dimensions = new Dictionary<string, string>() { { "region", ExpectedRegion }, { "category", ExpectedCategory } };
var dimensionKey = new DimensionKey(dimensions);

var comment = "Feedback created in a .NET test.";
Expand All @@ -145,7 +145,7 @@ public async Task AddAndGetCommentFeedbackWithOptionalTimeFilters()
{
MetricsAdvisorClient client = GetMetricsAdvisorClient();

var dimensions = new Dictionary<string, string>() { { "city", ExpectedCity }, { "category", ExpectedCategory } };
var dimensions = new Dictionary<string, string>() { { "region", ExpectedRegion }, { "category", ExpectedCategory } };
var dimensionKey = new DimensionKey(dimensions);

var comment = "Feedback created in a .NET test.";
Expand Down Expand Up @@ -176,7 +176,7 @@ public async Task AddAndGetPeriodFeedback()
{
MetricsAdvisorClient client = GetMetricsAdvisorClient();

var dimensions = new Dictionary<string, string>() { { "city", ExpectedCity }, { "category", ExpectedCategory } };
var dimensions = new Dictionary<string, string>() { { "region", ExpectedRegion }, { "category", ExpectedCategory } };
var dimensionKey = new DimensionKey(dimensions);

var periodValue = 10;
Expand Down Expand Up @@ -272,10 +272,10 @@ public async Task GetAllFeedbackWithOptionalFeedbackFilter()
// The sampling time range was chosen in a way to make sure there'll be feedback returned by the
// service call. Changing these values can make this test fail.

DateTimeOffset feedbackSamplingStartTime = DateTimeOffset.Parse("2020-12-01T00:00:00Z");
DateTimeOffset feedbackSamplingEndTime = DateTimeOffset.Parse("2020-12-31T00:00:00Z");
DateTimeOffset feedbackSamplingStartTime = DateTimeOffset.Parse("2021-10-01T00:00:00Z");
DateTimeOffset feedbackSamplingEndTime = DateTimeOffset.Parse("2021-11-20T00:00:00Z");

var dimensions = new Dictionary<string, string>() { { "city", "Delhi" } };
var dimensions = new Dictionary<string, string>() { { "region", "Karachi" } };
var options = new GetAllFeedbackOptions()
{
Filter = new FeedbackFilter()
Expand All @@ -284,7 +284,7 @@ public async Task GetAllFeedbackWithOptionalFeedbackFilter()
TimeMode = FeedbackQueryTimeMode.FeedbackCreatedOn,
StartsOn = feedbackSamplingStartTime,
EndsOn = feedbackSamplingEndTime,
FeedbackKind = MetricFeedbackKind.Comment,
FeedbackKind = MetricFeedbackKind.Anomaly
}
};

Expand All @@ -308,15 +308,15 @@ public async Task GetAllFeedbackWithOptionalFeedbackFilter()

ValidateGroupKey(dimensionKeyFilter);

Assert.That(dimensionKeyFilter.TryGetValue("city", out string city));
Assert.That(city, Is.EqualTo("Delhi"));
Assert.That(dimensionKeyFilter.TryGetValue("region", out string region));
Assert.That(region, Is.EqualTo("Karachi"));

Assert.That(feedback.FeedbackKind, Is.EqualTo(MetricFeedbackKind.Comment));
Assert.That(feedback.FeedbackKind, Is.EqualTo(MetricFeedbackKind.Anomaly));

var commentFeedback = feedback as MetricCommentFeedback;
var anomalyFeedback = feedback as MetricAnomalyFeedback;

Assert.That(commentFeedback, Is.Not.Null);
Assert.That(commentFeedback.Comment, Is.Not.Null.And.Not.Empty);
Assert.That(anomalyFeedback, Is.Not.Null);
Assert.That(anomalyFeedback.AnomalyValue, Is.Not.EqualTo(default(AnomalyValue)));

if (++feedbackCount >= MaximumSamplesCount)
{
Expand Down Expand Up @@ -344,9 +344,9 @@ private void ValidateMetricFeedback(MetricFeedback feedback)
Assert.That(dimensionFilter, Is.Not.Null);

Assert.That(Count(dimensionFilter), Is.EqualTo(2));
Assert.That(dimensionFilter.TryGetValue("city", out string city));
Assert.That(dimensionFilter.TryGetValue("region", out string region));
Assert.That(dimensionFilter.TryGetValue("category", out string category));
Assert.That(city, Is.EqualTo(ExpectedCity));
Assert.That(region, Is.EqualTo(ExpectedRegion));
Assert.That(category, Is.EqualTo(ExpectedCategory));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public TimeSeriesLiveTests(bool isAsync) : base(isAsync)
[TestCase(false)]
public async Task GetMetricDimensionValuesWithMinimumSetup(bool useTokenCredential)
{
const string dimensionName = "city";
const string dimensionName = "region";

MetricsAdvisorClient client = GetMetricsAdvisorClient(useTokenCredential);

Expand All @@ -43,7 +43,7 @@ public async Task GetMetricDimensionValuesWithMinimumSetup(bool useTokenCredenti
[RecordedTest]
public async Task GetMetricDimensionValuesWithOptionalDimensionFilter()
{
const string dimensionName = "city";
const string dimensionName = "region";
const string filter = "ba";

MetricsAdvisorClient client = GetMetricsAdvisorClient();
Expand Down Expand Up @@ -99,14 +99,14 @@ public async Task GetMetricSeriesDefinitionsWithMinimumSetup(bool useTokenCreden
[RecordedTest]
public async Task GetMetricSeriesDefinitionsWithOptionalDimensionFilter()
{
var cityFilter = new List<string>() { "Belo Horizonte", "Chennai", "Hong Kong" };
var categoryFilter = new List<string>() { "__SUM__", "Outdoors" };
var regionFilter = new List<string>() { "Cairo", "Seoul", "Beijing" };
var categoryFilter = new List<string>() { "__SUM__", "Handmade" };

MetricsAdvisorClient client = GetMetricsAdvisorClient();

var options = new GetMetricSeriesDefinitionsOptions(SamplingStartTime);

options.DimensionCombinationsFilter.Add("city", cityFilter);
options.DimensionCombinationsFilter.Add("region", regionFilter);
options.DimensionCombinationsFilter.Add("category", categoryFilter);

var definitionCount = 0;
Expand All @@ -120,10 +120,10 @@ public async Task GetMetricSeriesDefinitionsWithOptionalDimensionFilter()

DimensionKey seriesKey = definition.SeriesKey;

Assert.That(seriesKey.TryGetValue("city", out string city));
Assert.That(seriesKey.TryGetValue("region", out string region));
Assert.That(seriesKey.TryGetValue("category", out string category));

Assert.That(cityFilter.Contains(city));
Assert.That(regionFilter.Contains(region));
Assert.That(categoryFilter.Contains(category));

if (++definitionCount >= MaximumSamplesCount)
Expand All @@ -142,10 +142,10 @@ public async Task GetMetricSeriesData(bool useTokenCredential)
{
MetricsAdvisorClient client = GetMetricsAdvisorClient(useTokenCredential);

var dimensions = new Dictionary<string, string>() { { "city", "Delhi" }, { "category", "Handmade" } };
var dimensions = new Dictionary<string, string>() { { "region", "Delhi" }, { "category", "Handmade" } };
var seriesKey1 = new DimensionKey(dimensions);

dimensions = new Dictionary<string, string>() { { "city", "Kolkata" }, { "category", "__SUM__" } };
dimensions = new Dictionary<string, string>() { { "region", "Kolkata" }, { "category", "__SUM__" } };
var seriesKey2 = new DimensionKey(dimensions);

var returnedKey1 = false;
Expand Down Expand Up @@ -175,14 +175,14 @@ public async Task GetMetricSeriesData(bool useTokenCredential)

var seriesKey = seriesData.SeriesKey;

Assert.That(seriesKey.TryGetValue("city", out string city));
Assert.That(seriesKey.TryGetValue("region", out string region));
Assert.That(seriesKey.TryGetValue("category", out string category));

if (city == "Delhi" && category == "Handmade")
if (region == "Delhi" && category == "Handmade")
{
returnedKey1 = true;
}
else if (city == "Kolkata" && category == "__SUM__")
else if (region == "Kolkata" && category == "__SUM__")
{
returnedKey2 = true;
}
Expand Down
Loading