12月07, 2017

wonder agent改造历程

简介

Wonder是360内部一套all in one的监控解决方案,基于开源监控架构open-falcon v0.1 进行了二次开发。

Agent负责从主机上采集基础监控数据及执行特定脚本。

我们都做了些什么?

alt

代码风格

  • 代码整合到wonder主项目 项目初期每个模块都是独立的项目,随着模块的增多,经常会遗忘

  • 将一些常用、重复的功能提取出来做为公共库

  • 解决包依赖, 使用glide管理包依赖,在任何主机都可以编译成功

配置文件

  • 使用了更直观的toml
  • 支持热加载

Debug

日志系统

提供完善的日志,包括分级、多文件、rotate、buffer等功能。

package g

import (
    "log"
    "os"
    "syscall"

    "github.com/sumaig/glog"
)

// 初始化日志
func LogsInit() {
    glog.SetLogger(glog.AdapterFile, `{"filename":"logs/agent.log","maxdays":7}`)
    glog.EnableFuncCallDepth(true)
    glog.SetLogFuncCallDepth(3)
    if Config().Debug {
        glog.SetLevel(glog.LevelDebug)
    } else {
        glog.SetLevel(glog.LevelInfo)
    }

    fatalFile, err := os.OpenFile("logs/fatal.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0660)
    if err != nil {
        log.Println("Open fatal file failed.")
    }

    syscall.Dup2(int(fatalFile.Fd()), int(os.Stderr.Fd()))
    log.Println("Log.Init, ok")
}

性能分析

官方pprof采集性能数据

考虑到安全性并没有用常规的http方式,而是采用本地下发命令给socket,同时确保拿到的数据属于当前进程

package g

import (
    "time"
    "runtime"
    "runtime/pprof"
    "os"

    "github.com/sumaig/glog"

)

func CpuProfile() {
    profile := "cpu.prof"
    f, err := os.Create(profile)
    if err != nil {
        glog.Error(err)
    }

    if err := pprof.StartCPUProfile(f); err != nil {
        glog.Error("cpu profiling failed: ", err)
    }

    time.Sleep(time.Duration(30) * time.Second)
    pprof.StopCPUProfile()
    f.Close()
}

func HeapProfile() {
    profile := "heap.prof"
    f, err := os.Create(profile)
    if err != nil {
        glog.Error(err)
    }

    runtime.GC()
    if err := pprof.WriteHeapProfile(f); err != nil {
        glog.Error("write memory profile failed: ", err)
    }
    f.Close()

}

基础数据收集

  • Metric支持设置独立的采集周期

早期都是统一的周期进行上报,但有的metric需要更短的上报周期来及时发现问题,例如CPU。官方0.2也已经支持。

  • Agent监控: CPU、磁盘、内存

agent自身的资源损耗也是我们需要关注的,可以发现、解决一些问题。主要数据都来自/proc/pid/stat,算法参考的ps命令。

  • 优化CPU数据采集

一些业务对CPU关注度比较高,业务场景也导致CPU的监控数值变化很频繁,直接会导致频繁报警。所以我们对采集的数据 进行平均值计算,在能体现问题的同时控制报警。同时使绘图曲线不那么尖锐。

alt

  • 优化网卡速率

官方是从相关网卡设备的speed文件中读取,例如:/sys/class/net/eth0/speed。但并不是所有主机都有这个文件, 这样会导致监控数据一直为0。我们在此基础上增加了使用ethtool工具获取网卡速率的方案,提高准确率

RPC

  • 安全第一,传输过程使用证书进行加密
  • 使用MessagePack对象序列化方案替代官方的json,提升数据传输性能 alt

自动更新

机器数量较大,为减轻运维人员的负担,提供自动更新,支持热重启

HTTP API

让业务方便拿到本机的部分监控数据做分析、测试,需要验证。

初期只是支持内部大白系统,目前已改为通用的功能并支持更多的metric。

自定义监控脚本

  • 用户上传
  • 自动更新

日志监控

帮忙业务从日志中发现问题,目前支持以下三种类型:

  • 滚动数目

就是某个周期内有多少条日志

alt

  • 字符串匹配

支持精确匹配、正则匹配以及是否重复

alt

  • 数字匹配

其实也是正则匹配

alt

初期曾使用过filebeat,但它对我们来说太重了,而且需要将注册信息写入到文件中,经常引发各种问题,排查起来也比较困难。而我们的需求其实很简单,最终这个功能是自己实现的。

Qalarm日志收集

Qalarm是公司内部的一套应用级别的监控方案。它通过SDK嵌入到代码中,将报警信息写到日志后上报qbus(kafka),然后进行消费。但需要主机部署qbus环境,在一次qbus大版本升级中, 因为不向后兼容引出一些使用上的问题。Agent引入这个功能后收集日志数据上报到transfer,仅需要在transfer上部署qbus环境,毕竟transfer的数量较少,也可控。

Nginx

  • 请求数
  • 错误请求数: 499、50x
  • 平均响应时间
  • upstream平均响应时间

TODO

  • [ ] 深度整合docker
  • [ ] GRPC
  • [ ] 服务发现
  • [ ] relay

本文链接:https://www.opsdev.cn/post/wonder_agent.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。