From 34171a69d52a2bab1b2cfa403928616c260d92b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=AEittaG=20ordnasselA?= Date: Mon, 27 May 2019 14:39:14 +0200 Subject: [PATCH] Deprecate old "stats" and add a new one based on prometheus --- Dockerfile.broker | 9 +++ Dockerfile.mods | 6 ++ Dockerfile.stats | 6 ++ stats-old/mod/main.go | 46 +++++++++++ {stats => stats-old/mod}/stats.go | 0 {stats => stats-old/mod}/users.go | 0 {stats => stats-old/mod}/web.go | 0 .../stats-import}/main.go | 0 .../stats-web}/Chart.bundle.min.js | 0 {stats-web => stats-old/stats-web}/index.html | 0 stats/go.mod | 6 ++ stats/go.sum | 55 +++++++++++++ stats/main.go | 81 +++++++++++-------- stats/metrics.go | 33 ++++++++ 14 files changed, 207 insertions(+), 35 deletions(-) create mode 100644 Dockerfile.broker create mode 100644 Dockerfile.mods create mode 100644 Dockerfile.stats create mode 100644 stats-old/mod/main.go rename {stats => stats-old/mod}/stats.go (100%) rename {stats => stats-old/mod}/users.go (100%) rename {stats => stats-old/mod}/web.go (100%) rename {stats-import => stats-old/stats-import}/main.go (100%) rename {stats-web => stats-old/stats-web}/Chart.bundle.min.js (100%) mode change 100755 => 100644 rename {stats-web => stats-old/stats-web}/index.html (100%) create mode 100644 stats/go.mod create mode 100644 stats/go.sum create mode 100644 stats/metrics.go diff --git a/Dockerfile.broker b/Dockerfile.broker new file mode 100644 index 0000000..5068a01 --- /dev/null +++ b/Dockerfile.broker @@ -0,0 +1,9 @@ +FROM golang:alpine + +RUN apk add git +RUN go get -u git.fromouter.space/hamcha/tg/cmd/tg-broker + +ENTRYPOINT [ "tg-broker" ] + +EXPOSE 7313 +EXPOSE 7314 \ No newline at end of file diff --git a/Dockerfile.mods b/Dockerfile.mods new file mode 100644 index 0000000..90a5bfd --- /dev/null +++ b/Dockerfile.mods @@ -0,0 +1,6 @@ +FROM golang:alpine + +RUN apk add git +RUN go get -u git.fromouter.space/crunchy-rocks/clessy/mods + +ENTRYPOINT [ "mods" ] \ No newline at end of file diff --git a/Dockerfile.stats b/Dockerfile.stats new file mode 100644 index 0000000..fd2ffbe --- /dev/null +++ b/Dockerfile.stats @@ -0,0 +1,6 @@ +FROM golang:alpine + +RUN apk add git +RUN go get -u git.fromouter.space/crunchy-rocks/clessy/stats + +ENTRYPOINT [ "stats" ] \ No newline at end of file diff --git a/stats-old/mod/main.go b/stats-old/mod/main.go new file mode 100644 index 0000000..6a39754 --- /dev/null +++ b/stats-old/mod/main.go @@ -0,0 +1,46 @@ +package main + +import ( + "flag" + + "github.com/boltdb/bolt" + "github.com/hamcha/tg" +) + +func assert(err error) { + if err != nil { + panic(err) + } +} + +var db *bolt.DB +var chatID *int64 + +func process(broker *tg.Broker, update tg.APIMessage) { + // Process messages from marked chat only + if update.Chat.ChatID != *chatID { + return + } + getNick(update.User) + updateStats(update) +} + +func main() { + brokerAddr := flag.String("broker", "localhost:7314", "Broker address:port") + webBind := flag.String("webserver", "localhost:7315", "Address to bind webserver to") + boltdbFile := flag.String("boltdb", "stats.db", "BoltDB database file") + chatID = flag.Int64("chatid", -14625256, "Telegram Chat ID to count stats for") + flag.Parse() + + var err error + db, err = bolt.Open(*boltdbFile, 0600, nil) + assert(err) + defer db.Close() + + loadUsers() + loadStats() + + go startWebServer(*webBind) + + assert(tg.CreateBrokerClient(*brokerAddr, process)) +} diff --git a/stats/stats.go b/stats-old/mod/stats.go similarity index 100% rename from stats/stats.go rename to stats-old/mod/stats.go diff --git a/stats/users.go b/stats-old/mod/users.go similarity index 100% rename from stats/users.go rename to stats-old/mod/users.go diff --git a/stats/web.go b/stats-old/mod/web.go similarity index 100% rename from stats/web.go rename to stats-old/mod/web.go diff --git a/stats-import/main.go b/stats-old/stats-import/main.go similarity index 100% rename from stats-import/main.go rename to stats-old/stats-import/main.go diff --git a/stats-web/Chart.bundle.min.js b/stats-old/stats-web/Chart.bundle.min.js old mode 100755 new mode 100644 similarity index 100% rename from stats-web/Chart.bundle.min.js rename to stats-old/stats-web/Chart.bundle.min.js diff --git a/stats-web/index.html b/stats-old/stats-web/index.html similarity index 100% rename from stats-web/index.html rename to stats-old/stats-web/index.html diff --git a/stats/go.mod b/stats/go.mod new file mode 100644 index 0000000..7a793a2 --- /dev/null +++ b/stats/go.mod @@ -0,0 +1,6 @@ +module git.fromouter.space/crunchy-rocks/clessy/stats + +require ( + git.fromouter.space/hamcha/tg v0.0.0-20181213132350-d7698a3c50ea + github.com/prometheus/client_golang v0.9.3 +) diff --git a/stats/go.sum b/stats/go.sum new file mode 100644 index 0000000..99ab9b8 --- /dev/null +++ b/stats/go.sum @@ -0,0 +1,55 @@ +git.fromouter.space/hamcha/tg v0.0.0-20181213132350-d7698a3c50ea h1:2VrIQZEHaUGjf9Rqsli+S+/ZReLpodPWTklVUqQPCX0= +git.fromouter.space/hamcha/tg v0.0.0-20181213132350-d7698a3c50ea/go.mod h1:j0xF3DL3Y+HWAMzaFQlJxl9bLOKmFNEZNemg19vC+Cc= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/stats/main.go b/stats/main.go index 6a39754..095a402 100644 --- a/stats/main.go +++ b/stats/main.go @@ -1,46 +1,57 @@ -package main +package main // import "git.fromouter.space/crunchy-rocks/clessy/stats" import ( "flag" + "net/http" + "strconv" + "strings" - "github.com/boltdb/bolt" - "github.com/hamcha/tg" + "git.fromouter.space/hamcha/tg" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" ) +func process(broker *tg.Broker, update tg.APIUpdate) { + if update.Message != nil { + opTotalMsg.Inc() + // Check if it's a chat + if update.Message.Chat != nil { + opMsgPerChat.With(prometheus.Labels{ + "chatid": strconv.FormatInt(update.Message.Chat.ChatID, 10), + "user": update.Message.User.Username, + }).Inc() + } + if update.Message.Text != nil { + if strings.HasPrefix(*update.Message.Text, "/") { + opCommand.With(prometheus.Labels{ + "command": strings.SplitN(*update.Message.Text, " ", 2)[0], + }) + } + } + } +} + +func main() { + brokerAddr := flag.String("broker", "localhost:7314", "Broker address:port") + flag.Parse() + + registerMetrics() + + broker, err := tg.ConnectToBroker(*brokerAddr) + assert(err) + defer broker.Close() + + go func() { + http.Handle("/metrics", promhttp.Handler()) + http.ListenAndServe(":2112", nil) + }() + + assert(tg.RunBrokerClient(broker, process)) +} + func assert(err error) { if err != nil { panic(err) } } - -var db *bolt.DB -var chatID *int64 - -func process(broker *tg.Broker, update tg.APIMessage) { - // Process messages from marked chat only - if update.Chat.ChatID != *chatID { - return - } - getNick(update.User) - updateStats(update) -} - -func main() { - brokerAddr := flag.String("broker", "localhost:7314", "Broker address:port") - webBind := flag.String("webserver", "localhost:7315", "Address to bind webserver to") - boltdbFile := flag.String("boltdb", "stats.db", "BoltDB database file") - chatID = flag.Int64("chatid", -14625256, "Telegram Chat ID to count stats for") - flag.Parse() - - var err error - db, err = bolt.Open(*boltdbFile, 0600, nil) - assert(err) - defer db.Close() - - loadUsers() - loadStats() - - go startWebServer(*webBind) - - assert(tg.CreateBrokerClient(*brokerAddr, process)) -} diff --git a/stats/metrics.go b/stats/metrics.go new file mode 100644 index 0000000..4554517 --- /dev/null +++ b/stats/metrics.go @@ -0,0 +1,33 @@ +package main + +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +var ( + opTotalMsg = promauto.NewCounter(prometheus.CounterOpts{ + Name: "broker_received_total", + Help: "The total number of received messages", + }) + opMsgPerChat = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "broker_received_chat", + Help: "The number of received messages per chat", + }, []string{ + "chatid", + "user", + "messagetype", + }) + opCommand = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "broker_received_commands", + Help: "The number of commands written in chats (or privately)", + }, []string{ + "command", + }) +) + +func registerMetrics() { + prometheus.MustRegister(opTotalMsg) + prometheus.MustRegister(opMsgPerChat) + prometheus.MustRegister(opCommand) +}