diff --git a/README.md b/README.md index 7d0bd5f5..cd19ac7f 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ Flag | Description | Default value `--collectors.enabled` | Comma-separated list of collectors to use. Use `[defaults]` as a placeholder for all the collectors enabled by default." | `[defaults]` `--collectors.print` | If true, print available collectors and exit. | `--scrape.timeout-margin` | Seconds to subtract from the timeout allowed by the client. Tune to allow for overhead or high loads. | `0.5` +`--web.config` | A [web config][web_config] for setting up TLS and Auth | None ## Installation The latest release can be downloaded from the [releases page](https://github.com/prometheus-community/windows_exporter/releases). @@ -169,3 +170,5 @@ CLI flags enjoy a higher priority over values specified in the configuration fil ## License Under [MIT](LICENSE) + +[web_config]: https://github.com/prometheus/exporter-toolkit/blob/master/docs/web-configuration.md diff --git a/collector/ad.go b/collector/ad.go index 6a01944d..6511a582 100644 --- a/collector/ad.go +++ b/collector/ad.go @@ -6,8 +6,8 @@ import ( "errors" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/collector.go b/collector/collector.go index f7973ed3..25e43d47 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -7,8 +7,8 @@ import ( "strings" "github.com/leoluk/perflib_exporter/perflib" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "golang.org/x/sys/windows/registry" ) diff --git a/collector/container.go b/collector/container.go index 83de6fa2..0f013457 100644 --- a/collector/container.go +++ b/collector/container.go @@ -4,8 +4,8 @@ package collector import ( "github.com/Microsoft/hcsshim" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/cs.go b/collector/cs.go index f545b701..1978855c 100644 --- a/collector/cs.go +++ b/collector/cs.go @@ -6,8 +6,8 @@ import ( "errors" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/dfsr.go b/collector/dfsr.go index 8256a3dc..743dd2ec 100644 --- a/collector/dfsr.go +++ b/collector/dfsr.go @@ -3,8 +3,8 @@ package collector import ( + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/collector/dns.go b/collector/dns.go index d9ec9d91..c350488a 100644 --- a/collector/dns.go +++ b/collector/dns.go @@ -6,8 +6,8 @@ import ( "errors" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/exchange.go b/collector/exchange.go index 0a51d050..b478cdcb 100644 --- a/collector/exchange.go +++ b/collector/exchange.go @@ -7,8 +7,8 @@ import ( "os" "strings" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/collector/fsrmquota.go b/collector/fsrmquota.go index 29edec20..23c7c097 100644 --- a/collector/fsrmquota.go +++ b/collector/fsrmquota.go @@ -2,8 +2,8 @@ package collector import ( "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/hyperv.go b/collector/hyperv.go index 5f476390..279b4894 100644 --- a/collector/hyperv.go +++ b/collector/hyperv.go @@ -6,8 +6,8 @@ import ( "strings" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/iis.go b/collector/iis.go index b1b0ebe0..daba9ad3 100644 --- a/collector/iis.go +++ b/collector/iis.go @@ -10,8 +10,8 @@ import ( "golang.org/x/sys/windows/registry" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/collector/logical_disk.go b/collector/logical_disk.go index d6e391de..2f9d8eea 100644 --- a/collector/logical_disk.go +++ b/collector/logical_disk.go @@ -6,8 +6,8 @@ import ( "fmt" "regexp" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/collector/logon.go b/collector/logon.go index d6a4919a..df82f66e 100644 --- a/collector/logon.go +++ b/collector/logon.go @@ -6,8 +6,8 @@ import ( "errors" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/memory.go b/collector/memory.go index 29aecf7f..82617e37 100644 --- a/collector/memory.go +++ b/collector/memory.go @@ -6,8 +6,8 @@ package collector import ( + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/msmq.go b/collector/msmq.go index 16572a8c..fc4d2e99 100644 --- a/collector/msmq.go +++ b/collector/msmq.go @@ -6,8 +6,8 @@ import ( "strings" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/collector/mssql.go b/collector/mssql.go index d4af0131..e243589c 100644 --- a/collector/mssql.go +++ b/collector/mssql.go @@ -10,8 +10,8 @@ import ( "sync" "time" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "golang.org/x/sys/windows/registry" "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/collector/net.go b/collector/net.go index 3bbe0bdb..ccd82018 100644 --- a/collector/net.go +++ b/collector/net.go @@ -6,8 +6,8 @@ import ( "fmt" "regexp" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/collector/netframework_clrexceptions.go b/collector/netframework_clrexceptions.go index ffced912..53d80b16 100644 --- a/collector/netframework_clrexceptions.go +++ b/collector/netframework_clrexceptions.go @@ -4,8 +4,8 @@ package collector import ( "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/netframework_clrinterop.go b/collector/netframework_clrinterop.go index 78171919..483d799a 100644 --- a/collector/netframework_clrinterop.go +++ b/collector/netframework_clrinterop.go @@ -4,8 +4,8 @@ package collector import ( "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/netframework_clrjit.go b/collector/netframework_clrjit.go index fb3d4c2a..da24e1c4 100644 --- a/collector/netframework_clrjit.go +++ b/collector/netframework_clrjit.go @@ -4,8 +4,8 @@ package collector import ( "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/netframework_clrloading.go b/collector/netframework_clrloading.go index aba0921c..bc28ce87 100644 --- a/collector/netframework_clrloading.go +++ b/collector/netframework_clrloading.go @@ -4,8 +4,8 @@ package collector import ( "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/netframework_clrlocksandthreads.go b/collector/netframework_clrlocksandthreads.go index e446eaa2..5d236a80 100644 --- a/collector/netframework_clrlocksandthreads.go +++ b/collector/netframework_clrlocksandthreads.go @@ -4,8 +4,8 @@ package collector import ( "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/netframework_clrmemory.go b/collector/netframework_clrmemory.go index 407edde8..7318161e 100644 --- a/collector/netframework_clrmemory.go +++ b/collector/netframework_clrmemory.go @@ -4,8 +4,8 @@ package collector import ( "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/netframework_clrremoting.go b/collector/netframework_clrremoting.go index 9da318a7..4d8a1a41 100644 --- a/collector/netframework_clrremoting.go +++ b/collector/netframework_clrremoting.go @@ -4,8 +4,8 @@ package collector import ( "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/netframework_clrsecurity.go b/collector/netframework_clrsecurity.go index 1ea0ded1..4ae6347c 100644 --- a/collector/netframework_clrsecurity.go +++ b/collector/netframework_clrsecurity.go @@ -4,8 +4,8 @@ package collector import ( "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/os.go b/collector/os.go index 45486ace..f9db5796 100644 --- a/collector/os.go +++ b/collector/os.go @@ -7,8 +7,8 @@ import ( "time" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/perflib.go b/collector/perflib.go index 19ce2ad7..153429e6 100644 --- a/collector/perflib.go +++ b/collector/perflib.go @@ -7,7 +7,7 @@ import ( perflibCollector "github.com/leoluk/perflib_exporter/collector" "github.com/leoluk/perflib_exporter/perflib" - "github.com/prometheus/common/log" + "github.com/prometheus-community/windows_exporter/log" ) var nametable = perflib.QueryNameTable("Counter 009") // Reads the names in English TODO: validate that the English names are always present diff --git a/collector/process.go b/collector/process.go index 306bddf2..29d02416 100644 --- a/collector/process.go +++ b/collector/process.go @@ -9,8 +9,8 @@ import ( "strings" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/collector/remote_fx.go b/collector/remote_fx.go index f81066f7..3654ccf9 100644 --- a/collector/remote_fx.go +++ b/collector/remote_fx.go @@ -5,8 +5,8 @@ package collector import ( "strings" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/service.go b/collector/service.go index a5b50c65..86dd1251 100644 --- a/collector/service.go +++ b/collector/service.go @@ -7,8 +7,8 @@ import ( "strings" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/collector/smtp.go b/collector/smtp.go index 70eb6b3a..ccf6abab 100644 --- a/collector/smtp.go +++ b/collector/smtp.go @@ -4,8 +4,8 @@ package collector import ( "fmt" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" "gopkg.in/alecthomas/kingpin.v2" "regexp" ) diff --git a/collector/system.go b/collector/system.go index a4eec8ab..d76f9b87 100644 --- a/collector/system.go +++ b/collector/system.go @@ -3,8 +3,8 @@ package collector import ( + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/tcp.go b/collector/tcp.go index e9d2adce..879aaa91 100644 --- a/collector/tcp.go +++ b/collector/tcp.go @@ -3,8 +3,8 @@ package collector import ( + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/terminal_services.go b/collector/terminal_services.go index 1d02d97a..564631fe 100644 --- a/collector/terminal_services.go +++ b/collector/terminal_services.go @@ -7,8 +7,8 @@ import ( "strings" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) const ConnectionBrokerFeatureID uint32 = 133 diff --git a/collector/textfile.go b/collector/textfile.go index 6881a7ca..767f58bf 100644 --- a/collector/textfile.go +++ b/collector/textfile.go @@ -26,10 +26,10 @@ import ( "time" "github.com/dimchansky/utfbom" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" - "github.com/prometheus/common/log" kingpin "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/collector/thermalzone.go b/collector/thermalzone.go index baf6ec8b..c76cdf84 100644 --- a/collector/thermalzone.go +++ b/collector/thermalzone.go @@ -2,8 +2,8 @@ package collector import ( "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/time.go b/collector/time.go index dd1eee42..b8c66d09 100644 --- a/collector/time.go +++ b/collector/time.go @@ -5,8 +5,8 @@ package collector import ( "errors" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/vmware.go b/collector/vmware.go index acecbf1b..2c59b657 100644 --- a/collector/vmware.go +++ b/collector/vmware.go @@ -6,8 +6,8 @@ import ( "errors" "github.com/StackExchange/wmi" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) func init() { diff --git a/collector/wmi.go b/collector/wmi.go index 615db1f7..3654cfb0 100644 --- a/collector/wmi.go +++ b/collector/wmi.go @@ -4,7 +4,7 @@ import ( "bytes" "reflect" - "github.com/prometheus/common/log" + "github.com/prometheus-community/windows_exporter/log" ) func className(src interface{}) string { diff --git a/config/config.go b/config/config.go index 1fde1587..b0ff31ce 100644 --- a/config/config.go +++ b/config/config.go @@ -17,7 +17,7 @@ import ( "io/ioutil" "os" - "github.com/prometheus/common/log" + "github.com/prometheus-community/windows_exporter/log" "gopkg.in/alecthomas/kingpin.v2" "gopkg.in/yaml.v2" ) diff --git a/exporter.go b/exporter.go index f076db35..f474d9fe 100644 --- a/exporter.go +++ b/exporter.go @@ -19,10 +19,11 @@ import ( "github.com/StackExchange/wmi" "github.com/prometheus-community/windows_exporter/collector" "github.com/prometheus-community/windows_exporter/config" + "github.com/prometheus-community/windows_exporter/log" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/prometheus/common/log" "github.com/prometheus/common/version" + "github.com/prometheus/exporter-toolkit/https" "gopkg.in/alecthomas/kingpin.v2" ) @@ -258,6 +259,10 @@ func main() { "config.file", "YAML configuration file to use. Values set in this file will be overriden by CLI flags.", ).String() + httpsConfig = kingpin.Flag( + "web.config", + "[EXPERIMENTAL] Path to config yaml file that can enable TLS or authentication.", + ).Default("").String() listenAddress = kingpin.Flag( "telemetry.addr", "host:port for exporter.", @@ -398,7 +403,10 @@ func main() { go func() { log.Infoln("Starting server on", *listenAddress) - log.Fatalf("cannot start windows_exporter: %s", http.ListenAndServe(*listenAddress, nil)) + server := &http.Server{Addr: *listenAddress} + if err := https.Listen(server, *httpsConfig, log.NewToolkitAdapter()); err != nil { + log.Fatalf("cannot start windows_exporter: %s", err) + } }() for { diff --git a/go.mod b/go.mod index 4f3bffd2..be9ada88 100644 --- a/go.mod +++ b/go.mod @@ -7,14 +7,17 @@ require ( github.com/Microsoft/hcsshim v0.8.6 github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f github.com/dimchansky/utfbom v1.1.0 + github.com/go-kit/kit v0.10.0 github.com/go-ole/go-ole v1.2.1 // indirect github.com/google/go-cmp v0.5.1 // indirect github.com/leoluk/perflib_exporter v0.1.0 github.com/prometheus/client_golang v1.8.0 github.com/prometheus/client_model v0.2.0 - github.com/prometheus/common v0.14.0 + github.com/prometheus/common v0.15.0 + github.com/prometheus/exporter-toolkit v0.4.0 + github.com/sirupsen/logrus v1.6.0 golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 - gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index fb93a9b8..1a0348cd 100644 --- a/go.sum +++ b/go.sum @@ -72,13 +72,16 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -146,6 +149,7 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -190,6 +194,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= @@ -221,6 +226,7 @@ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -251,6 +257,10 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.14.0 h1:RHRyE8UocrbjU+6UvRzwi6HjiDfxrrBU91TtbKzkGp4= github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/exporter-toolkit v0.4.0 h1:O7Bw+ZKEMzW7vD10IuVF70b8EE4JIG7BvHFj9UKz49g= +github.com/prometheus/exporter-toolkit v0.4.0/go.mod h1:OCkM4805mmisBhLmVFw858QYi3v0wKdY6/UxrT0pZVg= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -314,6 +324,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9 h1:sYNJzB4J8toYPQTM6pAkcmBRgw9SnQKP9oXCHfgy604= +golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -338,6 +350,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -366,6 +379,7 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b h1:ag/x1USPSsqHud38I9BAC88qd golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -373,7 +387,9 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211 h1:9UQO31fZ+0aKQOFldThf7BKPMJTiBfWycGh/u3UoO88= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -442,6 +458,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 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-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/log/eventlog_formatter.go b/log/eventlog_formatter.go new file mode 100644 index 00000000..9ad9e31d --- /dev/null +++ b/log/eventlog_formatter.go @@ -0,0 +1,91 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Implementation forked from github.com/prometheus/common +// +// +build windows + +package log + +import ( + "fmt" + "os" + + "golang.org/x/sys/windows/svc/eventlog" + + "github.com/sirupsen/logrus" +) + +func init() { + setEventlogFormatter = func(l logger, name string, debugAsInfo bool) error { + if name == "" { + return fmt.Errorf("missing name parameter") + } + + fmter, err := newEventlogger(name, debugAsInfo, l.entry.Logger.Formatter) + if err != nil { + fmt.Fprintf(os.Stderr, "error creating eventlog formatter: %v\n", err) + l.Errorf("can't connect logger to eventlog: %v", err) + return err + } + l.entry.Logger.Formatter = fmter + return nil + } +} + +type eventlogger struct { + log *eventlog.Log + debugAsInfo bool + wrap logrus.Formatter +} + +func newEventlogger(name string, debugAsInfo bool, fmter logrus.Formatter) (*eventlogger, error) { + logHandle, err := eventlog.Open(name) + if err != nil { + return nil, err + } + return &eventlogger{log: logHandle, debugAsInfo: debugAsInfo, wrap: fmter}, nil +} + +func (s *eventlogger) Format(e *logrus.Entry) ([]byte, error) { + data, err := s.wrap.Format(e) + if err != nil { + fmt.Fprintf(os.Stderr, "eventlogger: can't format entry: %v\n", err) + return data, err + } + + switch e.Level { + case logrus.PanicLevel: + fallthrough + case logrus.FatalLevel: + fallthrough + case logrus.ErrorLevel: + err = s.log.Error(102, e.Message) + case logrus.WarnLevel: + err = s.log.Warning(101, e.Message) + case logrus.InfoLevel: + err = s.log.Info(100, e.Message) + case logrus.DebugLevel: + if s.debugAsInfo { + err = s.log.Info(100, e.Message) + } + default: + err = s.log.Info(100, e.Message) + } + + if err != nil { + fmt.Fprintf(os.Stderr, "eventlogger: can't send log to eventlog: %v\n", err) + } + + return data, err +} diff --git a/log/gokit_adapter.go b/log/gokit_adapter.go new file mode 100644 index 00000000..7230df3b --- /dev/null +++ b/log/gokit_adapter.go @@ -0,0 +1,46 @@ +package log + +import ( + "github.com/go-kit/kit/log/level" +) + +// Returns an adapter implementing the go-kit/kit/log.Logger interface on our +// logrus logger +func NewToolkitAdapter() *logAdapter { + return &logAdapter{} +} + +type logAdapter struct{} + +func (*logAdapter) Log(keyvals ...interface{}) error { + var lvl level.Value + var msg string + for i := 0; i < len(keyvals); i += 2 { + switch keyvals[i] { + case "level": + tlvl, ok := keyvals[i+1].(level.Value) + if !ok { + Warnf("Could not cast level of type %T", keyvals[i+1]) + } else { + lvl = tlvl + } + case "msg": + msg = keyvals[i+1].(string) + } + } + + switch lvl { + case level.ErrorValue(): + Errorln(msg) + case level.WarnValue(): + Warnln(msg) + case level.InfoValue(): + Infoln(msg) + case level.DebugValue(): + Debugln(msg) + default: + Warnf("Unmatched log level: '%v' for message %q", lvl, msg) + } + + return nil +} diff --git a/log/log.go b/log/log.go new file mode 100644 index 00000000..7a8b4b33 --- /dev/null +++ b/log/log.go @@ -0,0 +1,367 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package log implements logging via logrus. +// Implementation forked from github.com/prometheus/common + +package log + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "net/url" + "os" + "runtime" + "strconv" + "strings" + + "github.com/sirupsen/logrus" + "gopkg.in/alecthomas/kingpin.v2" +) + +// setSyslogFormatter is nil if the target architecture does not support syslog. +var setSyslogFormatter func(logger, string, string) error + +// setEventlogFormatter is nil if the target OS does not support Eventlog (i.e., is not Windows). +var setEventlogFormatter func(logger, string, bool) error + +func setJSONFormatter() { + origLogger.Formatter = &logrus.JSONFormatter{} +} + +type loggerSettings struct { + level string + format string +} + +func (s *loggerSettings) apply(ctx *kingpin.ParseContext) error { + err := baseLogger.SetLevel(s.level) + if err != nil { + return err + } + err = baseLogger.SetFormat(s.format) + return err +} + +// AddFlags adds the flags used by this package to the Kingpin application. +// To use the default Kingpin application, call AddFlags(kingpin.CommandLine) +func AddFlags(a *kingpin.Application) { + s := loggerSettings{} + a.Flag("log.level", "Only log messages with the given severity or above. Valid levels: [debug, info, warn, error, fatal]"). + Default(origLogger.Level.String()). + StringVar(&s.level) + defaultFormat := url.URL{Scheme: "logger", Opaque: "stderr"} + a.Flag("log.format", `Set the log target and format. Example: "logger:syslog?appname=bob&local=7" or "logger:stdout?json=true"`). + Default(defaultFormat.String()). + StringVar(&s.format) + a.Action(s.apply) +} + +// Logger is the interface for loggers used in the Prometheus components. +type Logger interface { + Debug(...interface{}) + Debugln(...interface{}) + Debugf(string, ...interface{}) + + Info(...interface{}) + Infoln(...interface{}) + Infof(string, ...interface{}) + + Warn(...interface{}) + Warnln(...interface{}) + Warnf(string, ...interface{}) + + Error(...interface{}) + Errorln(...interface{}) + Errorf(string, ...interface{}) + + Fatal(...interface{}) + Fatalln(...interface{}) + Fatalf(string, ...interface{}) + + With(key string, value interface{}) Logger + + SetFormat(string) error + SetLevel(string) error +} + +type logger struct { + entry *logrus.Entry +} + +func (l logger) With(key string, value interface{}) Logger { + return logger{l.entry.WithField(key, value)} +} + +// Debug logs a message at level Debug on the standard logger. +func (l logger) Debug(args ...interface{}) { + l.sourced().Debug(args...) +} + +// Debug logs a message at level Debug on the standard logger. +func (l logger) Debugln(args ...interface{}) { + l.sourced().Debugln(args...) +} + +// Debugf logs a message at level Debug on the standard logger. +func (l logger) Debugf(format string, args ...interface{}) { + l.sourced().Debugf(format, args...) +} + +// Info logs a message at level Info on the standard logger. +func (l logger) Info(args ...interface{}) { + l.sourced().Info(args...) +} + +// Info logs a message at level Info on the standard logger. +func (l logger) Infoln(args ...interface{}) { + l.sourced().Infoln(args...) +} + +// Infof logs a message at level Info on the standard logger. +func (l logger) Infof(format string, args ...interface{}) { + l.sourced().Infof(format, args...) +} + +// Warn logs a message at level Warn on the standard logger. +func (l logger) Warn(args ...interface{}) { + l.sourced().Warn(args...) +} + +// Warn logs a message at level Warn on the standard logger. +func (l logger) Warnln(args ...interface{}) { + l.sourced().Warnln(args...) +} + +// Warnf logs a message at level Warn on the standard logger. +func (l logger) Warnf(format string, args ...interface{}) { + l.sourced().Warnf(format, args...) +} + +// Error logs a message at level Error on the standard logger. +func (l logger) Error(args ...interface{}) { + l.sourced().Error(args...) +} + +// Error logs a message at level Error on the standard logger. +func (l logger) Errorln(args ...interface{}) { + l.sourced().Errorln(args...) +} + +// Errorf logs a message at level Error on the standard logger. +func (l logger) Errorf(format string, args ...interface{}) { + l.sourced().Errorf(format, args...) +} + +// Fatal logs a message at level Fatal on the standard logger. +func (l logger) Fatal(args ...interface{}) { + l.sourced().Fatal(args...) +} + +// Fatal logs a message at level Fatal on the standard logger. +func (l logger) Fatalln(args ...interface{}) { + l.sourced().Fatalln(args...) +} + +// Fatalf logs a message at level Fatal on the standard logger. +func (l logger) Fatalf(format string, args ...interface{}) { + l.sourced().Fatalf(format, args...) +} + +func (l logger) SetLevel(level string) error { + lvl, err := logrus.ParseLevel(level) + if err != nil { + return err + } + + l.entry.Logger.Level = lvl + return nil +} + +func (l logger) SetFormat(format string) error { + u, err := url.Parse(format) + if err != nil { + return err + } + if u.Scheme != "logger" { + return fmt.Errorf("invalid scheme %s", u.Scheme) + } + jsonq := u.Query().Get("json") + if jsonq == "true" { + setJSONFormatter() + } + + switch u.Opaque { + case "syslog": + if setSyslogFormatter == nil { + return fmt.Errorf("system does not support syslog") + } + appname := u.Query().Get("appname") + facility := u.Query().Get("local") + return setSyslogFormatter(l, appname, facility) + case "eventlog": + if setEventlogFormatter == nil { + return fmt.Errorf("system does not support eventlog") + } + name := u.Query().Get("name") + debugAsInfo := false + debugAsInfoRaw := u.Query().Get("debugAsInfo") + if parsedDebugAsInfo, err := strconv.ParseBool(debugAsInfoRaw); err == nil { + debugAsInfo = parsedDebugAsInfo + } + return setEventlogFormatter(l, name, debugAsInfo) + case "stdout": + l.entry.Logger.Out = os.Stdout + case "stderr": + l.entry.Logger.Out = os.Stderr + default: + return fmt.Errorf("unsupported logger %q", u.Opaque) + } + return nil +} + +// sourced adds a source field to the logger that contains +// the file name and line where the logging happened. +func (l logger) sourced() *logrus.Entry { + _, file, line, ok := runtime.Caller(2) + if !ok { + file = "" + line = 1 + } else { + slash := strings.LastIndex(file, "/") + file = file[slash+1:] + } + return l.entry.WithField("source", fmt.Sprintf("%s:%d", file, line)) +} + +var origLogger = logrus.New() +var baseLogger = logger{entry: logrus.NewEntry(origLogger)} + +// Base returns the default Logger logging to +func Base() Logger { + return baseLogger +} + +// NewLogger returns a new Logger logging to out. +func NewLogger(w io.Writer) Logger { + l := logrus.New() + l.Out = w + return logger{entry: logrus.NewEntry(l)} +} + +// NewNopLogger returns a logger that discards all log messages. +func NewNopLogger() Logger { + l := logrus.New() + l.Out = ioutil.Discard + return logger{entry: logrus.NewEntry(l)} +} + +// With adds a field to the logger. +func With(key string, value interface{}) Logger { + return baseLogger.With(key, value) +} + +// Debug logs a message at level Debug on the standard logger. +func Debug(args ...interface{}) { + baseLogger.sourced().Debug(args...) +} + +// Debugln logs a message at level Debug on the standard logger. +func Debugln(args ...interface{}) { + baseLogger.sourced().Debugln(args...) +} + +// Debugf logs a message at level Debug on the standard logger. +func Debugf(format string, args ...interface{}) { + baseLogger.sourced().Debugf(format, args...) +} + +// Info logs a message at level Info on the standard logger. +func Info(args ...interface{}) { + baseLogger.sourced().Info(args...) +} + +// Infoln logs a message at level Info on the standard logger. +func Infoln(args ...interface{}) { + baseLogger.sourced().Infoln(args...) +} + +// Infof logs a message at level Info on the standard logger. +func Infof(format string, args ...interface{}) { + baseLogger.sourced().Infof(format, args...) +} + +// Warn logs a message at level Warn on the standard logger. +func Warn(args ...interface{}) { + baseLogger.sourced().Warn(args...) +} + +// Warnln logs a message at level Warn on the standard logger. +func Warnln(args ...interface{}) { + baseLogger.sourced().Warnln(args...) +} + +// Warnf logs a message at level Warn on the standard logger. +func Warnf(format string, args ...interface{}) { + baseLogger.sourced().Warnf(format, args...) +} + +// Error logs a message at level Error on the standard logger. +func Error(args ...interface{}) { + baseLogger.sourced().Error(args...) +} + +// Errorln logs a message at level Error on the standard logger. +func Errorln(args ...interface{}) { + baseLogger.sourced().Errorln(args...) +} + +// Errorf logs a message at level Error on the standard logger. +func Errorf(format string, args ...interface{}) { + baseLogger.sourced().Errorf(format, args...) +} + +// Fatal logs a message at level Fatal on the standard logger. +func Fatal(args ...interface{}) { + baseLogger.sourced().Fatal(args...) +} + +// Fatalln logs a message at level Fatal on the standard logger. +func Fatalln(args ...interface{}) { + baseLogger.sourced().Fatalln(args...) +} + +// Fatalf logs a message at level Fatal on the standard logger. +func Fatalf(format string, args ...interface{}) { + baseLogger.sourced().Fatalf(format, args...) +} + +// AddHook adds hook to Prometheus' original logger. +func AddHook(hook logrus.Hook) { + origLogger.Hooks.Add(hook) +} + +type errorLogWriter struct{} + +func (errorLogWriter) Write(b []byte) (int, error) { + baseLogger.sourced().Error(string(b)) + return len(b), nil +} + +// NewErrorLogger returns a log.Logger that is meant to be used +// in the ErrorLog field of an http.Server to log HTTP server errors. +func NewErrorLogger() *log.Logger { + return log.New(&errorLogWriter{}, "", 0) +}