【云原生】夜莺系统的可观测性实操 – 1
前言
笔者已经在公有云上搭建了一套临时环境,可以先登录体验下:
http://124.222.45.207:17000/login
账号:root/root.2020
指标监控
记录规则
记录规则(Record Rule
)实现基于现有指标数据计算出新指标数据,通过定时周期(interval
)执行计算规则,形成新的指标时序数列。生产中记录规则往往用于简化PromQL
复杂性,夜莺监控系统也是支持的:
但是,需要注意的是,夜莺系统中配置记录规则,并不是比如生成Rule
规则文件下发到Prometheus
中,而是采用【远程查询】- 【解析】 – 【远程写入】方式,涉及到远程读写,所以这里可能需要关注网络IO情况。因为Prometheus
配置管理这块较弱,没有提供配置管理功能,也没有相关接口,只能进行文件加载,若要搞成下发配置则需要agent
才行,对于后面的告警规则一样,也是远程读取数据自行管理触发告警事件,而没有使用Rule Alarm
方式。夜莺系统规则计算逻辑具体参见如下代码:
源码说明:
- 每条记录规则(
Record Rule
)都会创建一个协程进行计算; -
rrc.Eval()
就是记录规则计算逻辑,然后Sleep
一段时间,实现interval
间隔计算规则逻辑;
主要步骤:
1、rrc.promClients.GetCli(rrc.datasourceId).Query()
:根据Record Rule配置的PromQL从指定数据源查询数据;
2、ts := ConvertToTimeSeries(value, rrc.rule)
:解析查询数据,主要是将自定义标签(label
)添加进去;
3、rrc.promClients.GetWriterCli(rrc.datasourceId).Write(ts)
:将添加了自定义标签的(label
)数据远程写入到数据源中。
1、配置prometheus数据源时,【write_addr】就是配置remote_write地址;
2、如果使用Prometheus,则需要打开
--web.enable-remote-write-receiver
开关,即将Prometheus作为TSDB库,可以通过remote-write方式远程写入数据,对应接口地址:http://xxx:port/api/v1/write3、如果使用vm作为远端存储,则需要提供vminsert组件提供的remote write协议接口:http://ip:port/api/v1/write
即时查询
【即时查询】提供PromQL
查询页面功能,基本类似于Prometheus UI
查询页面,特别需要说的是提供【新手模式】,基本通过表单下拉框选项就可以构建出PromQL
查询语句,对于初学者不太熟悉PromQL
语法的同学稍显友好,深入学习还是建议PromQL
,更加直接灵活,比如group left/right
等多指标关联暂未找到支持:
快捷视图
【快捷视图】属于夜莺系统的一个特色功能,主要是简化即时查询,同时作为监控大盘的一个补充,毕竟组件暴露的指标可能大几十到上百个,而Dashboard
展示的内容毕竟有限,难免故障定位中需要查询额外指标信息,这就是【快捷视图】的使用场景。
默认提供了一个【Host View】视图,这里比如自定义个MySQL
组件视图,用于查看MySQL
组件指标:
完成后如下图:
原理解读:
- 前置条件用于赛选指标序列series,然后就是指定两个标签:动态过滤标签和展开维度标签;
- 展开维度标签一般就是获取采集点或实例;
- 动态过滤标签就是对步骤2中采集点或实例进行分组筛选,比如
MySQL
节点非常多,可以按照网络域分组方便查找; - 选中【MySQL视图】,然后勾选故障MySQL实例节点,监控指标栏就展示出该节点所有指标信息,并按照前缀tab展示(前缀就是截取第一个下划线前面部分),指标说明需要通过
metrics.yaml
文件维护;
指标查询接口如:/api/v1/label/name/values?start=1681826693&end=1681830293&match[]={ident=~”VM-4-14-centos|categraf01″}
所以,比如ident标签这里要唯一代表一个实例,如一个主机上部署多个exporter就不要使用主机名无法区分,需要使用类似于instance标签,带有ip:port唯一标识。
- 比如这里查看
disk_io_time
指标,下面就以ident
实例维度聚合,即每个实例展示以avg均值
聚合展示一条趋势线,【聚合函数】下拉框可以切换不同的聚合函数,还可以使用计算函数进行数值处理; - 【环比】提供1天和7天环比,借助
PromQL
的offset
偏移功能
仪表盘
内置仪表盘
内置仪表盘提供夜莺监控提供的内置公共监控Dashboard
,公共Dashboard
作为基础模板大家都会使用,所以这里禁止编辑,避免相互影响,如果需要编辑修改做自定义定制,则使用【克隆】功能将公共模板复制一份到指定业务组下,这样业务组就拥有一份私有Dashboard
,编辑修改也不会影响到其它项目组监控功能,类似于Grafana
实现多租户实现Dashboard
隔离:
监控仪表盘
内置仪表盘通过克隆成业务组私有仪表盘,就可以在【监控仪表盘】页面看到,该页面仪表盘按照业务组划分。
夜莺仪表盘可视化数据没有使用Grafana
,而是自己开发实现,更加的轻量,方便系统整合。仪表盘和Grafana
仪表盘对比,大致概念,操作逻辑相似度非常高,熟悉Grafana
仪表盘的用户上手夜莺仪表盘基本没有任何压力,所以,对从Grafana
切换过来的用户比较友好,最大的障碍是Grafana
官网提供的大量Dashboard
没法兼容使用。
但是,我在使用夜莺仪表盘配置过程中发现,夜莺仪表盘功能上还是有很多阉割,保留了大部分常用功能,毕竟Grafana
也是一套庞大的系统。
我在配置过程中还是发现一些常见实用的功能缺失:
1、缺失业务组筛选
点击查看仪表盘,ident
下拉框筛选主机,发现所有业务组的主机节点都在下拉框中,前端打开Dashboard
时应该将业务组标签传递进来(这样感觉定义业务组时必须打开英文标识才行),Dashboard
定义一个Constant
变量进行接收,然后对ident
进行基于业务组标签筛选:
2、变量列表不支持变量引用,导致下拉框联动无法实现。
比如在Dashboard
上定义了两个维度筛选下拉框【group】和【name】,【name】下拉框需要和【group】下拉框联动,配置如下,但是夜莺系统好像不太支持。
3、Data Link功能缺失
很多场景下都需要监控大盘,监控大盘可以汇总的展示所有节点指标数据,在监控大盘中table
是常用组件,基于table
将所有节点及其重要核心指标列表方式直观展示出来,并基于Data Link
跳转指定节点看详情,即监控下钻功能,然后我在夜莺监控Dashboard
中并没有找到Data Link
功能,只看到【链接】功能,链接只能针对到panel
级别跳转,不能到达数据级别跳转,另外【链接】没有实现跳转将当前Dashboard
定义的变量一并传递,也使【链接】功能大打折扣。
权限隔离
简单梳理了下夜莺监控系统权限隔离情况,见下图:
从用户和业务资产两个维度来说,用户采用常见的RBAC
基于角色的权限控制,主要授权用户可以访问哪些页面的接口资源,再加上一个团队(Team)概念方便管理。业务资产主要包括Categraf采集点、Record Rule、Dashboard、告警规则和自愈脚本等,并将这些业务资产关联到某个业务组下,不同业务组下这些资产是独立隔离开的,避免相互影响,比如定制仪表盘、修改告警规则等。然后将用户以Team为单元添加到业务组下,即用户拥有操作管理该业务组下相关业务资产权限。
但是,对于基础数据部分,夜莺并没有做到多租户隔离。比如仪表盘是业务组隔离的,但是仪表盘可以访问哪些数据并没有限制;同样的,告警规则隶属于某个业务组,但是基于告警规则触发的告警并没有项目组概念。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net