159 lines
3.6 KiB
Go
159 lines
3.6 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"time"
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"go-common/app/service/ops/log-agent/conf"
|
|
"go-common/library/log"
|
|
"go-common/app/service/ops/log-agent/pipeline"
|
|
"go-common/app/service/ops/log-agent/pipeline/hostlogcollector"
|
|
"go-common/app/service/ops/log-agent/pipeline/dockerlogcollector"
|
|
"go-common/app/service/ops/log-agent/pkg/limit"
|
|
"go-common/app/service/ops/log-agent/pkg/flowmonitor"
|
|
"go-common/app/service/ops/log-agent/pkg/httpstream"
|
|
"go-common/app/service/ops/log-agent/pkg/lancermonitor"
|
|
"go-common/app/service/ops/log-agent/pkg/lancerroute"
|
|
"go-common/library/conf/env"
|
|
xip "go-common/library/net/ip"
|
|
"go-common/library/naming/discovery"
|
|
"go-common/library/naming"
|
|
)
|
|
|
|
const AppVersion = "2.1.0"
|
|
|
|
type Agent struct {
|
|
limit *limit.Limit
|
|
httpstream *httpstream.HttpStream
|
|
}
|
|
|
|
func main() {
|
|
var (
|
|
err error
|
|
ctx, cancel = context.WithCancel(context.Background())
|
|
//cancel context.CancelFunc
|
|
)
|
|
version := flag.Bool("v", false, "show version and exit")
|
|
flag.Parse()
|
|
if *version {
|
|
fmt.Println(AppVersion)
|
|
os.Exit(0)
|
|
}
|
|
|
|
if err = conf.Init(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
agent := new(Agent)
|
|
|
|
// set context
|
|
ctx = context.WithValue(ctx, "GlobalConfig", conf.Conf)
|
|
ctx = context.WithValue(ctx, "MetaPath", conf.Conf.HostLogCollector.MetaPath)
|
|
|
|
// init xlog
|
|
conf.Conf.Log.Stdout = true // ooooo just for test
|
|
log.Init(conf.Conf.Log)
|
|
defer log.Close()
|
|
log.Info("log agent [version: %s] start", AppVersion)
|
|
|
|
// resource limit by cgroup
|
|
if conf.Conf.Limit != nil {
|
|
conf.Conf.Limit.AppName = "log-agent"
|
|
if agent.limit, err = limit.LimitRes(conf.Conf.Limit); err != nil {
|
|
log.Warn("resource limit disabled: %s", err)
|
|
}
|
|
}
|
|
|
|
// /debug/vars
|
|
if conf.Conf.DebugAddr != "" {
|
|
go http.ListenAndServe(conf.Conf.DebugAddr, nil)
|
|
}
|
|
|
|
// init lancer route
|
|
err = lancerroute.InitLancerRoute()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// httpstream
|
|
if agent.httpstream, err = httpstream.NewHttpStream(conf.Conf.HttpStream); err != nil {
|
|
log.Warn("httpstream disabled: %s", err)
|
|
}
|
|
|
|
// start pipeline management
|
|
err = pipeline.InitPipelineMng(ctx)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// start host log collector
|
|
err = hostlogcollector.InitHostLogCollector(ctx, conf.Conf.HostLogCollector)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// start docker log collector
|
|
err = dockerlogcollector.InitDockerLogCollector(ctx, conf.Conf.DockerLogCollector)
|
|
if err != nil {
|
|
log.Error("failed to start docker log collector: %s", err)
|
|
}
|
|
|
|
// flow monitor
|
|
if conf.Conf.Flowmonitor != nil {
|
|
if err = flowmonitor.InitFlowMonitor(conf.Conf.Flowmonitor); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// lancer monitor
|
|
if conf.Conf.LancerMonitor != nil {
|
|
if _, err = lancermonitor.InitLancerMonitor(conf.Conf.LancerMonitor); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// start discovery register
|
|
if env.IP == "" {
|
|
ip := xip.InternalIP()
|
|
dis := discovery.New(conf.Conf.Discovery)
|
|
ins := &naming.Instance{
|
|
Zone: env.Zone,
|
|
Env: env.DeployEnv,
|
|
AppID: env.AppID,
|
|
Hostname: env.Hostname,
|
|
Version: AppVersion,
|
|
Addrs: []string{
|
|
ip,
|
|
},
|
|
}
|
|
_, err = dis.Register(ctx, ins)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// signal
|
|
ch := make(chan os.Signal, 1)
|
|
signal.Notify(ch, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT, syscall.SIGSTOP)
|
|
for {
|
|
s := <-ch
|
|
log.Info("agent get a signal %s", s.String())
|
|
switch s {
|
|
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGSTOP, syscall.SIGINT, syscall.SIGHUP:
|
|
if cancel != nil {
|
|
cancel()
|
|
}
|
|
time.Sleep(time.Second)
|
|
return
|
|
default:
|
|
return
|
|
}
|
|
}
|
|
}
|