由于服务器需要7×24 小时运行,十一期间,为了切实做好服务器的重点保障,电源监控,必不可少。基于成本的考虑,我们决定自己做。如何多快好省,实现一个这样的平台呢?思路是通过服务器自带的远程管理模块读取redfish接口中电源功耗信息,然后采集到时间序列数据库,再通过grafana基于时间和ip做条件筛选做展示。这里就要用到两把开源利器Grafana和Influxdb。
Tips:
1.Grafana Grafana是一个开源的度量分析与可视化套件, 可以轻松创建各种漂亮的前端图表,支持多种数据源。 2.Influxdb 一个开源的分布式时序、时间和指标数据库,可以说为物联网而生,可以用作存储各种传感器数据。 3.Redfish Redfish 是一种带外管理标准,它使用超媒体 RESTful 接口的数据模型表示 法。此模型以标准的机器可读模式表示,其消息负载以 JSON 来表示, 各大主板厂商都有支持,调用特别方便。
服务器各个厂商的远程管理模块虽然各有各家的卖点,但都支持redfish带外管理标准, 厂商远程管理模块对照表:
服务器品牌 | 远程管理模块 |
DELL | idrac |
Lenovo | BMC |
HP | iLO |
H3C | HDM |
一、数据采集
数据采集,不需要额外的软件,用Linux系统中bash 脚本或者python都可以。原理很简单,循环读取服务器的远程管理地址,用户名,密码,模拟登陆远程管理,向redfish发起GET请求,获取电源功耗的值,写入influxdb时间序列数据库中,这个过程中,我们不需要自己记录时间戳,influxdb数据库会写入记录自动添加时间戳。
戴尔的远程管理默认用户名root,密码calvin。联想远程管理的默认用户名USERID,密码PASSW0RD。这里需要注意的是,虽然redfish标准是全球通用的,但各家的redfish接口请求的url不完全一样。以下是我根据戴尔和联想的redfish 分别写了一个函数做处理。
我们先把机房,机柜,远程管理地址,用户名,密码,厂商远程管理模块名称记录到一个文件idrac.list,格式如下
机房1|机柜1|10.10.10.1|root |calvin|idrac 机房2|机柜2|10.10.10.2|USERID|PASSW0RD |bmc
生产环境强烈建议加密存储到单独的数据库中。我这里只是为了方便演示。采集脚本watt_collect.sh如下,包含读取接口,写入influxdb数据库。
#!/usr/bin/env bash idrac_get_value(){ get="curl -s -connect-timeout 5 "https://${1}/redfish/v1/Chassis/System.Embedded.1/Power/PowerControl" -k -u ${2}:${3} | jq .PowerConsumedWatts" eval $get } bmc_get_value(){ get="curl -s -connect-timeout 5 "https://${1}/redfish/v1/Chassis/1/Power/PowerControl" -k -u ${2}:${3} |jq .value[].PowerConsumedWatts" eval $get } idrac_insert_value(){ watt_value=$(idrac_get_value ${1} ${2} ${3}) run="curl -s -connect-timeout 5 –XPOST "http://localhost:8086/write?db=watt_monitor&u=power&p=power" --data-binary "watt,room=${4},cabinet=${5},idrac_ip=${1} watt_value=${watt_value}" " # echo $run eval $run } bmc_insert_value(){ watt_value=$(bmc_get_value ${1} ${2} ${3}) run="curl -s -connect-timeout 5 –XPOST "http://localhost:8086/write?db=watt_monitor&u=power&p=power" --data-binary "watt,room=${4},cabinet=${5},bmc_ip=${1} watt_value=${watt_value}" " eval $run } while read line do oem=`echo ${line}|awk -F'|' '{print $6}'` ip=`echo ${line}|awk -F'|' '{print $3}'` user=`echo ${line}|awk -F'|' '{print $4}'` pass=`echo ${line}|awk -F'|' '{print $5}'` room=`echo ${line}|awk -F'|' '{print $1}'` cabinet=`echo ${line}|awk -F'|' '{print $2}'` if [ ${oem} == "idrac" ];then idrac_insert_value "${ip}" "${user}" "${pass}" "${room}" "${cabinet}" & else bmc_insert_value "${ip}" "${user}" "${pass}" "${room}" "${cabinet}" & fi done</root/watt_collect/idrac.list wait
Influxdb数据库配置
配置文件打开监听,开启密码认证
[http] bind-address = "0.0.0.0:8086" auth-enabled = true
创建库
create database watt_monitor;
用户授权
CREATE USER power with password 'power'; grant all on watt_monitor to power; show grants for power;
数据保持策略,这里设置的是存量数据只保留一天,不至于使数据库容量越来越大,省去手动清理历史数据。
show retention policies on watt_monitor; create retention policy "history_clear_policies" on "watt_monitor" duration 1d replication 1 default ; show retention policies on watt_monitor;
简单查询
influx -host 'localhost' -port '8086' -username 'power' -password 'power' -precision rfc3339 SELECT * FROM "watt_monitor"."history_clear_policies"."watt" where time >= now() -1m tz('Asia/Shanghai') ;
数据格式如下
[root@node1 ~]# influx -host 'localhost' -port '8086' -username 'power' -password 'power' -precision rfc3339 Connected to http://localhost:8086 version 1.7.6 InfluxDB shell version: 1.7.6 Enter an InfluxQL query > SELECT * FROM "watt_monitor"."history_clear_policies"."watt" where time >= now() -1m tz('Asia/Shanghai') ; name: watt time cabinet idrac_ip room watt_value ---- ------- -------- ---- ---------- 2019-09-29T14:02:02.775044559+08:00 机柜1 10.10.10.1 机房1 153 2019-09-29T14:02:02.831190214+08:00 机柜1 10.10.10.2 机房1 337 2019-09-29T14:02:02.868500935+08:00 机柜1 10.10.10.3 机房1 333 2019-09-29T14:02:02.876070524+08:00 机柜1 10.10.10.4 机房1 322 2019-09-29T14:02:03.068110358+08:00 机柜1 10.10.10.5 机房1 154 2019-09-29T14:02:03.304841465+08:00 机柜1 10.10.10.6 机房1 152 2019-09-29T14:02:04.92504785+08:00 机柜1 10.10.10.7 机房1 227
使用crontab 定时执行脚本,保证实时采集
vi /etc/crontab * * * * * root /root/watt_collect/watt_collect.sh >>/tmp/`date +%Y-%m-%d`_watt_collect_log 2>&1
二、数据展示
Grafana支持多数据源,这里我们选择采集环节已经准备好的Influxdb。
1.创建数据源
Configuration--> Data Sources 选择Influxdb,创建一个name为机房功率的数据源,配置好数据库读取地址,数据库名,用户名,密码,如图1 。
2.创建图表
Create-->Dashboard 创建一个那么name为 两会重点保障作战室的 监控大盘。
制作宣传栏效果 Add pane-->Text 新建一个文本面板,General 里 Title 为 热烈庆祝两会成功在京召开, Options-->Mode-->html,嵌入一段html5跑马灯效果的“我和我的祖国”的歌词和播放器。Html5代码如下:
1. <div class="good"> 2. <marquee direction="left" scrollamount="5"> 3. 我和我的祖国 4. 一刻也不能分割 5. 无论我走到哪里 6. 都流出一首赞歌 7. 8. 我歌唱每一座高山 9. 我歌唱每一条河 10. 袅袅炊烟小小村落 11. 路上一道辙 12. 13. 我最亲爱的祖国 14. 我永远紧依着你的心窝 15. 你用你那母亲的脉搏 16. 和我诉说 17. 我的祖国和我 18. 象海和浪花一朵 19. 浪是那海的赤子 20. 海是那浪的依托 21. 22. 每当大海在微笑 23. 我就是笑的漩涡 24. 我分担着海的忧愁 25. 分享海的欢乐 26. 27. 我亲爱的祖国 28. 你是大海永不干涸 29. 永远给我碧浪清波 30. 心中的歌 31. 32. 我和我的祖国 33. 一刻也不能分割 34. 无论我走到哪里 35. 都流出一首赞歌 36. 37. 我歌唱每一座高山 38. 我歌唱每一条河 39. 袅袅炊烟小小村落 40. 路上一道辙 41. 42. 我最亲爱的祖国 43. 我永远紧依着你的心窝 44. 你用你那母亲的脉搏 45. 和我诉说 46. 47. 我最亲爱的祖国 48. 你是大海永不干涸 49. 永远给我碧浪清波 50. 心中的歌 51. </marquee> 52. 53. <div> 54. <audio controls> 55. <source src="public/wohewodezuguo.mp3" type="audio/mpeg"> 56. </audio> 57. <style> 58. .good{font-size: 20px;margin:15px;color:red;} 59. </style>
3.制作功率仪表盘
Add panel-->Singlestat ,创建仪表盘,我们选择Singlestat类型的图表,数据源选择刚才添加好的“机房功率”数据源。在Metrics选项卡下,选择读取watt这张表,按远程管理IP做条件筛选,按时间间隔做分组,使用last()函数读取功率的最新值,即表中的watt_value字段的值,如图2 。
在Options选项卡下,我们调整一下仪表盘的样式,0-500绿色,500-1400黄色,1400-2000红色,勾选仪表盘效果,仪表盘值的范围0-2000,值的后缀为w,即watt瓦特,如图3。
最终效果如图4。其实,这只是这两把利器的冰山一角,更多用途,大家可以仁者见仁,智者见智,充分发挥自己的主观能动性,实现自己更加个性化的需求。
完整代码见附件。
https://github.com/ZuoGuocai/hardware-monitor
本文作者:左国才,VIPKID运维工程师,笔名icai,主要研究开源Linux操作系统,数据库,云计算领域相关技术,平时喜欢阅读脚本之家公众号。
声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。