搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

一、环境搭建


1、安装Node exporter


1) a、mac 安装 brew install node_exporter

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)b、启动 node_exporter


node_exporter --web.listen-address=":9600" --web.telemetry-path="/node_metrics"

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

c、访问启动页面

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)


  • node_boot_time:系统启动时间
  • node_cpu:系统CPU使用量
  • nodedisk*:磁盘IO
  • nodefilesystem*:文件系统用量
  • node_load1:系统负载
  • nodememeory*:内存使用量
  • nodenetwork*:网络带宽
  • node_time:当前系统时间
  • go_*:node exporter中go相关指标
  • process_*:node exporter自身进程相关运行指标



2) docker启动


a、docker pull prom/node-exporter

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)


b、docker run -d --name=node  -p 9100:9100 prom/node-exporter:latest

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

c、验证启动结果

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)




2、安装Prometheus

1) docker pull prom/prometheus

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

2)启动prometheus


docker run -d -p 9090:9090 -v /tmp/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml  prom/prometheus



a、prometheusyml



global:                  
  scrape_interval:     15s 
 
  external_labels:   
    monitor: 'codelab-monitor'
 
# Alertmanager配置
alerting:
 alertmanagers:
 - static_configs:
   - targets: ["192.168.50.100:9093"] # 设定alertmanager和prometheus交互的接口,即alertmanager监听的ip地址和端口
rule_files: 
  - '/tmp/prometheus/prometheus_rules.yml'
  - '/tmp/prometheus/alertmanager/alertmanager_rules.yml' 
scrape_configs: 
  - job_name: 'prometheus' 
 
    # 覆盖全局的 scrape_interval
    scrape_interval: 5s
 
    static_configs:  
      - targets: ['192.168.50.100:9090']
 
  - job_name: 'node'
 
    scrape_interval: 10s
    metrics_path: "/metrics"
 
    static_configs:
      - targets: ['192.168.50.100:9100']  # 本机 node_exporter 的 endpoint 这里若配置成127.0.0.1 会出现gramtheus访问node不通问题


b、prometheus_rules.yml 


(base) mengfaniaodeMBP:prometheus mengfanxiao$ cat prometheus_rules.yml 
groups:
- name: example   #报警规则的名字
  rules:
  # Alert for any instance that is unreachable for >5 minutes.
  - alert: InstanceDown     #检测job的状态,持续1分钟metrices不能访问会发给altermanager进行报警
    expr: up == 0
    for: 1m    #持续时间
    labels:
      serverity: page
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
  #- alert: "it's has problem"  #报警的名字
  #  expr: "test_tomcat{exported_instance="uat",exported_job="uat-app-status",host="test",instance="uat",job="uat-apps-status"} -  test_tomcat{exported_instance="uat",exported_job="uat-app-status",host="test",instance="uat",job="uat-apps-status"} offset 1w > 5"   # 这个意思是监控该表达式查询出来的值与一周前的值进行比较,大于5且持续10m钟就发送给altermanager进行报警
  #  for: 1m  #持续时间
  #  labels:
 #     serverity: warning
  #  annotations:
  #    summary: "{{ $labels.type }}趋势增高"
  #    description: "机器:{{ $labels.host }} tomcat_id:{{ $labels.id }} 类型:{{ $labels.type }} 与一周前的差值大于5,当前的差值为:{{ $value }}"    #自定义的报警内容


c、alertmanager_rules.yml 


(base) mengfaniaodeMBP:alermanager mengfanxiao$ cat alertmanager_rules.yml 
groups:
 - name: test-rules
   rules:
   - alert: InstanceDown # 告警名称
     expr: up == 0 # 告警的判定条件,参考Prometheus高级查询来设定
     for: 2m # 满足告警条件持续时间多久后,才会发送告警
     labels: #标签项
      team: node
     annotations: # 解析项,详细解释告警信息
      summary: "{{$labels.instance}}: has been down"
      description: "{{$labels.instance}}: job {{$labels.job}} has been down "
      value: {{$value}}
(base) mengfaniaodeMBP:alermanager mengfanxiao$ ls
alertmanager.ymlalertmanager_rules.ymlconfig.ymltemplate
(base) mengfaniaodeMBP:alermanager mengfanxiao$ 
(base) mengfaniaodeMBP:alermanager mengfanxiao$ cat alertmanager_rules.yml 
groups:
 - name: test-rules
   rules:
   - alert: InstanceDown # 告警名称
     expr: up == 0 # 告警的判定条件,参考Prometheus高级查询来设定
     for: 2m # 满足告警条件持续时间多久后,才会发送告警
     labels: #标签项
      team: node
     annotations: # 解析项,详细解释告警信息
      summary: "{{$labels.instance}}: has been down"
      description: "{{$labels.instance}}: job {{$labels.job}} has been down "
   #   value: {{$value}}


3)

a、验证是否启动成功

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)


b、prometheus的数据

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)


c、看配置的2个数据源是否成功

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

问题:


Get http://127.0.0.1:9100/metrics: dial tcp 127.0.0.1:9100: connect: connection refused


但telnet 127.0.0.1 9100是可以的


原因是:

容器具有单独的网络名称空间,这意味着容器中的127.0.0.1在主机上不是127.0.0.1。

您应该使用主机的IP或使用--network = host启动容器。


host模式下使用-p或者-P会出现WARNING: Published ports are discarded when using host network mode 当你是host模式的时候,主机会自动把他上面的端口分配给容器,这个时候使用-p或者-P是无用的。但是还是可以在Dockerfile中声明EXPOSE端口 后续文章再详谈



3、安装grafana

1)docker pull grafana/grafana

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

2)查看下载情况

docker images|grep grafana/grafana

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

3)创建一个grafana/grafana容器并启动

docker run -d --name=grafana -p 3000:3000 grafana/grafana

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

4)访问启动页面

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

默认账号admin/admin

5)登陆了之后 配置数据源

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

数据源配置好之后 创建仪表盘用于显示数据源的数据

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

选择配置好的这个数据源

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

这里选择具体的数据指标仪表盘中就会画出对应的折线

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

不同的仪表盘模式供选择

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

4、安装Alertmanager

1) docker pull docker.io/prom/alertmanager:latest

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

2) docker run -d -p 9093:9093 -v /tmp/prometheus/alermanager/alertmanager.yml:/etc/alertmanager/config.yml --name alertmanager docker.io/prom/alertmanager:latest


a、alertmanager.yml 


(base) mengfaniaodeMBP:alermanager mengfanxiao$ cat alertmanager.yml 
# 全局配置项
global: 
  resolve_timeout: 5m #处理超时时间,默认为5min
  smtp_smarthost: 'smtp.sina.com:25' # 邮箱smtp服务器代理
  smtp_from: '******@sina.com' # 发送邮箱名称
  smtp_auth_username: '******@sina.com' # 邮箱名称
  smtp_auth_password: '******' # 邮箱密码或授权码
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' # 企业微信地址
# 定义模板信心
templates:
  - 'template/*.tmpl'
# 定义路由树信息
route:
  group_by: ['alertname'] # 报警分组依据
  group_wait: 10s # 最初即第一次等待多久时间发送一组警报的通知
  group_interval: 10s # 在发送新警报前的等待时间
  repeat_interval: 1m # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
  receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称
# 定义警报接收者信息
receivers:
  - name: 'email' # 警报
    email_configs: # 邮箱配置
    - to: '******@163.com'  # 接收警报的email配置
      html: '{{ template "test.html" . }}' # 设定邮箱的内容模板
      headers: { Subject: "[WARN] 报警邮件"} # 接收邮件的标题
    # 第三方开发配置
     #webhook_configs: # webhook配置
    #- url: 'http://127.0.0.1:5001'
    #send_resolved: true
    #wechat_configs: # 企业微信报警配置
    #- send_resolved: true
     #to_party: '1' # 接收组的id
      #agent_id: '1000002' # (企业微信-->自定应用-->AgentId)
      #corp_id: '******' # 企业信息(我的企业-->CorpId[在底部])
      #api_secret: '******' # 企业微信(企业微信-->自定应用-->Secret)
      #message: '{{ template "test_wechat.html" . }}' # 发送消息模板的设定
# 一个inhibition规则是在与另一组匹配器匹配的警报存在的条件下,使匹配一组匹配器的警报失效的规则。两个警报必须具有一组相同的标签。 
inhibit_rules: 
  - source_match: 
     severity: 'critical' 
    target_match: 
     severity: 'warning' 
    equal: ['alertname', 'dev', 'instance']

b、test.tmpl 


(base) mengfaniaodeMBP:template mengfanxiao$ cat test.tmpl 
{{ define "test.html" }}
<table border="1">
        <tr>
                <td>报警项</td>
                <td>实例</td>
                <td>报警阀值</td>
                <td>开始时间</td>
        </tr>
        {{ range $i, $alert := .Alerts }}
                <tr>
                        <td>{{ index $alert.Labels "alertname" }}</td>
                        <td>{{ index $alert.Labels "instance" }}</td>
                        <td>{{ index $alert.Annotations "value" }}</td>
                        <td>{{ $alert.StartsAt }}</td>
                </tr>
        {{ end }}
</table>
{{ end }}



3) 验证启动结果

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)


这里可看到 Prometheus sever 端发过来的 alerts,并可做 alerts 搜索,分组,静音等操作

搭建监控系统 (Node exporter、Grafana、Prometheus、Alertmanager)



二、遗留问题下次解析


1、告警相关

a、promtheus的alert页面没有显示告警配置 

b、node正常运行的时候 promtheus的alert页面没有显示

c、node停止运行时 promtheus的alert页面没有显示且alertmanage没有收到告警

d、alertmanager还没有配置receiver信息


2、简述各个组件是干什么的


3、简述原理及应用场景

a、简述原理

b、应用场景

4、docker host模式解析



参考资料


1、https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-prometheus-getting-started-and-practice/index.html

2、https://www.jianshu.com/p/7f586b482c44?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com


上一篇:docker nginx 部署 vue项目


下一篇:git命令梳理(二)