forked from loweel/zabov
				
			
		
			
				
	
	
		
			106 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
type send struct {
 | 
						|
	Payload   string
 | 
						|
	Number    int64
 | 
						|
	Operation string
 | 
						|
}
 | 
						|
 | 
						|
//ZabovStats is used to keep statistics to print
 | 
						|
var ZabovStats map[string]int64
 | 
						|
 | 
						|
var stats chan send
 | 
						|
 | 
						|
func init() {
 | 
						|
 | 
						|
	stats = make(chan send, 1024)
 | 
						|
 | 
						|
	ZabovStats = make(map[string]int64)
 | 
						|
 | 
						|
	fmt.Println("Initializing stats engine.")
 | 
						|
	go reportPrintThread()
 | 
						|
	go statsThread()
 | 
						|
}
 | 
						|
 | 
						|
func statsPrint() {
 | 
						|
	fmt.Println()
 | 
						|
	stat, _ := json.Marshal(ZabovStats)
 | 
						|
	fmt.Println(jsonPrettyPrint(string(stat)))
 | 
						|
	fmt.Println()
 | 
						|
}
 | 
						|
 | 
						|
func incrementStats(key string, value int64) {
 | 
						|
 | 
						|
	var s send
 | 
						|
 | 
						|
	s.Payload = key
 | 
						|
	s.Number = value
 | 
						|
	s.Operation = "INC"
 | 
						|
 | 
						|
	stats <- s
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
func setstatsvalue(key string, value int64) {
 | 
						|
 | 
						|
	var s send
 | 
						|
 | 
						|
	s.Payload = key
 | 
						|
	s.Number = value
 | 
						|
	s.Operation = "SET"
 | 
						|
 | 
						|
	stats <- s
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
func reportPrintThread() {
 | 
						|
	for {
 | 
						|
		var s send
 | 
						|
		s.Operation = "PRI"
 | 
						|
		s.Payload = "-"
 | 
						|
		s.Number = 0
 | 
						|
		stats <- s
 | 
						|
		time.Sleep(2 * time.Minute)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func statsThread() {
 | 
						|
 | 
						|
	fmt.Println("Starting Statistical Collection Thread")
 | 
						|
 | 
						|
	for item := range stats {
 | 
						|
 | 
						|
		switch item.Operation {
 | 
						|
		case "INC":
 | 
						|
			ZabovStats[item.Payload] += item.Number
 | 
						|
		case "SET":
 | 
						|
			if item.Number == 0 {
 | 
						|
 | 
						|
				delete(ZabovStats, item.Payload)
 | 
						|
			} else {
 | 
						|
				ZabovStats[item.Payload] = item.Number
 | 
						|
			}
 | 
						|
		case "PRI":
 | 
						|
			statsPrint()
 | 
						|
		}
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
func jsonPrettyPrint(in string) string {
 | 
						|
	var out bytes.Buffer
 | 
						|
	err := json.Indent(&out, []byte(in), "", "\t")
 | 
						|
	if err != nil {
 | 
						|
		return in
 | 
						|
	}
 | 
						|
	return out.String()
 | 
						|
}
 |