zoukankan      html  css  js  c++  java
  • Prometheus+Grafana+Altermanager搭建监控系统

    基本概念

    Prometheus

    时间序列化数据库,我的理解就是将数据打上标签,以时间维度存储。后面有机会在深入研究。

    Prometheus架构如下:

    Grafana

    Prometheus中存储的数据,通过Grafana进行图形化呈现。

    Alertmanager 

    Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组,策略路由,是一款前卫的告警通知系统。

    软件安装

    一.Prometheus安装

    1.1 Prometheus安装

    1)普通安装:

    prometheus安装包最新版本下载地址:

     https://github.com/prometheus/prometheus/releases/download/v2.3.2/prometheus-2.3.2.linux-amd64.tar.gz

    解压:tar txvf prometheus-2.3.2.linux-amd64.tar.gz

    切换目录:cd prometheus-2.3.2.linux-amd64
    启动:./prometheus --config.file=prometheus.yml

    注:通过执行

    ./prometheus -h

    可以查看具体得执行参数,参数后面可以查看默认得参数。如下图所示。

    2)docker 方式安装(前提docker已经安装完毕)

    创建目录和prometheus配置文件

    mkdir /prometheus
    vim /prometheus/prometheus.yml

    注:对于prometheus.yml文件的配置,稍后详细介绍。

    拉取prometheus镜像

    docker pull prom/prometheus

    启动prometheus

    docker run -d -p 9090:9090 --name prometheus -v /prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml

    注:参数的简要说明

    a、-d选项启动独立模式下的prometheus容器,这意味着容器将在后台启动,这种情况下只有stop docker才可以关闭prometheus,而不能执行ctrl+c

    b、-p选择指定端口号映射,通过访问本机的9090端口,即可访问prometheus容器的9090端口

    c、--name指定容器的名称

    d、-v选项建立本机文件和docker内文件的映射

    e、--config.file指定运行docker内prometheus的配置文件

    1.2 prometheus配置文件的设定

    prometheus的配置文件采用的是yaml文件,yaml文件书写的要求如下:

    大小写敏感
    使用缩进表示层级关系
    缩进时不允许使用Tab键,只允许使用空格。
    缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

    prometheus.yml的样例

    复制代码

    # Prometheus全局配置项
    global:
      scrape_interval:     15s # 设定抓取数据的周期,默认为1min
      evaluation_interval: 15s # 设定更新rules文件的周期,默认为1min
      scrape_timeout: 15s # 设定抓取数据的超时时间,默认为10s
      external_labels: # 额外的属性,会添加到拉取得数据并存到数据库中
       monitor: 'codelab_monitor'
    
    # Alertmanager配置
    alerting:
     alertmanagers:
     - static_configs:
       - targets: ["localhost:9093"] # 设定alertmanager和prometheus交互的接口,即alertmanager监听的ip地址和端口
         
    # rule配置,首次读取默认加载,之后根据evaluation_interval设定的周期加载
    rule_files:
     - "alertmanager_rules.yml"
     - "prometheus_rules.yml"
    
    # scape配置
    scrape_configs:
    - job_name: 'prometheus' # job_name默认写入timeseries的labels中,可以用于查询使用
      scrape_interval: 15s # 抓取周期,默认采用global配置
      static_configs: # 静态配置
      - targets: ['localdns:9090'] # prometheus所要抓取数据的地址,即instance实例项
    
    - job_name: 'example-random'
      static_configs:
      - targets: ['localhost:8080']

    1.3. 通过localhost:9090端口访问,如下图所示: 

    安装exporter
    prometheus可以理解为一个数据库+数据抓取工具,工具从各处抓来统一的数据,放入prometheus这一个时间序列数据库中。那如何保证各处的数据格式是统一的呢?就是通过这个exporter。exporter也是用GO写的程序,它开放一个http接口,对外提供格式化的数据。所以在不同的环境下,需要编写不同的exporter。好在已经有很多写好的exporter,我们可以直接使用(https://github.com/prometheus这里可以找到很多exporter)我们这里直接使用mysqld_exporter(prometheus.io/download/#mysqld_exporter)。当然也要下载对应系统的版本。

    下载地址可参考:

    window版本:https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.windows-amd64.tar.gz

    Linux版本:https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-amd64.tar.gz

    解压后的内容类似如下图:

    这里的mysqld_exporter是启动文件,.my.cnf是配置文件。想要正确的导出mysql的状态数据,必须在配置文件中正确的配置mysql的连接信息。我的配置如下: 

    配置好了,就可以启动了。成功如下所示:

    通过localhost:9104,就可以看到exporter导出的数据: 

     

    在Prometheus中配置mysqld_exporter

    exporter启动了,需要在Prometheus中正确的配置。修改prometheus目录中的prometheus.yml,增加配置如下:

    重启prometheus,点击导航栏中的status->targets可以看到,mysql的exporter已经集成。 

    二.安装Grafana

    2.1.安装Grafana

    下载Grafana安装包:https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.3.linux-amd64.tar.gz

    tar zxvf grafana-5.2.3.linux-amd64.tar.gz
    cd grafana-5.2.3.linux-amd64.tar.gz
    bin/grafana-server web

    Grafana默认服务端口号为3000,通过浏览器对Grafana进行访问。

    http://localdns:3000

    默认登录名密码为"admin/admin"。

     2.2 配置数据源

    首先,你要添加一个数据源,将Grafana和Prometheus关联起来。点击Add data source,如下填写数据保存即可: 

    操作步骤如下:

    1 在左侧工具栏中,点击"Configuration"菜单。
    2 点击"Data Sources"。
    3 点击"Add data source"。
    4 数据源Type选择“Prometheus”。
    5 设置Prometheus服务访问地址(例如:http://localhost:9090)。
    6 调整其他想要的设置(例如:关闭代理访问)。
    7 点击“Add”按钮,保存这个新数据源。

    看到如下的提示,说明你的prometheus工作是正常的:

    2.3 配置dashboard

    接着回到首页,你需要添加一个dashboard,如下图进入dashboard导入页面:

    这里你需要从https://github.com/percona/grafana-dashboards项目中的dashboards下载MySQL_Overview.json,然后通过上面页面的Upload .json File按钮上传上去,导入即可

    下载地址:https://github.com/percona/grafana-dashboards/blob/master/dashboards/MySQL_Overview.json

    导入成功后,你将看到监控页面。

     三、Alertmanager(email报警)

    Alertmanager简介及机制
    Alertmanager处理由类似Prometheus服务器等客户端发来的警报,之后需要删除重复、分组,并将它们通过路由发送到正确的接收器,比如电子邮件、Slack等。Alertmanager还支持沉默和警报抑制的机制。

    分组
    分组是指当出现问题时,Alertmanager会收到一个单一的通知,而当系统宕机时,很有可能成百上千的警报会同时生成,这种机制在较大的中断中特别有用。

    例如,当数十或数百个服务的实例在运行,网络发生故障时,有可能服务实例的一半不可达数据库。在告警规则中配置为每一个服务实例都发送警报的话,那么结果是数百警报被发送至Alertmanager。

    但是作为用户只想看到单一的报警页面,同时仍然能够清楚的看到哪些实例受到影响,因此,人们通过配置Alertmanager将警报分组打包,并发送一个相对看起来紧凑的通知。

    分组警报、警报时间,以及接收警报的receiver是在配置文件中通过路由树配置的。

    抑制
    抑制是指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。

    例如,当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。

    抑制机制可以通过Alertmanager的配置文件来配置。

    沉默
    沉默是一种简单的特定时间静音提醒的机制。一种沉默是通过匹配器来配置,就像路由树一样。传入的警报会匹配RE,如果匹配,将不会为此警报发送通知。

    沉默机制可以通过Alertmanager的Web页面进行配置。

    3.1 Alertmanager安装

    下载地址:https://github.com/prometheus/alertmanager/releases/download/v0.15.3/alertmanager-0.15.3.linux-amd64.tar.gz

    tar -zxvf alertmanager-0.15.3.linux-amd64.tar.gz

    cd alertmanager-0.15.3.linux-amd64

    执行命令 mv simple.yml alertmanager.yml,并修改 alertmanager.yml 配置:

    启动 ./alertmanager-config.file= alertmanager.yml #默认配置项为alertmanager.yml

     注:alertmanager.yml配置文件,默认是不存在的,需要新建。

    3.2 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']

    注:

    1)repeat_interval配置项,对于email来说,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝

    2)企业微信注册地址:https://work.weixin.qq.com

    上述配置的email、webhook和wechat三种报警方式。目前Alertmanager所有的报警方式有以下几个方面:

    复制代码

    email_config
    hipchat_config
    pagerduty_config
    pushover_config
    slack_config
    opsgenie_config
    victorops_config

    复制代码

    3.3.tmpl模板的配置

    1)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 }}

    复制代码

    注:上述Labels项,表示prometheus里面的可选label项。annotation项表示报警规则中定义的annotation项的内容。

    2)test_wechat.tmpl

    复制代码

    {{ define "cdn_live_wechat.html" }}
      {{ range $i, $alert := .Alerts.Firing }}
        [报警项]:{{ index $alert.Labels "alertname" }}
        [实例]:{{ index $alert.Labels "instance" }}
        [报警阀值]:{{ index $alert.Annotations "value" }}
        [开始时间]:{{ $alert.StartsAt }}
      {{ end }}
    {{ end }}
    

    复制代码

    注:此处range遍历项与email模板中略有不同,只遍历当前没有处理的报警(Firing)。此项如果不设置,则在Alert中已经Resolved的报警项,也会被发送到企业微信。

    3.4、在Prometheus模块定义告警规则

    alertmanager_rules.yml样例配置文件(与prometheus同目录下)

    复制代码

    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}}

    groups:

    - name: test-rule
      rules:
      - alert: "内存报警"
        expr: 100 - ((node_memory_MemAvailable * 100) / node_memory_MemTotal) > 10
        for: 1s
        labels:
           severity: warning
        annotations:
           summary: "服务名:{{$labels.alertname}}"
           description: "业务500报警: {{ $value }}"
           value: "{{ $value }}"


    - name: test-rule2
      rules:
      - alert: "内存报警"
        expr: 100 - ((node_memory_MemAvailable * 100) / node_memory_MemTotal) > 40
        for: 1s
        labels:
           severity: test
        annotations:
           summary: "服务名:{{$labels.alertname}}"
           description: "业务500报警: {{ $value }}"
           value: "{{ $value }}"

    3.5、告警信息生命周期的3中状态

    1)inactive:表示当前报警信息即不是firing状态也不是pending状态

    2)pending:表示在设置的阈值时间范围内被激活的

    3)firing:表示超过设置的阈值时间被激活的

    3.6、结果展示

    启动prometheus和alertmanager,满足报警条件后,就可以收到报警邮件了。

    1. 浏览器界面化告警展示

    在浏览器输入alertmanager的配置地址,即可查看所监控到的报警信息

    http://localdns:9093/#/alerts

    如图所示:

    2 . 邮箱告警展示

       1)原始邮箱告警展示

     2)模板邮箱告警展示

     3、企业微信告警展示

    四. Prometheus与其他模块对接

      由于Prometheus灵活的接口配置和数据获取方式,可以很灵活的与其他模块进行对接,用于实时监控多个模块。

    包括以下常用模块:

    1.node_exporter

    用户监控节点虚拟机的指标信息。

    下载地址:https://github.com/prometheus/node_exporter/releases/download/v0.17.0-rc.0/node_exporter-0.17.0-rc.0.linux-386.tar.gz

    2.jmx_exporter

    下载地址:https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar

    3.elasticsearch_exporter

    下载地址:https://github.com/justwatchcom/elasticsearch_exporter/releases/download/v1.0.4rc1/elasticsearch_exporter-1.0.4rc1.linux-386.tar.gz

    4.redis_exporter

    下载地址:https://github.com/oliver006/redis_exporter/releases/download/v0.22.0/redis_exporter-v0.22.0.linux-386.tar.gz

    5.mysqld_exporter

    下载地址;https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-386.tar.gz

    6.postgres_exporter

    下载地址:https://github.com/wrouesnel/postgres_exporter/releases/download/v0.4.7/postgres_exporter_v0.4.7_linux-amd64.tar.gz

    7.mongodb_exporter

    下载地址:https://github.com/dcu/mongodb_exporter/releases/download/v1.0.0/mongodb_exporter-linux-amd64

    8.statsd_exporter

    下载地址:https://github.com/prometheus/statsd_exporter/releases/download/v0.8.0/statsd_exporter-0.8.0.linux-amd64.tar.gz

    9.mesos_exporter

    下载地址:https://github.com/mesos/mesos_exporter/releases/download/v1.1.1/mesos_exporter-1.1.1.linux-arm64.tar.gz

    10.apache_exporter

    下载地址:https://github.com/Lusitaniae/apache_exporter/releases/download/v0.5.0/apache_exporter-0.5.0.linux-amd64.tar.gz

    11.hadoop_exporter

    下载地址:https://github.com/wyukawa/hadoop_exporter

    12.logstash_exporter

    下载地址:https://github.com/BonnierNews/logstash_exporter/archive/v0.1.2.tar.gz

    13.sql_exporter

    下载地址:https://github.com/justwatchcom/sql_exporter/releases/download/v0.2.0/sql_exporter-0.2.0.linux-amd64.tar.gz

    14.oracle_exporter

    下载地址:https://github.com/iamseth/oracledb_exporter/releases/download/0.0.8/oracledb_exporter.linux-amd64

    15.zookeeper_exporter

    下载地址1:https://github.com/carlpett/zookeeper_exporter/releases/download/v1.0.1/zookeeper_exporter-1.0.1.linux-amd64.tar.gz

    下载地址2:https://github.com/carlpett/zookeeper_exporter/releases/download/v1.0.2/zookeeper_exporter

    16.influxdb_exporter

    下载地址:https://github.com/prometheus/influxdb_exporter/releases/download/v0.1.0/influxdb_exporter-0.1.0.linux-amd64.tar.gz

    17.zabbix_exporter

    下载地址:https://github.com/MyBook/zabbix-exporter/archive/1.0.2.tar.gz

    18.opentsdb_exporter

    下载地址:https://github.com/cloudflare/opentsdb_exporter/archive/0.0.3.tar.gz

    19.grafana_exporter

    下载地址:https://github.com/frodenas/grafana_exporter/releases/download/v0.1.0/grafana_exporter-0.1.0.linux-amd64.tar.gz

    20.json_exporter

    下载地址:https://github.com/sciffer/json_exporter

       

  • 相关阅读:
    Spark Streaming企业运用
    spark企业运用
    sparkcore企业运用
    Spark GraphX从入门到实战
    sparkstreaming入门到实战
    sparkSql从入门到实战
    sparkcore入门到实战
    spark机器算法从入门到实战
    flink实时数仓从入门到实战
    github上克隆私有项目
  • 原文地址:https://www.cnblogs.com/momoyan/p/9943154.html
Copyright © 2011-2022 走看看