当前位置: 首页 > 后端技术 > Java

Ovirt中的云主机监控

时间:2023-04-01 21:15:55 Java

Ovirt中的云主机监控PollVmStatsRefresher.javaVm刷新调度器poll()调度执行方法@OnTimerMethodAnnotation("poll")publicvoidpoll(){if(isMonitoringNeeded(vdsManager.getStatus())){//负责获取虚拟机列表并存放到VdsManager上供分析VmsListFetcherfetcher=newVmsStatisticsFetcher(vdsManager);longfetchTime=System.nanoTime();//fetcher.fetch()调用vdsm接口获取AllVmStats信息if(fetcher.fetch()){//分析处理被监控主机的数据变化。相关更改将被持久化,状态转换和内部命令将相应地发生StreamvdsmVmsToMonitor=filterVmsToDevicesMonitoring(fetcher.getChangedVms());processDevices(vdsmVmsToMonitor,fetchTime);}else{log.info("无法获取主机'{}'的虚拟机信息-跳过虚拟机监控。",vdsManager.getVdsName());}}}startMonitoring()startscheduling10-15spublicvoidstartMonitoring(){vmsMonitoringJob=schedulerService.scheduleWithFixedDelay(this::poll,VMS_REFRESH_RATE*NUMBER_VMS_REFRESHES_BEFORE_SAVE,VMS_REFRESH_RATE*NUMBER_VMS_REFRESHES_BEFORE_SAVE,TimeUnit.MILLISECONDS);}VmsStatisticsFetcher.java由PollVmStatsRefresher.poll()调用VmsListFetcherfetcher=newVmsStatisticsFetcher(vdsManager);抓取器。拿来()//该方法会执行VmsStatisticsFetcher继承的vdsm接口fetch()VmsListFetcherpublicbooleanfetch(){VDSReturnValuepollReturnValue=poll();if(pollReturnValue.getSucceeded()){vdsmVms=(Map)pollReturnValue.getReturnValue();}//该方法会对获取到的道德信息进行过滤,在过滤的地方修改vms信息,并将VmDynamic信息存入库onFetchVms();返回真;}else{onError();返回假;}}poll()调用vdsminterfaceGetAllVmStatspoll()将被VmsStatisticsFetcher重写@OverrideprotectedVDSReturnValuepoll(){returngetResourceManager().runVdsCommand(VDSCommandType.GetAllVmStats,newVdsIdVDSCommandParametersBase(vdsManager.getVdsprotchId()));}onFmsvoidonFetchVms(){//获取当前库中的vms信息)));ngedVms=newArrayList<>();//过滤比较dbVms和vdsmVms,如果vm状态发生变化,重新调用vdsm接口GetVmStats获取最新的数据到changeVmsfilterVms();//过滤没有运行的云主机gatherNonRunningVms(dbVms);//保存最新的虚拟机列表saveLastVmsList();VmsMonitoring调用手头的所有Vm分析器,遍历它们的报告并采取行动-触发VDSM命令(销毁、运行、重新运行、迁移)、报告已完成的操作、移交并保存到dbperform()由PollVmStatsRefresher.poll()调用publicvoidperform(List>monitoredVms,longfetchTime,VdsManagervdsManager,booleanupdateStatistics){if(monitoredVms.isEmpty()){返回;}ListvmAnalyzers=Collections.emptyList();try{vmAnalyzers=analyzeVms(monitoredVms,fetchTime,vdsManager,updateStatistics);//在将动态数据刷新到数据库之前添加非托管VM很重要addUnmanagedVms(vdsManager.getVdsId());冲洗(vmAnalyzers);后Flush(vmAnalyzers,vdsManager,fetchTime);vdsManager.vmsMonitoringInitFinished();}catch(RuntimeExceptionex){log.error("在主机上进行vms监控时失败{}错误是:{}",vdsManager.getVdsName(),ex);log.error("异常:",ex);}最后{unlockVms(vmAnalyzers);}}analyzeVms()分析虚拟机,获取分析结果/***分析VM数据对*跳过对无法锁定的VM的分析*注意:memCommited和vmsCoresCount等指标计算应该在*在此过滤之前**进行计算。*@return保存每个VM的所有数据的分析器*/privateListanalyzeVms(List>monitoredVms,longfetchTime,VdsManagervdsManager,booleanupdateStatistics){VmAnalyzerFactoryvmAnalyzerFactory=getVmAnalyzerFactory(vdsManager,updateStatistics);ListvmAnalyzers=newArrayList<>(monitoredVms....getVmAnalyzer(vm);//该方法根据不同云主机状态去封装对比图vmAnalyzer.analyze();vmAnalyzers.add(vmAnalyzer);}catch(RuntimeExceptionex){GuidvmId=getVmId(vm.getFirst(),vm.getSecond());VmManagervmManager=getVmManager(vmId);vmManager.unlock();log.error("Failedduringmonitoringvm:{},erroris:{}",vmId,ex);log.error("Exception:",ex);}}});vmAnalyzers.sort(Comparator.comparing(VmAnalyzer::getVmId));returnvmAnalyzers;}flush(vmAnalyzers)保存vm数据privatevoidflush(ListvmAnalyzers){saveVmDynamic(vmAnalyzers);saveVmStatistics(vmAnalyzers);保存虚拟机接口aceStatistics(vmAnalyzers);saveVmDiskImageStatistics(vmAnalyzers);saveVmGuestAgentNetworkDevices(vmAnalyzers);}总结在云主机中,通过vm_interface_view查询监控信息,vm_interface_view查询数据表中的vm_interface_statistics表ovirt有一个针对云主机的调度任务,获取vds主机上的实际云主机信息,以同步本地云主机。大致流程是:创建调度方法,开始调度。在调度方法中,ovirt判断是否需要监控vds的状态。ovirt会先调用vdsm接口GetAllVmStats获取所有的vmsStatic信息,并与当前库中的dbVms信息进行比较,主要比较dbvm是否为空,双方的状态是否一致,之后会调用vdsm接口GetVmStats再次调用获取需要修改的vms信息。Ovirt会根据修改后的vms信息分析变化并做出响应。相关变化会被持久化,状态转换和内部命令会响应云主机网络波动显示,也通过监控和调度进行同步。VmAnalyzer.updateInterfaceStatistics()从vdsm中获取一个整数值,在ovirt中会判断最大值。当vdsm返回大于100时,取100。最大显示的网络波动数为40statistics.setUsageNetworkPercent(min(statistics.getUsageNetworkPercent(),100));整数usageHistoryLimit=Config.getValue(ConfigValues.UsageHistoryLimit);statistics.addNetworkUsageHistory(statistics.getUsageNetworkPercent(),usageHistoryLimit);云主机监控信息(rx,txrate)是从监控时间表同步的。``VmAnalyzer.updateInterfaceStatistics()NetworkStatisticsBuilder.updateExistingInterfaceStatistics()``