func main() { // Metron is intended to be light-weight so we occupy only one core runtime.GOMAXPROCS(1) flag.Parse() config, logger := parseConfig(*debug, *configFilePath, *logFilePath) dopplerClientPool := initializeClientPool(config, logger) dopplerForwarder := dopplerforwarder.New(dopplerClientPool, logger) byteSigner := signer.New(config.SharedSecret, dopplerForwarder) marshaller := eventmarshaller.New(byteSigner, logger) messageTagger := tagger.New(config.Deployment, config.Job, config.Index, marshaller) aggregator := messageaggregator.New(messageTagger, logger) initializeMetrics(byteSigner, config, logger) dropsondeUnmarshaller := eventunmarshaller.New(aggregator, logger) dropsondeReader := networkreader.New(fmt.Sprintf("localhost:%d", config.DropsondeIncomingMessagesPort), "dropsondeAgentListener", dropsondeUnmarshaller, logger) // TODO: remove next four lines when legacy support is removed (or extracted to injector) legacyMarshaller := eventmarshaller.New(byteSigner, logger) legacyMessageTagger := tagger.New(config.Deployment, config.Job, config.Index, legacyMarshaller) legacyUnmarshaller := legacyunmarshaller.New(legacyMessageTagger, logger) legacyReader := networkreader.New(fmt.Sprintf("localhost:%d", config.LegacyIncomingMessagesPort), "legacyAgentListener", legacyUnmarshaller, logger) go legacyReader.Start() dropsondeReader.Start() }
func main() { // Metron is intended to be light-weight so we occupy only one core runtime.GOMAXPROCS(1) flag.Parse() config, err := config.ParseConfig(*configFilePath) if err != nil { panic(err) } log := logger.NewLogger(*debug, *logFilePath, "metron", config.Syslog) log.Info("Startup: Setting up the Metron agent") dopplerClientPool, err := initializeClientPool(config, log) if err != nil { log.Errorf("Error while initializing client pool: %s", err.Error()) os.Exit(-1) } dopplerForwarder := dopplerforwarder.New(dopplerClientPool, log) byteSigner := signer.New(config.SharedSecret, dopplerForwarder) marshaller := eventmarshaller.New(byteSigner, log) messageTagger := tagger.New(config.Deployment, config.Job, config.Index, marshaller) aggregator := messageaggregator.New(messageTagger, log) initializeMetrics(byteSigner, config, log) dropsondeUnmarshaller := eventunmarshaller.New(aggregator, log) dropsondeReader := networkreader.New(fmt.Sprintf("localhost:%d", config.DropsondeIncomingMessagesPort), "dropsondeAgentListener", dropsondeUnmarshaller, log) log.Info("metron started") dropsondeReader.Start() }
func main() { flag.Parse() config, logger := parseConfig(*debug, *configFilePath, *logFilePath) dopplerClientPool := initializeClientPool(config, logger) dopplerForwarder := dopplerforwarder.New(dopplerClientPool, logger) byteSigner := signer.New(config.SharedSecret, dopplerForwarder) marshaller := eventmarshaller.New(byteSigner, logger) varzShim := varzforwarder.New(config.Job, metricTTL, marshaller, logger) messageTagger := tagger.New(config.Deployment, config.Job, config.Index, varzShim) aggregator := messageaggregator.New(messageTagger, logger) dropsondeUnmarshaller := eventunmarshaller.New(aggregator, logger) dropsondeReader := networkreader.New(fmt.Sprintf("localhost:%d", config.DropsondeIncomingMessagesPort), "dropsondeAgentListener", dropsondeUnmarshaller, logger) // TODO: remove next two lines when legacy support is removed (or extracted to injector) legacyUnmarshaller := legacyunmarshaller.New(aggregator, logger) legacyReader := networkreader.New(fmt.Sprintf("localhost:%d", config.LegacyIncomingMessagesPort), "legacyAgentListener", legacyUnmarshaller, logger) instrumentables := []instrumentation.Instrumentable{ legacyReader, dropsondeReader, legacyUnmarshaller, dropsondeUnmarshaller, aggregator, varzShim, marshaller, } go startMonitoringEndpoints(config, instrumentables, logger) go legacyReader.Start() dropsondeReader.Start() }
func main() { // Metron is intended to be light-weight so we occupy only one core runtime.GOMAXPROCS(1) flag.Parse() config, err := config.ParseConfig(*configFilePath) if err != nil { panic(fmt.Errorf("Unable to parse config: %s", err)) } localIp, err := localip.LocalIP() if err != nil { panic(fmt.Errorf("Unable to resolve own IP address: %s", err)) } log := logger.NewLogger(*debug, *logFilePath, "metron", config.Syslog) go func() { err := http.ListenAndServe(net.JoinHostPort(localIp, pprofPort), nil) if err != nil { log.Errorf("Error starting pprof server: %s", err.Error()) } }() log.Info("Startup: Setting up the Metron agent") marshaller, err := initializeDopplerPool(config, log) if err != nil { panic(fmt.Errorf("Could not initialize doppler connection pool: %s", err)) } messageTagger := tagger.New(config.Deployment, config.Job, config.Index, marshaller) aggregator := messageaggregator.New(messageTagger, log) statsStopChan := make(chan struct{}) initializeMetrics(messageTagger, config, statsStopChan, log) dropsondeUnmarshaller := eventunmarshaller.New(aggregator, log) metronAddress := fmt.Sprintf("127.0.0.1:%d", config.IncomingUDPPort) dropsondeReader, err := networkreader.New(metronAddress, "dropsondeAgentListener", dropsondeUnmarshaller, log) if err != nil { panic(fmt.Errorf("Failed to listen on %s: %s", metronAddress, err)) } log.Info("metron started") go dropsondeReader.Start() dumpChan := signalmanager.RegisterGoRoutineDumpSignalChannel() killChan := signalmanager.RegisterKillSignalChannel() for { select { case <-dumpChan: signalmanager.DumpGoRoutine() case <-killChan: log.Info("Shutting down") close(statsStopChan) return } } }
func initializeMetrics(messageTagger *tagger.Tagger, config *config.Config, logger *gosteno.Logger) { metricsAggregator := messageaggregator.New(messageTagger, logger) eventWriter := eventwriter.New("MetronAgent", metricsAggregator) metricSender := metric_sender.NewMetricSender(eventWriter) metricBatcher := metricbatcher.New(metricSender, time.Duration(config.MetricBatchIntervalSeconds)*time.Second) metrics.Initialize(metricSender, metricBatcher) }
func initializeMetrics(byteSigner *signer.Signer, config *config.Config, logger *gosteno.Logger) { metricsMarshaller := eventmarshaller.New(byteSigner, logger) metricsTagger := tagger.New(config.Deployment, config.Job, config.Index, metricsMarshaller) metricsAggregator := messageaggregator.New(metricsTagger, logger) eventWriter := eventwriter.New("MetronAgent", metricsAggregator) metricSender := metric_sender.NewMetricSender(eventWriter) metricBatcher := metricbatcher.New(metricSender, time.Duration(config.MetricBatchIntervalSeconds)*time.Second) metrics.Initialize(metricSender, metricBatcher) }
func initializeMetrics(messageTagger *tagger.Tagger, config *config.Config, stopChan chan struct{}, logger *gosteno.Logger) { metricsAggregator := messageaggregator.New(messageTagger, logger) eventWriter := eventwriter.New("MetronAgent", metricsAggregator) metricSender := metric_sender.NewMetricSender(eventWriter) metricBatcher := metricbatcher.New(metricSender, time.Duration(config.MetricBatchIntervalMilliseconds)*time.Millisecond) metrics.Initialize(metricSender, metricBatcher) stats := runtime_stats.NewRuntimeStats(eventWriter, time.Duration(config.RuntimeStatsIntervalMilliseconds)*time.Millisecond) go stats.Run(stopChan) }
func main() { // Metron is intended to be light-weight so we occupy only one core runtime.GOMAXPROCS(1) flag.Parse() config, err := config.ParseConfig(*configFilePath) if err != nil { panic(err) } log := logger.NewLogger(*debug, *logFilePath, "metron", config.Syslog) log.Info("Startup: Setting up the Metron agent") dopplerClientPool, err := initializeDopplerPool(config, log) if err != nil { log.Errorf("Failed to initialize the doppler pool: %s", err.Error()) os.Exit(-1) } dopplerForwarder := dopplerforwarder.New(dopplerClientPool, []byte(config.SharedSecret), uint(config.BufferSize), log) messageTagger := tagger.New(config.Deployment, config.Job, config.Index, dopplerForwarder) aggregator := messageaggregator.New(messageTagger, log) initializeMetrics(messageTagger, config, log) dropsondeUnmarshaller := eventunmarshaller.New(aggregator, log) metronAddress := fmt.Sprintf("127.0.0.1:%d", config.DropsondeIncomingMessagesPort) dropsondeReader, err := networkreader.New(metronAddress, "dropsondeAgentListener", dropsondeUnmarshaller, log) if err != nil { log.Errorf("Failed to listen on %s: %s", metronAddress, err) os.Exit(1) } log.Info("metron started") go dopplerForwarder.Run() dropsondeReader.Start() dopplerForwarder.Stop() }
func main() { // Put os.Exit in a deferred statement so that other defers get executed prior to // the os.Exit call. exitCode := 0 defer func() { os.Exit(exitCode) }() // Metron is intended to be light-weight so we occupy only one core runtime.GOMAXPROCS(1) flag.Parse() config, err := config.ParseConfig(*configFilePath) if err != nil { panic(err) } log := logger.NewLogger(*debug, *logFilePath, "metron", config.Syslog) log.Info("Startup: Setting up the Metron agent") profiler := profiler.New(*cpuprofile, *memprofile, 1*time.Second, log) profiler.Profile() defer profiler.Stop() dopplerClientPool, err := initializeDopplerPool(config, log) if err != nil { log.Errorf("Failed to initialize the doppler pool: %s", err.Error()) os.Exit(-1) } dopplerForwarder := dopplerforwarder.New(dopplerClientPool, []byte(config.SharedSecret), uint(config.BufferSize), config.EnableBuffer, log) messageTagger := tagger.New(config.Deployment, config.Job, config.Index, dopplerForwarder) aggregator := messageaggregator.New(messageTagger, log) statsStopChan := make(chan struct{}) initializeMetrics(messageTagger, config, statsStopChan, log) dropsondeUnmarshaller := eventunmarshaller.New(aggregator, log) metronAddress := fmt.Sprintf("127.0.0.1:%d", config.DropsondeIncomingMessagesPort) dropsondeReader, err := networkreader.New(metronAddress, "dropsondeAgentListener", dropsondeUnmarshaller, log) if err != nil { log.Errorf("Failed to listen on %s: %s", metronAddress, err) exitCode = 1 return } log.Info("metron started") go dopplerForwarder.Run() go dropsondeReader.Start() dumpChan := signalmanager.RegisterGoRoutineDumpSignalChannel() killChan := signalmanager.RegisterKillSignalChannel() for { select { case <-dumpChan: signalmanager.DumpGoRoutine() case <-killChan: log.Info("Shutting down") dopplerForwarder.Stop() close(statsStopChan) return } } }
"github.com/cloudfoundry/loggregatorlib/loggertesthelper" "github.com/cloudfoundry/sonde-go/events" "github.com/gogo/protobuf/proto" ) var _ = Describe("MessageAggregator", func() { var ( mockWriter *mocks.MockEnvelopeWriter messageAggregator *messageaggregator.MessageAggregator originalTTL time.Duration ) BeforeEach(func() { mockWriter = &mocks.MockEnvelopeWriter{} messageAggregator = messageaggregator.New( mockWriter, loggertesthelper.Logger(), ) originalTTL = messageaggregator.MaxTTL }) AfterEach(func() { messageaggregator.MaxTTL = originalTTL }) It("passes value messages through", func() { inputMessage := createValueMessage() messageAggregator.Write(inputMessage) Expect(mockWriter.Events).To(HaveLen(1)) Expect(mockWriter.Events[0]).To(Equal(inputMessage)) })