mirror of
https://github.com/nshttpd/mikrotik-exporter.git
synced 2024-09-27 03:42:52 +02:00
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:
parent
13b50a6b7c
commit
be3ca4608c
@ -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)
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
71
glide.lock
generated
@ -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: []
|
|
10
glide.yaml
10
glide.yaml
@ -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
|
|
40
main.go
40
main.go
@ -10,9 +10,8 @@ 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.
|
||||||
@ -23,9 +22,9 @@ var (
|
|||||||
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")
|
||||||
|
logFormat = flag.String("log-format", "json", "logformat text or json (default json)")
|
||||||
port = flag.String("port", ":9090", "port number to listen on")
|
port = flag.String("port", ":9090", "port number to listen on")
|
||||||
metricsPath = flag.String("path", "/metrics", "path to answer requests on")
|
metricsPath = flag.String("path", "/metrics", "path to answer requests on")
|
||||||
currentLogLevel = zap.NewAtomicLevelAt(zap.InfoLevel)
|
|
||||||
cfg collector.Config
|
cfg collector.Config
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -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()
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user