From 1b39ec70a32a9e09c4d6878d3819748f18162f04 Mon Sep 17 00:00:00 2001 From: Neur0toxine Date: Mon, 19 Dec 2022 10:05:50 +0300 Subject: [PATCH 1/2] zabbix collector support --- core/config/config.go | 18 +++++++++++++++++- core/engine.go | 28 ++++++++++++++++++++++++++-- go.mod | 5 +++-- go.sum | 20 ++++++++++++-------- 4 files changed, 58 insertions(+), 13 deletions(-) diff --git a/core/config/config.go b/core/config/config.go index 1e0f07f..468e652 100644 --- a/core/config/config.go +++ b/core/config/config.go @@ -15,6 +15,7 @@ type Configuration interface { GetSentryDSN() string GetLogLevel() logging.Level GetHTTPConfig() HTTPServerConfig + GetZabbixConfig() ZabbixConfig GetDBConfig() DatabaseConfig GetAWSConfig() AWS GetTransportInfo() InfoInterface @@ -37,6 +38,7 @@ type Config struct { ConfigAWS AWS `yaml:"config_aws"` TransportInfo Info `yaml:"transport_info"` HTTPServer HTTPServerConfig `yaml:"http_server"` + ZabbixConfig ZabbixConfig `yaml:"zabbix"` Version string `yaml:"version"` SentryDSN string `yaml:"sentry_dsn"` Database DatabaseConfig `yaml:"database"` @@ -88,9 +90,18 @@ type HTTPServerConfig struct { Listen string `yaml:"listen"` } +// ZabbixConfig contains information about Zabbix connection. +type ZabbixConfig struct { + ServerHost string `yaml:"server_host"` + ServerPort int `yaml:"server_port"` + Host string `yaml:"host"` + Interval uint64 `yaml:"interval"` +} + // NewConfig reads configuration file and returns config instance // Usage: -// NewConfig("config.yml") +// +// NewConfig("config.yml") func NewConfig(path string) *Config { return (&Config{}).LoadConfig(path) } @@ -166,6 +177,11 @@ func (c Config) GetHTTPConfig() HTTPServerConfig { return c.HTTPServer } +// GetZabbixConfig returns zabbix configuration. +func (c Config) GetZabbixConfig() ZabbixConfig { + return c.ZabbixConfig +} + // GetUpdateInterval user data update interval. func (c Config) GetUpdateInterval() int { return c.UpdateInterval diff --git a/core/engine.go b/core/engine.go index 531f0a1..bd3b38a 100644 --- a/core/engine.go +++ b/core/engine.go @@ -8,11 +8,13 @@ import ( "net/http" "sync" + "github.com/blacked/go-zabbix" "github.com/getsentry/sentry-go" "github.com/gin-gonic/gin" "github.com/gorilla/securecookie" "github.com/gorilla/sessions" "github.com/op/go-logging" + "github.com/retailcrm/zabbix-metrics-collector" "golang.org/x/text/language" "github.com/retailcrm/mg-transport-core/v2/core/config" @@ -65,6 +67,7 @@ type Engine struct { Sessions sessions.Store LogFormatter logging.Formatter Config config.Configuration + Zabbix metrics.Transport ginEngine *gin.Engine csrf *middleware.CSRF httpClient *http.Client @@ -160,6 +163,22 @@ func (e *Engine) Prepare() *Engine { return e } +func (e *Engine) UseZabbix(collectors []metrics.Collector) *Engine { + if e.Config == nil || e.Config.GetZabbixConfig().Interval == 0 { + return e + } + if e.Zabbix != nil { + for _, col := range collectors { + e.Zabbix.WithCollector(col) + } + return e + } + cfg := e.Config.GetZabbixConfig() + sender := zabbix.NewSender(cfg.ServerHost, cfg.ServerPort) + e.Zabbix = metrics.NewZabbix(collectors, sender, cfg.Host, cfg.Interval, e.Logger()) + return e +} + // TemplateFuncMap combines func map for templates. func (e *Engine) TemplateFuncMap(functions template.FuncMap) template.FuncMap { funcMap := e.LocalizationFuncMap() @@ -318,7 +337,8 @@ func (e *Engine) InitCSRF( // VerifyCSRFMiddleware returns CSRF verifier middleware // Usage: -// engine.Router().Use(engine.VerifyCSRFMiddleware(core.DefaultIgnoredMethods)) +// +// engine.Router().Use(engine.VerifyCSRFMiddleware(core.DefaultIgnoredMethods)) func (e *Engine) VerifyCSRFMiddleware(ignoredMethods []string) gin.HandlerFunc { if e.csrf == nil { panic("csrf is not initialized") @@ -329,7 +349,8 @@ func (e *Engine) VerifyCSRFMiddleware(ignoredMethods []string) gin.HandlerFunc { // GenerateCSRFMiddleware returns CSRF generator middleware // Usage: -// engine.Router().Use(engine.GenerateCSRFMiddleware()) +// +// engine.Router().Use(engine.GenerateCSRFMiddleware()) func (e *Engine) GenerateCSRFMiddleware() gin.HandlerFunc { if e.csrf == nil { panic("csrf is not initialized") @@ -355,6 +376,9 @@ func (e *Engine) ConfigureRouter(callback func(*gin.Engine)) *Engine { // Run gin.Engine loop, or panic if engine is not present. func (e *Engine) Run() error { + if e.Zabbix != nil { + go e.Zabbix.Run() + } return e.Router().Run(e.Config.GetHTTPConfig().Listen) } diff --git a/go.mod b/go.mod index abc874c..d48d79e 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.17.2 github.com/aws/aws-sdk-go-v2/config v1.18.4 github.com/aws/aws-sdk-go-v2/service/s3 v1.29.5 + github.com/blacked/go-zabbix v0.0.0-20170118040903-3c6a95ec4fdc github.com/denisenkom/go-mssqldb v0.0.0-20190830225923-3302f0226fbd // indirect github.com/getsentry/sentry-go v0.12.0 github.com/gin-contrib/multitemplate v0.0.0-20190914010127-bba2ccfe37ec @@ -30,7 +31,8 @@ require ( github.com/pkg/errors v0.9.1 github.com/retailcrm/api-client-go/v2 v2.0.12 github.com/retailcrm/mg-transport-api-client-go v1.1.32 - github.com/stretchr/testify v1.7.0 + github.com/retailcrm/zabbix-metrics-collector v1.0.0 + github.com/stretchr/testify v1.8.1 github.com/ugorji/go v1.2.6 // indirect golang.org/x/text v0.3.7 google.golang.org/protobuf v1.27.1 // indirect @@ -38,5 +40,4 @@ require ( gopkg.in/gormigrate.v1 v1.6.0 gopkg.in/h2non/gock.v1 v1.1.2 gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/go.sum b/go.sum index 93e7119..27f0915 100644 --- a/go.sum +++ b/go.sum @@ -89,6 +89,8 @@ github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/blacked/go-zabbix v0.0.0-20170118040903-3c6a95ec4fdc h1:Ati6LK4Cd96ZjshZWdVSNq8e8E13krbSMskWJHfXpB4= +github.com/blacked/go-zabbix v0.0.0-20170118040903-3c6a95ec4fdc/go.mod h1:MQFa+aV+n8IIKW8TvMLPCoq/HemkprtE8qU+pf8wXNo= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -236,7 +238,6 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -364,6 +365,8 @@ github.com/retailcrm/api-client-go/v2 v2.0.12 h1:0pMDsz4fzKpizUxoF1qtgwN+oJ+YJru github.com/retailcrm/api-client-go/v2 v2.0.12/go.mod h1:1yTZl9+gd3+/k0kAJe7sYvC+mL4fqMwIwtnSgSWZlkQ= github.com/retailcrm/mg-transport-api-client-go v1.1.32 h1:IBPltSoD5q2PPZJbNC/prK5F9rEVPXVx/ZzDpi7HKhs= github.com/retailcrm/mg-transport-api-client-go v1.1.32/go.mod h1:AWV6BueE28/6SCoyfKURTo4lF0oXYoOKmHTzehd5vAI= +github.com/retailcrm/zabbix-metrics-collector v1.0.0 h1:ju3rhpgVoiKII6oXEJEf2eoJy5bNcYAmOPRp1oPWDmA= +github.com/retailcrm/zabbix-metrics-collector v1.0.0/go.mod h1:3Orc+gfSg1tXj89QNvOn22t0cO1i2whR/4NJUGonWJA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -371,7 +374,6 @@ github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtm github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -382,19 +384,23 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E= github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= @@ -520,7 +526,6 @@ golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -531,7 +536,6 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -705,8 +709,8 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 0e3710add71e8517bc63b0a431c403f6db3056bd Mon Sep 17 00:00:00 2001 From: Neur0toxine Date: Mon, 19 Dec 2022 10:11:11 +0300 Subject: [PATCH 2/2] fix fieldalignment --- core/config/config.go | 2 +- core/db/models/connection.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/config/config.go b/core/config/config.go index 468e652..47d4f4c 100644 --- a/core/config/config.go +++ b/core/config/config.go @@ -93,8 +93,8 @@ type HTTPServerConfig struct { // ZabbixConfig contains information about Zabbix connection. type ZabbixConfig struct { ServerHost string `yaml:"server_host"` - ServerPort int `yaml:"server_port"` Host string `yaml:"host"` + ServerPort int `yaml:"server_port"` Interval uint64 `yaml:"interval"` } diff --git a/core/db/models/connection.go b/core/db/models/connection.go index de66f4a..8bb55d3 100644 --- a/core/db/models/connection.go +++ b/core/db/models/connection.go @@ -11,9 +11,9 @@ type Connection struct { GateURL string `gorm:"column:mg_url; type:varchar(255); not null;" json:"mgUrl,omitempty" binding:"max=255"` GateToken string `gorm:"column:mg_token; type:varchar(100); not null; unique" json:"mgToken,omitempty" binding:"max=100"` // nolint:lll ClientID string `gorm:"column:client_id; type:varchar(70); not null; unique" json:"clientId,omitempty"` + Lang string `gorm:"column:lang; type:varchar(2)" json:"lang,omitempty" binding:"max=2"` + PublicURL string `gorm:"column:public_url; type:varchar(255);" json:"publicUrl,omitempty" binding:"max=255"` Accounts []Account `gorm:"foreignkey:ConnectionID" json:"accounts"` ID int `gorm:"primary_key" json:"id"` Active bool `json:"active,omitempty"` - Lang string `gorm:"column:lang; type:varchar(2)" json:"lang,omitempty" binding:"max=2"` - PublicURL string `gorm:"column:public_url; type:varchar(255);" json:"publicUrl,omitempty" binding:"max=255"` }