基于 Prometheus 实现 laf 资源监控

2023年 9月 28日 33.6k 0

laf背景

没有资源监控前,应用的资源指标(cpu / mem / db / oss)无法得知,用户很难根据自己的业务规模评估合适的规格配置;不能清楚地发现当前应用状态:是否有内存泄露、是否需要开启弹性伸缩、当前的应用实例数等等。有了资源监控,这些问题统统解决。

laf实现方案

ac46c41a45250b80337e3aa3be8204ff.png

  • 前端轮询后端请求监控数据,后端向 Prometheus 发起 HTTP 查询请求,Prometheus 会根据请求从自带的数据库中查询数据并返回,后端完成整合工作后返回给前端。

  • Prometheus 会根据采集规则轮询需要采集的监控目标,将数据指标 (metrics) 存到数据库里。

laf组件介绍

  • Prometheus 是一个开源的监控和警报工具,通过 Pull 模式来获取目标服务的监控指标数据(如cpu和内存等),内置了一个时间序列数据库来存储收集到的指标数据,内置 PromQL 来查询数据(类似于使用SQL语句查询数据库),自带一个 Web UI 来快速验证查询结果。

  • Prometheus 的 Exporter 是一种适配器,用于采集非原生支持 Prometheus 的第三方系统或服务的指标数据,并将其转换为 Prometheus 可以识别的格式。Exporter运行为一个单独的服务,周期性地从目标系统中拉取原始指标,然后提供一个HTTP端点,使得 Prometheus 可以从中抓取已转换的指标数据。不同的系统和服务需要不同的Exporter,例如,MongoDB Exporter 用于 抓取 MongoDB 数据库的指标;而 Minio 原生支持Prometheus,不需要单独的 Exporter。

laf环境搭建和部署


这里假设我们已经拥有了一套 k8s 环境(使用 sealos 快速部署自己的 k8s),并且已经安装了必要组件,如 Helm、MongoDB 等

我们想要采集的指标包括 CPU、内存、MongoDB 和 MinIO 的用量,这里只演示前三者

  • 首先部署 Prometheus

使用 Helm 部署 kube-stack-prometheus


kube-prometheus-stack是一个 Kubernetes 的监控和告警套件,整合了 Prometheus、Grafana 及其他相关组件,通过 Prometheus Operator 简化部署和管理,提供从节点到Kubernetes 对象的全面监控,并支持通过 Grafana 进行数据可视化。

#创建 values.yaml 文件
cat  0.01

我们需要的PromQL

# 下面的 ${xxx} 代表变量,自行拼接。PromQL 的编写方法可以自行查阅

# CPU
sum(rate(container_cpu_usage_seconds_total{image!="",container!="",pod=~"${opts.pods}",namespace="${opts.namespace}"}[1m])) by (pod)

# 内存
sum(container_memory_working_set_bytes{image!="",container!="",pod=~"${opts.pods}",namespace="${opts.namespace}"}) by (pod)

# 数据库
sum(mongodb_dbstats_dataSize{database="${opts.appid}"})

# MinIO
sum(minio_bucket_usage_total_bytes{bucket=~"${opts.appid}.+"})

打开 Prometheus 的 Web UI 页面验证

04d4c6c86923f6ac8632d38a0ca1f427.png

laf后端代码实现


我们需要查询的数据包括瞬时值(db 和 oss 的大小)和范围值( cpu 和内存在一段时间内的波动)

  • 查询范围值
const url = "http://prometheus-prometheus.monitoring:9090"
const promql = ""

const range = 3600 // 1 hour
const now = Math.floor(Date.now() / 1000)
const start = now - range // 向前推进一小时
const end = now

const query = {
   query: promql,
   range,
   step: 60,
   start,
   end,
}
const res = await axios.get(url, { params: query }) 
return res.data.data.result
  • 查询瞬时值
const url = "http://prometheus-prometheus.monitoring:9090"
const promql = ""

const query = {
   query: promql,
}
const res = await axios.get(url, { params: query }) 
return res.data.data.result

laf前端部分


针对返回结果使用 ECharts 等图表组件实现

6a66c4d258508e9232ba6b9f9b1f80f0.png

引用链接
[1]
使用 sealos 快速部署自己的 k8s: sealos.io/zh-Hans/doc…

加入 Laf 开源社区
体验像写博客一样写代码

🏠官网链接
laf.run

🐙GitHub 地址
github.com/labring/laf

📑访问 Laf 文档
doc.laf.run/guide/

🏘️逛逛论坛
forum.laf.run/
sealos 以kubernetes为内核的云操作系统发行版,让云原生简单普及

laf 写代码像写博客一样简单,什么docker kubernetes统统不关心,我只关心写业务!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论