You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何程序化获取Azure App Service重启指标及历史记录(C#)

当然可以通过程序化方式获取Azure App Service的重启记录,不管是活动日志还是诊断中心的重启数据都能拿到,用你提到的Microsoft.Azure.Management.Fluent完全可行,下面给你详细说明:

方法一:通过Azure活动日志获取重启记录

这是官方文档提到的包含重启数据的核心渠道,所有手动触发、平台自动触发的App Service重启事件都会被记录到活动日志中,用Fluent SDK可以直接查询:

C#代码示例

using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent.Core;
using System;
using System.Linq;

// 初始化Azure客户端(使用服务主体认证)
var credentials = SdkContext.AzureCredentialsFactory
    .FromServicePrincipal(
        clientId: "你的客户端ID",
        clientSecret: "你的客户端密钥",
        tenantId: "你的租户ID",
        AzureEnvironment.AzureGlobalCloud);

var azure = Azure
    .Configure()
    .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
    .Authenticate(credentials)
    .WithSubscription("你的订阅ID");

// 获取目标App Service的资源ID
var targetApp = azure.WebApps.GetByResourceGroup("你的资源组名称", "你的App Service名称");
var appResourceId = targetApp.Id;

// 查询最近7天内的重启事件
var restartEvents = azure.ActivityLogs.List(
    filter: $"eventTimestamp ge '{DateTime.Now.AddDays(-7).ToString("yyyy-MM-ddTHH:mm:ssZ")}' " +
            $"and resourceId eq '{appResourceId}' " +
            $"and (operationName eq 'Microsoft.Web/sites/restart/action' or operationName eq 'Microsoft.Web/sites/reboot/action')"
);

// 遍历输出重启记录
foreach (var evt in restartEvents)
{
    Console.WriteLine($"重启时间: {evt.EventTimestamp:yyyy-MM-dd HH:mm:ss}");
    Console.WriteLine("触发类型: " + (evt.OperationName.Value.Contains("restart") ? "手动重启" : "平台自动重启"));
    Console.WriteLine("操作发起者: " + evt.Caller);
    Console.WriteLine("---");
}

说明

  • 筛选条件里的两个操作名称分别对应手动重启平台自动重启,可以根据需求调整;
  • 可以修改eventTimestamp的时间范围,比如查询最近30天的记录。
方法二:调用诊断API获取重启历史(对应诊断页面数据)

如果你需要和「诊断并解决问题 -> Web应用已重启」页面完全一致的数据,可以直接调用App Service的诊断API,这个接口返回的JSON包含重启时间、原因、持续时长等细节:

C#代码示例

using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

public async Task FetchRestartHistoryFromDiagnostics(string appName, string publishUsername, string publishPassword)
{
    // 诊断API端点
    var apiUrl = $"https://{appName}.scm.azurewebsites.net/api/diagnostics/restartHistory";
    
    using var client = new HttpClient();
    // 使用发布配置文件的用户名密码进行Basic认证
    var authToken = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{publishUsername}:{publishPassword}"));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authToken);
    
    var response = await client.GetAsync(apiUrl);
    response.EnsureSuccessStatusCode();
    
    // 读取并输出重启历史数据
    var restartData = await response.Content.ReadAsStringAsync();
    Console.WriteLine("诊断页面同款重启记录:");
    Console.WriteLine(restartData);
}

说明

  • 发布用户名和密码可以从App Service的「获取发布配置文件」下载的XML文件中提取;
  • 如果想用Azure AD认证替代Basic认证,可以获取AD令牌后添加到请求头的Authorization: Bearer <令牌>字段中。

内容的提问来源于stack exchange,提问作者johnstaveley

火山引擎 最新活动