2,190
社区成员
发帖
与我相关
我的任务
分享
package main
import(
"fmt"
"net/http"
"net"
"os"
"flag"
"log"
"bytes"
"os/exec"
"io"
"runtime"
)
var (
metricsChannel = make(chan string, 10)
)
func get_hostip() (string){
addrs, err := net.InterfaceAddrs()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
var host string = "127.0.0.1"
for _, a := range addrs {
if hostip, ok := a.(*net.IPNet); ok && !hostip.IP.IsLoopback() {
if hostip.IP.To4() != nil {
host = hostip.IP.String()
break
}
}
}
return host
}
func exec_shell(s string) (string){
cmd := exec.Command("/bin/bash", "-c", s)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
return out.String()
}
func metricsConsumer(metricsChannel chan string, w http.ResponseWriter) {
//每次访问都写入一次数据(当然还有其优化的方法)
go metricsProducer(metricsChannel)
for metrics := range metricsChannel {
fmt.Println(metrics)
io.WriteString(w, metrics)
}
}
func ExporterHandler(w http.ResponseWriter, r *http.Request){
metricsConsumer(metricsChannel, w)
}
func main(){
port := flag.String("port", "30083", "Input your exporter port")
flag.Parse()
runtime.GOMAXPROCS(runtime.NumCPU())
http.HandleFunc("/metrics", ExporterHandler)
url := fmt.Sprintf("%s:%s", get_hostip(), *port)
fmt.Println("url=", url+"/metrics")
err := http.ListenAndServe(url, nil)
if err != nil {
log.Fatal("ListenAndServe:", err)
}
}
func metricsProducer(metricsChannel chan<- string) {
defer close(metricsChannel)
commands := [3]string{"ls", "ls -lrt", "hostname -i"}
for _, cmd := range commands {
metricsChannel <- fetchMetrics(cmd, "this is test")
}
}
func fetchMetrics(command, describe string) (string) {
metrics := fmt.Sprintf("%s", exec_shell(command))
return "#" + describe + "\n" + metrics
}
当然,是为了使用channel,否则有更优化的写法。
package main
import(
"fmt"
"net/http"
"net"
"os"
"flag"
"log"
"bytes"
"os/exec"
"io"
"runtime"
)
var (
metricsChannel = make(chan string, 10)
)
func get_hostip() (string){
addrs, err := net.InterfaceAddrs()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
var host string = "127.0.0.1"
for _, a := range addrs {
if hostip, ok := a.(*net.IPNet); ok && !hostip.IP.IsLoopback() {
if hostip.IP.To4() != nil {
host = hostip.IP.String()
break
}
}
}
return host
}
func exec_shell(s string) (string){
cmd := exec.Command("/bin/bash", "-c", s)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
return out.String()
}
func metricsConsumer(metricsChannel chan string, w http.ResponseWriter) {
for metrics := range metricsChannel {
fmt.Println(metrics)
io.WriteString(w, metrics)
}
}
func ExporterHandler(w http.ResponseWriter, r *http.Request){
metricsConsumer(metricsChannel, w)
}
func main(){
port := flag.String("port", "30083", "Input your exporter port")
flag.Parse()
runtime.GOMAXPROCS(runtime.NumCPU())
go metricsProducer(metricsChannel)
http.HandleFunc("/metrics", ExporterHandler)
url := fmt.Sprintf("%s:%s", get_hostip(), *port)
fmt.Println("url=", url+"/metrics")
err := http.ListenAndServe(url, nil)
if err != nil {
log.Fatal("ListenAndServe:", err)
}
}
func metricsProducer(metricsChannel chan<- string) {
defer close(metricsChannel)
commands := [3]string{"ls", "ls -lrt", "hostname -i"}
for _, cmd := range commands {
metricsChannel <- fetchMetrics(cmd, "this is test")
}
}
func fetchMetrics(command, describe string) (string) {
metrics := fmt.Sprintf("%s", exec_shell(command))
return "#" + describe + "\n" + metrics
}
这是本人的Golang技术贴, 去看看关于for range 和select, 以及<- Channel 操作的区别、注意点。
https://my.oschina.net/90design/blog?sort=hot&temp=1523257103365