前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于 Go 语言开发的监控系统

基于 Go 语言开发的监控系统

作者头像
frank.
发布于 2022-10-28 02:33:11
发布于 2022-10-28 02:33:11
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

01

介绍

小米开源的监控系统 open-falcon 和滴滴开源的日志采集工具 falcon-log-agent 作为一组黄金搭档,被互联网公司广泛使用。

本文介绍怎么使用这组黄金搭档监控业务系统的日志。

02

open-falcon

open-falcon 使用 Golang 和 Python 开发,其中 Python 主要开发的是 Dashboard。

限于篇幅,本文不准备介绍 open-falcon 的原理,仅介绍如何安装。

安装 open-falcon 之前,必须确保已成功安装 RedisMySQL,因为 open-falcon 需要使用这两个存储组件。

同时,我们还需要确保已成功安装 Golang 和 Python。

需要注意的是,我们还需要确保已设置 GOPATHGOROOT 环境变量(也可以使用默认值)。

安装 open-falcon :

下载源码和初始化数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
cd $GOPATH/src/github.com/open-falcon/falcon-plus/scripts/mysql/db_schema/
# 初始化数据库
mysql -h 127.0.0.1 -u root -p < 1_uic-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 2_portal-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 3_dashboard-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 4_graph-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 5_alarms-db-schema.sql

编译

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

如果我们想要修改每个模块的配置文件,在执行 make pack 之前,我们可以修改模块的 config/xxx.json

需要注意的是,模块的配置文件中,MySQL 的账号和密码,默认分别是 root 和空,如果我们的 MySQL 账号和密码与之不同,我们需要编辑模块的配置文件进行修改。

部署

我们可以将得到的压缩包解压缩到指定目录进行部署,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make ~/open-falcon
tar -zxvf open-falcon-vx.x.x.tar.gz -C ~/open-falcon

启动所有模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ~/open-falcon
./open-falcon start

# 检查模块状态
./open-falcon check

安装仪表盘

在安装 Dashboard 之前,我们需要先安装依赖项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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

安装 Dashboard:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ~/open-falcon
git clone https://github.com/open-falcon/dashboard.git
cd dashboard
virtualenv ./env
./env/bin/pip install -r pip_requirements.txt

需要注意的是,这里有一个 Bug,会导致无法在仪表盘注册账号(点击按钮无反应),需要将 falcon api 的端口号 18080 改为 8080

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ~/open-falcon/dashboard
vim rrd/config.py
# 端口 18080 改为 8080
API_ADDR = os.environ.get("API_ADDR","http://81.70.201.193:8080/api/v1")

在启动 Dashboard 之前,我们再检查一下 open-falcon 的 api 模块是否已启动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ~/open-falcon
./open-falcon check

启动 Dashboard:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd ~/open-falcon/dashboard
$ ./control start

在浏览器中,打开 http://127.0.0.1:8081

03

falcon-log-agent

falcon-log-agent 不同于 ELK,它不是日志查看系统,而是日志计算系统。

它通过外挂式的日志采集方式,实时读取日志文件中的内容,实时计算,并将计算结果直接推送到 open-falcon。

它有几个限定条件,分别是要求日志必须包含时间,不支持文件软链接,日志时间必须有序。

安装 falcon-log-agent:

构建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make -p $GOPATH/src/github.com/didi && cd $_
git clone https://github.com/didi/falcon-log-agent.git
make build

修改配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd $GOPATH/src/github.com/didi/falcon-log-agent
cp cfg/dev.cfg cfg/cfg.json # 基础配置
cp cfg/strategy.dev.json cfg/strategy.json # 策略配置

部署

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd $GOPATH/src/github.com/didi/falcon-log-agent
make pack
mkdir ~/open-falcon/falcon-log-agent
tar -zxvf falcon-log-agent.tar.gz -C ~/open-falcon/falcon-log-agent

启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ~/open-falcon/falcon-log-agent
./control start

检查

  • http://ip:8003/health 健康检查
  • http://ip:8003/strategt 查看生效策略

策略配置示例:

本文以 open-falcon 的 agent 模块的日志为例,介绍怎么配置一个新策略。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
    {
        "id":10, # 多个策略,id 必须唯一
        "name":"agent send data count", # 对应 open-falcon 中的 metric(监控项)
        "file_path":"/root/open-falcon/agent/logs/agent.log", # 日志路径(支持动态路径)
        "time_format":"yyyy/mm/dd HH:MM:SS", # 时间格式
        "pattern":"Total=(\\d+)", # 匹配正则表达式
        "exclude":"", # 排除正则表达式
        "step":60, # 日志采集周期,单位秒
        "tags":{}, 对应 open-falcon 中的 tag
        "func":"cnt", # 日志采集方式,cnt、avg、sum、max、min
        "degree":6, # 精度
        "comment":"", # 备注
        "parse_succ":true
    }
]

重启 falcon-log-agent,我们在 Dashboard 中的 Couters 列表中可以看到 agent send data count

04

监控配置

我们介绍完 open-falcon 和 falcon-log-agent 的安装和启动。

已实现自动采集日志并将计算数据上报到 open-falcon,接下来,我们介绍针对日志数据怎么配置监控。

监控配置操作步骤:

  1. 创建用户组。
  2. 创建模板。
  3. 添加策略,其中 metric 对应 falcon-log-agent 策略配置文件中配置项的 name,max 是最大报警次数,P 是报警级别(<3:既发短信也发邮件,>=3:只发邮件),run 是策略生效时间(不填写代表全天生效),if 代表条件。 告警条件支持函数如下:
    • all(#3) 最新 3 个点都满足阈值条件则报警。
    • max(#3) 最新 3 个点,最大值满足阈值条件则报警。
    • min(#3) 最新 3 个点,最小值满足阈值条件则报警。
    • sum(#3) 最新 3 个点,其和满足阈值条件则报警。
    • avg(#3) 最新 3 个点,其平均值满足阈值条件则报警。
    • diff(#3) 将最新 push 过来的点(被减数),与历史最新 3 个点(减数)相减,得到 3 个差,有一个差满足阈值条件则报警。
    • pdiff(#3) 将最新 push 过来的点(被减数),与历史最新 3 个点(减数)相减,得到 3 个差,再将 3 个差值分别除以减数,得到 3 个商值,有一个商值满足阈值条件则报警。
    • lookup(#2,3) 最新的 3 个点中有 2 个满足阈值条件则报警。
  4. 配置报警接收用户组。

05

总结

本文我们介绍了基于 Go 语言开发的开源监控系统和日志采集工具的安装和使用方式。

建议读者朋友们动手操作一遍,需要注意的是,尽量严格按照本文的目录结构操作。

推荐阅读:

  1. Go 语言内存逃逸案例
  2. Golang 语言 vendor 在 GOPATH 和 Modules 中的区别
  3. Golang 语言中基础同步原语 Mutex 和 RWMutex 的区别
  4. Golang 语言中的非类型安全指针
  5. Golang 语言怎么实现访问流量限流?

参考资料:

  1. https://github.com/open-falcon/falcon-plus
  2. https://github.com/open-falcon/dashboard
  3. https://github.com/didi/falcon-log-agent
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小学生都能读懂的网络协议之:WebSocket
服务端和客户端应该怎么进行通信呢?我们常见的方法就是客户端向服务器端发送一个请求,然后服务器端向客户端发送返回的响应。这种做法比较简单,逻辑也很清晰,但是在某些情况下,这种操作方式并不好使。
程序那些事
2021/09/23
7780
WebSocket
WebSocket 对象提供了用于创建和管理 WebSocket 连接,以及可以通过该连接发送和接收数据的 API。
用户1418987
2023/10/16
2910
WebSocket
WebSocket 详解
WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
EchoROne
2022/08/15
7980
WebSocket 教程
WebSocket 是一种网络通信协议,很多高级功能都需要它。 本文介绍 WebSocket 协议的使用方法。 一、为什么需要 WebSocket? 初次接触 WebSocket 的人,都会问同样的问
ruanyf
2018/04/13
1.9K0
WebSocket 教程
WebSocket 学习
WebSocket是一种在单个TCP连接上进行全双工通信的协议,它为客户机和服务器之间的双向数据流提供了新的选择。相比HTTP协议,WebSocket具有更低的延迟和更高的效率,可以实现实时数据传输,如即时通讯、在线游戏等。
心安事随
2024/07/29
1110
webSocket使用详情
WebSocket是一种在Web浏览器和服务器之间进行双向通信的协议。它允许在一个持久化的TCP连接上进行实时的、双向通信。WebSocket协议是HTML5中的一项新技术,它可以用于替代传统的轮询和长轮询方法。本文将详细介绍WebSocket的使用方法,并提供代码示例。
世间万物皆对象
2024/03/20
3370
Websocket基础知识
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
Snine
2022/02/11
7730
Websocket基础知识
you-dont-know-websocket
本文阿宝哥将从多个方面入手,全方位带你一起探索 WebSocket 技术。阅读完本文,你将了解以下内容:
阿宝哥
2020/07/29
1.8K0
you-dont-know-websocket
WebSocket 托盘服务 NotifyIcon 通知栏「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说WebSocket 托盘服务 NotifyIcon 通知栏「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/10/04
4120
WebSocket 托盘服务 NotifyIcon 通知栏「建议收藏」
webSocket和EventSource的区别
WebSocket和EventSource是两种在Web应用程序中用于实现实时通信的不同技术。WebSocket是一种双向通信协议,允许服务器与客户端建立持久性连接并通过该连接发送消息。而EventSource是一种服务器推送技术,只允许服务器向客户端发送消息,而不允许客户端向服务器发送消息。 在下面的描述中,我将详细介绍WebSocket和EventSource的不同之处,并提供一些代码示例。
世间万物皆对象
2024/03/20
3940
JavaScript 服务器推送技术之 WebSocket
编者按:本文转载自 SHERlocked93 的掘金文章,跟着作者一起来学习一下吧
苏南
2020/12/16
1.6K0
JavaScript 服务器推送技术之 WebSocket
原 荐 webSocket与ajax、web
作者:汪娇娇 时间:2017年8月2日 先看一个有道释义: 其实释义的挺形象的,下面我来一一解释哈: 1、聊天室:webSocket有名的应用就是聊天室了; 2、服务:webSocket提供客户端请求
jojo
2018/05/03
2.1K0
原                    荐                                                            webSocket与ajax、web
一遍就能读懂的WebSocket协议详解
WebSocket提供了实时的、双向的通信机制,可以立即将数据从服务器推送到客户端,实现即时更新。
用户6297767
2023/12/14
1.3K0
一遍就能读懂的WebSocket协议详解
WebSocket系列之基础知识入门篇
本文是WebSocket系列的第一篇,主要介绍WebSocket相关的基础协议知识和API。由于WebSocket的相关介绍在MDN中分布较乱,初学者不太容易入门,因此通过本文将相关基础知识和使用方法进行一个归纳和总结。
黄Java
2018/09/18
8240
WebSocket的心跳机制你了解吗
WebSocket的心跳机制是一种用于保持WebSocket连接的稳定性和活跃性的方法。WebSocket是一种双向通信协议,通常用于实时应用程序,如在线聊天、在线游戏、数据推送等,而这些应用需要保持长时间的连接。心跳机制的目的是定期发送小的探测消息,以确保连接仍然有效,如果连接断开或出现问题,可以及时发现并采取措施。
星辰大海c
2023/11/08
2K0
WebSocket 初识篇
本文将基于腾讯云Lighthouse(轻量应用服务器)实例,对WebSocket进行简单的示例演示,以及初步的协议原理探索。帮助大家直观地感受双向通讯的特点以及常见的基于JavaScript的实现方法。
溪歪歪
2020/08/23
2K4
WebSocket 初识篇
《深入浅出Node.js》-WebSocket
WebSocket 与 Node 之间的配合可以说是天作之合:WebSocket 客户端基于事件的编程模型与 Node 中自定义事件相差无几;WebSocket 实现了客户端与服务器之间的长连接,而 Node 在与大量客户端之间保持高并发连接方面非常擅长。
李振
2021/11/26
1.5K0
《深入浅出Node.js》-WebSocket
网络协议之:WebSocket的消息格式
我们知道WebSocket是建立在TCP协议基础上的一种网络协议,用来进行客户端和服务器端的实时通信。非常的好用。最简单的使用WebSocket的办法就是直接使用浏览器的API和服务器端进行通信。
程序那些事
2021/09/24
9520
websocket深入浅出
答: 它是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
全栈程序员站长
2022/09/14
2.3K0
websocket深入浅出
深入探索WebSockets
在2008年中期,开发人员Michael Carter和Ian Hickson特别敏锐地感受到Comet在实施任何真正强大的东西时所带来的痛苦和局限。 通过在IRC和W3C邮件列表上的合作,他们制定了一项计划,在网络上引入现代实时双向通信的新标准,因此创造了“WebSocket”这个名称。
frontoldman
2019/09/03
1.3K0
深入探索WebSockets
相关推荐
小学生都能读懂的网络协议之:WebSocket
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文