基于prometheus 实现exporter新增监控指标

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
可观测监控 Prometheus 版,每月50GB免费额度
简介: 基于prometheus 实现exporter新增监控指标

基于node_exporter增加

cmd/collector/rds_files_linux.go

package collector

import (
    "github.com/go-kit/log"
    "github.com/prometheus/client_golang/prometheus"
)

func init() {
    registerCollector("system", defaultEnabled, NewSystemCollector)
}

type SystemCollector struct {
    log log.Logger
}

func NewSystemCollector(logger log.Logger) (Collector, error) {
    return &SystemCollector{log: logger}, nil
}

var sysInfo = map[string]*prometheus.Desc{
    "dir_size": prometheus.NewDesc(
        "rds_dir_size",
        "自定义指定文件夹的大小",
        []string{}, prometheus.Labels{},
    ),
    "file_size": prometheus.NewDesc(
        "rds_file_size",
        "自定义指定文件的大小",
        []string{}, prometheus.Labels{},
    ),
}

func (SystemCollector) Update(ch chan<- prometheus.Metric) error {
    var dirSize = DirSize("/root/go/src/node_mysqld_exporter/cmd/collector")
    ch <- prometheus.MustNewConstMetric(
        sysInfo["dir_size"],
        prometheus.GaugeValue, float64(dirSize),
    )
    var fileSize = DirSize("/root/go/src/node_mysqld_exporter/cmd/collector/cpu_linux.go")
    ch <- prometheus.MustNewConstMetric(
        sysInfo["file_size"],
        prometheus.GaugeValue, float64(fileSize),
    )
    return nil
}

cmd/collector/utils.go

package collector

import (
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
    "sync"
    "time"
)

var syncM sync.Map

var wait sync.WaitGroup

func DirSize(path string) int64 {
    var size int64
    filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
        if err != nil {
            log.Println(err.Error())
            return err
        }
        if !info.IsDir() {
            size += info.Size()
        }
        return err
    })
    return size
}

func getFileSize(path string) int64 {
    if !exists(path) {
        return 0
    }
    fileInfo, err := os.Stat(path)
    log.Println(fileInfo)
    if err != nil {
        return 0
    }
    return fileInfo.Size()
}

func exists(path string) bool {
    _, err := os.Stat(path)
    return err == nil || os.IsExist(err)
}

func SizeOfDirPath(dirPath string) float64 {
    log.Println("扫描文件夹:" + dirPath)
    t := time.Now()
    wait.Add(1)
    go scanDir(dirPath, &syncM)
    wait.Wait()

    var fileCount int
    var dirSize float64

    syncM.Range(func(key, value interface{}) bool {
        fileCount++
        v := value.(float64)
        dirSize += v
        return true
    })
    log.Println("花费的时间:" + time.Since(t).String())
    log.Println("文件的数量:", fileCount)
    log.Println("文件夹大小:", dirSize)
    return dirSize
}

func scanDir(path string, syncM *sync.Map) {
    defer wait.Done()
    dirAry, err := ioutil.ReadDir(path)
    if err != nil {
        panic(err)
    }
    for _, e := range dirAry {
        if e.IsDir() {
            wait.Add(1)
            go scanDir(filepath.Join(path, e.Name()), syncM)
        } else {
            syncM.Store(filepath.Join(path, e.Name()), (float64(e.Size()) / 1024))
        }
    }

}

验证

# HELP rds_dir_size 自定义指定文件夹的大小
# TYPE rds_dir_size gauge
rds_dir_size 1.591099e+06
# HELP rds_file_size 自定义指定文件的大小
# TYPE rds_file_size gauge
rds_file_size 15226
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
相关文章
|
18天前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
99 3
|
9天前
|
Prometheus 监控 Cloud Native
在 HBase 集群中,Prometheus 通常监控哪些类型的性能指标?
在 HBase 集群中,Prometheus 监控关注的核心指标包括 Master 和 RegionServer 的进程存在性、RPC 请求数、JVM 内存使用率、磁盘和网络错误、延迟和吞吐量、资源利用率及 JVM 使用信息。通过 Grafana 可视化和告警规则,帮助管理员实时监控集群性能和健康状况。
|
18天前
|
Prometheus 监控 Cloud Native
Prometheus中的Exporter详解
【10月更文挑战第25天】Prometheus Exporter分为直接采集(如cAdvisor, Kubernetes)和间接采集(如Node Exporter)两类。
|
17天前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第27天】在智能运维中,Prometheus和Grafana的组合已成为监控和告警体系的事实标准。Prometheus负责数据收集和存储,支持灵活的查询语言PromQL;Grafana提供数据的可视化展示和告警功能。本文介绍如何配置Prometheus监控目标、Grafana数据源及告警规则,帮助运维团队实时监控系统状态,确保稳定性和可靠性。
84 0
|
2月前
|
Prometheus 监控 Cloud Native
介绍如何使用Prometheus进行监控
介绍如何使用Prometheus进行监控
201 3
|
2月前
|
Prometheus 监控 Cloud Native
docker安装prometheus+Granfan并监控容器
【9月更文挑战第14天】本文介绍了在Docker中安装Prometheus与Grafana并监控容器的步骤,包括创建配置文件、运行Prometheus与Grafana容器,以及在Grafana中配置数据源和创建监控仪表盘,展示了如何通过Prometheus抓取数据并利用Grafana展示容器的CPU使用率等关键指标。
|
3月前
|
存储 Prometheus 监控
Grafana 与 Prometheus 集成:打造高效监控系统
【8月更文第29天】在现代软件开发和运维领域,监控系统已成为不可或缺的一部分。Prometheus 和 Grafana 作为两个非常流行且互补的开源工具,可以协同工作来构建强大的实时监控解决方案。Prometheus 负责收集和存储时间序列数据,而 Grafana 则提供直观的数据可视化功能。本文将详细介绍如何集成这两个工具,构建一个高效、灵活的监控系统。
404 1
|
3月前
|
Prometheus 监控 Cloud Native
使用Prometheus搞定微服务监控
使用Prometheus搞定微服务监控
使用Prometheus搞定微服务监控
|
3月前
|
Prometheus 监控 Cloud Native
基于prometheus的微服务指标监控
基于prometheus的微服务指标监控
|
3月前
|
Prometheus 监控 Cloud Native
在 HBase 集群中,Prometheus 通常监控哪些类型的性能指标?
在 HBase 集群中,Prometheus 通常监控哪些类型的性能指标?