Loading

prometheus2-blackbox

本文初稿,未完善

prometheus

与zabbix 对比:

和Zabbix类似,Prometheus也是一个近年比较火的开源监控框架,和Zabbix不同之处在于Prometheus相对更灵活点,模块间比较解耦,比如告警模块、代理模块等等都可以选择性配置。服务端和客户端都是开箱即用,不需要进行安装。zabbix则是一套安装把所有东西都弄好,很庞大也很繁杂。

zabbix的客户端agent可以比较方便的通过脚本来读取机器内数据库、日志等文件来做上报。而Prometheus的上报客户端则分为不同语言的SDK和不同用途的exporter两种,比如如果你要监控机器状态、mysql性能等,有大量已经成熟的exporter来直接开箱使用,通过http通信来对服务端提供信息上报(server去pull信息);而如果你想要监控自己的业务状态,那么针对各种语言都有官方或其他人写好的sdk供你使用,都比较方便,不需要先把数据存入数据库或日志再供zabbix-agent采集。

zabbix的客户端更多是只做上报的事情,push模式。而Prometheus则是客户端本地也会存储监控数据,服务端定时来拉取想要的数据。

granafa install

Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。它主要有以下六大特点:

1、展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;

2、数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;

3、通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;

4、混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;

5、注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;

6、过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。

###install
##https://grafana.com/docs/grafana/latest/installation/rpm/   手册
##https://grafana.com/grafana/download?platform=linux         下载

#sudo yum install initscripts urw-fonts wget
wget https://dl.grafana.com/oss/release/grafana-7.0.3-1.x86_64.rpm
sudo yum install grafana-7.0.3-1.x86_64.rpm

sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl status grafana-server
sudo systemctl enable grafana-server



##添加数据源
prometheus 数据源


##导入显示插件
11386  Prometheus Blackbox Exporter  granafa展示


##插件安装
grafana-cli plugins install grafana-piechart-panel

Blackbox Exporter

blackbox_exporter可以实现网络监控,支持http、dns、tcp、icmp等监控

安装blackbox 后.探测成功后会在targets 页面显示正常,表明探测过程成功且获取了数据, 至于端口异常或http异常,需要在报警rule 里显示出来

Blackbox_exporter 应用场景
HTTP 测试
定义 Request Header 信息
判断 Http status / Http Respones Header / Http Body 内容
TCP 测试
业务组件端口状态监听
应用层协议定义与监听
ICMP 测试
主机探活机制
POST 测试
接口联通性
SSL 证书过期时间

wget  https://github.com/prometheus/blackbox_exporter/releases/download/v0.16.0/blackbox_exporter-0.16.0.linux-amd64.tar.gz
sudo useradd --no-create-home --shell /bin/false blackbox_exporter
tar   xvf   blackbox_exporter-0.16.0.linux-amd64.tar.gz
sudo  mv  blackbox_exporter-0.16.0.linux-amd64/blackbox_exporter /usr/local/bin
sudo chown blackbox_exporter:blackbox_exporter /usr/local/bin/blackbox_exporter  

#######
####一般情况下都会以非root用户运行blackbox_exporter,为了使用icmp prober,需要设置CAP_NET_RAW
####
#######
setcap cap_net_raw+ep  /usr/local/bin/blackbox_exporter

blackbox_exporter --version 

sudo mkdir /etc/blackbox_exporter
sudo chown blackbox_exporter:blackbox_exporter /etc/blackbox_exporter

##探针配置文件
#通过 blackbox.yml 定义模块详细信息
#在 Prometheus 配置文件中引用该模块以及配置被监控目标主机

sudo vim /etc/blackbox_exporter/blackbox.yml
modules:
  http_2xx:  # http 监测模块
    prober: http
    http:
  http_post_2xx: # http post 监测模块
    prober: http
    http:
      method: POST
  tcp_connect: # tcp 监测模块
    prober: tcp
  ping: # icmp 检测模块
    prober: icmp
    timeout: 5s
    icmp:
      preferred_ip_protocol: "ip4"



##设置为系统服务
sudo vim /etc/systemd/system/blackbox_exporter.service
[Unit]
Description=Blackbox Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=blackbox_exporter
Group=blackbox_exporter
Type=simple
ExecStart=/usr/local/bin/blackbox_exporter --config.file /etc/blackbox_exporter/blackbox.yml #这个配置文件可以使用安装包里默认的配置文件

[Install]
WantedBy=multi-user.target


sudo systemctl daemon-reload

sudo systemctl start blackbox_exporter
sudo systemctl status  blackbox_exporter

ss -tunlp|grep 9115




##安装了 blackbox_exporter 后的prometheus 的配置文件
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
    - targets: ['localhost:9090']
    ##新添加,用来测试服务器的连通性
  - job_name: node_status
    metrics_path: /probe
    params:
      module: [ping]   ##模块, blackbox  配置文件配置的探测模块
    static_configs:
      - targets: ['192.168.1.200', '192.168.1.134']
        labels:
          instance: node_status
          group: 'node'
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - target_label: __address__
        replacement: 192.168.190.147:9115   ##91155是blackbox程序的启动端口和程序所在的服务器
        ##配置端口的探测
  - job_name: 'prometheus_port_status'
    metrics_path: /probe
    params:
      module: [tcp_connect]
    static_configs:
      - targets: ['192.168.1.134:8080','192.168.1.145:8888','192.168.1.145:8502', '192.168.1.145:9020','192.168.1.145:9005','192.168.1.145:9000']
        labels:
          instance: 'port_status'
          group: 'tcp'
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.190.147:9115
        ##配置网页的探测
  - job_name: web_status
    scrape_interval: 15s  #时间间隔
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets: ['http://192.168.1.137:8090','http://192.168.1.57:8090', 'http://192.168.1.145:8090', 'http://192.168.1.59:8090']
        labels:
          instance: user_status
          group: 'web'
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - target_label: __address__
        replacement: 192.168.190.147:9115

告警应用测试(未验证)

cat rules/blackbox-alert.rules 
groups:
- name: blackbox_network_stats
  rules:
  - alert: blackbox_network_stats
    expr: probe_success == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }}  is down"
      description: "This requires immediate action!"


##SSL 证书过期时间监测
cat << 'EOF' > prometheus.yml
rule_files:
  - ssl_expiry.rules
scrape_configs:
  - job_name: 'blackbox'
    metrics_path: /probe
    params:
      module: [http_2xx]  # Look for a HTTP 200 response.
    static_configs:
      - targets:
        - example.com  # Target to probe
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9115  # Blackbox exporter.
        EOF 
cat << 'EOF' > ssl_expiry.rules 
groups: 
  - name: ssl_expiry.rules 
    rules: 
      - alert: SSLCertExpiringSoon 
        expr: probe_ssl_earliest_cert_expiry{job="blackbox"} - time() < 86400 * 30 
        for: 10m
EOF

https://blog.csdn.net/qq_25934401/article/details/84325356

https://www.cnblogs.com/shhnwangjian/p/10706417.html blackbox配置

https://cloud.tencent.com/developer/article/1580054 比较全

prometheus 监控实战

探针和内省

监控应用程序主要有两种方法:探针(probing)和内省(introspection),

探针监控是在应用程序的外部,它查询应用程序的外部特征:监听端口是否有响应并返回正确的数据或状态码, 探针监控的一个例子是执行ICMP检查并确认可以收到响应

内省监控主要查看应用程序内部的内容。应用程序经过检测,并返回其状态、内部组件,或者事务和事件性能的度量。这些数据可准确显示应用程序的运行方式,而不仅是其可用性或其表面行为。内省监控可以直接将事件、日志和指标发送到监控工具,也可以将信息发送给状态或健康检查接口,然后由监控工具收集

内省方法提供了应用程序实际运行的状态,它允许你传达比探针监控更丰富且更多的有关应用程序状态上下文的信息,是能提供你和业务所需的监控信息的更好方式

两种执行监控检查的方式,分别是拉取(pull)和推送(push)

监控数据类型:

指标:指标存储为时间序列数据,用于记录应用程序度量的状态

日志:应用程序发出的事件

指标类型:

测量型: 上下增减的数字, 特定度量的快照,例如,cpu 内存,磁盘使用率

计数型(counter):随着时间增加而不会减少的数字,系统正常运行时间、设备收发包的字节数或登录次数

直方图:对观察点进行采样的指标类型,可展现数据集的频率分布

配置文件

验证配置文件:

promtool  check config   prometheus.yml 

服务发现

规模较大的集群

基于文件的方式、基于API的方式和基于DNS的方式

数据抓取的生命周期:

服务发现-->配置-->重新标记 relabel_configs --> 抓取--->重新标记 metric_relabel_configes

基于文件的服务发现

- job_name: node 
  file_sd_configs:
    - files: 
      - targets/nodes/*.json
      refresh_interval: 5m
      
- job_name: docker
  file_sd_configs:
    - files: 
      - targets/docker/*.json
      refresh_interval: 5m    
      
      
      
node.json
[{
  "targets": [
    "192.168.1.200:9100",
    "192.168.1.201:9100",
    "192.168.1.202:9100",
    "192.168.1.203:9100"
  ],
  "labels": {
      "datacenter": "nj"
  }

}]

除了json格式还有ymal 格式的配置文件

给予API 的服务发现

k8s

基于DNS 的服务发现

DNS服务发现允许你指定DNS条目列表,然后查询这些条目中的记录以发现目标列表。它依赖于A、AAAA或SRV DNS记录查询

- job_name: webapp
  dns_sd_configs:
    - names: ['_prometheus._tcp.example.com']
      tpye: A
      port: 9100

报警

安装Alertmanager

配置:


添加报警规则,添加的规则在prometheus.yml 中配置

rule_files"
  - "rules/*_rules.yml"
  - "rules/*_alerts.yml"
  

报警触发

Prometheus以一个固定时间间隔来评估所有规则,这个时间由evaluate_interval定义,我们将其设置为15秒。在每个评估周期,Prometheus运行每个警报规则中定义的表达式并更新警报状态。

警报的状态:

Inactive:警报未激活

Pending:警报已满足测试表达式条件,但仍在等待for子句中指定的持续时间

Firing:警报已满足测试表达式条件,并且Pending的时间已超过for子句的持续时间

警报的生命周期如下:

节点的CPU不断变化,每隔一段由scrape_interval定义的时间被Prometheus抓取一次,对我们来说是15秒。

根据每个evaluation_interval的指标来评估警报规则,对我们来说还是15秒

当警报表达式为true时(对于我们来说是CPU超过80%),会创建一个警报并转换到Pending状态,执行for子句

在下一个评估周期中,如果警报测试表达式仍然为true,则检查for的持续时间。如果超过了持续时间,则警报将转换为Firing,生成通知并将其推送到Alertmanager。

如果警报测试表达式不再为true,则Prometheus会将警报规则的状态从Pending更改为Inactive。

日志处理:

mtail日志处理器是由Google的SRE人员来编写的,其采用Apache 2.0许可证,并且使用Go语言。mtail日志处理器专门用于从应用程序日志中提取要导出到时间序列数据库中的指标,填补了我们上面描述的空缺:从无法导出自己内部状态的应用程序中解析日志数据

Pushgateway

监控无法访问到的资源

配置文件示例

prometheus

targets/blackbox/dev.yml 指targets目录处在prometheus配置文件相同的目录下

global:
  scrape_interval:     30s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 30s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

alerting:
  alertmanagers:
  - static_configs:
    - targets:
        - 127.0.0.1:9093
      # - alertmanager:9093

rule_files:
  - "rules/*.yml"
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  # - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    #static_configs:
    #- targets: ['192.168.1.142:9100']
  - job_name: 'promethues-node'
    static_configs:
    - targets:
        - 192.168.1.140:9100
        - 192.168.1.137:9100
        - 192.168.1.57:9100
        - 192.168.1.60:9100
        - 192.168.1.201:9100
        - 192.168.1.200:9100
        - 192.168.1.145:9100
        - 192.168.1.227:9100
        - 192.168.1.59:9100
        - 192.168.4.51:9100
        - 192.168.1.142:9100

  - job_name: 'check_137_port_status'
    metrics_path: /probe
    params:
      module: [tcp_connect]
    file_sd_configs:
      - files:
        - targets/blackbox/dev.yml
        refresh_interval: 10m
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.1.60:9115  # 指的是启动了blackbox 服务的ip:port

  - job_name: 'check_145_port_status'
    metrics_path: /probe
    params:
      module: [tcp_connect]
    file_sd_configs:
      - files:
        - targets/blackbox/sim.yml
        refresh_interval: 10m
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.1.60:9115  

  - job_name: 'check_57_port_status'
    metrics_path: /probe
    params:
      module: [tcp_connect]
    file_sd_configs:
      - files:
        - targets/blackbox/test.yml
        refresh_interval: 10m
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.1.60:9115 

  - job_name: 'check_59_port_status'
    metrics_path: /probe
    params:
      module: [tcp_connect]
    file_sd_configs:
      - files:
        - targets/blackbox/prod.yml
        refresh_interval: 10m
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.1.60:9115

rules

groups:
    - name: 主机状态-监控告警
      rules:
      - alert: 主机状态
        expr: up == 0
        for: 1m
        labels:
          status: 非常
        annotations:
          summary: "{{$labels.instance}}:服务器宕机 服务器延时超过1分钟"
          description: "{{$labels.instance}}:服务器延时超过1分钟"
      
      - alert: CPU使用情况
        expr: 100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100) > 80
        for: 1m
        labels:
          status: 严重
        annotations:
          summary: "{{$labels.mountpoint}} CPU使用率过高! 目前使用:{{$value}}% "
          description: "{{$labels.mountpoint }} CPU使用大于80%(目前使用:{{$value}}%)"
  
      - alert: home目录可用量
        expr:  node_filesystem_avail_bytes{mountpoint="/home",fstype=~"ext4|xfs"}  /1073741824  < 2
        for: 1m
        labels:
          status: 严重
        annotations:
          value: "{{ $value }}"
          instance: "{{ $labels.instance }}"
          mountpoint: "{{$labels.mountpoint}}"
          summary: "实例在home挂载点磁盘可用量小于2G!, 当前可用: {{ $value }}G"
   
      - alert: root目录可用量
        expr:  node_filesystem_avail_bytes{mountpoint="/",fstype=~"ext4|xfs"}  /1073741824  < 2
        for: 1m
        labels:
          status: 严重
        annotations:
          value: "{{ $value }}"
          instance: "{{ $labels.instance }}"
          mountpoint: "{{$labels.mountpoint}}"
          summary: "实例在root挂载点磁盘可用量小于2G!, 当前可用: {{ $value }}G"
       
      - alert: blackbox_port_stats
        expr: probe_success == 0
        for: 1m
        labels:
          severity: 严重
        annotations:
          summary: "Instance {{ $labels.instance }}  is down"
          description: "This requires immediate action!"

targets 下配置文件描述方式

targets/blackbox/test.yml 
- labels:
    env: "157-test"
  targets: 
    # CONFIG 
    - 192.168.1.57:8888


https://github.com/yunlzheng/prometheus-book

posted @ 2020-07-11 16:38  Lust4Life  阅读(682)  评论(0)    收藏  举报