From be3ca4608ccd5d110cb072cb014eefccd82ab155 Mon Sep 17 00:00:00 2001 From: Steve Brunton Date: Wed, 29 Nov 2017 22:42:59 -0500 Subject: [PATCH] update logging (#5) * removed Zap logging and switched to logrus * "deprecating" the prometheus.go file and fixed up logging stuff on a couple more files. * removed uber zap from glide * well that sure messed things up --- collector/collector.go | 8 +-- collector/config.go | 3 - collector/device.go | 54 +++++++--------- collector/{prometheus.go => prometheus.bak} | 19 +++--- glide.lock | 71 --------------------- glide.yaml | 10 --- main.go | 58 +++++++---------- 7 files changed, 58 insertions(+), 165 deletions(-) rename collector/{prometheus.go => prometheus.bak} (86%) delete mode 100644 glide.lock delete mode 100644 glide.yaml diff --git a/collector/collector.go b/collector/collector.go index 99fd217..ec1d5cd 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -5,7 +5,7 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" + log "github.com/sirupsen/logrus" ) const namespace = "mikrotik" @@ -32,9 +32,9 @@ type deviceCollector struct { func NewDeviceCollector(cfg Config) (*deviceCollector, error) { devices := make([]Device, len(cfg.Devices)) - cfg.Logger.Info("setting up collector for devices", - "numDevices", len(cfg.Devices), - ) + log.WithFields(log.Fields{ + "numDevices": len(cfg.Devices), + }).Info("setting up collector for devices") copy(devices, cfg.Devices) diff --git a/collector/config.go b/collector/config.go index 7f8a014..6bcb846 100644 --- a/collector/config.go +++ b/collector/config.go @@ -4,13 +4,10 @@ import ( "fmt" "github.com/prometheus/client_golang/prometheus" - "go.uber.org/zap" ) type Config struct { Devices []Device - Logger *zap.SugaredLogger - Metrics PromMetrics } func (c *Config) FromFlags(device, address, user, password *string) error { diff --git a/collector/device.go b/collector/device.go index a51884c..1131e15 100644 --- a/collector/device.go +++ b/collector/device.go @@ -8,6 +8,7 @@ import ( "strconv" "github.com/prometheus/client_golang/prometheus" + log "github.com/sirupsen/logrus" "gopkg.in/routeros.v2" "gopkg.in/routeros.v2/proto" ) @@ -37,19 +38,18 @@ func metricStringCleanup(in string) string { } func (d *Device) fetchInterfaceMetrics() ([]*proto.Sentence, error) { - // clean up logging later TODO(smb) - //l.Debugw("fetching interface metrics", - // "device", d.name, - //) + + log.WithFields(log.Fields{ + "device": d.name, + }).Debug("fetching interface metrics") // grab a connection to the device c, err := routeros.Dial(d.address+apiPort, d.user, d.password) if err != nil { - // clean up logging later TODO(smb) - //l.Errorw("error dialing device", - // "device", d.name, - // "error", err, - //) + log.WithFields(log.Fields{ + "device": d.name, + "error": err, + }).Error("error dialing device") return nil, err } defer c.Close() @@ -57,32 +57,14 @@ func (d *Device) fetchInterfaceMetrics() ([]*proto.Sentence, error) { reply, err := c.Run("/interface/print", "?disabled=false", "?running=true", "=.proplist="+strings.Join(InterfaceProps, ",")) if err != nil { - // do some logging here about an error when we redo all the logging TODO(smb) + log.WithFields(log.Fields{ + "device": d.name, + "error": err, + }).Error("error fetching interface metrics") return nil, err } return reply.Re, nil - - //for _, re := range reply.Re { - // var name string - // // name should always be first element on the array - // for _, p := range InterfaceProps { - // if p == "name" { - // name = re.Map[p] - // } else { - // v, err := strconv.ParseFloat(re.Map[p], 64) - // if err != nil { - // l.Errorw("error parsing value to float", - // "device", d.name, - // "property", p, - // "value", re.Map[p], - // "error", err, - // ) - // } - // m.IncrementInterface(p, d.name, d.address, name, v) - // } - // } - //} } func (d *Device) Update(ch chan<- prometheus.Metric) error { @@ -109,7 +91,15 @@ func (d *Device) Update(ch chan<- prometheus.Metric) error { v, err := strconv.ParseFloat(re.Map[p], 64) if err == nil { ch <- prometheus.MustNewConstMetric(desc, prometheus.CounterValue, v, d.name, d.address, intf) - } // add an else with logging here when logging is re done TODO(smb) + } else { + log.WithFields(log.Fields{ + "device": d.name, + "interface": intf, + "property": p, + "value": re.Map[p], + "error": err, + }).Error("error parsing interface metric value") + } } } } diff --git a/collector/prometheus.go b/collector/prometheus.bak similarity index 86% rename from collector/prometheus.go rename to collector/prometheus.bak index a39408c..24c2af8 100644 --- a/collector/prometheus.go +++ b/collector/prometheus.bak @@ -6,7 +6,6 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" - "go.uber.org/zap" ) type PromMetrics struct { @@ -27,7 +26,7 @@ func (p *PromMetrics) makeInterfaceLabels(name, address, intf string) prometheus return l } -func (p *PromMetrics) SetupPrometheus(l zap.SugaredLogger) (http.Handler, error) { +func (p *PromMetrics) SetupPrometheus() (http.Handler, error) { p.InterfaceMetrics = make(map[string]*prometheus.CounterVec) p.ResourceMetrics = make(map[string]*prometheus.GaugeVec) @@ -42,10 +41,10 @@ func (p *PromMetrics) SetupPrometheus(l zap.SugaredLogger) (http.Handler, error) }, interfaceLabelNames) if err := prometheus.Register(c); err != nil { - l.Errorw("error creating interface counter vector", - "property", v, - "error", err, - ) + //l.Errorw("error creating interface counter vector", + // "property", v, + // "error", err, + //) return nil, err } @@ -63,10 +62,10 @@ func (p *PromMetrics) SetupPrometheus(l zap.SugaredLogger) (http.Handler, error) }, resourceLabelNames) if err := prometheus.Register(c); err != nil { - l.Errorw("error creating resource counter vec", - "property", v, - "error", err, - ) + //l.Errorw("error creating resource counter vec", + // "property", v, + // "error", err, + //) return nil, err } p.ResourceMetrics[v] = c diff --git a/glide.lock b/glide.lock deleted file mode 100644 index dde8703..0000000 --- a/glide.lock +++ /dev/null @@ -1,71 +0,0 @@ -hash: 8559359b6438d6639f9e8b0ef126a997cab215b909acf69515ca5af252cb1394 -updated: 2017-09-03T23:52:58.212956959-04:00 -imports: -- name: github.com/alecthomas/template - version: a0175ee3bccc567396460bf5acd36800cb10c49c - subpackages: - - parse -- name: github.com/alecthomas/units - version: 2efee857e7cfd4f3d0138cc3cbb1b4966962b93a -- name: github.com/beorn7/perks - version: 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9 - subpackages: - - quantile -- name: github.com/golang/protobuf - version: 17ce1425424ab154092bbb43af630bd647f3bb0d - subpackages: - - proto -- name: github.com/matttproud/golang_protobuf_extensions - version: c12348ce28de40eed0136aa2b644d0ee0650e56c - subpackages: - - pbutil -- name: github.com/prometheus/client_golang - version: c5b7fccd204277076155f10851dad72b76a49317 - subpackages: - - prometheus - - prometheus/promhttp -- name: github.com/prometheus/client_model - version: 6f3806018612930941127f2a7c6c453ba2c527d2 - subpackages: - - go -- name: github.com/prometheus/common - version: bc8b88226a1210b016e9993b1d75f858c9c8f778 - subpackages: - - expfmt - - internal/bitbucket.org/ww/goautoneg - - log - - model -- name: github.com/prometheus/procfs - version: e645f4e5aaa8506fc71d6edbc5c4ff02c04c46f2 - subpackages: - - xfs -- name: github.com/sirupsen/logrus - version: 89742aefa4b206dcf400792f3bd35b542998eb3b -- name: go.uber.org/atomic - version: 4e336646b2ef9fc6e47be8e21594178f98e5ebcf -- name: go.uber.org/multierr - version: 3c4937480c32f4c13a875a1829af76c98ca3d40a -- name: go.uber.org/zap - version: 9d9d6135afe89b6fc4a05e9a8552526caba38048 - subpackages: - - buffer - - internal/bufferpool - - internal/color - - internal/exit - - zapcore -- name: golang.org/x/crypto - version: 81e90905daefcd6fd217b62423c0908922eadb30 - subpackages: - - ssh/terminal -- name: golang.org/x/sys - version: dbc2be9168a660ef302e04b6ff6406de6f967473 - subpackages: - - unix - - windows - - windows/registry - - windows/svc/eventlog -- name: gopkg.in/alecthomas/kingpin.v2 - version: 1087e65c9441605df944fb12c33f0fe7072d18ca -- name: gopkg.in/routeros.v2 - version: ffdb88bba0376a797b733f2279f539340926617f -testImports: [] diff --git a/glide.yaml b/glide.yaml deleted file mode 100644 index 53ae511..0000000 --- a/glide.yaml +++ /dev/null @@ -1,10 +0,0 @@ -package: github.com/nshttpd/prometheus-mikrotik -import: -- package: github.com/prometheus/client_golang - version: v0.8.0 -- package: gopkg.in/routeros.v2 -- package: go.uber.org/zap - version: ~1.5.0 -- package: go.uber.org/atomic - version: ~1.2.0 -- package: github.com/sirupsen/logrus diff --git a/main.go b/main.go index d816cb5..a89962e 100644 --- a/main.go +++ b/main.go @@ -10,23 +10,22 @@ import ( "github.com/nshttpd/mikrotik-exporter/collector" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/prometheus/common/log" "github.com/prometheus/common/version" - "go.uber.org/zap" + log "github.com/sirupsen/logrus" ) // single device can be defined via CLI flags, mutliple via config file. var ( - device = flag.String("device", "", "single device to monitor") - address = flag.String("address", "", "address of the device to monitor") - user = flag.String("user", "", "user for authentication with single device") - password = flag.String("password", "", "password for authentication for single device") - cfgFile = flag.String("config", "", "config file for multiple devices") - logLevel = flag.String("log-level", "info", "log level") - port = flag.String("port", ":9090", "port number to listen on") - metricsPath = flag.String("path", "/metrics", "path to answer requests on") - currentLogLevel = zap.NewAtomicLevelAt(zap.InfoLevel) - cfg collector.Config + device = flag.String("device", "", "single device to monitor") + address = flag.String("address", "", "address of the device to monitor") + user = flag.String("user", "", "user for authentication with single device") + password = flag.String("password", "", "password for authentication for single device") + cfgFile = flag.String("config", "", "config file for multiple devices") + logLevel = flag.String("log-level", "info", "log level") + logFormat = flag.String("log-format", "json", "logformat text or json (default json)") + port = flag.String("port", ":9090", "port number to listen on") + metricsPath = flag.String("path", "/metrics", "path to answer requests on") + cfg collector.Config ) func init() { @@ -58,7 +57,7 @@ func handler(w http.ResponseWriter, r *http.Request) { // Delegate http serving to Prometheus client library, which will call collector.Collect. h := promhttp.HandlerFor(gatherers, promhttp.HandlerOpts{ - ErrorLog: log.NewErrorLogger(), + ErrorLog: log.New(), ErrorHandling: promhttp.ContinueOnError, }) h.ServeHTTP(w, r) @@ -68,34 +67,29 @@ func main() { flag.Parse() // override default log level of info + var ll log.Level + var err error + ll = log.InfoLevel if *logLevel != "info" { - err := currentLogLevel.UnmarshalText([]byte(*logLevel)) + ll, err = log.ParseLevel(*logLevel) if err != nil { panic(err) } } - - // setup logger - l, err := newLogger(currentLogLevel) - if err != nil { - panic(err) - } - defer l.Sync() + log.SetLevel(ll) if *cfgFile == "" { if err := cfg.FromFlags(device, address, user, password); err != nil { - l.Sugar().Errorw("could not create configuration", - "error", err, - ) - return + log.WithFields(log.Fields{ + "error": err, + }).Error("could not create configuration") + os.Exit(1) } } else { - l.Sugar().Info("config file not supported yet") + log.Info("config file not supported yet") os.Exit(0) } - cfg.Logger = l.Sugar() - http.HandleFunc(*metricsPath, prometheus.InstrumentHandlerFunc("prometheus", handler)) http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("ok")) @@ -110,16 +104,10 @@ func main() { `)) }) - log.Infoln("Listening on", *port) + log.Info("Listening on", *port) err = http.ListenAndServe(*port, nil) if err != nil { log.Fatal(err) } } - -func newLogger(lvl zap.AtomicLevel) (*zap.Logger, error) { - config := zap.NewProductionConfig() - config.Level = lvl - return config.Build() -}