加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

轻松筹监控系统实现方案

发布时间:2021-01-19 14:44:15 所属栏目:电商 来源:网络整理
导读:《轻松筹监控系统实现方案》要点: 本文介绍了轻松筹监控系统实现方案,希望对您有用。如果有疑问,可以联系我们。 监控系统是服务管理最重要的组成部分之一,可以帮助开发人员更好的了解服务的运行状况,及时发现异常情况.虽然阿里提供收费的业务监控服务,但
副标题[/!--empirenews.page--]

《轻松筹监控系统实现方案》要点:
本文介绍了轻松筹监控系统实现方案,希望对您有用。如果有疑问,可以联系我们。

监控系统是服务管理最重要的组成部分之一,可以帮助开发人员更好的了解服务的运行状况,及时发现异常情况.虽然阿里提供收费的业务监控服务,但是监控有很多开源的解决方案,可以尝试自建监控系统,满足基本的监控需求,以后逐步完善优化.这样既可以更灵活的满足自身业务的监控需求,也可以为以后自建机房提供技术积累.通过以下7个方面来建设监控系统.

1 . 日志打印

完善的日志是实现监控的基础,如何打印日志关系到之后的日志过滤、存储以及分析.除了选择合适的日志库,还要满足一些日志打印的要求:

  • 日志风格:以key-value的field形式输出结构化的日志.
  • 输出时机: error日志一定都需要打印,info日志结合业务需求适当打印,日志只需要在业务层关注,model和util等不需要打印.
  • 输出格式:线上以json的格式打印日志,方便解析日志.线下为了方便查看,可以用自定义的format打印日志,线上和线下的日志格式通过etcd来控制.
  • 输出内容: 每一条日志都要携带logid、method、host和level,并且根据不同业务场景,需要携带不同业务的标识field,例如projectType、platform、payType等.
  • 用context来传递不同goroutine之间的共享信息.

2 . 日志切分

日志切分是运维层面的东西,不应该由日志库来承担日志切分的事情,因为Linux在日志切分上有很成熟的工具,不需要自己写码去重复实现.

目前对日志切分的需求只有2个:按天切分和删除切出来的多余日志.logrotate就能很好的满足这些需求,logrotate是基于cron来运行的,其脚本是/etc/cron.daily/logrotate,默认放在/etc/cron.daily下,每天执行一次.

有的时候程序异常或者请求激增会导致日志量暴增,有可能在短时间内打满整个磁盘.可以在logrotate的配置文件里加上maxsize来限制日志文件的大小,并且将logrotate的执行频率调高至每小时甚至每分钟,及时切分并删除超过rotate数量的日志,来防止异常情况下磁盘被打满的情况发生.

样例配置如下所示:
// logrotate config of sample
// rotate every day,and keep for 3 days
/var/log/sample.log {
daily
rotate 3
maxsize 1G
missingok
sharedscripts
postrotate
# 在切分时向程序发送SIGHUP信号
killall -SIGHUP bin_sample
endscript
}
业务程序只需要负责监听SIGHUP信号,收到该信号时再重新打开日志文件.

3 . 日志采集

从监控系统的角度来说,日志收集有2种方式:主动采集和被动接收,两种方式各有利弊.主动采集

优点:日志收集和业务程序分开,互不影响.

缺点:日志收集需要依赖额外的采集服务,过滤和存储可能还需要额外配置.

被动接收

优点:业务程序直接将日志发送至存储,灵活性强,存储内容可在业务代码里控制.

缺点:日志存储不稳定的话会影响业务程序的正常运行;反之,日志量大的话也会压垮日志存储.

但是在建设监控系统初期,日志存储还不是很稳定的情况下,还是用主动采集的方式比较稳妥,不影响服务稳定性为主.

Collectd功能确实很强大,它的tail插件也能满足从文件收集日志,但是tail插件配置比较复杂而且说明文档相较于Filebeat来说不是很详细.

Collectd的其他插件可以采集的数据确实很多,而且也有插件支持将数据发送到Logstash和InfluxDB,但是多数插件的功能我们用不到,而且Elastic Stack中的Beats也能够很好的收集系统参数等数据,而且跟ELK能很好的兼容.

所以在分别试用了Filebeat和Collectd这2个采集服务后,综合上述分析决定采用Filebeat来负责从日志文件中采集日志.如下所示,Filebeat的配置简单易懂:

filebeat:
spool_size:?1024????????????????????????????????????#?最大可以攒够?1024?条数据一起发送出去
idle_timeout:?“5s”??????????????????????????????????#?否则每?5?秒钟也得发送一次
registry_file:?“registry”???????????????????????????#?文件读取位置记录文件,会放在当前工作目录下.
config_dir:?“path/to/configs/contains/many/yaml”????#?如果配置过长,可以通过目录加载方式拆分配置
prospectors:????????????????????????????????????????#?有相同配置参数的可以归类为一个?prospector

fields:
log_source:?“sample”????????????????????#?类似?logstash?的?add_fields,此处的”log_source”用来标识该日志来源于哪个项目
paths:
–?/var/log/system.log???????????????????#?指明读取文件的位置
–?/var/log/wifi.log
include_lines:?[“^ERR”,?“^WARN”]????????????#?只发送包含这些字样的日志
exclude_lines:?[“^OK”]??????????????????????#?不发送包含这些字样的日志

document_type:?“apache”?????????????????????#?定义写入?ES?时的?_type?值
ignore_older:?“24h”?????????????????????????#?超过?24?小时没更新内容的文件不再监听.
scan_frequency:?“10s”???????????????????????#?每?10?秒钟扫描一次目录,更新通配符匹配上的文件列表
tail_files:?false???????????????????????????#?是否从文件末尾开始读取
harvester_buffer_size:?16384????????????????#?实际读取文件时,每次读取?16384?字节
backoff:?“1s”???????????????????????????????#?每?1?秒检测一次文件是否有新的一行内容需要读取
paths:
–?“/var/log/apache/*”???????????????????#?可以使用通配符
exclude_files:?[“/var/log/apache/error.log”]

input_type:?“stdin”?????????????????????????#?除了?“log”,还有?“stdin”
multiline:??????????????????????????????????#?多行合并
pattern:?‘^[[:space:]]’
negate:?false
match:?after
output:
logstash:
hosts:?[“localhost:5044”]??????????????????????????#?The?Logstash?hosts

Filebeat 发送的日志,会包含以下字段:
  • beat.hostname beat 运行的主机名
  • beat.name shipper 配置段设置的 name,如果没设置,等于 beat.hostname
  • @timestamp 读取到该行内容的时间
  • type 通过 document_type 设定的内容
  • input_type 来自 “log” 还是 “stdin”
  • source 具体的文件名全路径
  • offset 该行日志的起始偏移量
  • message 日志内容
  • fields 添加的其他固定字段都存在这个对象里面

4 . 日志过滤

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读