首页 > 解决方案 > 使用 Azure Function 查找空闲虚拟机并释放它们

问题描述

我正在创建一个 Azure 函数,它将找到空闲或未使用的虚拟机来释放它们。Azure 函数现在能够找到所有正在运行的虚拟机并能够解除分配它们。

现在,我如何确定虚拟机是否空闲、没有进程运行或没有用户登录?或任何其他参数。

[FunctionName("DeallocateVM")]
public static void DeallocateVM([TimerTrigger("0 0 * * * *")]TimerInfo myTimer, ILogger log)
{
    var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(ClientId, ClientSecret, TenantId, AzureEnvironment.AzureGlobalCloud);
    var azure = Azure.Configure().WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic).Authenticate(credentials).WithDefaultSubscription();
    var VirtualMachinesList = azure.VirtualMachines.List();
    foreach (var Vm in VirtualMachinesList)
    {
        log.LogInformation($"{Vm.Name}\t{Vm.ProvisioningState}\t{Vm.PowerState}\t{Vm.ResourceGroupName}\t{Vm.OSType}\t{Vm.OSDiskSize}");
        if (Vm.PowerState == PowerState.Running)
        {
            if (Vm.IsIdle())
                Vm.DeallocateAsync(); //Deallocate the VM
        }
    }
}
static bool IsIdle(this IVirtualMachine virtualMachine)
{
    return true; //How to find a VM is idle or not?
}

我希望只有空闲的虚拟机被释放,但目前,所有的虚拟机都被释放。

标签: c#azure-functionsazure-virtual-machineazure-monitoring

解决方案


您可以metrics使用Monitor SDK. 例子 :

var serviceCreds = ApplicationTokenProvider.LoginSilentAsync(azureTenantId, azureAppId, azureSecretKey).Result;
MonitorClient monitorClient = new MonitorClient(serviceCreds) { SubscriptionId = subscriptionId };
var resourceUrl = $"subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/virtualMachines/{machineName}";
var metricNames = "(name.value eq 'Disk Write Operations/Sec' or  name.value eq 'Percentage CPU' or  name.value eq 'Network In' or  name.value eq 'Network Out' or  name.value eq 'Disk Read Operations/Sec' or  name.value eq 'Disk Read Bytes' or  name.value eq 'Disk Write Bytes')"; 
 string timeGrain = " and timeGrain eq duration'PT5M'";
 string startDate = " and startTime eq 2017-10-26T05:28:34.919Z";
 string endDate = " and endTime eq 2017-10-26T05:33:34.919Z";
 var odataFilterMetrics = new ODataQuery<MetricInner>(
                $"{metricNames}{timeGrain}{startDate}{endDate}");

 var metrics = monitorClient.Metrics.ListWithHttpMessagesAsync(resourceUrl, odataFilterMetrics).Result;

推荐阅读