美文网首页个人学习Linux
大数据平台建设 —— 监控预警组件之OpenFalcon + G

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

作者: 端碗吹水 | 来源:发表于2020-11-17 21:01 被阅读0次

    监控系统介绍

    集群监控&平台监控:

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

    监控分层:

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

    常用开源监控项目对比

    常用监控组件:

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

    监控组件评判标准:

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

    Zabbix架构图:


    image.png

    OpenFalcon架构图:


    image.png

    Prometheus架构图:


    image.png

    Zabbix、OpenFalcon和Prometheus之间的对比:


    image.png

    OpenFalcon各个组件介绍

    OpenFalcon功能:


    image.png

    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组件:


    image.png

    部署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没有提供默认的账户密码,需要自行注册:


    image.png
    image.png

    注册完成后,进行登录,然后点击上方菜单栏中的“Dashboard”进入到如下界面:


    image.png

    勾选机器可以看到该机器的基础监控指标:


    image.png

    点击指标可以进入到图表页面:


    image.png

    右上角可以选择一些查询条件:


    image.png

    OpenFalcon基本使用

    官方文档:

    OpenFalcon的告警目标是针对用户组的,用户组是一组用户的集合,报警时对用户组进行报警。用户可以在 Welcome admin -> Profile 中设置邮箱信息:


    image.png

    在 Welcome admin -> Teams 中点击 Add 添加用户组:


    image.png

    添加成功:


    image.png

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


    image.png

    这里随意添加了两个机器组:


    image.png

    点击机器组的 hosts 配置该机器组的 host 列表:


    image.png

    在 Templates 页面我们可以添加报警模板,模板可以包含多个报警策略,方便对机器进行应用,模板也可以被多个机器进行复用。如下:


    image.png

    为该模板添加策略:


    image.png

    配置告警策略触发时,给哪些用户组发送告警信息:


    image.png

    为 ser.agent 这个机器组配置告警模板 HostGroups -> ser.agent -> templates ,如下:


    image.png

    OpenFalcon还提供了其他的告警模式,例如Expressions,即表达式,是单个的策略,可以灵活应用,不需要绑定机器组,直接配置就可以使用。表达式在 Expressions 页面进行添加:


    image.png

    除此之外还有 NoData,用于配置Agent中断上报之后的触发策略:


    image.png

    使用Aggregator可以对整个集群进行监控,不只关注于单个机器,在 HostGroups -> aggregator 中配置:


    image.png

    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": "xxxxx@163.com",
            "password": "VMWFExxxxxxxWRBKE",
            "from": "xxxx@163.com",
            "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 "tos=xxxxx@163.com&subject=falcon_test&content=test for falcon mail provider"
    success
    [root@hadoop /usr/local/falcon-mail-provider]# 
    

    测试成功,正常收到了邮件:


    image.png

    把发送邮件的接口地址配置到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 模板。配置端口监控告警策略:


    image.png

    然后到 HostGroups -> template 绑定模板:


    image.png

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

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

    等待一会后,收到告警邮件如下:


    image.png

    恢复Hadoop HDFS服务:

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

    等待一会后,收到服务恢复邮件如下:


    image.png

    自定义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的目录,如下:


    image.png

    重启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的监控指标:


    image.png

    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上查看数据:


    image.png

    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,登录并重置密码后进入到首页:


    image.png

    进入Plugins页面:


    image.png

    在Plugins界面可以看到对应的OpenFalcon DataSource,如图所示:


    image.png

    然后到 Data Sources 页面点击 “Add data source” 添加配置我们的open-falcon即可(注意端口配置):


    image.png

    Grafana监控大盘配置

    添加Dashboard:


    image.png

    选择添加图表:


    image.png

    编辑图表:


    image.png

    设置Metrics:


    image.png

    保存图表:


    image.png

    我们还可以根据需求再添加其他图表,最后大致的效果如下:


    image.png

    相关文章

      网友评论

        本文标题:大数据平台建设 —— 监控预警组件之OpenFalcon + G

        本文链接:https://www.haomeiwen.com/subject/roufiktx.html