-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathProgram.cs
176 lines (166 loc) · 8.43 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Resources;
using Azure.ResourceManager.Samples.Common;
using Azure.ResourceManager.Monitor;
using Azure.ResourceManager.Monitor.Models;
using Azure.ResourceManager.AppService.Models;
using Azure.ResourceManager.AppService;
namespace WebAppPerformanceMonitoringAlerts
{
public class Program
{
/**
* This sample shows examples of configuring Metric Alerts for WebApp instance performance monitoring through app service plan.
* - Create a App Service plan
* - Setup an action group to trigger a notification to the heavy performance alerts
* - Create auto-mitigated metric alerts for the App Service plan when
* - average CPUPercentage on any of Web App instance (where Instance = *) over the last 5 minutes is above 80%
*/
private static ResourceIdentifier? _resourceGroupId = null;
public static async Task RunSample(ArmClient client)
{
try
{
// ============================================================
// Create a resourceGroup
SubscriptionResource subscription = await client.GetDefaultSubscriptionAsync();
var rgName = Utilities.CreateRandomName("rgMonitor");
Utilities.Log($"creating a resource group with name : {rgName}...");
var rgLro = await subscription.GetResourceGroups().CreateOrUpdateAsync(WaitUntil.Completed, rgName, new ResourceGroupData(AzureLocation.EastUS2));
var resourceGroup = rgLro.Value;
_resourceGroupId = resourceGroup.Id;
Utilities.Log("Created a resource group with name: " + resourceGroup.Data.Name);
//Create an App Service Plan
Utilities.Log("Creating app service plan");
var appServicePlanCollection = resourceGroup.GetAppServicePlans();
var appServicePlanName = Utilities.CreateRandomName("HighlyAvailableWebApps");
var appServicePlanData = new AppServicePlanData(AzureLocation.EastUS2)
{
Sku = new AppServiceSkuDescription
{
Name = "P1",
Tier = "Premium",
Capacity = 1
},
IsReserved = false,
Kind = "app"
};
var appServicePlan = (await appServicePlanCollection.CreateOrUpdateAsync(WaitUntil.Completed, appServicePlanName, appServicePlanData)).Value;
Utilities.Log("Created app service plan with name:" + appServicePlan.Data.Name);
// ============================================================
// Create an action group to send notifications in case activity log alert condition will be triggered
Utilities.Log("Creating actionGroup...");
var actionGroupName = Utilities.CreateRandomName("criticalPerformanceActionGroup");
var actionGroupCollection = resourceGroup.GetActionGroups();
Uri uri = new Uri("https://www.weeneedmorepower.performancemonitoring.com");
var actionGroupData = new ActionGroupData(AzureLocation.NorthCentralUS)
{
GroupShortName = "AG",
IsEnabled = true,
AzureAppPushReceivers =
{
new MonitorAzureAppPushReceiver("MAAPRtierOne","[email protected]")
},
EmailReceivers =
{
new MonitorEmailReceiver("MERtierOne","[email protected]"),
new MonitorEmailReceiver("MERtierTwo","[email protected]")
},
SmsReceivers =
{
new MonitorSmsReceiver("MSRtierOne","1","4255655665")
},
VoiceReceivers =
{
new MonitorVoiceReceiver("MVRtierOne","1","2062066050")
},
WebhookReceivers =
{
new MonitorWebhookReceiver("MWRtierOne",uri)
}
};
var actionGroup = (await actionGroupCollection.CreateOrUpdateAsync(WaitUntil.Completed, actionGroupName, actionGroupData)).Value;
Utilities.Log("Created actionGroup with name:" + actionGroup.Data.Name);
// ============================================================
// Set a trigger to fire each time
// Create MetricAlerts
Utilities.Log("Creating MetricAlerts...");
var metricAlertsCollection = resourceGroup.GetMetricAlerts();
var metricAlertName = Utilities.CreateRandomName("metricAlert");
var scopes = new List<string>()
{
appServicePlan.Id,
};
var criteria = new MetricAlertSingleResourceMultipleMetricCriteria()
{
AllOf =
{
new MetricCriteria("Metric1", "CPUPercentage", MetricCriteriaTimeAggregationType.Total, MetricCriteriaOperator.GreaterThan, 80)
{
Dimensions =
{
new Azure.ResourceManager.Monitor.Models.MetricDimension("Instance","Include",new List<string> {"*"})
}
}
}
};
var metricAlertData = new MetricAlertData("global",3,true,scopes,TimeSpan.FromMinutes(1),TimeSpan.FromMinutes(5),criteria)
{
Actions =
{
new MetricAlertAction()
{
ActionGroupId = actionGroup.Id,
}
},
Severity = 3,
Description = "This alert rule is for U5 - Single resource-multiple criteria - with dimensions - with star",
};
var metricAlerts = (await metricAlertsCollection.CreateOrUpdateAsync(WaitUntil.Completed, metricAlertName, metricAlertData)).Value;
Utilities.Log("Created MetricAlerts with Name : " + metricAlerts.Data.Name);
}
finally
{
try
{
if (_resourceGroupId is not null)
{
Utilities.Log($"Deleting Resource Group: {_resourceGroupId}");
await client.GetResourceGroupResource(_resourceGroupId).DeleteAsync(WaitUntil.Completed);
Utilities.Log($"Deleted Resource Group: {_resourceGroupId}");
}
}
catch (NullReferenceException)
{
Utilities.Log("Did not create any resources in Azure. No clean up is necessary");
}
catch (Exception g)
{
Utilities.Log(g);
}
}
}
public static async Task Main(string[] args)
{
try
{
var clientId = Environment.GetEnvironmentVariable("CLIENT_ID");
var clientSecret = Environment.GetEnvironmentVariable("CLIENT_SECRET");
var tenantId = Environment.GetEnvironmentVariable("TENANT_ID");
var subscription = Environment.GetEnvironmentVariable("SUBSCRIPTION_ID");
ClientSecretCredential credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
ArmClient client = new ArmClient(credential, subscription);
await RunSample(client);
}
catch (Exception e)
{
Utilities.Log(e);
}
}
}
}