示例#1
0
文件: statsd.go 项目: pronix/logsend
func InitStatsd(ch chan *map[string]map[string]int64, conf *StatsdConfig) error {
	go func() {
		statsdclient := statsd.NewStatsdClient(conf.Host, conf.Prefix)
		statsdclient.CreateSocket()
		interval, err := time.ParseDuration(conf.Interval)
		if err != nil {
			Conf.Logger.Fatalf("can't parse interval %+v", err)
		}
		stats := statsd.NewStatsdBuffer(interval, statsdclient)
		defer stats.Close()
		for data := range statsdCh {
			for op, values := range *data {
				for key, val := range values {
					switch op {
					case "increment":
						debug("send incr", key, val)
						go stats.Incr(key, val)
					case "timing":
						debug("send timing", key, val)
						go stats.Timing(key, val)
					case "gauge":
						debug("send gauge", key, val)
						go stats.Gauge(key, val)
					}
				}

			}
		}
	}()
	return nil
}
示例#2
0
func (varnishncsa *Varnishncsa) Connect() {
	statsdclient := statsd.NewStatsdClient(varnishncsa.StatsdServer, varnishncsa.StatsdPrefix)
	statsdclient.CreateSocket()
	interval := time.Duration(int(time.Millisecond) * varnishncsa.StatsdSendInterval)
	stats := statsd.NewStatsdBuffer(interval, statsdclient)
	defer stats.Close()

	cmd := exec.Command("varnishncsa", "-F", `%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i" %{Varnish:time_firstbyte}x`)
	stdout, outerr := cmd.StdoutPipe()
	if outerr != nil {
		log.Fatal(outerr)
	}

	err := cmd.Start()
	if err != nil {
		log.Fatal(err)
	}

	scanner := bufio.NewScanner(stdout)
	for scanner.Scan() {
		r := Record{scanner.Text(), stats, varnishncsa.RecordRegex}
		r.Process()
	}
	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "There was an error with the scanner attached to varnishncsa", err)
	}
	cmd.Wait()
}
示例#3
0
// CreateStatsdClient creates a local instances of a statsd client. Any errors will be logged to
// console and ignored.
func CreateStatsdClient(statsdURL, statsdPrefix string) error {
	lock.Lock()
	defer lock.Unlock()

	if stats != noopClient {
		// Already initialized. Don't overwrite
		return nil
	}

	if statsdURL != "" {
		hostname, err := os.Hostname()
		if err != nil {
			log.Printf("Could not read hostname. Using default noop statsd client: %s", err)
			return err
		}
		prefix := fmt.Sprintf("%s.%s.artifacts.", statsdPrefix, hostname)

		statsdClient := statsd.NewStatsdClient(statsdURL, prefix)

		if statsdClient != nil {
			stats = statsd.NewStatsdBuffer(updateInterval, statsdClient)
		}
	} else {
		log.Println("No statsd URL provided. Using default noop statsd client")
	}

	return nil
}
示例#4
0
func main() {
	// Initialize the StatsD client
	prefix := "test.rob-egan."
	statsdclient := statsd.NewStatsdClient(agentServer, prefix)
	err := statsdclient.CreateSocket()
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}
	interval := time.Second * 2 // aggregate stats and flush every 2 seconds
	stats := statsd.NewStatsdBuffer(interval, statsdclient)
	defer stats.Close()

	// Handler functions
	http.HandleFunc("/", handler)
	http.HandleFunc("/lissajous", func(w http.ResponseWriter, r *http.Request) {
		lissajous(w)
	})
	http.HandleFunc("/debug", debug)
	http.HandleFunc("/count", counter)
	http.HandleFunc("/help", help)

	// The actual web server
	log.Print("Starting web server...\n")
	log.Print("Point your browser to http://", webServerHost, "/help for more info...\n")
	log.Fatal(http.ListenAndServe(webServerHost, nil))
}
示例#5
0
func runLoop(redisHost string, redisPort int64, redisDb int64, statsdHost string, statsdPort int64, statsPrefix string, interval int64, queues []string) {
	client := redis.NewClient(&redis.Options{
		Addr: fmt.Sprintf("%s:%d", redisHost, redisPort),
		DB:   redisDb,
	})
	_, connErr := client.Ping().Result()
	fmt.Println("connection errors? ", connErr)

	statsdClient := statsd.NewStatsdClient(
		fmt.Sprintf("%s:%d", statsdHost, statsdPort),
		fmt.Sprintf("%s.", statsPrefix),
	)
	statsdClient.CreateSocket()
	stats := statsd.NewStatsdBuffer(time.Second*2, statsdClient)
	defer stats.Close()
	timeoutInterval := time.Duration(interval) * time.Millisecond
	for true {
		for _, name := range queues {
			go func(oneName string) {
				listLength, err := client.LLen(oneName).Result()
				stats.Gauge(oneName, listLength)
				fmt.Println(oneName, listLength, err)
			}(name)
		}
		time.Sleep(timeoutInterval)
	}
}
示例#6
0
文件: server.go 项目: kureikain/fdns
func initStatsd(address string, prefix string) *statsd.StatsdBuffer {
	statsdclient := statsd.NewStatsdClient(address, prefix)
	statsdclient.CreateSocket()
	interval := time.Second * 10 // aggregate stats and flush every 2 seconds
	stats := statsd.NewStatsdBuffer(interval, statsdclient)
	return stats
}
func mustStartStatsd(host string, prefix string, frequency time.Duration) *statsd.StatsdBuffer {
	sClient := statsd.NewStatsdClient(opts.StatsDHost, opts.StatsDPrefix)
	if err := sClient.CreateSocket(); err != nil {
		log.WithField("error", err).Fatal("could not open socket to statsd")
	}

	return statsd.NewStatsdBuffer(opts.statsdFrequency, sClient)
}
示例#8
0
func getStatsdBuffer(host string) (*statsd.StatsdBuffer, error) {
	statsdclient := statsd.NewStatsdClient(host, "aws.sqs.")
	if err := statsdclient.CreateSocket(); err != nil {
		log.WithField("error", err).Warn("unable to open socket for statsd")
		return nil, err
	}

	return statsd.NewStatsdBuffer(time.Minute, statsdclient), nil
}
示例#9
0
func NewStatsdClient(simulationPrefix string) *StatsdClient {
	statsdClient := statsd.NewStatsdClient("localhost:8125", simulationPrefix)
	statsdClient.CreateSocket()
	interval := time.Second * 2
	stats := statsd.NewStatsdBuffer(interval, statsdClient)
	return &StatsdClient{
		Stats: stats,
	}
}
示例#10
0
func main() {
	fmt.Println("Starting eISCP (ethernet Integra Serial Communication Protocol) Gateway")
	// Command line options
	flag.BoolVar(&debug, "debug", false, "enable verbose debugging")
	flag.BoolVar(&statsEnabled, "stats", false, "enable stats collecting")
	flag.StringVar(&defaultDevice, "device", "192.168.2.143", "IP address of device to connect to")
	flag.IntVar(&devicePort, "port", 60128, "port on device to commmunicate with")
	flag.IntVar(&defaultPort, "serve", 3000, "port to host REST API on")
	flag.StringVar(&statsdAddress, "statsd", "localhost:8125", "IP and Port of Statsd server")
	flag.StringVar(&statsdPrefix, "prefix", "eiscp", "A prefix prepended to all stats")

	// Now that we've defined our flags, parse them
	flag.Parse()

	if debug {
		fmt.Println("Displaying debug output.")
	}

	// init
	statsdclient := statsd.NewStatsdClient(statsdAddress, statsdPrefix)
	if statsEnabled {
		if debug {
			fmt.Println("Attempting connection to statsd")
		}
		statsdclient.CreateSocket()
		interval := time.Second * 2 // aggregate stats and flush every 2 seconds
		stats = statsd.NewStatsdBuffer(interval, statsdclient)
		defer stats.Close()
	}

	fmt.Println("Searching for device on port", devicePort, "at", defaultDevice)

	// Do our device stuff here
	go func() {
		for true {
			deviceLoop()
		}
	}()

	r := mux.NewRouter()
	r.HandleFunc("/kill", HandleKill) //Debug Function
	r.HandleFunc("/status/", GetStatus).Methods("GET")
	r.HandleFunc("/device/", DeleteDevice).Methods("DELETE")
	r.HandleFunc("/device/{ip}/{port}", PutDevice).Methods("PUT")
	r.HandleFunc("/device/{property}", GetProperty).Methods("GET")
	r.HandleFunc("/device/{property}/{value}", PostProperty).Methods("POST")
	http.Handle("/", r)

	fmt.Println("REST API listening on port", strconv.Itoa(defaultPort))
	http.ListenAndServe(":"+strconv.Itoa(defaultPort), nil)
}
示例#11
0
func BenchmarkQuipoTimingAsDuration(b *testing.B) {
	s := newServer()
	c := quipo.NewStatsdBuffer(flushPeriod, quipo.NewStatsdClient(addr, prefix))
	c.Logger = logger{}
	b.StartTimer()
	for i := 0; i < b.N; i++ {
		c.Incr(counterKey, 1)
		c.Gauge(gaugeKey, gaugeValue)
		c.PrecisionTiming(timingKey, tValDur)
	}
	c.Close()
	b.StopTimer()
	s.Close()
}
示例#12
0
func TestMain(m *testing.M) {
	var statsdHost = flag.String("test_statsd_host", "", "Statsd server hostname or IP")
	var statsdInterval = flag.Int("test_statsd_interval", 3, "Seconds between metric flush")
	var statsdPrefix = flag.String("test_statsd_prefix", "gopassivedns", "statsd metric prefix")

	flag.Parse()

	if *statsdHost != "" {
		statsdclient := statsd.NewStatsdClient(*statsdHost, *statsdPrefix)
		stats = statsd.NewStatsdBuffer(time.Duration(*statsdInterval)*time.Second, statsdclient)
	}

	os.Exit(m.Run())
}
示例#13
0
func BenchmarkQuipo(b *testing.B) {
	s := newServer()
	c := quipo.NewStatsdBuffer(flushPeriod, quipo.NewStatsdClient(s.Addr(), prefix))
	c.Logger = logger{}

	b.ResetTimer()

	for i := 0; i < b.N; i++ {
		c.Incr(counterKey, 1)
		c.Gauge(gaugeKey, gaugeValue)
		c.Timing(timingKey, int64(timingValue))
	}
	c.Close()
	s.Close()
}
示例#14
0
func main() {

	//insert the ENV as defaults here, then after the parse we add the true defaults if nothing has been set
	//also convert true/false strings to true/false types

	config := initConfig()

	if config.cpuprofile != "" {
		f, err := os.Create(config.cpuprofile)
		if err != nil {
			log.Fatal(err)
		}
		pprof.StartCPUProfile(f)
		defer pprof.StopCPUProfile()
	}

	var stats *statsd.StatsdBuffer = nil

	if config.statsdHost != "" {
		statsdclient := statsd.NewStatsdClient(config.statsdHost, config.statsdPrefix+"."+config.sensorName+".")
		stats = statsd.NewStatsdBuffer(time.Duration(config.statsdInterval)*time.Second, statsdclient)
	}

	handle := initHandle(config)

	if handle == nil {
		log.Fatal("Could not initilize the capture.")
	}

	logOpts := NewLogOptions(config)

	logChan := initLogging(logOpts)

	reChan := make(chan tcpDataStruct)

	//spin up logging thread(s)
	go logConn(logChan, logOpts, stats)

	//spin up the actual capture threads
	doCapture(handle, logChan, config, reChan, stats)

	log.Debug("Done!  Goodbye.")
	os.Exit(0)

}
示例#15
0
func InitStatsd(conf interface{}) {
	host := conf.(map[string]interface{})["host"].(string)
	prefix := ""
	_interval := "1s"
	if val, ok := conf.(map[string]interface{})["prefix"].(string); ok {
		prefix = val
	}
	if val, ok := conf.(map[string]interface{})["interval"].(string); ok {
		_interval = val
	}
	statsdclient := statsd.NewStatsdClient(host, prefix)

	statsdclient.CreateSocket()
	interval, err := time.ParseDuration(_interval)
	if err != nil {
		Conf.Logger.Fatalf("can't parse interval %+v", err)
	}
	stats := statsd.NewStatsdBuffer(interval, statsdclient)
	go func() {
		defer stats.Close()
		Conf.Logger.Println("Statsd queue is starts")
		for data := range statsdCh {
			for op, values := range *data {
				for key, val := range values {
					switch op {
					case "increment":
						debug("send incr", key, val)
						go stats.Incr(key, val)
					case "timing":
						debug("send timing", key, val)
						go stats.Timing(key, val)
					case "gauge":
						debug("send gauge", key, val)
						go stats.Gauge(key, val)
					}
				}

			}
		}

	}()
	return
}
示例#16
0
func NewMasterWithStatsd(host string, workerConfig *WorkerConfig, command, balanceConfigTemplate, balanceConfigFile, digitalOceanToken, digitalOceanImageID string,
	overloadedCpuThreshold, underusedCpuThreshold float64, minWorkers, maxWorkers int64, pollInterval, cooldownInterval, surveyDeadline, queryInterval time.Duration,
	scaleNodes, changeWeights bool,
	statsdAddr, statsdPrefix string, statsdInterval time.Duration) *Master {

	master := NewMaster(
		host, workerConfig, command,
		balanceConfigTemplate, balanceConfigFile,
		digitalOceanToken, digitalOceanImageID,
		overloadedCpuThreshold, underusedCpuThreshold,
		minWorkers, maxWorkers,
		pollInterval, cooldownInterval, surveyDeadline, queryInterval,
		scaleNodes, changeWeights,
	)
	statsdClient := statsd.NewStatsdClient(statsdAddr, statsdPrefix)
	statsdClient.CreateSocket()
	master.statsdClientBuffer = statsd.NewStatsdBuffer(statsdInterval, statsdClient)

	return master
}
示例#17
0
func NewMetricsManager(givenQueueManager *queueManager) *MetricsManager {
	m := MetricsManager{}

	m.queueManager = givenQueueManager

	m.metricsChannel = make(chan *Metric, 100)

	if Configuration.StatsDEndpoint != "" {
		m.statsdEnabled = true
		statsClient := statsd.NewStatsdClient(Configuration.StatsDEndpoint, "gamq.")
		statsClient.CreateSocket()
		interval := time.Second
		m.statsBuffer = statsd.NewStatsdBuffer(interval, statsClient)
		log.Debugf("Initialized StatsD - sending metrics to: %s", Configuration.StatsDEndpoint)
	} else {
		m.statsdEnabled = false
	}

	go m.listenForMetrics()

	return &m
}
示例#18
0
func main() {
	// init
	prefix := "myproject."
	statsdclient := statsd.NewStatsdClient("localhost:8125", prefix)
	err := statsdclient.CreateSocket()
	if nil != err {
		log.Println(err)
		os.Exit(1)
	}
	interval := time.Second * 2 // aggregate stats and flush every 2 seconds
	stats := statsd.NewStatsdBuffer(interval, statsdclient)
	defer stats.Close()

	// not buffered: send immediately
	statsdclient.Incr("mymetric", 4)

	// buffered: aggregate in memory before flushing
	stats.Incr("mymetric", 1)
	stats.Incr("mymetric", 3)
	stats.Incr("mymetric", 1)
	stats.Incr("mymetric", 1)
}