c# - 使用 Azure Function 查找空闲虚拟机并释放它们
问题描述
我正在创建一个 Azure 函数,它将找到空闲或未使用的虚拟机来释放它们。Azure 函数现在能够找到所有正在运行的虚拟机并能够解除分配它们。
现在,我如何确定虚拟机是否空闲、没有进程运行或没有用户登录?或任何其他参数。
- 我尝试运行命令来查找 CPU 使用率,但不知何故无法执行(可能是由于权限问题);
- 我试图从 Azure Monitor > Metrics 获取数据 - 未能这样做。
- 尝试在文档中查找,没有得到任何相关结果。
[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?
}
我希望只有空闲的虚拟机被释放,但目前,所有的虚拟机都被释放。
解决方案
您可以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;
推荐阅读
- javascript - 如何在javascript中循环浏览子文件夹中的图像
- postgresql - 新行的 Postgresql 触发器
- javascript - 如何在 react-native 中传递 state.params
- python - discord.py bot 只响应一个命令
- lda - 当使用`--save_resume`运行vw LDA时,学习率是否会自动降低
- android - 为什么在发布 google play 但构建模拟器显示检索数据后检索 firebase 数据值不查看?
- android - 带有渐变背景的Jetpack Compose按钮?
- java - Spring - AOP:@within 异常:java.lang.IllegalArgumentException:错误引用的类型不是注释类型
- javascript - Socket.IO 广播发射不工作如何解决它,
- ngrx - ngrx EntityAdapter upsertMany 部分更新