如何使用C#获取Azure App Service中的CPU使用率?
在Azure App Service中编程获取应用CPU使用率的方案
以下是几种无需管理员权限、跨Windows/Linux平台的可行方案:
1. 使用Azure Monitor SDK/API获取实例级或应用级CPU指标
Azure Monitor提供标准化的指标查询接口,能获取App Service的整体CPU使用率,支持跨平台,只需给应用分配Monitoring Reader权限即可。
示例代码(C#)
首先安装NuGet包:
Install-Package Azure.Monitor.Query Install-Package Azure.Identity
然后编写查询逻辑:
using Azure.Identity; using Azure.Monitor.Query; using System; using System.Threading.Tasks; public class CpuMetricsFetcher { public static async Task FetchAppServiceCpuAsync() { string subscriptionId = "你的订阅ID"; string resourceGroupName = "资源组名称"; string appServiceName = "你的App Service名称"; string resourceId = $"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{appServiceName}"; // 使用DefaultAzureCredential自动处理本地和Azure环境的认证 var metricsClient = new MetricsQueryClient(new DefaultAzureCredential()); var queryResult = await metricsClient.QueryResourceAsync( resourceId, metricNames: new[] { "CpuTime" }, // 实例级CPU时间指标,可计算使用率 options: new MetricsQueryOptions { TimeRange = new QueryTimeRange(TimeSpan.FromMinutes(5)), Aggregations = { MetricAggregationType.Average } }); foreach (var metric in queryResult.Value.Metrics) { Console.WriteLine($"指标: {metric.Name.LocalizedValue}"); foreach (var timeSeries in metric.TimeSeries) { foreach (var dataPoint in timeSeries.DataPoints) { Console.WriteLine($"{dataPoint.Timestamp:yyyy-MM-dd HH:mm:ss} | 平均CPU使用率: {dataPoint.Average:F2}%"); } } } } }
2. 通过App Service SCM站点获取实时CPU数据
App Service的SCM(站点管理)站点提供实时指标端点,可直接获取当前实例的CPU使用情况,无需依赖Azure Monitor,但需要使用应用的发布凭证认证。
示例代码(C#)
using System; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; public class ScmCpuFetcher { public static async Task FetchRealTimeCpuAsync() { string appName = "你的App Service名称"; string deploymentUsername = "$你的App Service名称"; // 从部署中心获取 string deploymentPassword = "你的发布密码"; using var httpClient = new HttpClient(); // Basic认证 var authBytes = System.Text.Encoding.ASCII.GetBytes($"{deploymentUsername}:{deploymentPassword}"); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(authBytes)); var response = await httpClient.GetAsync($"https://{appName}.scm.azurewebsites.net/api/metrics/cpu"); if (response.IsSuccessStatusCode) { var cpuData = await response.Content.ReadAsStringAsync(); Console.WriteLine("实时CPU数据:"); Console.WriteLine(cpuData); } else { Console.WriteLine($"请求失败: {response.StatusCode}"); } } }
3. 获取当前应用进程的CPU使用率
如果只需要监测自身应用进程的CPU消耗,可以直接使用.NET的Process类,无需额外权限,跨Windows和Linux平台。
示例代码(C#)
using System; using System.Diagnostics; public class ProcessCpuMonitor { public static float GetCurrentProcessCpuUsage() { using var currentProcess = Process.GetCurrentProcess(); // 第一次采样 currentProcess.Refresh(); var startTime = DateTime.Now; var startCpuTime = currentProcess.TotalProcessorTime; // 等待1秒后二次采样 System.Threading.Thread.Sleep(1000); currentProcess.Refresh(); var endTime = DateTime.Now; var endCpuTime = currentProcess.TotalProcessorTime; // 计算CPU使用率 var cpuUsedMs = (endCpuTime - startCpuTime).TotalMilliseconds; var totalMsPassed = (endTime - startTime).TotalMilliseconds; var cpuUsage = cpuUsedMs / (Environment.ProcessorCount * totalMsPassed) * 100; return (float)Math.Round(cpuUsage, 2); } }
方案选择建议
- 若需要多实例或全局的CPU统计,优先使用Azure Monitor方案,数据更全面,权限管控更规范。
- 若需要实时的单实例CPU数据,选择SCM站点端点,延迟更低。
- 若仅关注自身进程的CPU消耗,使用Process类方案最简便,无外部依赖。
内容的提问来源于stack exchange,提问作者Milad Karimifard
相关产品推荐
相关产品推荐

