目前覆盖的监控对象包含主机层、组件层、服务拨测,对于无法开箱即用的监控对象可以使用脚本采集、日志采集以及组件二次开发,通过仪表盘实现自定义可视化视图呈现,基于iPaaS的产品设计(关联CMDB、作业执行、数据平台等)天然打破"竖井式"产品设计理念,依托于故障自愈实现告警的无人值守!
支持以主机为单元的基础性能指标查看、告警策略配置、告警记录等功能。指标支持CPU、内存、磁盘、网络、进程、系统、事件(corefile、主机重启等)等7类共30~40项指标。
指标 | 类型 | 单位 | 含义 | 采集方法(Linux) | 采集方法(Windows) | |||
---|---|---|---|---|---|---|---|---|
5分钟平均负载 | CPU | % | 五分钟内同时处于就绪状态的平均进程数 | awk '{print $2}' /proc/loadavg | N/A | |||
cpu总使用率 | CPU | % | 当前消耗的总CPU百分比 | delta(busy) / delta(total) * 100 busy = user + sys + nice + iowait + irq + softirq + steal + guest + guestnice + stolen total = busy + idle | for /f "tokens=1,2,* delims==" %i in ('wmic path Win32_PerfFormattedData_Counters_ProcessorInformation where "Name='_Total'" get PercentIdleTime/value \ | findstr PercentIdleTime') do (set /a 100-%j) | ||
cpu单核使用率 | CPU | % | 当前单个CPU消耗的百分比 | delta(busy) / delta(total) * 100 busy = user + sys + nice + iowait + irq + softirq + steal + guest + guestnice + stolen total = busy + idle | for /f "tokens=1,2,* delims==" %i in ('wmic path Win32_PerfFormattedData_Counters_ProcessorInformation where "not name like '%Total%'" get PercentIdleTime/value \ | findstr PercentIdleTime') do (set /a 100-%j) | ||
接收字节流量 | 网络 | KB/s | 网卡每秒接收的比特数,即网卡的上行带宽 | 读取/proc/net/dev文件 第1项SpeedRecv = delta(new.BytesRecv, old.BytesRecv) / interval | wmic path Win32_PerfRawData_Tcpip_NetworkInterface get BytesReceivedPersec/value \ | findstr BytesReceivedPersec | ||
发送字节流量 | 网络 | KB/s | 网卡每秒发送的比特数,即网卡的下行带宽 | 读取/proc/net/dev文件第9项SpeedSent = delta(new.BytesSent, old.BytesSent) / interval | wmic path Win32_PerfRawData_Tcpip_NetworkInterface get BytesSentPersec/value \ | findstr BytesSentPersec | ||
发送包速率 | 网络 | 个/s | 网卡每秒接收的数据包数 | 读取/proc/net/dev文件 第10项 SpeedPacketsSent = (counterDiff(once.Stat[i].PacketsSent, val.PacketsSent, NetCoutnerMaxSize)) / interval | wmic path Win32_PerfRawData_Tcpip_NetworkInterface get PacketsSentPersec/value \ | findstr PacketsSentPersec | ||
接收包速率 | 网络 | 个/s | 网卡每秒发送的数据包数 | 读取/proc/net/dev文件 第2项 SpeedPacketsRecv = delta(new.PacketsRecv, old.PacketsRecv) / interval | wmic path Win32_PerfRawData_Tcpip_NetworkInterface get PacketsReceivedPersec/value | findstr PacketsReceivedPersec | |||
established连接数 | 网络 | 个 | 当前服务器下TCP链接处于ESTABLISHED状态的连接数 | 系统netlink实现 验证方法netstat -pant\ | grep ESTABLISHED | netstat -ano -p tcp | more +4 | find " ESTABLISHED " | ||
time_wait连接数 | 网络 | 个 | 当前服务器下TCP链接处于TIME_WAIT状态的连接数 | 系统netlink实现 验证方法netstat -pant\ | grep TIME_WAIT | netstat -ano -p tcp | more +4 | find " TIME_WAIT " | ||
listen连接数 | 网络 | 个 | 当前服务器下TCP链接处于LISTEN状态的连接数 | 系统netlink实现 验证方法netstat -pant\ | grep LISTEN | netstat -ano -p tcp | more +4 | find " LISTENING " | ||
last_ack连接数 | 网络 | 个 | 当前服务器下TCP链接处于LAST_ACK状态的连接数 | 系统netlink实现 验证方法netstat -pant\ | grep LAST_ACK | netstat -ano -p tcp | more +4 | find " LAST_ACK " | ||
syn_recv连接数 | 网络 | 个 | 当前服务器下TCP链接处于SYN_RECV状态的连接数 | 系统netlink实现 验证方法netstat -pant\ | grep SYNC_RECV | netstat -ano -p tcp | more +4 | find " SYN_RECV " | ||
syn_sent连接数 | 网络 | 个 | 当前服务器下TCP链接处于SYN_SENT状态的连接数 | 系统netlink实现 验证方法netstat -pant\ | grep SYNC_SENT | netstat -ano -p tcp | more +4 | find " SYN_SENT " | ||
fin_wait1连接数 | 网络 | 个 | 当前服务器下TCP链接处于FIN_WAIT1状态的连接数 | 系统netlink实现 验证方法netstat -pant\ | grep FIN_WAIT1 | netstat -ano -p tcp | more +4 | find " FIN_WAIT_1 " | ||
fin_wait2连接数 | 网络 | 个 | 当前服务器下TCP链接处于FIN_WAIT2状态的连接数 | 系统netlink实现 验证方法netstat -pant\ | grep FIN_WAIT2 | netstat -ano -p tcp | more +4 | find " FIN_WAIT_2 " | ||
closing连接数 | 网络 | 个 | 当前服务器下TCP链接处于CLOSING状态的连接数 | 系统netlink实现 验证方法netstat -pant\ | grep CLOSING | netstat -ano -p tcp | more +4 | find " CLOSING " | ||
closed状态连接数 | 网络 | 个 | 当前服务器下TCP链接处于CLOSED状态的连接数 | 系统netlink实现 验证方法netstat -pant\ | grep CLOSED | netstat -ano -p tcp | more +4 | find " CLOSE " | ||
UDP接收包量 | 网络 | 个 | UDP包接受数 | 读取 /proc/net/snmp 文件 InDatagrams项 cat /proc/net/snmp\ | grep Udp:\ | grep -v 'InDatagrams'\ | awk '{print $2}' | wmic path Win32_PerfFormattedData_Tcpip_UDPv4 get DatagramsReceivedPersec/value |
UDP发送包量 | 网络 | 个 | UDP包发送数 | 读取 /proc/net/snmp 文件 OutDatagrams项 cat /proc/net/snmp\ | grep Udp:\ | grep -v 'InDatagrams'\ | awk '{print $5}' | 读取/proc/net/dev文件 第2项 SpeedPacketsRecv = delta(new.PacketsRecv, old.PacketsRecv) / interval |
可用物理内存 | 内存 | MB | 可用内存容量 | 读取 /proc/meminfo 文件 MemTotal字段*1024 cat /proc/meminfo \ | grep 'MemTotal'\ | awk -F ':' '{print $2}'\ | awk '{print $1}'\ | awk '{print $1 * 1024}' |
交换分区已用量 | 内存 | MB | 交换分区使用容量 | 读取 /proc/meminfo 文件 golang系统调用syscall.Sysinfo sysinfo.Totalswap - sysinfo.Freeswap 验证方法free -m | wmic os get TotalSwapSpaceSize/value | |||
物理内存使用率 | 内存 | % | 内存使用百分比 | 读取 /proc/meminfo 文件[MemTotal-MemFree]/MemTotal*100.0 | wmic os get FreePhysicalMemory,TotalVisibleMemorySize/value | findstr "FreePhysicalMemory TotalVisibleMemorySize" | ||
物理内存使用量 | 内存 | MB | 已经使用的内存容量 | 读取 /proc/meminfo 文件[MemTotal-MemFree]*1024 | wmic os get FreePhysicalMemory,TotalVisibleMemorySize/value \ | findstr "FreePhysicalMemory TotalVisibleMemorySize" | ||
应用内存使用量 | 内存 | MB | 应用进程使用的内存量 | 读取 /proc/meminfo 文件 如果有MemAvailable字段(不同系统版本有差异)(MemTotal-MemAvailable)/1024,如果没有该字段,MemAvailable=MemFree+Buffers+Cached | N/A | |||
应用内存使用率 | 内存 | % | 应用进程内存量占总内存的百分比 | 读取 /proc/meminfo 文件 (MemTotal-MemAvailable)/(MemTotal*100.0),如果没有MemAvailable字段,则MemAvailable=MemFree+Buffers+Cached | N/A | |||
磁盘使用率 | 磁盘 | % | 磁盘已用空间的百分占比 | golang 系统调用syscall.Statfs 相当于df | for /f "tokens=1,2,* delims==" %i in ('wmic path Win32_PerfFormattedData_PerfDisk_LogicalDisk where "name like '%:%'" get PercentFreeSpace/value \ | findstr PercentFreeSpace') do (set /a 100-%j) | ||
读速率 | 磁盘 | 次/s | 磁盘每秒输出次数 | 读取 /proc/diskstats 每一行的第四项 float64((new_stat.ReadCount - stat.ReadCount)) / 60 只上报逻辑分区 | wmic path Win32_PerfFormattedData_PerfDisk_LogicalDisk get DiskReadsPersec/value | |||
写速率 | 磁盘 | 次/s | 磁盘每秒写入次数 | 读取 /proc/diskstats第8项 float64((new_stat.WriteCount - stat.WriteCount)) / 60 只上报逻辑分区 | wmic path Win32_PerfFormattedData_PerfDisk_LogicalDisk get DiskWritesPersec/value | |||
磁盘IO使用率 | 磁盘 | % | 磁盘处于活动时间的百分比 | 读取 /proc/diskstats 文件读取 /proc/diskstats第13项 (new_stat.IoTime - stat.IoTime)/60.0 / 1000.0 | for /f "tokens=1,2,* delims==" %i in ('wmic path Win32_PerfFormattedData_PerfDisk_LogicalDisk where "Name='_Total'" get PercentIdleTime/value \ | findstr PercentIdleTime') do (set /a 100-%j) | ||
系统进程数 | 进程 | 个 | 系统已启动进程数量 | 抓取/proc 目录下所有子目录数量 | wmic path win32_process get ProcessId/value | findstr ProcessId | ||
Agent心跳丢失-GSE | 事件 | 监测GSE的Agent是否正常 | N/A | N/A | ||||
磁盘只读-GSE | 事件 | 监测磁盘状态 | N/A | N/A | ||||
磁盘写满-GSE | 事件 | 监测磁盘状态 | N/A | N/A | ||||
Corefile产生-GSE | 事件 | 监测/proc/sys/kernel/core_pattern中目录内文件的变化 | N/A | N/A | ||||
PING不可达告警-GSE | 事件 | 监测PING不可达事件告警 | N/A | N/A | ||||
进程端口 | 事件 | 进程对应端口 | N/A | wmic path win32_process get */value 和 netstat -ano | ||||
自定义字符型 | 事件 | N/A | N/A | N/A | ||||
系统启动时间异常 | 事件 | 监测系统启动异常告警 | N/A | N/A | ||||
采集 应用程序
所占用系统资源,主要用于开发监测单个程序占用的资源。
适用于
Linux
和Windows
指标 | 单位 | 具体含义 | 备注 |
---|---|---|---|
Process.CPU | % | CPU使用率 | cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running (cputime/realtime ratio),expressed as a percentage. |
Process.Mem | % | 内存使用率 | ratio of the process’s resident set size to the physical memory on the machine, expressed as a percentage. |
Process.FileDescriptor | 文件句柄数 | lsof -p ${pid} 来获取单个进程占用的文件句柄数 | |
Process.RES | MB | 物理内存 | resident set size, the non-swapped physical memory that a task has used . (alias rssize, rsz). |
Process.VIRT | MB | 虚拟内存 | virtual memory size of the process. Device mappings are currently excluded. |
FAQ
问:一个二进制程序启动多个进程,仅pid不同,可以监控吗?
答: 监控先识别进程二进制文件名称,然后匹配出该名称下所有进程
监控常见开源组件及商业中间件的性能指标,比如Nginx的每分钟客户端请求数(req_per_min)、等待中的连接数(waiting)等,或Oracle的并发等待时间( CONCURRENCY_WAIT_TIME)等。 图1. 组件监控
图2. Nginx关键性能指标监控
图3. Oracle关键性能指标监控
蓝鲸监控除内置组件性能指标的采集能力,同时兼容Prometheus Exporter的导入及开发能力,全面覆盖组件的采集能力。
指标 | 单位 | 具体含义 |
---|---|---|
jvm_buffer_pool_used_bytes | MB | 已使用缓冲池的大小 |
jvm_buffer_pool_capacity_bytes | MB | 缓冲池的字节容量 |
jvm_buffer_pool_used_buffers | 已经使用的缓冲数量 | |
jmx_config_reload_success_total | 已成功重新加载配置的次数 | |
jvm_threads_current | 当前线程数 | |
jvm_threads_daemon | 当前后台线程数 | |
jvm_threads_peak | 当前峰值线程数 | |
jvm_threads_started_total | 已经启动的线程计数 | |
jvm_threads_deadlocked | 等待获取对象监视器或自己的同步器的死锁线程数 | |
jvm_threads_deadlocked_monitor | 等待获取对象监视器的死锁线程数 | |
jmx_scrape_duration_seconds | 秒 | scrape的时间 |
jmx_scrape_error | scrape失败次数 | |
jvm_classes_loaded | 当前加载的类数量 | |
jvm_classes_loaded_total | 从JVM开始执行以来已经加载的类的总数 | |
jvm_classes_unloaded_total | 从JVM开始执行以来未加载的类的总数 | |
jvm_info | JVM版本信息 | |
jvm_memory_bytes_used | MB | 已经使用的内存 |
jvm_memory_bytes_committed | MB | 已经提交的内存 |
jvm_memory_bytes_max | MB | 最大内存 |
jvm_memory_bytes_init | MB | 初始化内存 |
jvm_memory_pool_bytes_used | MB | 内存池中已经使用的内存 |
jvm_memory_pool_bytes_committed | MB | 内存池中已经提交的内存 |
jvm_memory_pool_bytes_max | MB | 内存池中最大内存 |
jvm_memory_pool_bytes_init | MB | 内存池中初始化内存 |
jmx_config_reload_failure_total | 配置reload失败的次数 | |
jvm_gc_collection_seconds_count | 秒 | gc时间 |
自定义监控
当你需要对业务指标或蓝鲸监控未内置的监控对象做监控时,通过自定义监控可实现你的监控需求。
大屏展示
通过仪表盘功能可以对当前业务下的监控对象做可视化分析,实现你的个性化展示和监控需求.
监控的告警自动处理能力依托于PaaS上的故障自愈上,请在访问故障自愈的在线文档了解详情。
图1. 故障自愈执行列表
图2. 单个告警执行故障自愈详情
告警检测和收敛是监控的核心能力之一,监控支持静态阈值、同比、环比等多种检测算法,其中同比、环比更适合周期性时间序列数据的检测。
通过X分钟内满足Y次检测算法实现告警防抖动。
此外检测算法的组合策略,可设置同时满足多种检测算法才触发告警。
记录采集、监控策略、视图以及其他设置的新建、修改、删除操作,追溯每一条变更。
监控的权限体系分2个层面:业务隔离
、业务下角色隔离
,均是基于配置平台(CMDB)实现.
提供了 谁能访问该业务 和 谁可查看或变更该业务配置 的功能。
配置平台业务间的权限通过业务中的运维人员、产品人员、测试人员、开发人员以实现业务隔离(不同业务,拥有对应业务权限的人员才能访问)
如monitor
在配置中心拥有 蓝鲸
和 业务3
的业务权限
他在监控中也只有这2个业务的权限,因为监控继承了CMDB权限。
分为 查询
和 变更
权限,基于配置平台(CMDB)针对单个业务可设置运维
、测试
、开发
、产品
权限。
默认运维拥有 查询
和 变更
权限,其他人员拥有 查询
权限。
根据实际使用场景,可以针对单个角色做权限调整。