大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

监控系统介绍

集群监控&平台监控:

  • 开发一个大数据平台不是我们的目的,稳定的对其使用才是
  • 大数据平台的日志和监控是我们开发人员工作中必不可少的两只眼睛
  • 大数据平台涉及到的组件较多,需要统一的完成集群监控和平台监控

监控分层:

  • 监控粒度、监控指标完整性、监控实时性是评价监控系统的三要素
  • 般我们将监控系统分为三个层次:系统层、应用层和业务层
  • 系统层:
    • 系统层即我们的大数据平台所依赖的服务器层级的监控
    • 实时掌握服务器工作状态,留意性能、内存消耗、容量和整体系统健康状态,保证服务器稳定运行
    • 监控指标:内存、磁盘、CPU、 网络流量、系统进程等系统级指标
  • 应用层:
    • 应用层顾名思义为在服务器上部署的各类的应用,包括但不限于我们的Hadoop集群、Azkaban调度 服务和我们的大数据平台应用等等
    • 对应用的整体运行状况进行了解、把控,确保服务状态正常,服务性能正常
    • 常用监控数据: JVM堆内存、GC、 CPU使用率、线程数、TPS、 吞吐量等
  • 业务层:
    • 业务层监控是最贴近系统用户的,同时可以反馈系统及应用层的问题
    • 对业务数据进行监控,可及时发现程序bug或业务逻辑设计缺陷
    • 比如我们会监控Azkaban的任务执行情况、Datax数据抽取情况等等

常用开源监控项目对比

常用监控组件:

  • Zabbix:基于Web界面提供分布式系统监视及网络监视功能的企业级开源解决方案
  • OpenFalcon:小米开源的面向互联网企业的监控产品
  • Prometheus:Prometheus是一套开源的监控&报警&时间序列数据库的组合

监控组件评判标准:

  • 监控粒度、监控指标完整度、监控数据实时性
  • 面向的监控对象、监控对象是否可扩展、监控项是否可扩展
  • 数据的采集方式、存储方式、展示方式、报警方式

Zabbix架构图:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

OpenFalcon架构图:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

Prometheus架构图:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

Zabbix、OpenFalcon和Prometheus之间的对比:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana


OpenFalcon各个组件介绍

OpenFalcon功能:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

OpenFalcon重点组件:

  • Agent:用于自发现的采集需监控机器的各种数据和指标
  • Transfer:接收客户端的数据,做一些数据规整检查之后转发到多个处理端,转发过程中通过hash进行分片
  • Judge:接收Transfer的数据,进行报警判断
  • Graph:接收Transfer发送的数据,进行数据的存储和后续图表绘制
  • Alarm:Judge进行告 警判断之后,将告警请求放到redis,Alarm从redis中获取告警指标,执行报警
  • HeartBeat Server&Portal:心跳服务器,Agent从HBS获取监控策略Judge从HBS获取报警策略

OpenFalcon架构优势:

  • 中间节点Transfer进行快速转发和容错
  • 一致性Hash进行分片,提高集群吞吐量
  • 通过队列做缓冲,减少服务的压力,如报警的Redis队列
  • 单独的策略检索服务,提供高效的策略检索
  • RRD存储方案,对于画图和分析数据分开存储,保证图表绘制速度
  • 报警事件按照优先级进行队列分配并执行报警

OpenFalcon单机部署

官方文档:

环境准备

安装redis:

yum install -y redis

安装mysql

yum install -y mysql-server

安装git:

yum install -y git

安装Golang环境:

[root@hadoop ~]# cd /usr/local/src
[root@hadoop /usr/local/src]# wget https://studygolang.com/dl/golang/go1.15.5.linux-amd64.tar.gz
[root@hadoop /usr/local/src]# tar -zxvf go1.15.5.linux-amd64.tar.gz -C /usr/local
[root@hadoop /usr/local/src]# vim /etc/profile
export GROOT=/usr/local/go/
export GOPATH=/usr/local/go_project
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN:$GROOT/bin
[root@hadoop /usr/local/src]# source /etc/profile
[root@hadoop /usr/local/src]# go version
go version go1.15.5 linux/amd64
[root@hadoop /usr/local/src]# 

编译安装

安装编译工具:

[root@hadoop ~]# yum install -y centos-release-scl scl-utils-build
[root@hadoop ~]# yum install -y devtoolset-9-toolchain
[root@hadoop ~]# echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
[root@hadoop ~]# source /etc/profile

拉取open-falcon的源码:

[root@hadoop ~]# mkdir -p $GOPATH/src/github.com/open-falcon
[root@hadoop /usr/local/go_project/src/github.com/open-falcon]# git clone https://github.com/open-falcon/falcon-plus.git

初始化mysql表结构:

[root@hadoop /usr/local/go_project/src/github.com/open-falcon]# mysql -h 192.168.1.11 -u root --password="123456a." < falcon-plus/scripts/mysql/db_schema/1_uic-db-schema.sql
[root@hadoop /usr/local/go_project/src/github.com/open-falcon]# mysql -h 192.168.1.11 -u root --password="123456a." < falcon-plus/scripts/mysql/db_schema/2_portal-db-schema.sql
[root@hadoop /usr/local/go_project/src/github.com/open-falcon]# mysql -h 192.168.1.11 -u root --password="123456a." < falcon-plus/scripts/mysql/db_schema/3_dashboard-db-schema.sql
[root@hadoop /usr/local/go_project/src/github.com/open-falcon]# mysql -h 192.168.1.11 -u root --password="123456a." < falcon-plus/scripts/mysql/db_schema/4_graph-db-schema.sql
[root@hadoop /usr/local/go_project/src/github.com/open-falcon]# mysql -h 192.168.1.11 -u root --password="123456a." < falcon-plus/scripts/mysql/db_schema/5_alarms-db-schema.sql

进行编译打包,步骤如下:

[root@hadoop /usr/local/go_project/src/github.com/open-falcon]# cd falcon-plus/
[root@hadoop /usr/local/go_project/src/github.com/open-falcon/falcon-plus]# make all
[root@hadoop /usr/local/go_project/src/github.com/open-falcon/falcon-plus]# make agent
[root@hadoop /usr/local/go_project/src/github.com/open-falcon/falcon-plus]# make pack
[root@hadoop /usr/local/go_project/src/github.com/open-falcon/falcon-plus]# ls |grep tar
open-falcon-v0.3.x.tar.gz
[root@hadoop /usr/local/go_project/src/github.com/open-falcon/falcon-plus]# 

将压缩包解压到合适的目录下:

[root@hadoop /usr/local/go_project/src/github.com/open-falcon/falcon-plus]# mkdir /usr/local/open-falcon
[root@hadoop /usr/local/go_project/src/github.com/open-falcon/falcon-plus]# tar -zxvf open-falcon-v0.3.x.tar.gz -C /usr/local/open-falcon
[root@hadoop /usr/local/go_project/src/github.com/open-falcon/falcon-plus]# cd /usr/local/open-falcon/
[root@hadoop /usr/local/open-falcon]# ls
agent  aggregator  alarm  api  gateway  graph  hbs  judge  nodata  open-falcon  plugin  public  transfer
[root@hadoop /usr/local/open-falcon]# 

修改配置

由于Redis和MySQL部署在其他机器上,所以需要修改一下这两个组件的连接信息。编辑open-falcon api模块的配置文件:

[root@hadoop /usr/local/open-falcon]# vim api/config/cfg.json

主要修改连接MySQL数据库相关配置:

{
        "log_level": "debug",
        "db": {
                "falcon_portal": "root:123456a.@tcp(192.168.1.11:3306)/falcon_portal?charset=utf8&parseTime=True&loc=Local&allowNativePasswords=true",
                "graph": "root:123456a.@tcp(192.168.1.11:3306)/graph?charset=utf8&parseTime=True&loc=Local&allowNativePasswords=true",
                "uic": "root:123456a.@tcp(192.168.1.11:3306)/uic?charset=utf8&parseTime=True&loc=Local&allowNativePasswords=true",
                "dashboard": "root:123456a.@tcp(192.168.1.11:3306)/dashboard?charset=utf8&parseTime=True&loc=Local&allowNativePasswords=true",
                "alarms": "root:123456a.@tcp(192.168.1.11:3306)/alarms?charset=utf8&parseTime=True&loc=Local&allowNativePasswords=true",
                "db_bug": true
        },
        "graphs": {
                "cluster": {
                        "graph-00": "127.0.0.1:6070"
                },
                "max_conns": 100,
                "max_idle": 100,
                "conn_timeout": 1000,
                "call_timeout": 5000,
                "numberOfReplicas": 500
        },
        "metric_list_file": "./api/data/metric",
        "web_port": "0.0.0.0:8080",
        "access_control": true,
        "signup_disable": false,
        "salt": "",
        "skip_auth": false,
        "default_token": "default-token-used-in-server-side",
        "gen_doc": false,
        "gen_doc_path": "doc/module.html"
}

修改hbs连接MySQL数据库的相关配置:

[root@hadoop /usr/local/open-falcon]# vim hbs/config/cfg.json
{
    "debug": true,
    "database": "root:123456a.@tcp(192.168.1.11:3306)/falcon_portal?loc=Local&parseTime=true&allowNativePasswords=true",
    "hosts": "",
    "maxConns": 20,
    "maxIdle": 15,
    "listen": ":6030",
    "trustable": [""],
    "http": {
        "enabled": true,
        "listen": "0.0.0.0:6031"
    }
}

修改aggregator连接MySQL数据库的相关配置:

[root@hadoop /usr/local/open-falcon]# vim aggregator/config/cfg.json
{
    "debug": true,
    "http": {
        "enabled": true,
        "listen": "0.0.0.0:6055"
    },
    "database": {
        "addr": "root:123456a.@tcp(192.168.1.11:3306)/falcon_portal?loc=Local&parseTime=true&allowNativePasswords=true",
        "idle": 10,
        "ids": [1, -1],
        "interval": 55
    },
    "api": {
        "connect_timeout": 500,
        "request_timeout": 2000,
        "plus_api": "http://127.0.0.1:8080",
        "plus_api_token": "default-token-used-in-server-side",
        "push_api": "http://127.0.0.1:1988/v1/push"
    }
}

修改alarm连接MySQL数据库和Redis的相关配置:

[root@hadoop /usr/local/open-falcon]# vim alarm/config/cfg.json
...
    "redis": {
        "addr": "192.168.243.163:6379",

    ...

    "falcon_portal": {
        "addr": "root:123456a.@tcp(192.168.1.11:3306)/alarms?charset=utf8&loc=Local&allowNativePasswords=true",
        "idle": 10,
        "max": 100
    },
...

修改judge连接Redis的相关配置:

[root@hadoop /usr/local/open-falcon]# vim judge/config/cfg.json
...
    "alarm": {
        "enabled": true,
        "minInterval": 300,
        "queuePattern": "event:p%v",
        "redis": {
            "dsn": "192.168.243.163:6379",
            "maxIdle": 5,
            "connTimeout": 5000,
            "readTimeout": 5000,
            "writeTimeout": 5000
        }
    }
...

修改graph连接MySQL数据库的相关配置:

[root@hadoop /usr/local/open-falcon]# vim graph/config/cfg.json
...
    "db": {
        "dsn": "root:123456a.@tcp(192.168.1.11:3306)/graph?loc=Local&parseTime=true&allowNativePasswords=true",
        "maxIdle": 4
    },
...

修改nodata连接MySQL数据库的相关配置:

[root@hadoop /usr/local/open-falcon]# vim nodata/config/cfg.json
...
    "config": {
        "enabled": true,
        "dsn": "root:123456a.@tcp(192.168.1.11:3306)/falcon_portal?loc=Local&parseTime=true&wait_timeout=604800&allowNativePasswords=true",
        "maxIdle": 4
    },
...

启动open-falcon

启动命令如下:

[root@hadoop /usr/local/open-falcon]# ./open-falcon start
[falcon-graph] 6787
[falcon-hbs] 6798
[falcon-judge] 6809
[falcon-transfer] 6818
[falcon-nodata] 6827
[falcon-aggregator] 6835
[falcon-agent] 6845
[falcon-gateway] 6855
[falcon-api] 6864
[falcon-alarm] 6875
[root@hadoop /usr/local/open-falcon]# 

检查各个组件的状态:

[root@hadoop /usr/local/open-falcon]# ./open-falcon check
        falcon-graph         UP            6787 
          falcon-hbs         UP            6798 
        falcon-judge         UP            6809 
     falcon-transfer         UP            6818 
       falcon-nodata         UP            6827 
   falcon-aggregator         UP            6835 
        falcon-agent         UP            6845 
      falcon-gateway         UP            6855 
          falcon-api         UP            6864 
        falcon-alarm         UP            6875 
[root@hadoop /usr/local/open-falcon]# 

使用浏览器测试下能否访问到Api组件:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

部署Dashboard

dashboard需要单独部署,不包含在源码包中。dashboard是面向用户的查询界面。在这里,用户可以看到push到graph中的所有数据,并查看其趋势图。

官方文档:

Dashboard是个Python的项目。安装&部署Dashboard时,需要安装一些依赖库。依赖库安装,步骤如下,

[root@hadoop ~]# yum install -y python-virtualenv python-devel openldap-devel mysql-devel
[root@hadoop ~]# yum group install "Development tools"

拉取dashboard的源码:

[root@hadoop /usr/local/open-falcon]# git clone https://github.com/open-falcon/dashboard.git

创建虚拟环境并安装依赖:

[root@hadoop /usr/local/open-falcon]# cd dashboard/
[root@hadoop /usr/local/open-falcon/dashboard]# virtualenv ./env
[root@hadoop /usr/local/open-falcon/dashboard]# ./env/bin/pip install -r pip_requirements.txt

修改配置文件,主要是修改MySQL数据库的连接配置:

[root@hadoop /usr/local/open-falcon/dashboard]# vim rrd/config.py 
# Falcon+ API
API_ADDR = os.environ.get("API_ADDR","http://127.0.0.1:8080/api/v1")
API_USER = os.environ.get("API_USER","admin")
API_PASS = os.environ.get("API_PASS","password")

# portal database
# TODO: read from api instead of db
PORTAL_DB_HOST = os.environ.get("PORTAL_DB_HOST","192.168.1.11")
PORTAL_DB_PORT = int(os.environ.get("PORTAL_DB_PORT",3306))
PORTAL_DB_USER = os.environ.get("PORTAL_DB_USER","root")
PORTAL_DB_PASS = os.environ.get("PORTAL_DB_PASS","123456a.")
PORTAL_DB_NAME = os.environ.get("PORTAL_DB_NAME","falcon_portal")

# alarm database
# TODO: read from api instead of db
ALARM_DB_HOST = os.environ.get("ALARM_DB_HOST","192.168.1.11")
ALARM_DB_PORT = int(os.environ.get("ALARM_DB_PORT",3306))
ALARM_DB_USER = os.environ.get("ALARM_DB_USER","root")
ALARM_DB_PASS = os.environ.get("ALARM_DB_PASS","123456a.")
ALARM_DB_NAME = os.environ.get("ALARM_DB_NAME","alarms")

启动dashboard:

[root@hadoop /usr/local/open-falcon/dashboard]# ./control start
falcon-dashboard started..., pid=8026
[root@hadoop /usr/local/open-falcon/dashboard]# 

启动成功后使用浏览器访问8081端口,Falcon没有提供默认的账户密码,需要自行注册:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

注册完成后,进行登录,然后点击上方菜单栏中的“Dashboard”进入到如下界面:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

勾选机器可以看到该机器的基础监控指标:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

点击指标可以进入到图表页面:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

右上角可以选择一些查询条件:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana


OpenFalcon基本使用

官方文档:

OpenFalcon的告警目标是针对用户组的,用户组是一组用户的集合,报警时对用户组进行报警。用户可以在 Welcome admin -> Profile 中设置邮箱信息:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

在 Welcome admin -> Teams 中点击 Add 添加用户组:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

添加成功:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

OpenFalcon可以针对机器组进行监控,机器组是一组机器的集合,用于对机器进行批量配置。例如,Zookeeper节点可以组成一个机器组,DataNode节点也可以组成一个机器组。我们可以把提供相同服务的节点划分到一个机器组里对其进行监控,就像是分类。在 HostGroups 页面可以添加机器组:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

这里随意添加了两个机器组:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

点击机器组的 hosts 配置该机器组的 host 列表:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

在 Templates 页面我们可以添加报警模板,模板可以包含多个报警策略,方便对机器进行应用,模板也可以被多个机器进行复用。如下:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

为该模板添加策略:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

配置告警策略触发时,给哪些用户组发送告警信息:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

为 ser.agent 这个机器组配置告警模板 HostGroups -> ser.agent -> templates ,如下:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

OpenFalcon还提供了其他的告警模式,例如Expressions,即表达式,是单个的策略,可以灵活应用,不需要绑定机器组,直接配置就可以使用。表达式在 Expressions 页面进行添加:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

除此之外还有 NoData,用于配置Agent中断上报之后的触发策略:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

使用Aggregator可以对整个集群进行监控,不只关注于单个机器,在 HostGroups -> aggregator 中配置:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana


OpenFalcon邮件网关安装

为了实现邮件告警,我们还需要安装一下OpenFalcon的邮件网关。步骤如下:

[root@hadoop ~]# wget https://dl.cactifans.com/open-falcon/falcon-mail-provider.tar.gz
[root@hadoop ~]# mkdir /usr/local/falcon-mail-provider
[root@hadoop ~]# tar zxvf falcon-mail-provider.tar.gz -C /usr/local/falcon-mail-provider
[root@hadoop ~]# cd /usr/local/falcon-mail-provider/
[root@hadoop /usr/local/falcon-mail-provider]# ls
cfg.json  control  falcon-mail-provider
[root@hadoop /usr/local/falcon-mail-provider]# 

修改配置,配置一下邮箱服务器,可以使用QQ或163的免费邮箱服务:

[root@hadoop /usr/local/falcon-mail-provider]# vim cfg.json
{
    "debug": true,
    "http": {
        "listen": "0.0.0.0:4000",
        "token": ""
    },
    "smtp": {
        "addr": "smtp.163.com:25",
        "username": "[email protected]",
        "password": "VMWFExxxxxxxWRBKE",
        "from": "[email protected]",
        "tls":false,
        "anonymous":false,
        "skipVerify":true
    }
}

配置完成后,启动falcon-mail-provider服务:

[root@hadoop /usr/local/falcon-mail-provider]# ./control start
falcon-mail-provider started..., pid=8382
[root@hadoop /usr/local/falcon-mail-provider]# 

启动成功后,手动调用接口测试一下能否正常发送邮件:

[root@hadoop /usr/local/falcon-mail-provider]# curl http://127.0.0.1:4000/sender/mail -d "[email protected]&subject=falcon_test&content=test for falcon mail provider"
success
[root@hadoop /usr/local/falcon-mail-provider]# 

测试成功,正常收到了邮件:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

把发送邮件的接口地址配置到alarm组件中。如下:

[root@hadoop /usr/local/open-falcon]# vim alarm/config/cfg.json 
...
    "api": {
        "im": "http://127.0.0.1:10086/wechat",
        "sms": "http://127.0.0.1:10086/sms",
        "mail": "http://127.0.0.1:4000/sender/mail",
        "dashboard": "http://127.0.0.1:8081",
        "plus_api":"http://127.0.0.1:8080",
        "plus_api_token": "default-token-used-in-server-side"
    },
...

然后重启alarm组件:

[root@hadoop /usr/local/open-falcon]# ./open-falcon stop alarm
[falcon-alarm] down
[root@hadoop /usr/local/open-falcon]# ./open-falcon start alarm
[falcon-alarm] 8445
[root@hadoop /usr/local/open-falcon]# ./open-falcon check alarm
        falcon-alarm         UP            8445 
[root@hadoop /usr/local/open-falcon]# 

实现OpenFalcon对Hadoop服务状态报警

OpenFalcon的报警函数

  • all(#3):最新的3个点都满足阈值条件则报警
  • max(#3):对于最新的3个点,其最大值满足阈值条件则报警
  • min(#3):对于最新的3个点,其最小值满足阈值条件则报警
  • sum(#3):对于最新的3个点,其和满足阈值条件则报警
  • avg(#3):对于最新的3个点,其平均值满足阈值条件则报警
  • diff(#3):拿最新push上来的点(被减数),与历史最新的3个点(3个减数)相减,得到3个差,只要有一个差满足阈值条件则报警
  • pdiff(#3):拿最新push上来的点,与历史最新的3个点相减,得到3个差,再将3个差值分别除以减数,得到3个商值,只要有一个商值满足阈值则报警

OpenFalcon进程端口监控的metric和tag:

  • net.port.listen/port=xxxx
  • proc.num/name=xxxx
  • proc.num/cmdline=xxxx

到 Templates 页面添加一个 hadoop.monitor 模板。配置端口监控告警策略:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

然后到 HostGroups -> template 绑定模板:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

到操作系统上停止Hadoop HDFS服务:

[root@hadoop ~]# stop-dfs.sh 

等待一会后,收到告警邮件如下:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

恢复Hadoop HDFS服务:

[root@hadoop ~]# start-dfs.sh 

等待一会后,收到服务恢复邮件如下:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana


自定义Plugin开发

OpenFalcon支持自定义Plugin,我们可以开发自己的Plugin来实现个性化的监控。首先,我们来认识下OpenFalcon的数据模型:

{
    "metric": "net.port.listen",
    "endpoint": "open-falcon-host",
    "tags": "port=3306",
    "value": 1,
    "timestamp": 1581430728,
    "counterType": "GAUGE",
    "step": 60
}
  • metric:最核心的字段,监控指标名称,代表这个采集项具体度量的是什么
  • endpoint:标明Metric的主体(属主),比如metric是cpu_idle,那么Endpoint就表示这是哪台机器的cpu_idle
  • timestamp:表示上报该数据时的unix时间戳,注意是整数,代表的是秒
  • value:代表该metric在当前时间点的值,float64
  • step:表示该数据采集项的上报周期,这对于后续的配置监控策略很重要,必须明确指定
  • tags:监控数据的属性标签,一组逗号分割的键值对,对metric进一步描述和细化,比如service=xbox
  • counterType:是Open Falcon定义的数据类型,取值只能是COUNTER或者GAUGE二选一
    • GAUGE:即用户上传什么样的值,就原封不动的存储
    • COUNTER:指标在存储和展现的时候,会被计算为speed,即(当前值 - 上次值)/ 时间间隔

接下来演示一下自定义Plugin脚本实现对Presto的监控,这里使用Python2.7作为实现语言。具体代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pyhive import presto
import socket
import time
import json

# 存储监控信息
metric_list = []

# key是监控的metric,value是对presto中jmx的查询sql
metric_types = {
  "HeartbeatFailureDetector": "select activecount,failedcount,totalcount from jmx.current.\"com.facebook.presto.failureDetector:name=HeartbeatFailureDetector\"",
  "QueryManager": "select runningqueries,\"failedqueries.fiveminute.count\" as failedqueriesfiveminute,\"internalfailures.fiveminute.count\" as internalfailuresfiveminute,\"externalfailures.fiveminute.count\" as externalfailuresfiveminute,\"usererrorfailures.fiveminute.count\" as usererrorfailuresfiveminute,\"startedqueries.fiveminute.count\" as startedqueriesfiveminute,\"executiontime.fiveminutes.p50\" as executiontimefiveminute from jmx.current.\"com.facebook.presto.execution:name=QueryManager\"",
  "GeneralFreeMemory": "select FreeDistributedBytes,blockednodes,nodes from jmx.current.\"com.facebook.presto.memory:name=general,type=clustermemorypool\""
}

# 获取presto连接
cursor = presto.connect(host='192.168.243.161', port=9090).cursor()

def check_state(metric_info):
  global cursor
  # 执行查询
  cursor.execute(metric_info[1])
  # 获取查询结果,并组装成metric_list
  columns = cursor.description
  for row in cursor:
    for (index, column) in enumerate(row):
      # 按OpenFalcon的数据模型进行组装
      metric_list.append({
        "metric": "presto.{0}".format(metric_info[0]),
        "endpoint": socket.gethostname(),
        "timestamp": int(time.time()),
        "step": 60,
        "counterType": "GAUGE",
        "tags": "type={0}".format(columns[index][0]),
        "value": row[index]
      })

if __name__ == '__main__':
  # 对metric_types中每个k-v都执行一次check_state函数
  map(check_state, metric_types.items())
  print(json.dumps(metric_list))

安装依赖:

[root@hadoop ~]# yum -y install epel-release
[root@hadoop ~]# yum -y install python-pip
[root@hadoop ~]# pip install pyhive[presto]

配置开启plugin:

[root@hadoop /usr/local/open-falcon]# vim agent/config/cfg.json
...
    "plugin": {
        "enabled": true,
        "dir": "./plugin",
        "git": "https://github.com/open-falcon/plugin.git",
        "logs": "./logs"
    },
...

添加我们编写的脚本并赋予可执行权限:

[root@hadoop /usr/local/open-falcon]# mkdir agent/plugin/presto
[root@hadoop /usr/local/open-falcon]# cp /root/presto_monitor.py agent/plugin/presto/60_presto.py
[root@hadoop /usr/local/open-falcon]# chmod a+x agent/plugin/presto/60_presto.py
  • Tips:这里脚本文件名的前缀代表执行步长,60就代表每60秒执行一次该脚本

然后到Dashboard上添加Plugin,HostGroups -> plugins,绑定Plugin的目录,如下:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

重启agent组件:

[root@hadoop /usr/local/open-falcon]# ./open-falcon stop agent
[falcon-agent] down
[root@hadoop /usr/local/open-falcon]# ./open-falcon start agent
[falcon-agent] 12815
[root@hadoop /usr/local/open-falcon]# ./open-falcon check agent
        falcon-agent         UP           12815 
[root@hadoop /usr/local/open-falcon]# 

到Dashboard上查看是否能够搜索到Presto的监控指标:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana


Push数据脚本开发

Push数据脚本用于我们的应用需要主动将监控数据推给OpenFalcon的场景,官方文档如下:

使用Python2.7编写的自定义push数据到open-falcon的脚本示例代码:

#!/usr/bin/env python
#!-*- coding:utf8 -*-
import requests
import time
import json

ts = int(time.time())
payload = [
    {
        "endpoint": "test-endpoint",
        "metric": "test-metric",
        "timestamp": ts,
        "step": 60,
        "value": 1,
        "counterType": "GAUGE",
        "tags": "service=push_metric",
    },

    {
        "endpoint": "test-endpoint",
        "metric": "test-metric2",
        "timestamp": ts,
        "step": 60,
        "value": 2,
        "counterType": "GAUGE",
        "tags": "service=push_metric",
    },
]

r = requests.post("http://127.0.0.1:1988/v1/push", data=json.dumps(payload))

print r.text

执行该脚本:

[root@hadoop ~]# python push_metric_test.py 
success
[root@hadoop ~]# 

到Dashboard上查看数据:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana


Grafana安装并使用OpenFalcon数据源

Grafana官方下载地址:

Grafana整合OpenFalcon数据源,需要用到grafana-openfalcon-datasource这个plugin,但目前该plugin只支持Grafana v4.2 ~ Grafana v5.4。所以这里安装5.4版本的Grafana:

[root@hadoop ~]# wget https://dl.grafana.com/oss/release/grafana-5.4.0.linux-amd64.tar.gz
[root@hadoop ~]# tar -zxvf grafana-5.4.0.linux-amd64.tar.gz -C /usr/local

下载open-falcon的plugin:

[root@hadoop ~]# cd /usr/local/grafana-5.4.0
[root@hadoop /usr/local/grafana-5.4.0]# mkdir -p data/plugins
[root@hadoop /usr/local/grafana-5.4.0]# cd data/plugins/
[root@hadoop /usr/local/grafana-5.4.0/data/plugins]# git clone https://github.com/open-falcon/grafana-openfalcon-datasource

启动Grafana Server:

[root@hadoop /usr/local/grafana-5.4.0]# bin/grafana-server

浏览器访问3000端口,Grafana 默认的用户名和密码均为admin,登录并重置密码后进入到首页:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

进入Plugins页面:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

在Plugins界面可以看到对应的OpenFalcon DataSource,如图所示:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

然后到 Data Sources 页面点击 “Add data source” 添加配置我们的open-falcon即可(注意端口配置):
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana


Grafana监控大盘配置

添加Dashboard:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

选择添加图表:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

编辑图表:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

设置Metrics:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

保存图表:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

我们还可以根据需求再添加其他图表,最后大致的效果如下:
大数据平台建设 —— 监控预警组件之OpenFalcon + Grafana

猜你喜欢

转载自blog.51cto.com/zero01/2551650