Extend logging

This commit is contained in:
Robert Jacob 2020-06-21 15:22:19 +02:00
parent 380405edfe
commit ee49657c75
4 changed files with 47 additions and 24 deletions

View file

@ -1,11 +1,11 @@
package main package main
import ( import (
"log"
"time" "time"
netatmo "github.com/exzz/netatmo-api-go" netatmo "github.com/exzz/netatmo-api-go"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/sirupsen/logrus"
) )
const ( const (
@ -97,19 +97,22 @@ var (
) )
type netatmoCollector struct { type netatmoCollector struct {
log logrus.FieldLogger
client *netatmo.Client client *netatmo.Client
} }
func (m *netatmoCollector) Describe(dChan chan<- *prometheus.Desc) { func (c *netatmoCollector) Describe(dChan chan<- *prometheus.Desc) {
dChan <- updatedDesc dChan <- updatedDesc
dChan <- tempDesc dChan <- tempDesc
dChan <- humidityDesc dChan <- humidityDesc
dChan <- cotwoDesc dChan <- cotwoDesc
} }
func (m *netatmoCollector) Collect(mChan chan<- prometheus.Metric) { func (c *netatmoCollector) Collect(mChan chan<- prometheus.Metric) {
devices, err := m.client.Read() devices, err := c.client.Read()
if err != nil { if err != nil {
c.log.Errorf("Error getting data: %s", err)
netatmoUp.Set(0) netatmoUp.Set(0)
mChan <- netatmoUp mChan <- netatmoUp
return return
@ -119,76 +122,78 @@ func (m *netatmoCollector) Collect(mChan chan<- prometheus.Metric) {
for _, dev := range devices.Devices() { for _, dev := range devices.Devices() {
stationName := dev.StationName stationName := dev.StationName
collectData(mChan, dev, stationName) c.collectData(mChan, dev, stationName)
for _, module := range dev.LinkedModules { for _, module := range dev.LinkedModules {
collectData(mChan, module, stationName) c.collectData(mChan, module, stationName)
} }
} }
} }
func collectData(ch chan<- prometheus.Metric, device *netatmo.Device, stationName string) { func (c *netatmoCollector) collectData(ch chan<- prometheus.Metric, device *netatmo.Device, stationName string) {
moduleName := device.ModuleName moduleName := device.ModuleName
data := device.DashboardData data := device.DashboardData
if data.LastMeasure == nil { if data.LastMeasure == nil {
c.log.Debugf("No data available.")
return return
} }
date := time.Unix(*data.LastMeasure, 0) date := time.Unix(*data.LastMeasure, 0)
if time.Since(date) > staleDataThreshold { if time.Since(date) > staleDataThreshold {
c.log.Warnf("Data is stale: %s > %s", time.Since(date), staleDataThreshold)
return return
} }
sendMetric(ch, updatedDesc, prometheus.CounterValue, float64(date.UTC().Unix()), moduleName, stationName) c.sendMetric(ch, updatedDesc, prometheus.CounterValue, float64(date.UTC().Unix()), moduleName, stationName)
if data.Temperature != nil { if data.Temperature != nil {
sendMetric(ch, tempDesc, prometheus.GaugeValue, float64(*data.Temperature), moduleName, stationName) c.sendMetric(ch, tempDesc, prometheus.GaugeValue, float64(*data.Temperature), moduleName, stationName)
} }
if data.Humidity != nil { if data.Humidity != nil {
sendMetric(ch, humidityDesc, prometheus.GaugeValue, float64(*data.Humidity), moduleName, stationName) c.sendMetric(ch, humidityDesc, prometheus.GaugeValue, float64(*data.Humidity), moduleName, stationName)
} }
if data.CO2 != nil { if data.CO2 != nil {
sendMetric(ch, cotwoDesc, prometheus.GaugeValue, float64(*data.CO2), moduleName, stationName) c.sendMetric(ch, cotwoDesc, prometheus.GaugeValue, float64(*data.CO2), moduleName, stationName)
} }
if data.Noise != nil { if data.Noise != nil {
sendMetric(ch, noiseDesc, prometheus.GaugeValue, float64(*data.Noise), moduleName, stationName) c.sendMetric(ch, noiseDesc, prometheus.GaugeValue, float64(*data.Noise), moduleName, stationName)
} }
if data.Pressure != nil { if data.Pressure != nil {
sendMetric(ch, pressureDesc, prometheus.GaugeValue, float64(*data.Pressure), moduleName, stationName) c.sendMetric(ch, pressureDesc, prometheus.GaugeValue, float64(*data.Pressure), moduleName, stationName)
} }
if data.WindStrength != nil { if data.WindStrength != nil {
sendMetric(ch, windStrengthDesc, prometheus.GaugeValue, float64(*data.WindStrength), moduleName, stationName) c.sendMetric(ch, windStrengthDesc, prometheus.GaugeValue, float64(*data.WindStrength), moduleName, stationName)
} }
if data.WindAngle != nil { if data.WindAngle != nil {
sendMetric(ch, windDirectionDesc, prometheus.GaugeValue, float64(*data.WindAngle), moduleName, stationName) c.sendMetric(ch, windDirectionDesc, prometheus.GaugeValue, float64(*data.WindAngle), moduleName, stationName)
} }
if data.Rain != nil { if data.Rain != nil {
sendMetric(ch, rainDesc, prometheus.GaugeValue, float64(*data.Rain), moduleName, stationName) c.sendMetric(ch, rainDesc, prometheus.GaugeValue, float64(*data.Rain), moduleName, stationName)
} }
if device.BatteryPercent != nil { if device.BatteryPercent != nil {
sendMetric(ch, batteryDesc, prometheus.GaugeValue, float64(*device.BatteryPercent), moduleName, stationName) c.sendMetric(ch, batteryDesc, prometheus.GaugeValue, float64(*device.BatteryPercent), moduleName, stationName)
} }
if device.WifiStatus != nil { if device.WifiStatus != nil {
sendMetric(ch, wifiDesc, prometheus.GaugeValue, float64(*device.WifiStatus), moduleName, stationName) c.sendMetric(ch, wifiDesc, prometheus.GaugeValue, float64(*device.WifiStatus), moduleName, stationName)
} }
if device.RFStatus != nil { if device.RFStatus != nil {
sendMetric(ch, rfDesc, prometheus.GaugeValue, float64(*device.RFStatus), moduleName, stationName) c.sendMetric(ch, rfDesc, prometheus.GaugeValue, float64(*device.RFStatus), moduleName, stationName)
} }
} }
func sendMetric(ch chan<- prometheus.Metric, desc *prometheus.Desc, valueType prometheus.ValueType, value float64, moduleName string, stationName string) { func (c *netatmoCollector) sendMetric(ch chan<- prometheus.Metric, desc *prometheus.Desc, valueType prometheus.ValueType, value float64, moduleName string, stationName string) {
m, err := prometheus.NewConstMetric(desc, valueType, value, moduleName, stationName) m, err := prometheus.NewConstMetric(desc, valueType, value, moduleName, stationName)
if err != nil { if err != nil {
log.Printf("Error creating %s metric: %s", updatedDesc.String(), err) c.log.Errorf("Error creating %s metric: %s", updatedDesc.String(), err)
} }
ch <- m ch <- m
} }

1
go.mod
View file

@ -5,6 +5,7 @@ go 1.14
require ( require (
github.com/exzz/netatmo-api-go v0.0.0-20171026152754-41589231f446 github.com/exzz/netatmo-api-go v0.0.0-20171026152754-41589231f446
github.com/prometheus/client_golang v1.7.0 github.com/prometheus/client_golang v1.7.0
github.com/sirupsen/logrus v1.6.0
github.com/spf13/pflag v1.0.5 github.com/spf13/pflag v1.0.5
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
) )

4
go.sum
View file

@ -38,6 +38,8 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/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/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@ -69,6 +71,8 @@ github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFB
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
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/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=

19
main.go
View file

@ -1,13 +1,25 @@
package main package main
import ( import (
"log"
"net/http" "net/http"
"os" "os"
netatmo "github.com/exzz/netatmo-api-go" netatmo "github.com/exzz/netatmo-api-go"
"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/sirupsen/logrus"
)
var (
log = &logrus.Logger{
Out: os.Stderr,
Formatter: &logrus.TextFormatter{
DisableTimestamp: true,
},
Level: logrus.InfoLevel,
ExitFunc: os.Exit,
ReportCaller: false,
}
) )
func main() { func main() {
@ -16,13 +28,14 @@ func main() {
log.Fatalf("Error in configuration: %s", err) log.Fatalf("Error in configuration: %s", err)
} }
log.Printf("Login as %s", cfg.Netatmo.Username) log.Infof("Login as %s", cfg.Netatmo.Username)
client, err := netatmo.NewClient(cfg.Netatmo) client, err := netatmo.NewClient(cfg.Netatmo)
if err != nil { if err != nil {
log.Fatalf("Error creating client: %s", err) log.Fatalf("Error creating client: %s", err)
} }
metrics := &netatmoCollector{ metrics := &netatmoCollector{
log: log,
client: client, client: client,
} }
prometheus.MustRegister(metrics) prometheus.MustRegister(metrics)
@ -30,6 +43,6 @@ func main() {
http.Handle("/metrics", promhttp.HandlerFor(prometheus.DefaultGatherer, promhttp.HandlerOpts{})) http.Handle("/metrics", promhttp.HandlerFor(prometheus.DefaultGatherer, promhttp.HandlerOpts{}))
http.Handle("/", http.RedirectHandler("/metrics", http.StatusFound)) http.Handle("/", http.RedirectHandler("/metrics", http.StatusFound))
log.Printf("Listen on %s...", cfg.Addr) log.Infof("Listen on %s...", cfg.Addr)
log.Fatal(http.ListenAndServe(cfg.Addr, nil)) log.Fatal(http.ListenAndServe(cfg.Addr, nil))
} }