Skip to main content

Command Palette

Search for a command to run...

监控改造之路3

Updated
1 min read

也是没想到监控系列竟然断更如此之久,要做到笔耕不辍真的挺难,再一次反映自己行动力之差。话说人logseq里面的todo也是越积越多,眼看着2023年就快结束了,小破站虽然没啥人看,但这债,还是得快速还的。好,切入正题,上次写监控还是上次……

上篇提到主机监控,采用的是将主机的node-exporter写入到prometheus配置文件的方式,利用prom配置文件的热更新机制完成,这种方式是比较生硬的,不够优雅。一旦需要监控的主机数量多起来,就会带来一些问题,

  1. 每次要读写文件,速度是比较慢的,特别是当配置文件逐渐变大起来时

  2. 对于问题1,可以将配置文件拆分来缓解,拆分带来的配置的更多的管理和维护成本

  3. 操作文件意味着写文件的服务/进程需要跟prom的配置文件具体位置强关联,会带来其它问题,比如:读写配置文件的进程或者服务如果是多实例,需要处理资源争抢等问题

所以服务发现就有存在的必要的,具体而言,就是将需要监控的目标将给第三方服务来维护和管理,再将第三方服务的地址告诉prom,由prom通过第三方服务来获取需要监控的目标,例如比较流行的consul,以及上文提到的监控目标存在配置文件中,其实也是服务发现的一种。

但是团队的情况有一些复杂,因为早期在项目设计上技术调研上欠缺,导致整个项目引入了过多的中间件,例如zk、kafka、redis等,笔者进入这个团队以后,通过对整个项目的梳理,发现这些中间件并不是必须的,甚至于完全可以去掉,再加之开源竞品仅依赖一个MySQL,团队对于去中件间这件事显得不够有决心,但是对于引入新的中间件却是非常谨慎的。虽然我比较推荐使用consul,但是当时的一些情况,并没有得到支持,于是本着尽可能不引入新的中件间的原则,在架构师的坚持下,使用zk作为服务发现,但其实prom并不支持直接使用zk作为服务发现,不过支持一个叫做nerve的服务发现,使用zk作为存储,于是乎,通过走读promtheus的相关代码,使用一些骚操作,将需要监控的主机信息写入zk,以此支持将zk作为promtheus的服务发现,此事就此作罢。

从我的角度,这是一个非常不好的实践,为了之前错误的设计(过多的中间件使用),要采取一种社区少有人使用的服务发现机制,带来的隐患着实不小。

所以经过一番梳理,我发现平台需要监控的主机信息在主服务(下文以ms指代)中是能查到的,既然主服务中能查到,为何要劳什子地将这些信息写入zk呢?所以答案呼之欲出了,HTTP-based service discovery: ms提供一个查询监控主机信息的HTTP即可,以下是一个简单的示例:

代码示例:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
)

type target struct {
    Targets []string          `json:"targets"`
    Labels  map[string]string `json:"labels"`
}

func main() {
    targets := []target{
        {
            Targets: []string{"172.88.1.71:8080", "172.88.1.56:8080"},
            Labels: map[string]string{
                "job": "myapp",
            },
        },
        {
            Targets: []string{"172.18.5.32:10250"},
            Labels: map[string]string{
                "job":              "myapp",
                "__scheme__":       "https",
                "__metrics_path__": "/metrics/cadvisor",
            },
        },
    }

    handler := func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")
        json.NewEncoder(w).Encode(targets)
    }

    http.HandleFunc("/targets", handler)
    fmt.Println("Starting HTTP server on port 8080...")
    // ip:172.18.4.172
    http.ListenAndServe(":8080", nil)
}

相应地,在prometheus.yml中需要添加的配置如下所示:

scrape_configs:
  - job_name: myapp
    http_sd_configs:
    - url: http://172.18.4.172:8080/targets
      refresh_interval: 10s

这是一个相对接地气的方案,简单而有力。代码改动量也比较小,我比较惊讶的是,团队开发环境的主机不足30台,也就是说需要监控的主机数量不足30台,但这个接口的第一次响应查义时间竟然需要3s以上(http服务发现的方案是我出的,也给出了golang和prom配置示例,接口是其它同事在ms中实现的,ms是java写的) 。呃,又是历史债务么……


在如此少的监控目标下,prom的内存战用却意外的高,3G到8G的样子,我很吃惊,于是想用vm(victoriametrics)替换prom,在测试环境作对比,经过近两周的观察,vm完胜,但是却意外发现团队使用prom竟然还是两年前的版本,先前的对比就有些不讲武德了。本着公平的原则,将其升级到当时较新的版本2.45.0,经过一周的观察,监控等量的目标,vm与prom内存占用相当,甚至prom还略低于vm,虽然我是一个“激进”派,但此时,也不得不为prom而感动,一个老项目,能优化至此,实在是没理由不升级到2.45.0,这是一个令我印象深刻的prom版本……

你以为这就完事了?基于一些考量,最近我又谋划着使用vm……

64 views

More from this blog

2025: 祛魅 灰度 念头通达

今天是2025年的最后一天,当大家都在准备下班的时候,好巧不巧的,我刚好发现了一个不大不小的问题,大胆猜想,小心求证,向上反馈,暴露风险,作为2025年工作注解,实在是再有趣不过了。 今年的工作,从结果上看,还算平稳,至于过程,有太多不可言说的部分。厂里打镙丝的牛马,有工资可拿,理应知足了,至于其它的,与己无关,也没那么重要了。 祛魅 近距离观察大厂,才发现一些违背常识/直觉的事实:路人以为的高大

Feb 28, 20261 min read21

大厂祛魅:破碎的专注力

毁掉一个人最直接的方法,就是毁掉ta的专注力。 这句话的出处已然模糊,但放在大厂环境中,却显得格外深刻。 围城 大厂宛如一座围城。城外的人满怀憧憬,目之所及皆是光鲜;城内的人却如困笼之鸟,翅膀日渐退化,每日挣扎求生。 高大上 不可否认,大厂的硬件设施确实令人艳羡:宽敞的独立园区内,来往穿梭的人群中,几乎人人手握智能设备。这看似现代化的景象背后,却藏着一个无奈的事实:在工作时段,每台电脑都被严密监控,连听音乐都成奢望。于是,工作之余玩手机,成了许多人难得的解压方式。 大厂的品牌效应确实强大。外界对...

Jul 29, 20251 min read138

Black Swan

黑天鹅理论 是指极不可能发生,实际上却又发生的事件 来到大厂打工已经满一个月了,从一开始的手足无措,到逐渐度过不适期,也算是适应了吧。 不适应 刚入职时,不适应的地方还是挺多的。 第一次只使用台式机工作,这就限制了我一天中的绝大部分时间,都必须呆在自己的工位上,好在工位足够大。只是人与人的沟通少了很多,有问题只能在工位上通过 IM 呼对方,有种魔幻又现实的感觉 第一次只能用 Windows,也不能 WSL,这给我的工作效率带来了很大影响,不能用熟悉的软件,就连写代码用的 VSCode 的...

Jan 24, 20251 min read74

2024年: 逐渐平静

这个世界是一面镜子,会把你的感受反射给你 2024 开端: 相由心生 那时,还带着一着愤懑,因为拿到了低绩效,虽然内心知道这是公司经营困难,想让我离开的一种策略,但仍然感受到自己那可笑的自尊受到了践踏。自那之后,非必要不加班,只做份内事,尽可能地不去涉及份外之事。 2024 年中: 与人为善 组里的项目眼见不行了,我被迫去支援 AI 项目,久违地写起了 python,项目接近完成时,意外收到通知:我拿到大礼包了。在这之前,架构师因故裸辞。在我离开之后不到两周,我的 TL 也裸辞了,直到同事告诉...

Jan 9, 20251 min read92

企业软件之殇

殇 动词 未成年而死。 名词 战死者。 笔者经历了两家打着云原生旗号的企业软件/解决方案公司,都是中途加入,项目都以解(失)散(败)告终。 云原生解决方案 NB 公司:一个传统的 IDC 小厂,想着借云原生的热度,进军企业软件市场。 在加入这个项目之前,笔者考取了 CKAD 认证,彼时对 K8s 相当着迷。先简要介绍一下这个项目背景: 基于 Rancher (换皮肤)的二次开发项目,名字叫:HCaaS ,在笔者加入这个团队之前,项目已经开发近两年了,除了 TL 之外,其它人之前都...

Jul 1, 20241 min read103

just for fun

57 posts

I'm a Software Engineer