首页 > 编程语言 >通过golang编写并发程序监控系统中文件大小并通过prometheus告警

通过golang编写并发程序监控系统中文件大小并通过prometheus告警

时间:2023-02-20 18:03:00浏览次数:56  
标签:wg 文件大小 string err golang info func FileInfo 并发程序

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "path/filepath"
    "sync"
)

const (
    maxFileSize            int64  = 10 * 1024 * 1024
    metricsName            string = "node_filesystem_file_size"
    nodeFilesystemFileSize string = "/host/prom-textfile/node-filesystem-file-size.prom"
)

type FileInfo struct {
    Path       string
    Size       int64
    MountPoint string
    FileName   string
}

func main() {
    dirs := []string{"/web", "/var/log", "/data"}

    wg := &sync.WaitGroup{}
    fileChan := make(chan FileInfo)

    for _, dir := range dirs {
        wg.Add(1)
        go func(dir string) {
            defer wg.Done()
            err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
                if err != nil {
                    return err
                }

                if !info.IsDir() && info.Size() > maxFileSize {
                    fileChan <- FileInfo{
                        FileName:   info.Name(),
                        MountPoint: dir,
                        Path:       path,
                        Size:       info.Size(),
                    }
                }

                return nil
            })

            if err != nil {
                fmt.Printf("Error walking directory %s: %s\n", dir, err)
            }
        }(dir)
    }

    if err := ioutil.WriteFile(nodeFilesystemFileSize, []byte{}, 0644); err != nil {
        fmt.Printf("清空文件内容失败: %s\n", err)
    }

    go func() {
        for fileInfo := range fileChan {
            writeCollectorFile(fileInfo)
        }
    }()

    wg.Wait()
    close(fileChan)
}

func writeCollectorFile(fileInfo FileInfo) {

    f, err := os.OpenFile(nodeFilesystemFileSize, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
    if err != nil {
        fmt.Printf("打开文件失败: %s\n", err)
        return
    }

    defer f.Close()

    _, err = f.WriteString(fmt.Sprintf("%s{path=\"%s\", mountPoint=\"%s\", fileName=\"%s\"} %d\n", metricsName, fileInfo.Path, fileInfo.MountPoint, fileInfo.FileName, fileInfo.Size))
    if err != nil {
        fmt.Printf("写入文件失败: %s\n", err)
    }
}

效果如下:

 

标签:wg,文件大小,string,err,golang,info,func,FileInfo,并发程序
From: https://www.cnblogs.com/zhangzihong/p/17138386.html

相关文章

  • golang中的GPM(用户态的线程池)
     全局队列(GlobalQueue):存放等待运行的G。P的本地队列:同全局队列类似,存放的也是等待运行的G,存的数量有限,不超过256个。新建G’时,G’优先加入到P的本地队列,如果......
  • Golang基础-正则表达式
    backticksWhenusingbackticks(`)tomakestrings(Rawstringliterals),backslashes(\)don'thaveanyspecialmeaninganddon'tmarkthebeginningofspecial......
  • Golang 构建 Apache thrift 应用
    安装去官网下载安装包,然后编译安装。https://thrift.apache.org/download./configure&&make当然如果我们使用了MacOS我们将可以方便的直接使用 Homebrew进行......
  • 【转】golang bufio、ioutil读文件的速度比较(性能测试)和影响因素分析
    golang读取文件的方式主要有4种:使用File自带的Read方法使用bufio库的Read方法使用io/ioutil库的ReadAll()使用io/ioutil库的ReadFile() 使用io/ioutil库的ReadFile()......
  • 【转】golang的log.Fatal()和panic()函数的区别
    golang的log.Fatal()和panic()函数的区别在讲两者区别之前我们先看一下os.Exit()函数的定义:funcExit(codeint)Exitcausesthecurrentprogramtoexitwiththe......
  • golang拾遗:实现一个不可复制类型
    这是golang拾遗系列的第六篇。这个系列主要用来记录一些平时不常见的知识点,偶尔也会实现些有意思的小功能,比如这篇。golang拾遗系列目录:golang拾遗:指针和接口golang拾......
  • Golang微服务(一)
    Golang微服务(一)目录Golang微服务(一)一、protobuf常规使用及踩坑记录1.类型映射关系及零值2.go_package设置3.protobuf的字段编号4.proto文件的import5.protobuf的message嵌......
  • golang 入门(十) 异常处理
    1、recovery捕获异常代码在运行的时候,总会遇到错误。有的时候我们会希望程序遇到错误以后继续运行后面的流程,而不是直接异常退出。在Python中,使用tryexcept组合实现这种需......
  • Golang基础-Runes
    rune与stringTherunetypeinGoisanaliasforint32.Giventhisunderlyingint32type,therunetypeholdsasigned32-bitintegervalue.However,unlikean......
  • golang 面向对象
    1.张老太养了两只猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名字......