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
This commit is contained in:
Steve Brunton 2017-11-29 22:42:59 -05:00 committed by GitHub
parent 13b50a6b7c
commit be3ca4608c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 58 additions and 165 deletions

View File

@ -5,7 +5,7 @@ import (
"time" "time"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log" log "github.com/sirupsen/logrus"
) )
const namespace = "mikrotik" const namespace = "mikrotik"
@ -32,9 +32,9 @@ type deviceCollector struct {
func NewDeviceCollector(cfg Config) (*deviceCollector, error) { func NewDeviceCollector(cfg Config) (*deviceCollector, error) {
devices := make([]Device, len(cfg.Devices)) devices := make([]Device, len(cfg.Devices))
cfg.Logger.Info("setting up collector for devices", log.WithFields(log.Fields{
"numDevices", len(cfg.Devices), "numDevices": len(cfg.Devices),
) }).Info("setting up collector for devices")
copy(devices, cfg.Devices) copy(devices, cfg.Devices)

View File

@ -4,13 +4,10 @@ import (
"fmt" "fmt"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"go.uber.org/zap"
) )
type Config struct { type Config struct {
Devices []Device Devices []Device
Logger *zap.SugaredLogger
Metrics PromMetrics
} }
func (c *Config) FromFlags(device, address, user, password *string) error { func (c *Config) FromFlags(device, address, user, password *string) error {

View File

@ -8,6 +8,7 @@ import (
"strconv" "strconv"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
log "github.com/sirupsen/logrus"
"gopkg.in/routeros.v2" "gopkg.in/routeros.v2"
"gopkg.in/routeros.v2/proto" "gopkg.in/routeros.v2/proto"
) )
@ -37,19 +38,18 @@ func metricStringCleanup(in string) string {
} }
func (d *Device) fetchInterfaceMetrics() ([]*proto.Sentence, error) { func (d *Device) fetchInterfaceMetrics() ([]*proto.Sentence, error) {
// clean up logging later TODO(smb)
//l.Debugw("fetching interface metrics", log.WithFields(log.Fields{
// "device", d.name, "device": d.name,
//) }).Debug("fetching interface metrics")
// grab a connection to the device // grab a connection to the device
c, err := routeros.Dial(d.address+apiPort, d.user, d.password) c, err := routeros.Dial(d.address+apiPort, d.user, d.password)
if err != nil { if err != nil {
// clean up logging later TODO(smb) log.WithFields(log.Fields{
//l.Errorw("error dialing device", "device": d.name,
// "device", d.name, "error": err,
// "error", err, }).Error("error dialing device")
//)
return nil, err return nil, err
} }
defer c.Close() defer c.Close()
@ -57,32 +57,14 @@ func (d *Device) fetchInterfaceMetrics() ([]*proto.Sentence, error) {
reply, err := c.Run("/interface/print", "?disabled=false", reply, err := c.Run("/interface/print", "?disabled=false",
"?running=true", "=.proplist="+strings.Join(InterfaceProps, ",")) "?running=true", "=.proplist="+strings.Join(InterfaceProps, ","))
if err != nil { 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 nil, err
} }
return reply.Re, nil 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 { 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) v, err := strconv.ParseFloat(re.Map[p], 64)
if err == nil { if err == nil {
ch <- prometheus.MustNewConstMetric(desc, prometheus.CounterValue, v, d.name, d.address, intf) 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")
}
} }
} }
} }

View File

@ -6,7 +6,6 @@ import (
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"
"go.uber.org/zap"
) )
type PromMetrics struct { type PromMetrics struct {
@ -27,7 +26,7 @@ func (p *PromMetrics) makeInterfaceLabels(name, address, intf string) prometheus
return l 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.InterfaceMetrics = make(map[string]*prometheus.CounterVec)
p.ResourceMetrics = make(map[string]*prometheus.GaugeVec) p.ResourceMetrics = make(map[string]*prometheus.GaugeVec)
@ -42,10 +41,10 @@ func (p *PromMetrics) SetupPrometheus(l zap.SugaredLogger) (http.Handler, error)
}, interfaceLabelNames) }, interfaceLabelNames)
if err := prometheus.Register(c); err != nil { if err := prometheus.Register(c); err != nil {
l.Errorw("error creating interface counter vector", //l.Errorw("error creating interface counter vector",
"property", v, // "property", v,
"error", err, // "error", err,
) //)
return nil, err return nil, err
} }
@ -63,10 +62,10 @@ func (p *PromMetrics) SetupPrometheus(l zap.SugaredLogger) (http.Handler, error)
}, resourceLabelNames) }, resourceLabelNames)
if err := prometheus.Register(c); err != nil { if err := prometheus.Register(c); err != nil {
l.Errorw("error creating resource counter vec", //l.Errorw("error creating resource counter vec",
"property", v, // "property", v,
"error", err, // "error", err,
) //)
return nil, err return nil, err
} }
p.ResourceMetrics[v] = c p.ResourceMetrics[v] = c

71
glide.lock generated
View File

@ -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: []

View File

@ -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

58
main.go
View File

@ -10,23 +10,22 @@ import (
"github.com/nshttpd/mikrotik-exporter/collector" "github.com/nshttpd/mikrotik-exporter/collector"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/prometheus/common/log"
"github.com/prometheus/common/version" "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. // single device can be defined via CLI flags, mutliple via config file.
var ( var (
device = flag.String("device", "", "single device to monitor") device = flag.String("device", "", "single device to monitor")
address = flag.String("address", "", "address of the device to monitor") address = flag.String("address", "", "address of the device to monitor")
user = flag.String("user", "", "user for authentication with single device") user = flag.String("user", "", "user for authentication with single device")
password = flag.String("password", "", "password for authentication for single device") password = flag.String("password", "", "password for authentication for single device")
cfgFile = flag.String("config", "", "config file for multiple devices") cfgFile = flag.String("config", "", "config file for multiple devices")
logLevel = flag.String("log-level", "info", "log level") logLevel = flag.String("log-level", "info", "log level")
port = flag.String("port", ":9090", "port number to listen on") logFormat = flag.String("log-format", "json", "logformat text or json (default json)")
metricsPath = flag.String("path", "/metrics", "path to answer requests on") port = flag.String("port", ":9090", "port number to listen on")
currentLogLevel = zap.NewAtomicLevelAt(zap.InfoLevel) metricsPath = flag.String("path", "/metrics", "path to answer requests on")
cfg collector.Config cfg collector.Config
) )
func init() { 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. // Delegate http serving to Prometheus client library, which will call collector.Collect.
h := promhttp.HandlerFor(gatherers, h := promhttp.HandlerFor(gatherers,
promhttp.HandlerOpts{ promhttp.HandlerOpts{
ErrorLog: log.NewErrorLogger(), ErrorLog: log.New(),
ErrorHandling: promhttp.ContinueOnError, ErrorHandling: promhttp.ContinueOnError,
}) })
h.ServeHTTP(w, r) h.ServeHTTP(w, r)
@ -68,34 +67,29 @@ func main() {
flag.Parse() flag.Parse()
// override default log level of info // override default log level of info
var ll log.Level
var err error
ll = log.InfoLevel
if *logLevel != "info" { if *logLevel != "info" {
err := currentLogLevel.UnmarshalText([]byte(*logLevel)) ll, err = log.ParseLevel(*logLevel)
if err != nil { if err != nil {
panic(err) panic(err)
} }
} }
log.SetLevel(ll)
// setup logger
l, err := newLogger(currentLogLevel)
if err != nil {
panic(err)
}
defer l.Sync()
if *cfgFile == "" { if *cfgFile == "" {
if err := cfg.FromFlags(device, address, user, password); err != nil { if err := cfg.FromFlags(device, address, user, password); err != nil {
l.Sugar().Errorw("could not create configuration", log.WithFields(log.Fields{
"error", err, "error": err,
) }).Error("could not create configuration")
return os.Exit(1)
} }
} else { } else {
l.Sugar().Info("config file not supported yet") log.Info("config file not supported yet")
os.Exit(0) os.Exit(0)
} }
cfg.Logger = l.Sugar()
http.HandleFunc(*metricsPath, prometheus.InstrumentHandlerFunc("prometheus", handler)) http.HandleFunc(*metricsPath, prometheus.InstrumentHandlerFunc("prometheus", handler))
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("ok")) w.Write([]byte("ok"))
@ -110,16 +104,10 @@ func main() {
</html>`)) </html>`))
}) })
log.Infoln("Listening on", *port) log.Info("Listening on", *port)
err = http.ListenAndServe(*port, nil) err = http.ListenAndServe(*port, nil)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
} }
func newLogger(lvl zap.AtomicLevel) (*zap.Logger, error) {
config := zap.NewProductionConfig()
config.Level = lvl
return config.Build()
}