2019-02-22

其实与终归 · · 965 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1 Open-falcon简介

opne-falcon是小米公司推出的一款开源的企业级监控产品,下面对它做些简单的介绍。

1.1 工程结构

[图片上传失败...(image-11e30b-1550819626391)]

每台服务器,都有安装falcon-agent,falcon-agent是一个golang开发的daemon程序,用于自发现的采集单机的各种数据和指标,这些指标包括不限于以下几个方面,共计200多项指标。

  • CPU相关
  • 磁盘相关
  • IO
  • Load
  • 内存相关
  • 网络相关
  • 端口存活、进程存活
  • ntp offset(插件)
  • 某个进程资源消耗(插件)
  • netstat、ss 等相关统计项采集
  • 机器内核配置参数

只要安装了falcon-agent的机器,就会自动开始采集各项指标,主动上报,不需要用户在server做任何配置(这和zabbix有很大的不同),这样做的好处,就是用户维护方便,覆盖率高。当然这样做也会server端造成较大的压力,不过open-falcon的服务端组件单机性能足够高,同时都可以水平扩展,所以自动多采集足够多的数据,反而是一件好事情,对于SRE和DEV来讲,事后追查问题,不再是难题。

另外,falcon-agent提供了一个proxy-gateway,用户可以方便的通过http接口,push数据到本机的gateway,gateway会帮忙高效率的转发到server端。

falcon-agent,可以在我们的github上找到 : https://github.com/open-falcon/falcon-plus

1.2 组件介绍

graph
graph是存储绘图数据的组件。graph组件 接收transfer组件推送上来的监控数据,同时处理api组件的查询请求、返回绘图数据。

hbs(Heartbeat Server)
心跳服务器,公司所有agent都会连到HBS,每分钟发一次心跳请求。

judge
Judge用于告警判断,agent将数据push给Transfer,Transfer不但会转发给Graph组件来绘图,还会转发给Judge用于判断是否触发告警。

transfer
transfer是数据转发服务。它接收agent上报的数据,然后按照哈希规则进行数据分片、并将分片后的数据分别push给graph&judge等组件。

nodata
nodata用于检测监控数据的上报异常。nodata和实时报警judge模块协同工作,过程为: 配置了nodata的采集项超时未上报数据,nodata生成一条默认的模拟数据;用户配置相应的报警策略,收到mock数据就产生报警。采集项上报异常检测,作为judge模块的一个必要补充,能够使judge的实时报警功能更加可靠、完善。

aggregator
集群聚合模块。聚合某集群下的所有机器的某个指标的值,提供一种集群视角的监控体验。

agent
agent用于采集机器负载监控指标,比如cpu.idle、load.1min、disk.io.util等等,每隔60秒push给Transfer。agent与Transfer建立了长连接,数据发送速度比较快,agent提供了一个http接口/v1/push用于接收用户手工push的一些数据,然后通过长连接迅速转发给Transfer。

api
api组件,提供统一的restAPI操作接口。比如:api组件接收查询请求,根据一致性哈希算法去相应的graph实例查询不同metric的数据,然后汇总拿到的数据,最后统一返回给用户。

alarm
alarm模块是处理报警event的,judge产生的报警event写入redis,alarm从redis读取处理,并进行不同渠道的发送。

task
task是监控系统一个必要的辅助模块。定时任务,实现了如下几个功能:

  • index更新。包括图表索引的全量更新 和 垃圾索引清理。
  • falcon服务组件的自身状态数据采集。定时任务了采集了transfer、graph、task这三个服务的内部状态数据。
  • falcon自检控任务。

1.3 特性

  • 强大灵活的数据采集:自动发现,支持falcon-agent、snmp、支持用户主动push、用户自定义插件支持、opentsdb data model like(timestamp、endpoint、metric、key-value tags)
  • 水平扩展能力:支持每个周期上亿次的数据采集、告警判定、历史数据存储和查询
  • 高效率的告警策略管理:高效的portal、支持策略模板、模板继承和覆盖、多种告警方式、支持callback调用
  • 人性化的告警设置:最大告警次数、告警级别、告警恢复通知、告警暂停、不同时段不同阈值、支持维护周期
  • 高效率的graph组件:单机支撑200万metric的上报、归档、存储(周期为1分钟)
  • 高效的历史数据query组件:采用rrdtool的数据归档策略,秒级返回上百个metric一年的历史数据
  • dashboard:多维度的数据展示,用户自定义Screen
  • 高可用:整个系统无核心单点,易运维,易部署,可水平扩展
  • 开发语言: 整个系统的后端,全部golang编写,portal和dashboard使用python编写。

2 环境搭建

open-falcon需要运行在linux上,目前没有发现基于windows的版本。

下面主要的内容是本地环境搭建,vbox+Centos7。

open-falcon分为前端和后端,后端依赖软件的安装Centos与Ubuntu差异不大,这里就只说centos;前端依赖的软件安装稍有不同,下面会提供centos与ubuntu两种命令。

2.1 环境准备

本地基础环境

  • VirtualBox 5.1.30 r118389;
  • CentOS-7-x86_64-Minimal-1804;
  • Git >= 1.7.5
  • GO >= 1.6

Centos7

虚拟机的安装这里就不再赘述,具体的网络配置可以参考:https://www.linuxidc.com/Linux/2017-01/139345.htm

设置代理及DNS配置

添加代理并生效

vi /etc/profile

# 粘贴下列代码
export http_proxy="http://xxx.xx.xx.xx:8080"
export https_proxy="https://xxx.xx.xx.xx:8080"
export ftp_proxy="ftp://xxx.xx.xx.xx:8080"
export no_proxy="xxx,xxx,xxx"

#生效配置文件
source /etc/profile

添加DNS配置并生效

#连接外网的网卡
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

#添加DNS配置
DNS1=xxx.xx.xx.xx
DNS2=xxx.xx.xx.xx

#重启网络,生效配置
service network restart

关闭防火墙

#临时关闭
systemctl stop firewalld
#禁止开机启动
systemctl disable firewalld

到这里虚拟机的安装及配置应该就完成了,可以测试一下,网络以及主机命令交互。默认的yum源速度还可以,这里就不再说如何改yum源了。

2.2 依赖软件

2.2.1 git

安装
yum install -y git

2.2.2 redis

安装
yum install -y redis
#检查服务是否启动
ps -ef|grep redis
#若未启动,启动服务
systemctl start redis.service
#root用户直接运行即可
service redis start

2.2.3 mysql

安装
yum install -y mysql-server

这里完成安装后建议使用默认密码,原因:方便

开启远程访问

mysql默认是关闭远程访问的,这里先开启。

#登录mysql,执行语句
grant all privileges on *.* to 'root' @'%' identified by '你的root用户密码';
#刷新权限
flush privileges;

2.2.4 golang

安装
yum install -y golang

#查看GO环境配置
go env

GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/jay/go" #默认是在当前用户目录下go文件下
GORACE=""
GOROOT="/usr/lib/golang" #GO安装目录
GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build101066216=/tmp/go-build -gno-record-gcc-switches"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"

2.2.5 python&其他软件安装(前端系统依赖)

执行以下命令,完成软件安装

centos:
yum install -y python-virtualenv
yum install -y python-devel
yum install -y openldap-devel
yum install -y mysql-devel
yum groupinstall "Development tools"

ubuntu:
apt-get install -y python-virtualenv
apt-get install -y slapd ldap-utils
apt-get install -y libmysqld-dev
apt-get install -y build-essential
apt-get install -y python-dev libldap2-dev libsasl2-dev libssl-dev

2.3 数据准备

2.3.1 源码包

clone官方github上的源码到本地,务必依以下结构创建目录。

mkdir -p $GOPATH/src/github.com/open-falcon
cd $GOPATH/src/github.com/open-falcon
git clone https://github.com/open-falcon/falcon-plus.git

若无法clone,可以下载zip包,解压后上传指定目录。当然了,如果你不想自己编译,官方也有编译好的二进制包,后面会说。

2.3.2 数据库

这里官方已提供完整的SQL语句,只需按顺序执行就可以,方式不限; 语句地址:https://github.com/open-falcon/falcon-plus/tree/master/scripts/mysql/db_schema 执行顺序:

 1_uic-db-schema.sql
 2_portal-db-schema.sql
 3_dashboard-db-schema.sql
 4_graph-db-schema.sql
 5_alarms-db-schema.sql

2.3.3 编译源码(可省略)

cd $GOPATH/src/github.com/open-falcon/falcon-plus/

# make all modules
make all

# make specified module
make agent

# pack all modules
make pack

执行make pack编译成功后,就可得到 open-falcon-vx.x.x.tar.gz

官方也提供了编译好的二进制包,下载即可。

3 启动

3.1 后端

3.1.2 创建目录并解压二进制包
#进入当前用户目录
cd ~

#编辑.bash_profile,在当前用户添加工作目录
vi .bash_profile

export FALCON_HOME=$HOME/work
export WORKSPACE=$FALCON_HOME/open-falcon

#创建工作目录
mkdir -p $WORKSPACE

#解压之前编译(下载)好的二进制包到工作目录
tar -xzvf open-falcon-vx.x.x.tar.gz -C $WORKSPACE

3.1.3 启动后端

启动全部模块

cd $WORKSPACE
./open-falcon start

检查启动状态

./open-falcon check

#成功状态示例
        falcon-graph         UP           14577 
          falcon-hbs         UP           14586 
        falcon-judge         UP           14594 
     falcon-transfer         UP           14600 
       falcon-nodata         UP           14606 
   falcon-aggregator         UP           14613 
        falcon-agent         UP           14621 
      falcon-gateway         UP           14628 
          falcon-api         UP           14634 
        falcon-alarm         UP           14648 

3.2 前端

下载前端源码至工作目录$WORKSPACE,若网络不给力,只有手动上传了。

cd $WORKSPACE
git clone https://github.com/open-falcon/dashboard.git

进入dashboard目录,启动前端系统。

cd dashboard
virtualenv ./env
./env/bin/pip install -r pip_requirements.txt -i https://pypi.douban.com/simple

#开发模式启动前端系统
./env/bin/python wsgi.py
#生产环境启动系统(这里可能出现权限问题,建议sudo执行)
bash control start
#生产环境停止系统
bash control stop
#生产环境查看日志
bash control tail

启动后,主机访问虚拟机ip:8081即可。

4 简单入门

4.1 查看监控数据

我们说agent只要部署到机器上,并且配置好了heartbeat和transfer就自动采集数据了,我们就可以去dashboard上面搜索监控数据查看了。dashboard是个web项目,浏览器访问之。左侧输入endpoint搜索,endpoint是什么?应该用什么搜索?对于agent采集的数据,endpoint都是机器名,去目标机器上执行hostname,看到的输出就是endpoint,拿着hostname去搜索。

搜索到了吧?嗯,选中前面的复选框,点击“查看counter列表”,可以列出隶属于这个endpoint的counter,counter是什么?counter=${metric}/sorted(${tags})

假如我们要查看cpu.busy,在counter搜索框中输入cpu并回车。看到cpu.busy了吧,点击,会看到一个新页面,图表中就是这个机器的cpu.busy的近一小时数据了,想看更长时间的?右上角有个小三角,展开菜单,可以选择更长的时间跨度

[图片上传失败...(image-189391-1550819626389)]


[图片上传失败...(image-4a374c-1550819626389)]

4.2 如何配置报警策略

上节我们已经了解到如何查看监控数据了,如果数据达到阈值,比如cpu.busy太大的时候,我们应该如何配置告警呢?

4.2.1 配置报警接收人

falcon的报警接收人不是一个具体的手机号,也不是一个具体的邮箱,因为手机号、邮箱都是容易发生变化的,如果变化了去修改所有相关配置那就太麻烦了。我们把用户的联系信息维护在一个叫 帐户/Profile 里,以后如果要修改手机号、邮箱,只要修改自己的帐户信息即可。报警接收人也不是单个的人,而是一个组(Teams),比如falcon这个系统的任何组件出问题了,都应该发报警给falcon的运维和开发人员,发给falcon这个团队,这样一来,新员工入职只要加入falcon这个Team即可;员工离职,只要从falcon这个Team删掉即可。

浏览器访问UIC,如果启用了LDAP,那就用LDAP账号登陆,如果没有启用,那就注册一个或者找管理员帮忙开通。创建一个Team,名称姑且叫falcon,把自己加进去,待会用来做测试。

首先修改帐户信息,保证邮箱和手机号正确 [图片上传失败...(image-29e354-1550819626389)]

然后添加报警组,添加成员 [图片上传失败...(image-41a467-1550819626389)]


[图片上传失败...(image-685ce6-1550819626389)]

4.2.2 创建HostGroup

比如我们要对falcon-judge这个组件做端口监控,那首先创建一个HostGroup,把所有部署了falcon-judge这个模块的机器都塞进去,以后要扩容或下线机器的时候直接从这个HostGroup增删机器即可,报警策略会自动生效、失效。咱们为这个HostGroup取名为:sa.dev.falcon.judge,这个名称有讲究,sa是我们部门,dev是我们组,falcon是项目名,judge是组件名,传达出了很多信息,这样命名比较容易管理,推荐大家这么做。

[图片上传失败...(image-e02370-1550819626389)]

在往组里加机器的时候如果报错,需要检查portal的数据库中host表,看里边是否有相关机器。那host表中的机器从哪里来呢?agent有个heartbeat(hbs)的配置,agent每分钟会发心跳给hbs,把自己的ip、hostname、agent version等信息告诉hbs,hbs负责写入host表。如果host表中没数据,需要检查这条链路是否通畅。

4.2.3 创建策略模板

portal最上面有个Templates链接,这就是策略模板管理的入口。我们进去之后创建一个模板,名称姑且也叫:sa.dev.falcon.judge.tpl,与HostGroup名称相同,在里边配置一个端口监控,通常进程监控有两种手段,一个是进程本身是否存活,一个是端口是否在监听,此处我们使用端口监控。

[图片上传失败...(image-e484f4-1550819626389)]

[图片上传失败...(image-696e8f-1550819626389)]

右上角那个加号按钮是用于增加策略的,一个模板中可以有多个策略,此处我们只添加了一个。下面可以配置报警接收人,此处填写的是falcon,这是之前在UIC中创建的Team。

4.2.4 将HostGroup与模板绑定

一个模板是可以绑定到多个HostGroup的,现在我们重新回到HostGroups页面,找到sa.dev.falcon.judge这个HostGroup,右侧有几个超链接,点击【templates】进入一个新页面,输入模板名称,绑定一下就行了。

[图片上传失败...(image-ebb279-1550819626389)]

[图片上传失败...(image-6b6b7e-1550819626389)]

4.2.5 以80端口为例完成一次告警

完成上面的步骤,相信已对HostGroup和Templates有了一个简单的了解,如果judge组件宕机,端口不再监听了,就会报警。不过大家不要为了测试报警效果,直接把judge组件给干掉了,因为judge本身就是负责判断报警的,把它干掉了,那就没法判断了...所以这里我们使用常见的80端口来完成一次告警处理。

安装&启动Apache服务(已有请忽略)
yum -y install httpd
#启动apache服务
service httpd start
#查看服务启动状态
service httpd status
#服务启动成功
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-06-12 14:16:22 CST; 8s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 1597 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─1597 /usr/sbin/httpd -DFOREGROUND
           ├─1598 /usr/sbin/httpd -DFOREGROUND
           ├─1599 /usr/sbin/httpd -DFOREGROUND
           ├─1600 /usr/sbin/httpd -DFOREGROUND
           ├─1601 /usr/sbin/httpd -DFOREGROUND
           └─1602 /usr/sbin/httpd -DFOREGROUND
...

这里启动以后可以通过ss -ln命令查看80端口是否已被监听。

ss -ln|grep LISTEN
#80端口已监听
tcp    LISTEN     0      128      :::80                   :::*  

修改策略模板

为了方便,这里就不修改名字了。

  1. 直接点击Template,找到刚才的sa.dev.falcon.judge.tpl模板,点击修改;
  2. 进入修改页面,找到策略列表,点击修改;
  3. 将targs一栏修改为:port=80,note一栏的提示信息可以改为:apache挂了,保存设置。 [图片上传中...(image-411877-1550819626388-1)]
查看80端口监听状态

现在回到Dashboard,查看net.port.listen/port=80是否已在列表中。 [图片上传失败...(image-5cd483-1550819626389)]

因为agent对于端口的监控只有两个值 1:监听中 0:未监听,所以表中可以看到一个关闭到启动的过程。 [图片上传失败...(image-184ef9-1550819626389)]

关闭Apache服务,触发告警

关闭服务器中的Apache服务

service httpd stop

现在继续80端口的监控信息,agent大概60s上报一次状态。 [图片上传失败...(image-fbeae5-1550819626389)]

打开Alarm-Dashboard,这里可以看到已触发的告警列表。 [图片上传失败...(image-f12db6-1550819626389)]

附录

常用配置文件注释

  1. agent配置,目录$WORKSPACE/agent/config/cfg.json
{
    "debug": true,  # 控制一些debug信息的输出,生产环境通常设置为false
    "hostname": "", # agent采集了数据发给transfer,endpoint就设置为了hostname,默认通过`hostname`获取,如果配置中配置了hostname,就用配置中的
    "ip": "", # agent与hbs心跳的时候会把自己的ip地址发给hbs,agent会自动探测本机ip,如果不想让agent自动探测,可以手工修改该配置
    "plugin": {
        "enabled": false, # 默认不开启插件机制
        "dir": "./plugin",  # 把放置插件脚本的git repo clone到这个目录
        "git": "https://github.com/open-falcon/plugin.git", # 放置插件脚本的git repo地址
        "logs": "./logs" # 插件执行的log,如果插件执行有问题,可以去这个目录看log
    },
    "heartbeat": {
        "enabled": true,  # 此处enabled要设置为true
        "addr": "127.0.0.1:6030", # hbs的地址,端口是hbs的rpc端口
        "interval": 60, # 心跳周期,单位是秒
        "timeout": 1000 # 连接hbs的超时时间,单位是毫秒
    },
    "transfer": {
        "enabled": true, 
        "addrs": [
            "127.0.0.1:18433"
        ],  # transfer的地址,端口是transfer的rpc端口, 可以支持写多个transfer的地址,agent会保证HA
        "interval": 60, # 采集周期,单位是秒,即agent一分钟采集一次数据发给transfer
        "timeout": 1000 # 连接transfer的超时时间,单位是毫秒
    },
    "http": {
        "enabled": true,  # 是否要监听http端口
        "listen": ":1988",
        "backdoor": false
    },
    "collector": {
        "ifacePrefix": ["eth", "em"], # 默认配置只会采集网卡名称前缀是eth、em的网卡流量,配置为空就会采集所有的,lo的也会采集。可以从/proc/net/dev看到各个网卡的流量信息
        "mountPoint": []
    },
    "default_tags": {
    },
    "ignore": {  # 默认采集了200多个metric,可以通过ignore设置为不采集
        "cpu.busy": true,
        "df.bytes.free": true,
        "df.bytes.total": true,
        "df.bytes.used": true,
        "df.bytes.used.percent": true,
        "df.inodes.total": true,
        "df.inodes.free": true,
        "df.inodes.used": true,
        "df.inodes.used.percent": true,
        "mem.memtotal": true,
        "mem.memused": true,
        "mem.memused.percent": true,
        "mem.memfree": true,
        "mem.swaptotal": true,
        "mem.swapused": true,
        "mem.swapfree": true
    }
}

  1. 内置的监控项,源码地址:[图片上传失败...(image-544858-1550819626388)]
package g

import (
  "time"
)

// changelog:
// 3.1.3: code refactor
// 3.1.4: bugfix ignore configuration
// 5.0.0: 支持通过配置控制是否开启/run接口;收集udp流量数据;du某个目录的大小
// 5.1.0: 同步插件的时候不再使用checksum机制
// 5.1.1: 修复往多个transfer发送数据的时候crash的问题
const (
  VERSION          = "5.1.1"
  COLLECT_INTERVAL = time.Second
  URL_CHECK_HEALTH = "url.check.health"
  NET_PORT_LISTEN  = "net.port.listen"   
  DU_BS            = "du.bs"
  PROC_NUM         = "proc.num"
)

这里列出的监控项,如果不在策略模板中配置,默认是不监控的。

可能遇到的问题

1.简单入门中,已经在模板中配置了net.port.listen,但是在counter列表中并未发现。
出现这种情况,可能是当前网卡不在agent的监控范围内,具体的内容可以参考上面的agent配置文件信息。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:其实与终归

查看原文:2019-02-22

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

965 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传