编写一个简单的 rtc_exporter

栏目: 数据库 · 发布时间: 7年前

内容简介:1)rtc_server 通过写文件的方式将系统和业务数据记录到临时文件2)rtc_exporter 读取相关配置并上传到 pushgateway因为是Beta版,只实现基本功能,后续会持续优化
  1. 系统交互图

    编写一个简单的 rtc_exporter

    rtc_exporter.png

1)rtc_server 通过写文件的方式将系统和业务数据记录到临时文件

2)rtc_exporter 读取相关配置并上传到 pushgateway

  1. 系统使用的是 golang 语言进行编写

    main.go

package main

import (
    "flag"
    "fmt"
    "os"
    "rtc_exporter/common"
    "rtc_exporter/structure"
    "rtc_exporter/utils"
    "time"

    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/push"
)

var (
    confFile = flag.String("c", "./config/config.json", "configuration file,json format")

    rtcData = prometheus.NewGaugeVec(prometheus.GaugeOpts{
        Name:      "rtc_server",
        Namespace: "rtc_server",
        Help:      "rtc server report running manually~",
    }, []string{"server", "key"})
)

//读取程序配置文件
func ReadConfigFile() (string, string, string, float64) {

    common.ProcessOptions()
    if err := common.LoadConfigFromFile(*confFile); err != nil {
        fmt.Println("Load Config File fail,", err)
        return "", "", "", -1
    }
    common.DumpConfigContent()

    // 获取日志配置
    expo_dest, err := common.GetConfigByKey("exporter.dest")
    if err != nil {
        fmt.Println("can not get dest config:", err)
        return "", "", "", -1
    }
    jobname, err := common.GetConfigByKey("exporter.jobname")
    if err != nil {
        fmt.Println("can not get jobname config:", err)
        return "", "", "", -1
    }
    filename, err := common.GetConfigByKey("exporter.filename")
    if err != nil {
        fmt.Println("can not get filename config:", err)
        return "", "", "", -1
    }
    interval, err := common.GetConfigByKey("exporter.interval")
    if err != nil {
        fmt.Println("can not get interval config:", err)
        return "", "", "", -1
    }

    return expo_dest.(string), jobname.(string), filename.(string), interval.(float64)
}

//main函数
func main() {

    var f func()
    var t *time.Timer

    expo_dest, jobname, filename, interval := ReadConfigFile()

    f = func() {
        var info structure.BasicInfo
        info, err := utils.ReadLineJson(filename, utils.ProcessLine)
        if err != nil {
            fmt.Println("Info error!")
        } else {
            registry := prometheus.NewRegistry()
            registry.MustRegister(rtcData)
            pusher := push.New(expo_dest, jobname).Gatherer(registry)

            rtcData.WithLabelValues(info.Server, "user").Set((float64)(info.Data.User))
            rtcData.WithLabelValues(info.Server, "qps").Set((float64)(info.Data.Qps))

            if err := pusher.Add(); err != nil {
                fmt.Println("Could not push to Pushgateway:", err)
                os.Exit(-1)
            }

            fmt.Println("success")
        }
        t = time.AfterFunc(time.Duration(interval)*time.Second, f)
    }

    t = time.AfterFunc(time.Duration(interval)*time.Second, f)

    defer t.Stop()
    time.Sleep(time.Minute)
}

因为是Beta版,只实现基本功能,后续会持续优化

  1. 实现功能:

    1)读取临时文件(json格式)

    2)读取配置文件信息(包括上报地址、间隔时间等)

    3)定时发送信息到 pushgateway

  2. 后续可优化的点

    1)改造成直接与 prometheus 交互的版本

    2)实现自身的高可用,守护进程等方式

    3)代码整合结构化...


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

A Byte of Python

A Byte of Python

Swaroop C H / Lulu Marketplace / 2008-10-1 / USD 27.98

'A Byte of Python' is a book on programming using the Python language. It serves as a tutorial or guide to the Python language for a beginner audience. If all you know about computers is how to save t......一起来看看 《A Byte of Python》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具