-
系統(tǒng)交互圖
rtc_exporter.png
1)rtc_server 通過寫文件的方式將系統(tǒng)和業(yè)務(wù)數(shù)據(jù)記錄到臨時文件
2)rtc_exporter 讀取相關(guān)配置并上傳到 pushgateway
- 系統(tǒng)使用的是 golang 語言進(jìn)行編寫
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函數(shù)
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)
}
因?yàn)槭荁eta版抵屿,只實(shí)現(xiàn)基本功能碳默,后續(xù)會持續(xù)優(yōu)化
實(shí)現(xiàn)功能:
1)讀取臨時文件(json格式)
2)讀取配置文件信息(包括上報地址、間隔時間等)
3)定時發(fā)送信息到 pushgateway后續(xù)可優(yōu)化的點(diǎn)
1)改造成直接與 prometheus 交互的版本
2)實(shí)現(xiàn)自身的高可用古今,守護(hù)進(jìn)程等方式
3)代碼整合結(jié)構(gòu)化...