Files
gost-plugin/observer/example/http/main.go
T
2024-01-27 21:28:52 +08:00

87 lines
1.9 KiB
Go

package main
import (
"bytes"
"encoding/json"
"flag"
"fmt"
"io"
"log"
"net"
"net/http"
)
var (
port = flag.Int("port", 8000, "The server port")
)
type observeRequest struct {
Events []event `json:"events"`
}
type event struct {
Kind string `json:"kind"`
Service string `json:"service"`
Client string `json:"client,omitempty"`
Type string `json:"type"`
Stats *statsEvent `json:"stats,omitempty"`
Status *statusEvent `json:"status,omitempty"`
}
type statsEvent struct {
TotalConns uint64 `json:"totalConns"`
CurrentConns int64 `json:"currentConns"`
InputBytes uint64 `json:"inputBytes"`
OutputBytes uint64 `json:"outputBytes"`
}
type statusEvent struct {
State string `json:"state"`
Msg string `json:"msg"`
}
type observeResponse struct {
OK bool `json:"ok"`
}
func main() {
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
log.Printf("server listening at %v", lis.Addr())
http.HandleFunc("/observer", func(w http.ResponseWriter, r *http.Request) {
rb := observeRequest{}
data, _ := io.ReadAll(r.Body)
log.Println(string(data))
if err := json.NewDecoder(bytes.NewReader(data)).Decode(&rb); err != nil {
log.Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
resp := observeResponse{
OK: true,
}
for _, event := range rb.Events {
switch event.Type {
case "service":
log.Printf("observe %s: kind=%s, service=%s, status=%+v", event.Type, event.Kind, event.Service, event.Status)
case "stats":
log.Printf("observe %s: kind=%s, service=%s, client=%s, stats=%+v", event.Type, event.Kind, event.Service, event.Client, event.Stats)
default:
log.Printf("observe %+v", event)
}
}
json.NewEncoder(w).Encode(resp)
})
if err := http.Serve(lis, nil); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}