2018-07-06 01:42:09 +09:00
|
|
|
package main // import "amuz.es/src/infra/cpu_ctrl"
|
2017-09-05 01:13:03 +09:00
|
|
|
|
|
|
|
import (
|
2018-07-06 01:42:09 +09:00
|
|
|
"time"
|
|
|
|
"context"
|
2017-09-05 01:13:03 +09:00
|
|
|
"os"
|
2018-07-06 01:42:09 +09:00
|
|
|
"fmt"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"gopkg.in/alecthomas/kingpin.v2"
|
2017-09-10 16:28:50 +09:00
|
|
|
"runtime"
|
2018-07-06 01:42:09 +09:00
|
|
|
"amuz.es/src/infra/goutils/handler"
|
|
|
|
)
|
2017-09-11 01:49:54 +09:00
|
|
|
|
2018-07-06 01:42:09 +09:00
|
|
|
const (
|
|
|
|
name = "cpu_ctrl"
|
2017-09-05 01:13:03 +09:00
|
|
|
)
|
|
|
|
|
2018-07-06 01:42:09 +09:00
|
|
|
// command argument
|
2017-09-05 01:13:03 +09:00
|
|
|
var (
|
2018-07-06 01:42:09 +09:00
|
|
|
// 아래 부분은 컴파일시 하드코딩됨
|
|
|
|
buildDate, version string
|
|
|
|
|
|
|
|
app = kingpin.New(name, fmt.Sprintf("%s - metric collector", name)).Author("Amazing from here")
|
2017-09-13 07:27:24 +09:00
|
|
|
P = app.Flag("proportional-gain", "Set proportional gain value.").Short('p').Default("1.0").Float64()
|
2017-09-23 15:16:20 +09:00
|
|
|
I = app.Flag("integral-gain", "Set integral gain value.").Short('i').Default("0.4").Float64()
|
2017-09-11 01:58:42 +09:00
|
|
|
D = app.Flag("derivative-gain", "Set derivative gain value.").Short('d').Default("2.0").Float64()
|
2017-09-23 15:16:20 +09:00
|
|
|
SetPoint = app.Flag("set-point", "Set pointe tempeture").Short('t').Default("40.0").Float64()
|
2018-07-06 01:42:09 +09:00
|
|
|
SampleInterval = app.Flag("interval", "Set sampling interval").Short('s').Default("1s").Duration()
|
|
|
|
InfluxHost = app.Flag("influx-host", "Set influx host").Short('h').Default("db:8089").TCP()
|
|
|
|
verbose = app.Flag("verbose", "Enable verbose mode.").Short('v').Bool()
|
|
|
|
|
|
|
|
// 아래 부분은 실행될때 평가됨
|
|
|
|
start = time.Now().Local()
|
2017-09-11 01:49:54 +09:00
|
|
|
|
2018-07-06 01:42:09 +09:00
|
|
|
logger = zap.L().Sugar()
|
2017-09-05 01:13:03 +09:00
|
|
|
)
|
|
|
|
|
2017-09-10 16:28:50 +09:00
|
|
|
func init() {
|
2018-07-06 01:42:09 +09:00
|
|
|
defer finalCloser()
|
2017-09-11 01:49:54 +09:00
|
|
|
|
2018-07-06 01:42:09 +09:00
|
|
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
2017-09-05 01:13:03 +09:00
|
|
|
|
2018-07-06 01:42:09 +09:00
|
|
|
// command 설정 로드
|
|
|
|
app.Version(version)
|
|
|
|
if _, err := app.Parse(os.Args[1:]); err != nil {
|
|
|
|
fmt.Fprintln(os.Stderr, err.(error).Error())
|
|
|
|
os.Exit(1)
|
2017-09-10 19:45:30 +09:00
|
|
|
}
|
|
|
|
}
|
2017-09-11 00:22:51 +09:00
|
|
|
|
2018-07-06 01:42:09 +09:00
|
|
|
// 엔트리 포인트
|
2017-09-05 01:13:03 +09:00
|
|
|
func main() {
|
2018-07-06 01:42:09 +09:00
|
|
|
defer finalCloser()
|
|
|
|
|
|
|
|
// 로그 초기화
|
|
|
|
loggerCleanup := initLogger()
|
|
|
|
defer loggerCleanup()
|
|
|
|
|
|
|
|
// 컨텍스트 생성
|
|
|
|
// handler내부에서도 로거를 이용하기 때문에 로깅부분 밑에 위치해야 된다.
|
|
|
|
mainHandler := handler.NewHandler(context.Background())
|
|
|
|
|
|
|
|
// hello ;-)
|
|
|
|
logger.Infof(
|
|
|
|
"%s(%s), built: %s",
|
|
|
|
name,
|
|
|
|
version,
|
|
|
|
buildDate,
|
2017-09-05 01:13:03 +09:00
|
|
|
)
|
|
|
|
|
2018-07-06 01:42:09 +09:00
|
|
|
// 컨텍스트 띄우기
|
|
|
|
processorCleanup := initProcessor(mainHandler)
|
|
|
|
defer processorCleanup()
|
2017-09-10 16:28:50 +09:00
|
|
|
|
2018-07-06 01:42:09 +09:00
|
|
|
// 뭔가 문제가 나거나 signal이 발생할 때 까지 애플리케이션이 종료로 빠지지 않게 잡아주는 부분
|
|
|
|
contextWatcher, contextCloser := initContext(mainHandler)
|
|
|
|
defer contextCloser()
|
2017-09-11 07:41:59 +09:00
|
|
|
|
2018-07-06 01:42:09 +09:00
|
|
|
// ok
|
|
|
|
logger.Info("bootstrapped application ", time.Since(start), " ", time.Now())
|
|
|
|
contextWatcher()
|
|
|
|
logger.Info("served duration: ", time.Since(start))
|
2017-09-05 01:13:03 +09:00
|
|
|
}
|
2018-07-06 01:42:09 +09:00
|
|
|
|