乐趣区

关于云计算:基于-Prometheus-实现-laf-资源监控

laf 背景

没有资源监控前,利用的资源指标 (cpu / mem / db / oss) 无奈得悉,用户很难依据本人的业务规模评估适合的规格配置;不能分明地发现以后利用状态:是否有内存泄露、是否须要开启弹性伸缩、以后的利用实例数等等。有了资源监控,这些问题通通解决。

laf 实现计划

  • 前端轮询后端申请监控数据,后端向 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 <<EOF > values.yaml
fullnameOverride: prometheus
prometheus:
  prometheusSpec:
    storageSpec:
      volumeClaimTemplate:
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 20Gi
EOF

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring -f values.yaml
  • 为了采集 MongoDB 的 db 大小,须要部署 MongoDB Exporter
# 填须要采集数据的 MongoDB 的连贯串
DATABASE_URL=<mongodb-uri-need-to-monitor>

helm install prometheus-mongodb-exporter -n laf-system \
    --set image.tag="0.39.0"
    --set mongodb.uri=${DATABASE_URL} \
    --set serviceMonitor.enabled=true \
    --set serviceMonitor.additionalLabels.release=prometheus \
    --set serviceMonitor.additionalLabels.namespace=monitoring \
    prometheus-community/prometheus-mongodb-exporter
  • 采集 cpu 和内存指标,只须要内存
    kubelet 作为 k8s 的组件自带了 cAdvisor 组件,cAdvisor 是一个用于 收集对于容器的资源应用状况和性能个性的工具,为容器运行时(如 Docker 和 containerd)提供监控和统计信息。而 kube-prometheus-stack 集成了对 kubelet 的采集规定,所以这块咱们不须要特地解决。
  • 部署实现后,应用 kubectl port-forward 进入 Prometheus 的 Web UI,查看各采集指标是否都 UP 了。至此,Prometheus 便会依据采集规定定期地去轮询各采集指标,失去采集数据存到数据库中。

laf 编写 PromQL 查问语句验证成果

什么是 PromQL

  1. 概念:PromQL 是 Prometheus Query Language 的缩写,它是用于 Prometheus 数据库的专用查询语言。Prometheus 次要用于监控零碎和工夫序列数据库,PromQL 使用户可能查问和剖析收集的数据,在 Prometheus 的界面或其余集成工具中,PromQL 可用于生成数据的可视化图表。
  2. 类比:设想一下,SQL 用于关系型数据库,PromQL 就是用于 Prometheus 工夫序列数据库的。就像应用 SQL 查问关系型数据库中的数据一样,应用 PromQL 查问 Prometheus 中的工夫序列数据。
  3. 例子:
  4. 查问某个服务的均匀响应工夫:http_requests_duration_seconds_sum / http_requests_total
  • 查问在过来 5 分钟内的均匀 CPU 使用率:rate(node_cpu_seconds_total[5m])
  • 依据条件设置警报,例如,当某个服务的申请错误率超过 1% 时
    rate(http_requests_total{status_code=~”5..”}[5m]) / rate(http_requests_total[5m]) > 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 页面验证

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 等图表组件实现

援用链接
[1]
应用 sealos 疾速部署本人的 k8s: https://sealos.io/zh-Hans/docs/Intro

退出 Laf 开源社区
体验像写博客一样写代码

🏠官网链接
https://laf.run

🐙GitHub 地址
https://github.com/labring/laf

📑拜访 Laf 文档
https://doc.laf.run/guide/

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

laf 写代码像写博客一样简略,什么 docker kubernetes 通通不关怀,我只关怀写业务!

退出移动版