Zabbix监控openstack系统资源

一、简介

随着信息技术的不断发展,作为基础平台,封闭架构带来不兼容性,无法支持异构虚拟机系统,也难以支撑开放合作的产业链需求。随着云计算时代的来临,虚拟化管理平台向开放平台架构转变,多种厂家的虚拟机可以在开放的平台架构下共存,不同的应用厂商可以基于开放平台架构使其应用不断的丰富。它不仅可以提供更加高效的计算速度和存储空间,还可以大大降低成本,提高企业的竞争力。监控也随之兼容满足云平台的日常监控运维工作的手段。那么对于Openstack运维人员来说,需要掌握Openstack云平台系统资源的整体运行情况,包括域(AZ)的cpu/menmory等资源使用情况,将介绍使用zabbix结合openstack python-api对openstack系统资源进行监控。

二、数据获取

1、使用控制台获取域(AZ)监控信息,使用如下命令可以获取当前openstack的所有可用域。

nova availability-zone-list
+-----------------------+----------------------------------------+
| Name                  | Status                                 |
+-----------------------+----------------------------------------+
| internal              | available                              |
| |- computer03         |                                        |
| | |- nova-storage     | enabled :-) 2018-10-18T10:56:07.000000 |
| |- computer04         |                                        |
| | |- nova-storage     | enabled :-) 2018-10-18T10:56:08.000000 |
| |- computer05         |                                        |
| | |- nova-storage     | enabled :-) 2018-10-18T10:56:13.000000 |
| |- computer06         |                                        |
| | |- nova-storage     | enabled :-) 2018-10-18T10:56:05.000000 |
| |- computer07         |                                        |
| | |- nova-storage     | enabled :-) 2018-10-18T10:56:05.000000 |
| |- computer08         |                                        |
| | |- nova-storage     | enabled :-) 2018-10-18T10:56:07.000000 |
| |- controler02        |                                        |
| | |- nova-conductor   | enabled XXX 2017-10-09T09:46:27.000000 |
| | |- nova-consoleauth | enabled XXX 2017-10-09T09:46:37.000000 |
| | |- nova-monitor     | enabled :-) 2018-10-18T10:56:11.000000 |
| | |- nova-scheduler   | enabled XXX 2017-10-09T09:46:37.000000 |
| | |- nova-cert        | enabled XXX 2017-10-09T09:46:37.000000 |
| |- controller01       |                                        |
| | |- nova-conductor   | enabled :-) 2018-10-18T10:56:11.000000 |
| | |- nova-consoleauth | enabled :-) 2018-10-18T10:56:04.000000 |
| | |- nova-monitor     | enabled :-) 2018-10-18T10:56:07.000000 |
| | |- nova-scheduler   | enabled :-) 2018-10-18T10:56:09.000000 |
| | |- nova-cert        | enabled :-) 2018-10-18T10:56:12.000000 |
| IMS                   | available                              |
| |- computer03         |                                        |
| | |- nova-compute     | enabled :-) 2018-10-18T10:56:07.000000 |
| |- computer04         |                                        |
| | |- nova-compute     | enabled :-) 2018-10-18T10:56:05.000000 |
| |- computer08         |                                        |
| | |- nova-compute     | enabled :-) 2018-10-18T10:56:13.000000 |
| paas                  | available                              |
| |- computer05         |                                        |
| | |- nova-compute     | enabled :-) 2018-10-18T10:56:07.000000 |
| |- computer06         |                                        |
| | |- nova-compute     | enabled :-) 2018-10-18T10:56:13.000000 |
| |- computer07         |                                        |
| | |- nova-compute     | enabled :-) 2018-10-18T10:56:04.000000 |
+-----------------------+----------------------------------------+

由结果可以看出,该系统含有两个域: IMS 和 paas ,但是该命令结果不太直观,不容易提取,我们也可以使用如下命令:

nova aggregate-list
+----+---------+-------------------+
| Id | Name    | Availability Zone |
+----+---------+-------------------+
| 1  | IMS+RCS | IMS               |
| 4  | paas    | paas              |
+----+---------+-------------------+

 根据 aggregate-list ,我们可以查看域对应的计算节点:

nova aggregate-details paas
+----+------+-------------------+------------------------------------------+--------------------------+
| Id | Name | Availability Zone | Hosts                                    | Metadata                 |
+----+------+-------------------+------------------------------------------+--------------------------+
| 4  | paas | paas              | 'computer07', 'computer05', 'computer06' | 'availability_zone=paas' |
+----+------+-------------------+------------------------------------------+--------------------------+

由结果可知,paas域,一共包含三个computer节点,对于每个节点的使用情况,我们一样可以通过命令获取:

nova hypervisor-show computer07
+---------------------------+------------+
| Property                  | Value      |
+---------------------------+------------+
| free_disk_gb              | 55         |
| free_ram_mb               | 126156     |
| host_ip                   | 193.2.0.37 |
| hypervisor_hostname       | computer07 |
| hypervisor_type           | QEMU       |
| id                        | 9          |
| local_gb                  | 445        |
| local_gb_used             | 390        |
| memory_mb                 | 257740     |
| memory_mb_used            | 131584     |
| npt_ept                   | ept        |
| pci_pools                 | -          |
| running_vms               | 8          |
| service_disabled_reason   | -          |
| service_host              | computer07 |
| service_id                | 27         |
| state                     | up         |
| status                    | enabled    |
| vcpus                     | 48         |
| vcpus_used                | 32         |
+---------------------------+------------+
#部分信息

我们可以得知,该节点的vcpu总数及其使用情况,memory_mb总数及其使用情况。

将每个节点的使用情况均获取后,经过计算,就可以得出域的资源整体使用情况。对于云平台的整体使用情况,我们也可以通过命令行获取:

nova hypervisor-stats
+----------------------+---------+
| Property             | Value   |
+----------------------+---------+
| count                | 6       |
| current_workload     | 0       |
| disk_available_least | 304     |
| free_disk_gb         | 518     |
| free_ram_mb          | 961736  |
| local_gb             | 2670    |
| local_gb_used        | 2152    |
| memory_mb            | 1546440 |
| memory_mb_used       | 584704  |
| running_vms          | 42      |
| vcpus                | 288     |
| vcpus_used           | 172     |
+----------------------+---------+

上面我们讨论了使用命令行进行相关信息的获取,下面我们讨论使用python-api进行相关信息的获取与计算。

2、使用 openstack python-api 获取域监控信息

代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#imports
import json
from optparse import OptionParser
from novaclient import client as noclient
from novaclient import utils
#登录及授权
keystone = {}
keystone['os_username']='admin'
keystone['os_password']='keystone'
keystone['os_auth_url']='http://lb-vip:5000/v2.0/'
keystone['os_tenant_name']='admin'
nova_client = noclient.Client(2, keystone['os_username'], keystone['os_password'], keystone['os_tenant_name'], keystone['os_auth_url'])
def main():#获取云平台整体信息并打印total_info = nova_client.hypervisor_stats.statistics()._info.copy()print "total_info_vcpus:", total_info["vcpus"]print "total_info_vcpus_used:", total_info["vcpus_used"]print "total_info_memory_mb:", total_info["memory_mb"]print "total_info_memory_mb_used:", total_info["memory_mb_used"]print "total_info_running_vms:", total_info["running_vms"]#获取域列表信息aggregates = nova_client.aggregates.list()for aggregate in aggregates:#初始化每个域的资源统计变量vcpus = 0vcpus_used = 0memory_mb = 0memory_mb_used = 0running_vms = 0#获取每个aggregate信息,并保存对应的hostscomputer节点列表aggregate_info = aggregate._info.copy()print aggregate_info["id"], aggregate_info["name"], aggregate_info["availability_zone"], aggregate_info["hosts"]aggregate_hosts = aggregate_info["hosts"]#循环计算节点,保存相关资源信息for aggregate_host in aggregate_hosts:hypervisor_info = utils.find_resource(nova_client.hypervisors, aggregate_host)._infovcpus = vcpus + hypervisor_info["vcpus"]vcpus_used = vcpus_used + hypervisor_info["vcpus_used"]memory_mb = memory_mb + hypervisor_info["memory_mb"]memory_mb_used = memory_mb_used + hypervisor_info["memory_mb_used"]running_vms = running_vms + hypervisor_info["running_vms"]#打印域资源信息print "vcpus:", vcpusprint "vcpus_used:", vcpus_usedprint "memory_mb:", memory_mbprint "memory_mb_used:", memory_mb_usedprint "running_vms:", running_vms
if __name__ == "__main__":main()

执行该程序后,可以获取各个域节点的信息:

total_info_vcpus: 288
total_info_vcpus_used: 172
total_info_memory_mb: 1546440
total_info_memory_mb_used: 584704
total_info_running_vms: 42
1 IMS+RCS IMS [u'computer04', u'computer03', u'computer08']
vcpus: 144
vcpus_used: 84
memory_mb: 773220
memory_mb_used: 243200
running_vms: 20
4 paas paas [u'computer07', u'computer05', u'computer06']
vcpus: 144
vcpus_used: 88
memory_mb: 773220
memory_mb_used: 341504
running_vms: 22

经过适当的计算,我们就可以获取各个域分配及使用比例等信息。

上面我们就使用 python-api 打印出了所有需要的信息,但是对于监控来说,我们需要提取的是各个监控项的信息,这样才能方便的搜索和做图表展示;下面我们讨论结合zabbix进行相关信息的监控。

三、Zabbix获取监控信息

1、获取可用域信息列表

上面我们已经获取了所有的可用域信息,但对于zabbix来说,我们还需要返回固定格式的数据,供zabbix进行解析:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#imports
import json
from optparse import OptionParser
from novaclient import client as noclient
from novaclient import utils
#登录及授权
keystone = {}
keystone['os_username']='admin'
keystone['os_password']='keystone'
keystone['os_auth_url']='http://lb-vip:5000/v2.0/'
keystone['os_tenant_name']='admin'
nova_client = noclient.Client(2, keystone['os_username'], keystone['os_password'], keystone['os_tenant_name'], keystone['os_auth_url'])
def main():r = {"data":[]}aggregates = nova_client.aggregates.list()for aggregate in aggregates:aggregate_info = aggregate._info.copy()r['data'].append( {"{#NAME}":aggregate_info["name"]} )print(json.dumps(r, indent=2, sort_keys=True, encoding="utf-8"))
if __name__ == "__main__":main()

执行后,返回的结果如下,可以通过供zabbix自动发现模版使用:

{"data": [{"{#AVAILABLE_ZONE}": "IMS","{#NAME}": "IMS+RCS"},{"{#AVAILABLE_ZONE}": "paas","{#NAME}": "paas"}]
}

2、Item及LLD自动发配置

 云平台整体信息,Item设置如下:

openstack.total[vcpus]
openstack.total[vcpus_used]
openstack.total[memory_mb]
openstack.total[memory_mb_used]
openstack.total[running_vms]

获取{#NAME}后就可以根据监控项获取对应的监控内容了,zabbix自动发现自动发现key设置如下:

openstack.system.discovery

discovery下,设置监控Item,key设置如下:

openstack.zone[hosts,{#NAME}]
openstack.zone[vcpus,{#NAME}]
openstack.zone[vcpus_used,{#NAME}]
openstack.zone[memory_mb,{#NAME}]
openstack.zone[memory_mb_used,{#NAME}]
openstack.zone[running_vms,{#NAME}]

其中{#NAME}为第一步的脚本中返回的可用域对应的aggregate相关信息。

3、Agent自定义配置

对应的zabbix-agent.conf配置如下:

# /etc/zabbix/zabbix_agentd.d/userparameter_openstack-system.conf
UserParameter=openstack.system.discovery,python /etc/zabbix/zabbix_agentd.d/openstack-system.py --item discovery
UserParameter=openstack.total[*],python /etc/zabbix/zabbix_agentd.d/openstack-system.py --item total --moniter $1
UserParameter=openstack.zone[*],python /etc/zabbix/zabbix_agentd.d/openstack-system.py --item $1 --aggregate $2

对应的zabbix自动发现的监控脚本如下:

# /etc/zabbix/zabbix_agentd.d/openstack-system.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
#imports
import json
from optparse import OptionParser
from novaclient import client as noclient
from novaclient import utils
#登录及授权
keystone = {}
keystone['os_username']='admin'
keystone['os_password']='keystone'
keystone['os_auth_url']='http://lb-vip:5000/v2.0/'
keystone['os_tenant_name']='admin'
nova_client = noclient.Client(2, keystone['os_username'], keystone['os_password'], keystone['os_tenant_name'], keystone['os_auth_url'])
def main():options = parse_args()if options.item=="discovery":zone_list()elif options.item=="total":total_moniter(options)else:zone_moniter(options)
#判断入参合法性
def parse_args():parser = OptionParser()valid_item = ["discovery", "total", "hosts", "vcpus", "vcpus_used", "memory_mb", "memory_mb_used", "running_vms"]parser.add_option("", "--item", dest="item", help="", action="store", type="string", default=None)parser.add_option("", "--moniter", dest="moniter", help="", action="store", type="string", default=None)parser.add_option("", "--aggregate", dest="aggregate", help="", action="store", type="string", default=None)(options, args) = parser.parse_args()if options.item not in valid_item:parser.error("Item has to be one of: "+", ".join(valid_item))return options
#获取可用域列表
def zone_list():r = {"data":[]}aggregates = nova_client.aggregates.list()for aggregate in aggregates:aggregate_info = aggregate._info.copy()r['data'].append( {"{#NAME}":aggregate_info["name"], "{#AVAILABLE_ZONE}":aggregate_info["availability_zone"]} )print(json.dumps(r, indent=2, sort_keys=True, encoding="utf-8"))
#获取云平台整体监控信息
def total_moniter(options):total_info = nova_client.hypervisor_stats.statistics()._info.copy()print (total_info[options.moniter])
#获取可用域对应的监控信息
def zone_moniter(options):aggregate = utils.find_resource(nova_client.aggregates, options.aggregate)aggregate_info = aggregate._info.copy()aggregate_hosts = aggregate_info["hosts"]if options.item=="hosts":print (aggregate_hosts)else:monitor_data = 0for aggregate_host in aggregate_hosts:hypervisor_info = utils.find_resource(nova_client.hypervisors, aggregate_host)._infomonitor_data = monitor_data + hypervisor_info[options.item]print (monitor_data)
if __name__ == "__main__":main()

在zabbix上进行对应的配置后重启,将模版应用于主机,此时应当监控获取所有的可用域,并监控对应的信息。

4、参考资料

  1. Openstack 中zone ,aggregates和host及其应用:https://blog.csdn.net/ztejiagn/article/details/8948688
  2. nova 命令汇总四 ——计算相关命令:http://blog.51cto.com/13788458/2129157
  3. The novaclient Python API:https://docs.openstack.org/python-novaclient/latest/reference/api/index.html
  4. GitHub - larsks/openstack-api-samples:https://github.com/larsks/openstack-api-samples

探索技术无限可能,博主具有丰富监控模板资源及开发能力和项目管理经验,欢迎添加交流一起探讨,解决你的技术难题!

微信号:king_songax

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12.1平衡树(splay),旋转操作及代码

平衡树 变量定义 tot表示结点数量,rt表示根的编号 v[i]表示结点i的权值 fa[i]表示结点i的父亲节点 chi[i][2]表示结点i的左右孩子 cnt[i]表示结点i的权值存在数量,如1123,v[3]1,则cnt[3]2;就是说i3的三号结点的权值为1&…

备忘录模式-C++实现

备忘录是一种行为型设计模式,它允许在不破坏封装性的前提下捕获和恢复一个对象的内部状态。它将对象的内部状态保存到备忘录对象中,并在需要的时候从备忘录中取出恢复状态,实现了状态的保存和恢复。 备忘录有以下三个角色: 1、发…

Mybatis-Plus条件构造器Wrapper

常用的两种条件构造器分别是 QueryWrapper 和 LambdaQueryWrapper QueryWrapper Autowiredprivate StudentMapper studentMapper;Testpublic void test() {//条件分页查询学生,性别为2(代表女),年龄大于等于12的学生QueryWrapper&…

树和二叉树的基本概念和堆的实现

树的概念及结构 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1.有一个特殊的结点&#…

04-配置远程仓库的SSH免密登陆

配置SSH免密登录 配置步骤 创建好的远程仓库也可以使用SSH的方式进行访问,但如果没有配置公钥会有警告 第一步: 删除用户家目录下的.ssh目录,如果没有该目录或者该目录下已经有密钥了就不用执行该操作 #进入当前用户的家目录,删除.ssh 目录 LayneLAPTOP-Layne MINGW64 ~ $ r…

python datetime 获取特定一天的后一天或者后几天

这里写自定义目录标题 1 获取特定天的时间对象 具体时间格式参考:Python time strptime()和strftime()-CSDN博客 import datetimetimer datetime.datetime.strptime(date, "%Y-%m-%d")2 获取下一天或者【下x天】的数据并进行格式转换 # 下一天数据 ne…

基于SpringBoot+Vue的前后端分离的房屋租赁系统2

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 开发过程中&#xff0…

uniApp打包的手机app如果用户没开启通知权限、引导用户开启

封装一个setPermissions.js文件 /*** 如果用户没开启通知权限、引导用户开启 */ export function setPermissions() {// #ifdef APP-PLUS if (plus.os.name Android) {var main plus.android.runtimeMainActivity();var pkName main.getPackageName();var uid main.getApp…

基于WebSocket实现客户聊天室

目录 一、实现聊天室原理 二、聊天室前端代码 三、聊天室后端代码(重点) 四、聊天室实现效果展示 一、实现聊天室原理 1.1 介绍websocket协议 websocket是一种通信协议,再通过websocket实现弹幕聊天室时候,实现原理是客户端首…

Dynamo初学配置

配置参考 视频参考 Dynamo之Python编程视频教学_dynamo python-CSDN博客 升级Python3参考【需要Revit2020版本,2019版本不适用】 Dynamo 升级使用 Python3教程_dynamo升级找不到cpython-CSDN博客 Dynamo数据淘金——01//升级配置Dynamo - 哔哩哔哩 dynamo中pyt…

【动态规划】LeetCode-931.下降路径最小和

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩 🏠个人主页:Jammingpro 📕专栏链接&…

jira配置https访问-running-jira-applications-over-ssl-or-https

命令行配置步骤 Command line installation 过程说明: 创建存放证书的本地秘钥库keystore文件jira.jks,生成证书签名请求文件csr.txt或者jira.csr; 自签名,生成密钥和根证书; 使用根证书ca.crt对csr.txt进行签名&…

求二叉树叶子结点个数或求二叉树非叶子结点个数。

题目描述&#xff1a;求二叉树叶子结点个数。 分析&#xff1a; 考虑递归和非递归两种方法 <1>递归 int Leaves(BiTree T){if(T NULL)return 0;if(T->lchild NULL && T->rchild NULL)return 1;elsereturn Leaves(T->lchild) Leaves(T->rchild…

服务器基础知识

服务器被誉为互联网之魂。我第一次见到服务器是在学校图书馆&#xff0c;是一种机架式服务器&#xff0c;第二次见到服务器是在公司机房。本期文章是对服务器进行大盘点和梳理&#xff0c;会介绍我拆装服务器过程&#xff0c;从中的学习感悟。 图片来自 Pexels 01 服务器 服务…

TCP网络常见名词

1、MAC地址 用来识别同一链路中不同的计算机。 2、IP地址 用来识别TCP/IP网络中互连的主机和路由器。 3、端口号 用来识别同一台计算机中进行通信的不同应用程序。 1&#xff09;端口号如何确定 <1>标准既定的端口号 它是指每个应用程序都有其指定的端口号。例如…

vue---消息订阅与发布(pubsub)

一种组件间通信的方式&#xff0c;适用于任意组件间通信 使用步骤&#xff1a; 安装pubsub&#xff1a;npm i pubsub-js 引入&#xff1a;import pubsub from pubsub-js 接收数据&#xff1a;A组件想接收数据&#xff0c;则在A组件中订阅消息&#xff0c;订阅的回调留在A组…

VSCode 开发C/C++实用插件分享——codegeex

VSCode 开发C/C实用插件分享——codegeex 一、codegeex 一、codegeex CodeGeeX 智能编程助手是一款编程插件&#xff0c;CodeGeeX支持多种主流IDE&#xff0c;如VS Code、IntelliJ IDEA、PyCharm、Vim等&#xff0c;同时&#xff0c;支持Python、Java、C/C、JavaScript、Go等多…

图片点击放大

在列表中添加插槽 <template slot-scope"scope">&#xff0c;获取当前点击的数据 在图片中添加点击事件的方法&#xff0c;用来弹出窗口 <vxe-columnfield"icon"title"等级图标"><template slot-scope"scope"><…

PyLMKit(3):基于角色扮演的应用案例

角色扮演应用案例RolePlay 0.项目信息 日期&#xff1a; 2023-12-2作者&#xff1a;小知课题: 通过设置角色模板并结合在线搜索、记忆和知识库功能&#xff0c;实现典型的对话应用功能。这个功能是大模型应用的基础功能&#xff0c;在后续其它RAG等功能中都会用到这个功能。功…

使用MD5当做文件的唯一标识,这样安全么?

使用MD5作为文件唯一标识符可靠么&#xff1f; 文章目录 使用MD5作为文件唯一标识符可靠么&#xff1f;什么是MD5&#xff1f;MD5的用途MD5作为文件唯一标识的优劣优势劣势 使用MD5作为文件唯一标识的建议其他文件标识算法结束语 什么是MD5&#xff1f; MD5&#xff08;Messag…