package main
import (
"context"
"flag"
"fmt"
"os"
"github.com/go-kit/log/level"
"github.com/grafana/agent/pkg/build"
"github.com/grafana/agent/pkg/crow"
"github.com/grafana/agent/pkg/server"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
func init() {
prometheus.MustRegister(build.NewCollector("grafana_agent_crow"))
}
func main() {
var (
fs = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
serverCfg = server.DefaultConfig()
serverFlags = server.DefaultFlags
crowCfg = crow.DefaultConfig
showVersion bool
)
serverFlags.RegisterFlags(fs)
crowCfg.RegisterFlagsWithPrefix(fs, "crow.")
fs.BoolVar(&showVersion, "version", false, "show version")
if err := fs.Parse(os.Args[1:]); err != nil {
fmt.Fprintln(os.Stderr, "failed to parse flags", err)
os.Exit(1)
}
if showVersion {
fmt.Println(build.Print(os.Args[0]))
os.Exit(0)
}
l := server.NewLogger(&serverCfg)
crowCfg.Log = l
s, err := server.New(l, prometheus.DefaultRegisterer, prometheus.DefaultGatherer, serverCfg, serverFlags)
if err != nil {
level.Error(l).Log("msg", "failed to initialize server", "err", err)
os.Exit(1)
}
c, err := crow.New(crowCfg)
if err != nil {
level.Error(l).Log("msg", "failed to initialize crow", "err", err)
os.Exit(1)
}
defer c.Stop()
validator := prometheus.NewRegistry()
s.HTTP.Handle("/validate", promhttp.HandlerFor(validator, promhttp.HandlerOpts{
EnableOpenMetrics: true,
}))
prometheus.DefaultRegisterer.MustRegister(c.StateMetrics())
validator.MustRegister(c.TestMetrics())
ctx, cancel := server.SignalContext(context.Background(), l)
defer cancel()
if err := s.Run(ctx); err != nil {
level.Error(l).Log("msg", "server exited with error", "err", err)
os.Exit(1)
}
}