Linux 之父出席、干货分享、圆桌讨论,精彩尽在 OpenCloudOS 社区开放日,报名戳 了解详情
写点什么

基于 Prometheus 构建黑盒监控体系(已用于线上环境)

  • 2020 年 5 月 03 日
  • 本文字数:4842 字

    阅读完需:约 16 分钟

基于Prometheus构建黑盒监控体系(已用于线上环境)

本文由 dbaplus 社群授权转载。


概述

在监控体系里面,通常我们认为监控分为:白盒监控和黑盒监控。



黑盒监控:主要关注的现象,一般都是正在发生的东西,例如出现一个告警,业务接口不正常,那么这种监控就是站在用户的角度能看到的监控,重点在于能对正在发生的故障进行告警。


白盒监控:主要关注的是原因,也就是系统内部暴露的一些指标,例如 redis 的 info 中显示 redis slave down,这个就是 redis info 显示的一个内部的指标,重点在于原因,可能是在黑盒监控中看到 redis down,而查看内部信息的时候,显示 redis port is refused connection。


白盒监控:有很多种,有中间件,有存储,有 web 服务器例如 redis 可以使用 info 暴露内部的指标信息;例如 mysql 可以使用 show variables 暴露内部指标信息;例如 nginx 可以使用 nginx_status 来暴露内部信息,系统业务指标可以通过埋点或者命令进行采集。


Blackbox Exporter

在前面的知识中,我们介绍 Prometheus 下如何进行白盒监控,我们监控主机的资源用量、容器的运行状态、数据库中间件的运行数据,通过采集相关指标来预测我们的服务健康状态。


在黑盒健康方面。Blackbox Exporter 是 Prometheus 社区提供的官方黑盒监控解决方案,其允许用户通过:HTTP、HTTPS、DNS、TCP 以及 ICMP 的方式对网络进行探测,目前我司相关业务监控接口也是基于 Blockbox 来进行的,下面我们开始。


Blackbox_exporter 应用场景

1、HTTP 测试


  • 定义 Request Header 信息

  • 判断 Http status / Http Respones Header / Http Body 内容


2、TCP 测试


  • 业务组件端口状态监听

  • 应用层协议定义与监听


3、ICMP 测试


  • 主机探活机制


4、POST 测试


  • 接口联通性


5、SSL 证书过期时间


结合 grafana 生成的相关模板

1、首先看下我们这边的相关图表,门户多项指标与 ssl 监控



2、机房线路监控



3、接口状态监控



Blackbox Exporter 部署

1、安装 Exporter


[root@cinder1 src]# wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.16.0/blackbox_exporter-0.16.0.linux-amd64.tar.gz[root@cinder1 src]#tar -zxvf blackbox_exporter-0.16.0.linux-amd64.tar.gz -C /usr/local[root@cinder1 src]#mv /usr/local/blackbox_exporter-0.16.0.linux-amd64 /usr/local/blackbox_exporter
复制代码


2、添加到启动项


[root@cinder1 src]# cat /etc/systemd/system/blackbox_exporter.service [Unit]Description=blackbox_exporterAfter=network.target 
[Service]WorkingDirectory=/usr/local/blackboxExecStart=/usr/local/blackbox/blackbox_exporter \ --config.file=/usr/local/blackbox/blackbox.yml[Install]WantedBy=multi-user.target
复制代码


3、检测是否正常启动


[root@cinder1 src]# ss -tunlp|grep 9115tcp    LISTEN     0      128      :::9115                 :::*                   users:(("blackbox_export",pid=2517722,fd=3))
复制代码


icmp 监控

通过 icmp 这个指标的采集,我们可以确认到对方的线路是否有问题。这个也是监控里面比较重要的一个环节。我们要了解全国各地到我们机房的线路有哪条有问题我们总结了两种方案:


  • 全国各地各节点 ping 和访问数据采集。这种类似听云运营商有提供这类服务,但是要花钱;

  • 我现在用的方法就是:找各地测试 ping 的节点,我们从机房主动 ping 看是否到哪个线路有故障,下面我们开始。


1、prometheus 添加相关监控,Blackbox 使用默认配置启动即可


- job_name: "icmp_ping"    metrics_path: /probe    params:      module: [icmp]  # 使用icmp模块    file_sd_configs:    - refresh_interval: 10s      files:      - "/home/prometheus/conf/ping_status*.yml"  #具体的配置文件    relabel_configs:    - source_labels: [__address__]      regex: (.*)(:80)?      target_label: __param_target      replacement: ${1}    - source_labels: [__param_target]      target_label: instance    - source_labels: [__param_target]      regex: (.*)      target_label: ping      replacement: ${1}    - source_labels: []      regex: .*      target_label: __address__      replacement: 192.168.1.14:9115
复制代码


2、相关 ping 节点配置


[root@cinder1 conf]# cat ping_status.yml - targets: ['220.181.38.150','14.215.177.39','180.101.49.12','14.215.177.39','180.101.49.11','14.215.177.38','14.215.177.38']  labels:    group: '一线城市-电信网络监控'- targets: ['112.80.248.75','163.177.151.109','61.135.169.125','163.177.151.110','180.101.49.11','61.135.169.121','180.101.49.11']  labels:    group: '一线城市-联通网络监控'- targets: ['183.232.231.172','36.152.44.95','182.61.200.6','36.152.44.96','220.181.38.149']  labels:    group: '一线城市-移动网络监控' 
复制代码


这些数据是从全国各地 ping 网站进行采集,大家可以从那些网站获取.


3、添加 grafana


这个 grafana 是自己定义的,看到网上没有就自己定义了一个。大家可以从 github 上下载,再看看效果,可以看到我们通过 Ping 就获取到了全国各地的线路运行情况,可以有效的检测到我们线路异常问题:



http 相关指标监控

1、prometheus 配置 http_get 访问


  - job_name: "blackbox"    metrics_path: /probe    params:      module: [http_2xx]  #使用http模块    file_sd_configs:     - refresh_interval: 1m      files:       - "/home/prometheus/conf/blackbox*.yml"    relabel_configs:    - source_labels: [__address__]      target_label: __param_target    - source_labels: [__param_target]      target_label: instance    - target_label: __address__      replacement: 192.168.1.14:9115
复制代码


2、相关配置文件,类似举例如下


[root@cinder1 conf]# cat /home/prometheus/conf/blackbox-dis.yml - targets:  - https://www.zhibo8.cc  - https://www.baidu.com#配置相关URL
复制代码


3、添加 grafana 模板


可以选择模板的 9965 模板,这个模板我们也看到前面的,提供了相关的 ssl 过期检测,这里以两个常见的网站为例。


接口 get 请求检测

1、prometheus 配置,其实跟我们之前的配置一样,我们直接看配置文件


  - job_name: "check_get"    metrics_path: /probe    params:      module: [http_2xx]  # Look for a HTTP 200 response.    file_sd_configs:    - refresh_interval: 1m      files:      - "/home/prometheus/conf/service_get.yml"    relabel_configs:    - source_labels: [__address__]      target_label: __param_target    - source_labels: [__param_target]      target_label: instance    - target_label: __address__      replacement: 192.168.1.14:9115
复制代码


2、相关接口配置参考


[root@cinder1 conf]# cat service_get.yml - targets:  - http://10.10.1.123:10000/pmkb/atc_tcbi  - http://10.10.1.123:10000/pmkb/get_ship_lock_count  - http://10.10.1.123:10000/pmkb/get_terminal_count_by_city  - http://10.10.1.123:10000/pmkb/get_terminal_monitor?industry=1  - http://10.10.1.123:10000/pmkb/get_terminal_comparison?industry=1  - http://10.10.1.123:10000/pmkb/get_terminal_city_count_industry?industry=1  - http://10.10.1.123:10000/pmkb/industry_stat?industry=1  - http://10.10.1.123:10000/pmkb/get_company_car_count?industry=1  - http://10.10.1.123:10000/pmkb/get_terminal_month_countbyi?industry=1  labels:    group: 'service'
复制代码


3、grafana 和前面一样自己订制的,可以从 github 上下载


接口 post 请求状态检测

1、这里首先我们要改一下 post 相关接口的 blackbox.yml 配置,我们自己定义一个模块


[root@cinder1 blackbox]# cat blackbox.yml modules:  http_2xx:    prober: http  http_post_2xx:   #这个模块名称可以自己定义    prober: http    http:      method: POST      headers:        Content-Type: application/json   #添加头部      body: '{"username":"admin","password":"123456"}'  #发送的相关数据,这里我们以登录接口为例
复制代码


2、添加到 prometheus


  - job_name: "check_service"    metrics_path: /probe    params:      module: [http_post_2xx]  # 这里要对应配置文件里,定义的模块    file_sd_configs:     - refresh_interval: 1m      files:       - "/home/prometheus/conf/service_post.yml"    relabel_configs:    - source_labels: [__address__]      target_label: __param_target    - source_labels: [__param_target]      target_label: instance    - target_label: __address__      replacement: 192.168.1.14:9115
复制代码


3、相关配置查看


[root@cinder1 conf]# cat service_post.yml - targets:  - http://10.2.4.103:5000/devops/api/v1.0/login  labels:    group: 'service'
复制代码


4、添加 grafana 相关配置,这个也是自己定义的,可以从 github 上下载


tcp 端口状态检测

个人理解的是这个跟 telnet 差不多都是检测端口是否在线


1、prometheus 配置


  - job_name: 'port_status'    metrics_path: /probe    params:      module: [tcp_connect]  #使用tcp模块    static_configs:      - targets: ['10.10.1.35:8068','10.10.1.35:8069']  #对应主机接口        labels:          instance: 'port_status'          group: 'tcp'    relabel_configs:    - source_labels: [__address__]      target_label: __param_target     - target_label: __address__      replacement: 192.168.1.14:9115 
复制代码


2、图表


图表可以集成到前面的 grafana 9965 模板。


告警规则定义

1、业务正常性


  • icmp、tcp、http、post 监测是否正常可以观察 probe_success 这一指标

  • probe_success == 0 ##联通性异常

  • probe_success == 1 ##联通性正常

  • 告警也是判断这个指标是否等于 0,如等于 0 则触发异常报警



2、通过 http 模块我们可以获取证书的过期时间,可以根据过期时间添加相关告警


probe_ssl_earliest_cert_expiry :可以查询证书到期时间。



#经过单位转换我们可以得到一下,按天来计算:(probe_ssl_earliest_cert_expiry - time())/86400



3、所以我们结合上面的配置可以定制如下告警规则


[root@cinder1 rules]# cat blackbox.yml groups:- name: blackbox_network_stats  rules:  - alert: blackbox_network_stats    expr: probe_success == 0    for: 1m    labels:      severity: critical    annotations:      summary: "接口/主机/端口 {{ $labels.instance }}  无法联通"      description: "请尽快检测"
复制代码


##ssl 检测


[root@cinder1 rules]# cat ssl.yml groups:- name: check_ssl_status  rules:  - alert: "ssl证书过期警告"    expr: (probe_ssl_earliest_cert_expiry - time())/86400 <30    for: 1h    labels:      severity: warn    annotations:      description: '域名{{$labels.instance}}的证书还有{{ printf "%.1f" $value }}天就过期了,请尽快更新证书'      summary: "ssl证书过期警告"
复制代码


4、重启完成之后我们可以登录 web 界面查看下




5、我们发现有个接口已经存在问题,这个时候我们也收到了一条相应的微信告警



总结

黑盒监控相较于白盒监控最大的不同在于黑盒监控是以故障为导向当故障发生时,黑盒监控能快速发现故障,所以我们监控时候以粒度比较细的,如端口、接口、线路等进行监控。


通过 Prometheus Blackbox Exporter 可以快速实现和定制我们很多相关策略,大家线上环境可以基于以上做配置即可。


作者介绍


罗辉,原荔枝 FM 运维工程师,现任北方激光研究院广西分公司运维总监。


原文链接


https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650787711&idx=1&sn=0f9cf318b1c94eb00ece6203b20c8da2&chksm=f3f97aeac48ef3fc58505339af481106b66b4df138d1a70b74b72033ea06dad65b2db0656889&scene=27#wechat_redirect


2020 年 5 月 03 日 14:065755

评论

发布
暂无评论
发现更多内容

Spark RDD详解

大数据技术指南

大数据 spark 5月日更

CRUD程序员勿进!全身心投入才能读懂腾讯大佬亲码的“Java微服务”学习笔记

Java架构师迁哥

智能家居商业模式:To C向左,To B向右

不脱发的程序猿

IoT 智能家居 智能家居商业模式

ELK协议栈基本介绍

五分钟学大数据

大数据 5月日更

【LeetCode】整数转罗马数字Java题解

HQ数字卡

算法 LeetCode 5月日更

css与less,sass的奇妙之旅

less SASS

cornerstone 基础概念篇(一)

Lazy

cornerstone 脑科学 脑科学软件工程 脑影像

夯实信任基础 区块链正在成为价值互联网的新代言

CECBC

iOS 面试策略之系统框架-UIKit

iOSer

ios 面试 语言 & 开发 系统框架

如何防止抄袭PCB电路板

不脱发的程序猿

嵌入式 如何防止抄袭PCB电路板 PCB电路板 硬件开发

打破固有思维(九)

Changing Lin

python变量、运算符

若尘

变量 运算符 Python编程 5月日更

区块链技术如何助力构建新能源系统

CECBC

据说学会这款数据分析工具,会被各大名企高薪哄抢!

博文视点Broadview

Serverless:这真的是未来吗?(一)

Serverless Devs

运维 云原生 服务器 #Serverless

个人/团队/企业/组织申请计算机软件著作权的流程

不脱发的程序猿

程序人生 专利 软著申请 计算机软件著作

深入浅出,Andorid 端屏幕采集技术实践

拍乐云Pano

android 音视频

区块链创新包含基础技术和应用场景两个层面

CECBC

如何从Docker镜像提取Dockerfile?

运维研习社

Docker Dockerfile 5月日更

Windows后渗透之权限维持

Thrash

Kubernetes入门——Kubernetes日志采集与监控告警

百度开发者中心

百度 Kubernetes 云原生 kubernetes入门 技术课程

情场失意的我,幸获师兄捞了一把,助我拿到6个大厂offer,Java岗

Java架构师迁哥

WAVE SUMMIT 2021 深度学习开发者峰会定档5月20日

百度大脑

深度学习 飞桨

解读SSDB、LevelDB和RocksDB到GaussDB(for Redis)的迁移

华为云开发者联盟

数据仓库 华为云 数据迁移 GaussDB(for Redis) PB级数据库

☕【Java技术之旅】走进线程池的世界(基础篇)

浩宇天尚

Java 线程 线程池 线程池工作原理 5月日更

最强阿里巴巴历年经典面试题汇总:C++研发岗

linux大本营

c++ Linux epoll 服务器开发

canvas从零到一,实际案例

Vue 海报 js ts canvas

区块链新基建时代 看欧科云链如何助力数字经济产业升级

CECBC

数字经济

数据中心太耗电,送你一个节能神器

华为云开发者联盟

数据中心 节能 电费 NAIE 制冷

GPU容器虚拟化:用户态和内核态的技术和实践详解

GPU容器虚拟化:用户态和内核态的技术和实践详解

基于Prometheus构建黑盒监控体系(已用于线上环境)_容器_dbaplus社群_InfoQ精选文章