From 5a5a606b161ebd28c68d044e6511c62dc3a758d8 Mon Sep 17 00:00:00 2001 From: Ryan Fitzpatrick Date: Tue, 19 Jul 2022 20:31:37 +0000 Subject: [PATCH] All monitors own their loggers and set monitorID field --- Dockerfile.dev | 2 +- pkg/core/common/docker/containerlist.go | 3 +- pkg/core/common/kubelet/client.go | 11 +-- pkg/core/config/sources/vault/vault.go | 11 ++- pkg/core/diagnostics.go | 10 +-- pkg/core/services/rules.go | 1 - pkg/core/writer/dimensions/dedup.go | 3 +- pkg/core/writer/signalfx/writer.go | 30 ++++---- pkg/core/writer/splunk/splunk.go | 6 +- pkg/monitors/aspdotnet/aspdotnet.go | 3 + pkg/monitors/aspdotnet/aspdotnet_windows.go | 8 ++- pkg/monitors/cadvisor/common.go | 16 +++-- pkg/monitors/cadvisor/converter/converter.go | 17 +++-- pkg/monitors/cadvisor/kubeletstats.go | 16 +++-- pkg/monitors/cgroups/cpu.go | 4 +- pkg/monitors/cgroups/cpuacct.go | 6 +- pkg/monitors/cgroups/memory.go | 4 +- pkg/monitors/cgroups/monitor.go | 8 ++- pkg/monitors/cloudfoundry/client.go | 6 +- pkg/monitors/cloudfoundry/monitor.go | 14 ++-- pkg/monitors/collectd/collectd.go | 3 +- .../collectd/elasticsearch/elasticsearch.go | 3 +- pkg/monitors/collectd/kong/kong.go | 5 +- pkg/monitors/collectd/logging.go | 5 +- pkg/monitors/collectd/metadata/metadata.go | 10 ++- pkg/monitors/collectd/monitorcore.go | 3 +- pkg/monitors/collectd/processes/processes.go | 12 ++-- pkg/monitors/collectd/python/python.go | 3 +- pkg/monitors/collectd/rabbitmq/rabbitmq.go | 6 +- pkg/monitors/collectd/templating_linux.go | 6 +- pkg/monitors/collectd/write_server.go | 4 +- pkg/monitors/conviva/conviva.go | 8 +-- pkg/monitors/cpu/cpu.go | 14 ++-- pkg/monitors/cpu/cpu_others.go | 5 +- pkg/monitors/cpu/cpu_windows.go | 12 +--- pkg/monitors/diskio/diskio_others.go | 10 ++- pkg/monitors/diskio/diskio_windows.go | 12 ++-- pkg/monitors/docker/docker.go | 5 +- pkg/monitors/dotnet/dotnet.go | 3 + pkg/monitors/dotnet/dotnet_windows.go | 8 ++- pkg/monitors/ecs/ecs.go | 15 ++-- .../elasticsearch/query/datapoints.go | 72 ++++++++++++------- .../elasticsearch/query/datapoints_test.go | 11 +-- pkg/monitors/elasticsearch/query/monitor.go | 13 ++-- .../elasticsearch/stats/elasticsearch.go | 5 +- pkg/monitors/expvar/expvar.go | 5 +- pkg/monitors/filesystems/filesystems.go | 9 ++- pkg/monitors/filesystems/filesystems_test.go | 3 +- pkg/monitors/forwarder/forwarder.go | 30 ++++---- pkg/monitors/forwarder/monitor.go | 21 +++--- pkg/monitors/haproxy/helpers.go | 35 +++++---- pkg/monitors/haproxy/monitor.go | 12 ++-- pkg/monitors/heroku/monitor.go | 5 +- pkg/monitors/internalmetrics/monitor.go | 10 +-- pkg/monitors/jaegergrpc/monitor.go | 21 +++--- .../kubernetes/cluster/clusterstate.go | 22 +++--- .../kubernetes/cluster/metrics/cache.go | 12 ++-- .../kubernetes/cluster/metrics/dimensions.go | 15 ++-- .../kubernetes/cluster/metrics/hpa.go | 15 ++-- pkg/monitors/kubernetes/cluster/monitor.go | 10 +-- .../kubernetes/cluster/monitor_test.go | 11 ++- pkg/monitors/kubernetes/events/events.go | 29 ++++---- .../kubernetes/kubeletmetrics/monitor.go | 20 +++--- .../kubernetes/leadership/leadership.go | 12 ++-- pkg/monitors/kubernetes/volumes/volumes.go | 15 ++-- pkg/monitors/load/load.go | 7 +- pkg/monitors/logstash/logstash/monitor.go | 19 ++--- pkg/monitors/logstash/tcp/monitor.go | 38 +++++----- pkg/monitors/manager.go | 3 +- pkg/monitors/manager_test.go | 3 +- pkg/monitors/memory/memory.go | 8 +-- .../metadata/hostmetadata/hostmetadata.go | 5 +- .../mongodb/atlas/measurements/common.go | 4 +- .../mongodb/atlas/measurements/disks.go | 14 ++-- .../mongodb/atlas/measurements/process.go | 19 ++--- pkg/monitors/mongodb/atlas/monitor.go | 15 ++-- pkg/monitors/monitor.go | 2 +- pkg/monitors/nagios/nagios.go | 5 +- pkg/monitors/netio/netio.go | 8 +-- pkg/monitors/ntp/ntp.go | 8 +-- pkg/monitors/postgresql/monitor.go | 28 ++++---- pkg/monitors/process/process.go | 8 ++- pkg/monitors/processlist/processlist.go | 14 ++-- .../processlist/processlist_darwin.go | 4 +- pkg/monitors/processlist/processlist_linux.go | 5 +- .../processlist/processlist_linux_test.go | 2 +- .../processlist/processlist_windows.go | 7 +- pkg/monitors/prometheusexporter/prometheus.go | 14 ++-- pkg/monitors/sql/monitor.go | 21 +++--- pkg/monitors/sql/querier.go | 5 +- pkg/monitors/statsd/monitor.go | 19 ++--- pkg/monitors/statsd/parser.go | 37 ++++++---- pkg/monitors/statsd/parser_test.go | 16 +++-- pkg/monitors/statsd/statsd.go | 25 ++++--- pkg/monitors/subproc/core.go | 3 +- pkg/monitors/subproc/signalfx/handler.go | 3 +- pkg/monitors/supervisor/supervisor.go | 5 +- .../common/emitter/baseemitter/baseemitter.go | 3 +- .../emitter/baseemitter/baseemitter_test.go | 3 +- .../emitter/batchemitter/batchemitter.go | 3 +- .../emitter/batchemitter/batchemitter_test.go | 3 +- pkg/monitors/telegraf/monitors/dns/dns.go | 9 ++- pkg/monitors/telegraf/monitors/exec/exec.go | 11 +-- .../monitors/mssqlserver/mssqlserver.go | 8 +-- pkg/monitors/telegraf/monitors/ntpq/ntpq.go | 9 ++- .../telegraf/monitors/procstat/procstat.go | 14 ++-- pkg/monitors/telegraf/monitors/tail/tail.go | 15 ++-- .../telegraflogparser/telegraflogparser.go | 15 ++-- .../monitors/telegrafsnmp/telegrafsnmp.go | 8 +-- .../monitors/telegrafstatsd/statsd.go | 11 +-- .../telegraf/monitors/varnish/varnish.go | 9 ++- .../winperfcounters/win_perf_counters.go | 6 +- .../win_perf_counters_windows.go | 10 +-- .../monitors/winservices/winservices.go | 3 + .../winservices/winservices_windows.go | 8 ++- pkg/monitors/vmem/vmem.go | 3 +- pkg/monitors/vmem/vmem_linux.go | 5 +- pkg/monitors/vmem/vmem_windows.go | 5 +- pkg/monitors/vsphere/monitor.go | 8 ++- pkg/monitors/vsphere/runner.go | 7 +- pkg/monitors/vsphere/service/auth.go | 7 +- pkg/monitors/vsphere/service/gateway.go | 4 +- pkg/monitors/vsphere/service/inventory.go | 7 +- pkg/monitors/vsphere/service/metrics.go | 7 +- .../vsphere/service/multi_perf_fetcher.go | 2 +- pkg/monitors/vsphere/service/perf_fetcher.go | 2 +- pkg/monitors/vsphere/service/points.go | 4 +- .../vsphere/service/single_perf_fetcher.go | 2 +- pkg/monitors/vsphere/vsphere_monitor.go | 4 +- pkg/monitors/windowsiis/windowsiis.go | 4 +- pkg/monitors/windowsiis/windowsiis_windows.go | 8 ++- pkg/monitors/windowslegacy/windowslegacy.go | 3 + .../windowslegacy/windowslegacy_windows.go | 8 ++- .../k8s/testhelpers/fakek8s/fakek8s.go | 3 +- pkg/observers/docker/docker.go | 5 +- pkg/observers/ecs/ecs.go | 3 +- pkg/observers/host/host.go | 3 +- pkg/observers/kubelet/kubelet.go | 7 +- pkg/observers/kubernetes/annotations.go | 5 +- pkg/observers/kubernetes/api.go | 17 +++-- pkg/observers/manager.go | 3 +- pkg/observers/observer.go | 3 +- pkg/observers/servicediffer.go | 3 +- pkg/selfdescribe/observers.go | 3 +- pkg/utils/log.go | 2 +- pkg/utils/log_test.go | 3 +- 146 files changed, 795 insertions(+), 621 deletions(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index 103e7c2be6..069025252e 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -84,7 +84,7 @@ COPY --from=signalfx-agent-dev-cache:stage-agent-builder /go $GOPATH RUN go install golang.org/x/lint/golint@latest &&\ if [ `uname -m` != "aarch64" ]; then go install github.com/go-delve/delve/cmd/dlv@latest; fi &&\ go install github.com/tebeka/go2xunit@latest &&\ - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.23.8 + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.23.8 COPY ./ ./ diff --git a/pkg/core/common/docker/containerlist.go b/pkg/core/common/docker/containerlist.go index 6d640be212..9d81615e4f 100644 --- a/pkg/core/common/docker/containerlist.go +++ b/pkg/core/common/docker/containerlist.go @@ -8,8 +8,9 @@ import ( dtypes "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" docker "github.com/docker/docker/client" - "github.com/signalfx/signalfx-agent/pkg/utils/filter" log "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/utils/filter" ) // ContainerChangeHandler is what gets called when a Docker container is diff --git a/pkg/core/common/kubelet/client.go b/pkg/core/common/kubelet/client.go index a639678576..e2a85bbc08 100644 --- a/pkg/core/common/kubelet/client.go +++ b/pkg/core/common/kubelet/client.go @@ -12,8 +12,9 @@ import ( "time" "github.com/pkg/errors" - "github.com/signalfx/signalfx-agent/pkg/core/common/auth" log "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/core/common/auth" ) // AuthType to use when connecting to kubelet @@ -56,10 +57,11 @@ type APIConfig struct { type Client struct { *http.Client config *APIConfig + logger log.FieldLogger } // NewClient creates a new client with the given config -func NewClient(kubeletAPI *APIConfig) (*Client, error) { +func NewClient(kubeletAPI *APIConfig, logger log.FieldLogger) (*Client, error) { if kubeletAPI.URL == "" { hostname, err := os.Hostname() if err != nil { @@ -110,7 +112,7 @@ func NewClient(kubeletAPI *APIConfig) (*Client, error) { Token: string(token), } - log.Debug("Using service account authentication for Kubelet") + logger.Debug("Using service account authentication for Kubelet") default: transport.(*http.Transport).TLSClientConfig = tlsConfig } @@ -121,6 +123,7 @@ func NewClient(kubeletAPI *APIConfig) (*Client, error) { Transport: transport, }, config: kubeletAPI, + logger: logger, }, nil } @@ -157,7 +160,7 @@ func (kc *Client) DoRequestAndSetValue(req *http.Request, value interface{}) err } if kc.config.LogResponses { - log.WithField("url", req.URL.String()).WithField("body", string(body)).Info("Raw response from Kubelet url") + kc.logger.WithField("url", req.URL.String()).WithField("body", string(body)).Info("Raw response from Kubelet url") } err = json.Unmarshal(body, value) diff --git a/pkg/core/config/sources/vault/vault.go b/pkg/core/config/sources/vault/vault.go index b9540320f7..6d2fca27ae 100644 --- a/pkg/core/config/sources/vault/vault.go +++ b/pkg/core/config/sources/vault/vault.go @@ -11,12 +11,11 @@ import ( "sync" "time" - "github.com/signalfx/signalfx-agent/pkg/core/config/sources/vault/auth" - "github.com/signalfx/signalfx-agent/pkg/core/config/types" - "github.com/sirupsen/logrus" + "github.com/hashicorp/vault/api" log "github.com/sirupsen/logrus" - "github.com/hashicorp/vault/api" + "github.com/signalfx/signalfx-agent/pkg/core/config/sources/vault/auth" + "github.com/signalfx/signalfx-agent/pkg/core/config/types" ) type vaultConfigSource struct { @@ -32,7 +31,7 @@ type vaultConfigSource struct { nowProvider func() time.Time conf *Config tokenRenewer *api.LifetimeWatcher - logger logrus.FieldLogger + logger log.FieldLogger } var _ types.Stoppable = &vaultConfigSource{} @@ -110,7 +109,7 @@ func (c *Config) New() (types.ConfigSource, error) { // New creates a new vault ConfigSource func New(conf *Config) (types.ConfigSource, error) { - logger := logrus.WithFields(log.Fields{"remoteConfigSource": "vault"}) + logger := log.WithFields(log.Fields{"remoteConfigSource": "vault"}) logger.Info("Initializing new Vault remote config instance") diff --git a/pkg/core/diagnostics.go b/pkg/core/diagnostics.go index e815185d18..4d83b7df16 100644 --- a/pkg/core/diagnostics.go +++ b/pkg/core/diagnostics.go @@ -16,12 +16,12 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + log "github.com/sirupsen/logrus" + "gopkg.in/yaml.v2" + "github.com/signalfx/signalfx-agent/pkg/core/dpfilters" "github.com/signalfx/signalfx-agent/pkg/core/writer/tap" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" - "gopkg.in/yaml.v2" ) // VersionLine should be populated by the startup logic to contain version @@ -211,13 +211,13 @@ func (a *Agent) datapointTapHandler(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(200) dpTap := tap.New(filter, rw) - logrus.Infof("Datapoint tap started") + log.Infof("Datapoint tap started") a.writer.SetTap(dpTap) dpTap.Run(req.Context()) a.writer.SetTap(nil) - logrus.Infof("Datapoint tap cleared") + log.Infof("Datapoint tap cleared") } func streamDatapoints(host string, port uint16, metric string, dims string) (io.ReadCloser, error) { diff --git a/pkg/core/services/rules.go b/pkg/core/services/rules.go index 70ced259cd..50cc4a6582 100644 --- a/pkg/core/services/rules.go +++ b/pkg/core/services/rules.go @@ -123,7 +123,6 @@ func DoesServiceMatchRule(si Endpoint, ruleText string, doValidation bool) bool exprVal, ok := ret.(bool) if !ok { log.WithFields(log.Fields{ - "discoveryRule": ruleText, "serviceInstance": spew.Sdump(si), }).Errorf("Discovery rule did not evaluate to a true/false value") diff --git a/pkg/core/writer/dimensions/dedup.go b/pkg/core/writer/dimensions/dedup.go index a2cd6384ae..ed6afbf6f3 100644 --- a/pkg/core/writer/dimensions/dedup.go +++ b/pkg/core/writer/dimensions/dedup.go @@ -4,8 +4,9 @@ import ( "reflect" lru "github.com/hashicorp/golang-lru" - "github.com/signalfx/signalfx-agent/pkg/monitors/types" log "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/monitors/types" ) type deduplicator struct { diff --git a/pkg/core/writer/signalfx/writer.go b/pkg/core/writer/signalfx/writer.go index 7c47c65025..42fa7ce523 100644 --- a/pkg/core/writer/signalfx/writer.go +++ b/pkg/core/writer/signalfx/writer.go @@ -25,11 +25,9 @@ import ( "github.com/signalfx/golib/v3/sfxclient" "github.com/signalfx/golib/v3/trace" sfxwriter "github.com/signalfx/signalfx-go/writer" - "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus" "github.com/signalfx/signalfx-agent/pkg/apm/correlations" - libtracker "github.com/signalfx/signalfx-agent/pkg/apm/tracetracker" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/core/writer/dimensions" @@ -100,7 +98,7 @@ func New(conf *config.WriterConfig, dpChan chan []*datapoint.Datapoint, eventCha dimensionChan chan *types.Dimension, spanChan chan []*trace.Span, spanSourceTracker *tracetracker.SpanSourceTracker) (*Writer, error) { - logger := utils.NewThrottledLogger(logrus.WithFields(logrus.Fields{"component": "writer"}), 20*time.Second) + logger := utils.NewThrottledLogger(log.WithFields(log.Fields{"component": "writer"}), 20*time.Second) ctx, cancel := context.WithCancel(context.Background()) @@ -179,7 +177,7 @@ func New(conf *config.WriterConfig, dpChan chan []*datapoint.Datapoint, eventCha dpEndpointURL, err := conf.ParsedIngestURL().Parse("v2/datapoint") if err != nil { - logger.WithFields(logrus.Fields{ + logger.WithFields(log.Fields{ "error": err, "ingestURL": conf.ParsedIngestURL().String(), }).Error("Could not construct datapoint ingest URL") @@ -192,7 +190,7 @@ func New(conf *config.WriterConfig, dpChan chan []*datapoint.Datapoint, eventCha var err error eventEndpointURL, err = conf.ParsedIngestURL().Parse("v2/event") if err != nil { - logger.WithFields(logrus.Fields{ + logger.WithFields(log.Fields{ "error": err, "ingestURL": conf.ParsedIngestURL().String(), }).Error("Could not construct event ingest URL") @@ -206,7 +204,7 @@ func New(conf *config.WriterConfig, dpChan chan []*datapoint.Datapoint, eventCha var err error traceEndpointURL, err = conf.ParsedIngestURL().Parse(conf.DefaultTraceEndpointPath()) if err != nil { - logger.WithFields(logrus.Fields{ + logger.WithFields(log.Fields{ "error": err, "ingestURL": conf.ParsedIngestURL().String(), }).Error("Could not construct trace ingest URL") @@ -267,7 +265,7 @@ func (sw *Writer) processDatapoint(dp *datapoint.Datapoint) bool { utils.TruncateDimensionValuesInPlace(dp.Dimensions) if sw.conf.LogDatapoints { - log.Debugf("Sending datapoint:\n%s", utils.DatapointToString(dp)) + sw.logger.Debugf("Sending datapoint:\n%s", utils.DatapointToString(dp)) } return true @@ -278,11 +276,11 @@ func (sw *Writer) sendDatapoints(ctx context.Context, dps []*datapoint.Datapoint err := sw.client.AddDatapoints(ctx, dps) if err != nil { if isTransientError(err) { - log.Debugf("retrying datapoint submission after receiving temporary network error: %v\n", err) + sw.logger.Debugf("retrying datapoint submission after receiving temporary network error: %v\n", err) err = sw.client.AddDatapoints(ctx, dps) } if err != nil { - log.WithFields(log.Fields{ + sw.logger.WithFields(log.Fields{ "error": utils.SanitizeHTTPError(err), }).Error("Error shipping datapoints to SignalFx") // If there is an error sending datapoints then just forget about them. @@ -291,7 +289,7 @@ func (sw *Writer) sendDatapoints(ctx context.Context, dps []*datapoint.Datapoint } - log.Debugf("Sent %d datapoints out of the agent", len(dps)) + sw.logger.Debugf("Sent %d datapoints out of the agent", len(dps)) // dpTap.Accept handles the receiver being nil sw.dpTap.Accept(dps) @@ -333,7 +331,7 @@ func (sw *Writer) sendEvents(events []*event.Event) error { sw.PreprocessEvent(events[i]) if sw.conf.LogEvents { - log.WithFields(log.Fields{ + sw.logger.WithFields(log.Fields{ "event": spew.Sdump(events[i]), }).Debug("Sending event") } @@ -346,7 +344,7 @@ func (sw *Writer) sendEvents(events []*event.Event) error { } } sw.eventsSent += int64(len(events)) - log.Debugf("Sent %d events to SignalFx", len(events)) + sw.logger.Debugf("Sent %d events to SignalFx", len(events)) return nil } @@ -367,7 +365,7 @@ func (sw *Writer) listenForEventsAndDimensionUpdates() { case event := <-sw.eventChan: if len(sw.eventBuffer) > eventBufferCapacity { - log.WithFields(log.Fields{ + sw.logger.WithFields(log.Fields{ "eventType": event.EventType, "eventBufferLength": len(sw.eventBuffer), }).Error("Dropping event due to overfull buffer") @@ -380,14 +378,14 @@ func (sw *Writer) listenForEventsAndDimensionUpdates() { go func(buf []*event.Event) { if err := sw.sendEvents(buf); err != nil { - log.WithError(utils.SanitizeHTTPError(err)).Error("Error shipping events to SignalFx") + sw.logger.WithError(utils.SanitizeHTTPError(err)).Error("Error shipping events to SignalFx") } }(sw.eventBuffer) initEventBuffer() } case dim := <-sw.dimensionChan: if err := sw.dimensionClient.AcceptDimension(dim); err != nil { - log.WithFields(log.Fields{ + sw.logger.WithFields(log.Fields{ "dimName": dim.Name, "dimValue": dim.Value, }).WithError(utils.SanitizeHTTPError(err)).Warn("Dropping dimension update") @@ -407,5 +405,5 @@ func (sw *Writer) Shutdown() { if sw.cancel != nil { sw.cancel() } - log.Debug("Stopped datapoint writer") + sw.logger.Debug("Stopped datapoint writer") } diff --git a/pkg/core/writer/splunk/splunk.go b/pkg/core/writer/splunk/splunk.go index 1a8379d95a..85c13a8e49 100644 --- a/pkg/core/writer/splunk/splunk.go +++ b/pkg/core/writer/splunk/splunk.go @@ -15,15 +15,15 @@ import ( "strings" "time" - "github.com/signalfx/golib/v3/trace" - "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/event" + "github.com/signalfx/golib/v3/trace" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/common/httpclient" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/core/writer/processor" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) const ( diff --git a/pkg/monitors/aspdotnet/aspdotnet.go b/pkg/monitors/aspdotnet/aspdotnet.go index a35b1c56bc..edc5425339 100644 --- a/pkg/monitors/aspdotnet/aspdotnet.go +++ b/pkg/monitors/aspdotnet/aspdotnet.go @@ -1,6 +1,8 @@ package aspdotnet import ( + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" @@ -26,6 +28,7 @@ type Config struct { type Monitor struct { Output types.Output cancel func() + logger logrus.FieldLogger // nolint: structcheck,unused } // Shutdown stops the metric sync diff --git a/pkg/monitors/aspdotnet/aspdotnet_windows.go b/pkg/monitors/aspdotnet/aspdotnet_windows.go index 83a8b118ba..d0b966bf47 100644 --- a/pkg/monitors/aspdotnet/aspdotnet_windows.go +++ b/pkg/monitors/aspdotnet/aspdotnet_windows.go @@ -8,17 +8,19 @@ import ( "strings" "time" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/monitors/winperfcounters" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) var logger = logrus.WithField("monitorType", monitorType) // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = logger.WithField("monitorID", conf.MonitorID) perfcounterConf := &winperfcounters.Config{ CountersRefreshInterval: conf.CountersRefreshInterval, PrintValid: conf.PrintValid, @@ -65,7 +67,7 @@ func (m *Monitor) Configure(conf *Config) error { } // create batch emitter - emitter := baseemitter.NewEmitter(m.Output, logger) + emitter := baseemitter.NewEmitter(m.Output, m.logger) // Hard code the plugin name because the emitter will parse out the // configured measurement name as plugin and that is confusing. @@ -93,7 +95,7 @@ func (m *Monitor) Configure(conf *Config) error { // gather metrics on the specified interval utils.RunOnInterval(ctx, func() { if err := plugin.Gather(ac); err != nil { - logger.WithError(err).Errorf("an error occurred while gathering metrics from the plugin") + m.logger.WithError(err).Errorf("an error occurred while gathering metrics from the plugin") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/cadvisor/common.go b/pkg/monitors/cadvisor/common.go index 37c1fd8f24..36bebfdccd 100644 --- a/pkg/monitors/cadvisor/common.go +++ b/pkg/monitors/cadvisor/common.go @@ -6,9 +6,9 @@ package cadvisor import ( "time" + "github.com/signalfx/golib/v3/datapoint" log "github.com/sirupsen/logrus" - "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors/cadvisor/converter" ) @@ -17,6 +17,7 @@ import ( type Monitor struct { monConfig *config.MonitorConfig stop chan bool + logger log.FieldLogger } // Configure and start/restart cadvisor plugin @@ -27,16 +28,19 @@ func (m *Monitor) Configure( hasPodEphemeralStorageStatsGroupEnabled bool) error { m.monConfig = monConfig + if m.logger == nil { + m.logger = log.WithFields(log.Fields{"monitorType": monConfig.Type, "monitorID": monConfig.MonitorID}) + } - collector := converter.NewCadvisorCollector(statProvider, sendDPs, monConfig.ExtraDimensions) + collector := converter.NewCadvisorCollector(statProvider, sendDPs, monConfig.ExtraDimensions, m.logger) - m.stop = monitorNode(monConfig.IntervalSeconds, collector, hasPodEphemeralStorageStatsGroupEnabled) + m.stop = m.monitorNode(collector, hasPodEphemeralStorageStatsGroupEnabled) return nil } -func monitorNode(intervalSeconds int, collector *converter.CadvisorCollector, hasPodEphemeralStorageStatsGroupEnabled bool) (stop chan bool) { - ticker := time.NewTicker(time.Duration(intervalSeconds) * time.Second) +func (m *Monitor) monitorNode(collector *converter.CadvisorCollector, hasPodEphemeralStorageStatsGroupEnabled bool) (stop chan bool) { + ticker := time.NewTicker(time.Duration(m.monConfig.IntervalSeconds) * time.Second) stop = make(chan bool, 1) go func() { @@ -44,7 +48,7 @@ func monitorNode(intervalSeconds int, collector *converter.CadvisorCollector, ha for { select { case <-stop: - log.Info("Stopping cAdvisor collection") + m.logger.Info("Stopping cAdvisor collection") ticker.Stop() return case <-ticker.C: diff --git a/pkg/monitors/cadvisor/converter/converter.go b/pkg/monitors/cadvisor/converter/converter.go index 388be47b6a..e05fb54856 100644 --- a/pkg/monitors/cadvisor/converter/converter.go +++ b/pkg/monitors/cadvisor/converter/converter.go @@ -6,12 +6,12 @@ import ( "strings" "time" - log "github.com/sirupsen/logrus" - info "github.com/google/cadvisor/info/v1" "github.com/signalfx/golib/v3/datapoint" - "github.com/signalfx/signalfx-agent/pkg/utils" + log "github.com/sirupsen/logrus" stats "k8s.io/kubelet/pkg/apis/stats/v1alpha1" + + "github.com/signalfx/signalfx-agent/pkg/utils" ) // InfoProvider provides a swappable interface to actually get the cAdvisor @@ -69,6 +69,7 @@ type CadvisorCollector struct { podEphemeralStorageMetrics []podStatusMetric sendDPs func(...*datapoint.Datapoint) defaultDimensions map[string]string + logger log.FieldLogger } // fsValues is a helper method for assembling per-filesystem stats. @@ -675,7 +676,8 @@ func getPodEphemeralStorageMetrics() []podStatusMetric { func NewCadvisorCollector( infoProvider InfoProvider, sendDPs func(...*datapoint.Datapoint), - defaultDimensions map[string]string) *CadvisorCollector { + defaultDimensions map[string]string, + logger log.FieldLogger) *CadvisorCollector { return &CadvisorCollector{ infoProvider: infoProvider, @@ -687,6 +689,7 @@ func NewCadvisorCollector( podEphemeralStorageMetrics: getPodEphemeralStorageMetrics(), sendDPs: sendDPs, defaultDimensions: defaultDimensions, + logger: logger, } } @@ -749,7 +752,7 @@ func (c *CadvisorCollector) collectContainersInfo() { now := time.Now() containers, err := c.infoProvider.SubcontainersInfo("/") if err != nil { - log.WithError(err).Error("Couldn't get cAdvisor container stats") + c.logger.WithError(err).Error("Couldn't get cAdvisor container stats") return } dpsOut := make([]*datapoint.Datapoint, 0) @@ -847,7 +850,7 @@ func (c *CadvisorCollector) collectMachineInfo() { machineInfo, err := c.infoProvider.GetMachineInfo() if err != nil { //c.errors.Set(1) - log.Errorf("Couldn't get machine info: %s", err) + c.logger.Errorf("Couldn't get machine info: %s", err) return } if machineInfo == nil { @@ -878,7 +881,7 @@ func (c *CadvisorCollector) collectEphemeralStorageStatsFromPod() { podStats, err := c.infoProvider.GetEphemeralStatsFromPods() if err != nil { - log.Errorf("Couldn't get Pod stats: %s", err) + c.logger.Errorf("Couldn't get Pod stats: %s", err) return } diff --git a/pkg/monitors/cadvisor/kubeletstats.go b/pkg/monitors/cadvisor/kubeletstats.go index f44d015326..74fc8a41d5 100644 --- a/pkg/monitors/cadvisor/kubeletstats.go +++ b/pkg/monitors/cadvisor/kubeletstats.go @@ -13,12 +13,13 @@ import ( "time" info "github.com/google/cadvisor/info/v1" + "github.com/sirupsen/logrus" + stats "k8s.io/kubelet/pkg/apis/stats/v1alpha1" + "github.com/signalfx/signalfx-agent/pkg/core/common/kubelet" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" - log "github.com/sirupsen/logrus" - stats "k8s.io/kubelet/pkg/apis/stats/v1alpha1" ) func init() { @@ -45,13 +46,14 @@ type KubeletStatsMonitor struct { // Configure the Kubelet Stats monitor func (ks *KubeletStatsMonitor) Configure(conf *KubeletStatsConfig) error { - client, err := kubelet.NewClient(&conf.KubeletAPI) + ks.logger = logrus.WithFields(logrus.Fields{"monitorType": conf.MonitorConfig.Type, "monitorID": conf.MonitorID}) + client, err := kubelet.NewClient(&conf.KubeletAPI, ks.logger) if err != nil { return err } return ks.Monitor.Configure(&conf.MonitorConfig, ks.Output.SendDatapoints, - newKubeletInfoProvider(client), ks.Output.HasEnabledMetricInGroup(groupPodEphemeralStats)) + newKubeletInfoProvider(client, ks.logger), ks.Output.HasEnabledMetricInGroup(groupPodEphemeralStats)) } type statsRequest struct { @@ -79,11 +81,13 @@ type statsRequest struct { type kubeletInfoProvider struct { client *kubelet.Client + logger logrus.FieldLogger } -func newKubeletInfoProvider(client *kubelet.Client) *kubeletInfoProvider { +func newKubeletInfoProvider(client *kubelet.Client, logger logrus.FieldLogger) *kubeletInfoProvider { return &kubeletInfoProvider{ client: client, + logger: logger, } } @@ -135,7 +139,7 @@ func (kip *kubeletInfoProvider) getAllContainersLatestStats() ([]info.ContainerI return nil, err } - log.Debugf("Sending body to kubelet stats endpoint: %s", body) + kip.logger.Debugf("Sending body to kubelet stats endpoint: %s", body) req, err := kip.client.NewRequest("POST", "/stats/container/", bytes.NewBuffer(body)) if err != nil { return nil, err diff --git a/pkg/monitors/cgroups/cpu.go b/pkg/monitors/cgroups/cpu.go index 3ec2d9954c..20c5054d7c 100644 --- a/pkg/monitors/cgroups/cpu.go +++ b/pkg/monitors/cgroups/cpu.go @@ -11,8 +11,8 @@ import ( "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + "github.com/signalfx/signalfx-agent/pkg/utils/filter" - "github.com/sirupsen/logrus" ) func (m *Monitor) getCPUMetrics(controllerPath string, pathFilter filter.StringFilter) []*datapoint.Datapoint { @@ -51,7 +51,7 @@ func (m *Monitor) getCPUMetrics(controllerPath string, pathFilter filter.StringF }) if err != nil { - logrus.WithError(err).Errorf("Failed to process %s", f) + m.logger.WithError(err).Errorf("Failed to process %s", f) continue } diff --git a/pkg/monitors/cgroups/cpuacct.go b/pkg/monitors/cgroups/cpuacct.go index b8f0d00868..496a785c01 100644 --- a/pkg/monitors/cgroups/cpuacct.go +++ b/pkg/monitors/cgroups/cpuacct.go @@ -12,8 +12,8 @@ import ( "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + "github.com/signalfx/signalfx-agent/pkg/utils/filter" - "github.com/sirupsen/logrus" ) func (m *Monitor) getCPUAcctMetrics(controllerPath string, pathFilter filter.StringFilter) []*datapoint.Datapoint { @@ -63,7 +63,7 @@ func (m *Monitor) getCPUAcctMetrics(controllerPath string, pathFilter filter.Str err := withOpenFile(file, func(fd *os.File) { usage, err := parseFunc(fd) if err != nil { - logrus.WithError(err).Errorf("Failed to parse %s", file) + m.logger.WithError(err).Errorf("Failed to parse %s", file) return } @@ -74,7 +74,7 @@ func (m *Monitor) getCPUAcctMetrics(controllerPath string, pathFilter filter.Str dps = append(dps, usageDPs...) }) if err != nil { - logrus.WithError(err).Errorf("Could not process %s", file) + m.logger.WithError(err).Errorf("Could not process %s", file) } } }) diff --git a/pkg/monitors/cgroups/memory.go b/pkg/monitors/cgroups/memory.go index 8967bf1461..0f8f9e3733 100644 --- a/pkg/monitors/cgroups/memory.go +++ b/pkg/monitors/cgroups/memory.go @@ -12,8 +12,8 @@ import ( "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + "github.com/signalfx/signalfx-agent/pkg/utils/filter" - "github.com/sirupsen/logrus" ) func (m *Monitor) getMemoryMetrics(controllerPath string, pathFilter filter.StringFilter) []*datapoint.Datapoint { @@ -55,7 +55,7 @@ func (m *Monitor) getMemoryMetrics(controllerPath string, pathFilter filter.Stri fileDPs, err = parseFunc(fd) }) if err != nil { - logrus.WithError(err).Errorf("Failed to process %s", f) + m.logger.WithError(err).Errorf("Failed to process %s", f) continue } diff --git a/pkg/monitors/cgroups/monitor.go b/pkg/monitors/cgroups/monitor.go index 630c2b9e7b..eeeb00efea 100644 --- a/pkg/monitors/cgroups/monitor.go +++ b/pkg/monitors/cgroups/monitor.go @@ -9,12 +9,13 @@ import ( "github.com/prometheus/procfs" "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/filter" - "github.com/sirupsen/logrus" ) // Config for this monitor @@ -44,11 +45,12 @@ func init() { type Monitor struct { Output types.FilteringOutput cancel context.CancelFunc + logger logrus.FieldLogger } // Configure the monitor and start collection func (m *Monitor) Configure(conf *Config) error { - logger := logrus.WithField("monitorType", monitorType) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) var ctx context.Context ctx, m.cancel = context.WithCancel(context.Background()) @@ -65,7 +67,7 @@ func (m *Monitor) Configure(conf *Config) error { utils.RunOnInterval(ctx, func() { controllerPaths, err := getCgroupControllerPaths(conf.ProcPath) if err != nil { - logger.WithError(err).Error("Failed to get cgroup controller roots") + m.logger.WithError(err).Error("Failed to get cgroup controller roots") return } diff --git a/pkg/monitors/cloudfoundry/client.go b/pkg/monitors/cloudfoundry/client.go index 5d22db1a47..708d3d39d5 100644 --- a/pkg/monitors/cloudfoundry/client.go +++ b/pkg/monitors/cloudfoundry/client.go @@ -4,7 +4,6 @@ import ( "context" "crypto/tls" "errors" - "log" "net" "net/http" "strings" @@ -13,9 +12,10 @@ import ( "code.cloudfoundry.org/go-loggregator" "code.cloudfoundry.org/go-loggregator/rpc/loggregator_v2" "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/common/dpmeta" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) const defaultShardID = "signalfx-nozzle" @@ -111,7 +111,7 @@ func (c *SignalFxGatewayClient) processEnvelopes(ctx context.Context, streamer l envDPs, err := envelopeToDatapoints(env) if err != nil { - log.Printf("Error converting envelope to SignalFx datapoint: %v", err) + c.logger.Printf("Error converting envelope to SignalFx datapoint: %v", err) continue } diff --git a/pkg/monitors/cloudfoundry/monitor.go b/pkg/monitors/cloudfoundry/monitor.go index 7807f1ba61..763a2ddaff 100644 --- a/pkg/monitors/cloudfoundry/monitor.go +++ b/pkg/monitors/cloudfoundry/monitor.go @@ -6,10 +6,11 @@ import ( "net/url" "time" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" - "github.com/sirupsen/logrus" ) func init() { @@ -57,12 +58,13 @@ func (c *Config) Validate() error { type Monitor struct { Output types.Output cancel func() + logger logrus.FieldLogger } // Configure is the main function of the monitor, it will report host metadata // on a varied interval func (m *Monitor) Configure(conf *Config) error { - logger := logrus.WithFields(logrus.Fields{"monitorType": monitorType}) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // create contexts for managing the the plugin loop var ctx context.Context @@ -72,18 +74,18 @@ func (m *Monitor) Configure(conf *Config) error { for { uaaToken, err := getUAAToken(conf.UAAURL, conf.UAAUser, conf.UAAPassword, conf.UAASkipVerify) if err != nil { - logger.WithError(err).Errorf("Could not get UAA access token for user %s, retrying...", conf.UAAUser) + m.logger.WithError(err).Errorf("Could not get UAA access token for user %s, retrying...", conf.UAAUser) time.Sleep(10 * time.Second) continue } - client := NewSignalFxGatewayClient(conf.RLPGatewayURL, uaaToken, conf.RLPGatewaySkipVerify, logger) + client := NewSignalFxGatewayClient(conf.RLPGatewayURL, uaaToken, conf.RLPGatewaySkipVerify, m.logger) client.ShardID = conf.ShardID - logger.Info("Running RLP Gateway streamer") + m.logger.Info("Running RLP Gateway streamer") err = client.Run(ctx, m.Output.SendDatapoints) if err != nil && err != context.Canceled { - logger.WithError(err).Error("Gateway streamer shut down unexpectedly, retrying...") + m.logger.WithError(err).Error("Gateway streamer shut down unexpectedly, retrying...") time.Sleep(10 * time.Second) continue } diff --git a/pkg/monitors/collectd/collectd.go b/pkg/monitors/collectd/collectd.go index 4327622275..b900f81301 100644 --- a/pkg/monitors/collectd/collectd.go +++ b/pkg/monitors/collectd/collectd.go @@ -21,6 +21,7 @@ import ( "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/event" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" @@ -60,7 +61,7 @@ type Manager struct { terminated chan struct{} requestRestart chan struct{} - logger *log.Entry + logger log.FieldLogger } var collectdSingleton *Manager diff --git a/pkg/monitors/collectd/elasticsearch/elasticsearch.go b/pkg/monitors/collectd/elasticsearch/elasticsearch.go index 1b7177b7ef..d64b69360e 100644 --- a/pkg/monitors/collectd/elasticsearch/elasticsearch.go +++ b/pkg/monitors/collectd/elasticsearch/elasticsearch.go @@ -9,7 +9,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/collectd/python" "github.com/signalfx/signalfx-agent/pkg/monitors/subproc" - log "github.com/sirupsen/logrus" ) func init() { @@ -75,7 +74,7 @@ type Monitor struct { // Configure configures and runs the plugin in collectd func (m *Monitor) Configure(conf *Config) error { - log.Warn("The collectd/elasticsearch monitor is deprecated in favor of the elasticsearch monitor.") + m.Logger().Warn("The collectd/elasticsearch monitor is deprecated in favor of the elasticsearch monitor.") conf.pyConf = &python.Config{ MonitorConfig: conf.MonitorConfig, Host: conf.Host, diff --git a/pkg/monitors/collectd/kong/kong.go b/pkg/monitors/collectd/kong/kong.go index 3ff968ed12..5977b28309 100644 --- a/pkg/monitors/collectd/kong/kong.go +++ b/pkg/monitors/collectd/kong/kong.go @@ -1,12 +1,11 @@ package kong import ( - "github.com/signalfx/signalfx-agent/pkg/monitors/collectd" "github.com/sirupsen/logrus" "github.com/signalfx/signalfx-agent/pkg/core/config" - "github.com/signalfx/signalfx-agent/pkg/monitors" + "github.com/signalfx/signalfx-agent/pkg/monitors/collectd" "github.com/signalfx/signalfx-agent/pkg/monitors/collectd/python" "github.com/signalfx/signalfx-agent/pkg/monitors/subproc" ) @@ -189,7 +188,7 @@ func (m *Monitor) Configure(c *Config) error { for _, metric := range m.Output.EnabledMetrics() { metricConfig := metricConfigMap[metric] if metricConfig == "" { - log.Warnf("Unable to determine metric configuration name for %s", metric) + m.Logger().Warnf("Unable to determine metric configuration name for %s", metric) continue } diff --git a/pkg/monitors/collectd/logging.go b/pkg/monitors/collectd/logging.go index 619cb5ff75..dce9dd2ab7 100644 --- a/pkg/monitors/collectd/logging.go +++ b/pkg/monitors/collectd/logging.go @@ -7,8 +7,9 @@ import ( "regexp" "strings" - "github.com/signalfx/signalfx-agent/pkg/utils" log "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/utils" ) var logRE = regexp.MustCompile( @@ -17,7 +18,7 @@ var logRE = regexp.MustCompile( `(?:\[(?P\w+?)\] )?` + `(?P(?:(?P[\w-]+?): )?.*)`) -func logLine(line string, logger *log.Entry) { +func logLine(line string, logger log.FieldLogger) { groups := utils.RegexpGroupMap(logRE, line) var level string diff --git a/pkg/monitors/collectd/metadata/metadata.go b/pkg/monitors/collectd/metadata/metadata.go index e0f5f3bad6..dd629b4f51 100644 --- a/pkg/monitors/collectd/metadata/metadata.go +++ b/pkg/monitors/collectd/metadata/metadata.go @@ -8,11 +8,12 @@ package metadata import ( "errors" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/collectd" "github.com/signalfx/signalfx-agent/pkg/utils/hostfs" - log "github.com/sirupsen/logrus" ) var logger = log.WithFields(log.Fields{"monitorType": monitorType}) @@ -21,6 +22,7 @@ func init() { monitors.Register(&monitorMetadata, func() interface{} { return &Monitor{ MonitorCore: *collectd.NewMonitorCore(CollectdTemplate), + logger: logger, } }, &Config{}) } @@ -97,19 +99,21 @@ var _ config.ExtraMetrics = &Config{} // Monitor is the main type that represents the monitor type Monitor struct { collectd.MonitorCore + logger log.FieldLogger } // Configure configures and runs the plugin in collectd func (m *Monitor) Configure(conf *Config) error { + m.logger = m.logger.WithField("monitorID", conf.MonitorID) conf.WriteServerURL = collectd.MainInstance().WriteServerURL() if conf.ProcFSPath != "" { - logger.Warningf("please set the `procPath` top level agent configuration instead of the monitor level configuration") + m.logger.Warningf("please set the `procPath` top level agent configuration instead of the monitor level configuration") } else { // get top level configuration for /proc path conf.ProcFSPath = hostfs.HostProc() } if conf.EtcPath != "" { - logger.Warningf("Please set the `etcPath` top level agent configuration instead of the monitor level configuration") + m.logger.Warningf("Please set the `etcPath` top level agent configuration instead of the monitor level configuration") } else { // get top level configuration for /etc path conf.EtcPath = hostfs.HostEtc() diff --git a/pkg/monitors/collectd/monitorcore.go b/pkg/monitors/collectd/monitorcore.go index 6bb0f80c7e..aff5b1c958 100644 --- a/pkg/monitors/collectd/monitorcore.go +++ b/pkg/monitors/collectd/monitorcore.go @@ -12,9 +12,10 @@ import ( "text/template" "github.com/pkg/errors" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors/types" - log "github.com/sirupsen/logrus" ) // MonitorCore contains common data/logic for collectd monitors, mainly diff --git a/pkg/monitors/collectd/processes/processes.go b/pkg/monitors/collectd/processes/processes.go index 16d2ccfb28..e492fedc7e 100644 --- a/pkg/monitors/collectd/processes/processes.go +++ b/pkg/monitors/collectd/processes/processes.go @@ -6,11 +6,12 @@ package processes //go:generate ../../../../scripts/collectd-template-to-go processes.tmpl import ( + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/collectd" "github.com/signalfx/signalfx-agent/pkg/utils/hostfs" - log "github.com/sirupsen/logrus" ) var logger = log.WithFields(log.Fields{"monitorType": monitorType}) @@ -19,6 +20,7 @@ func init() { monitors.Register(&monitorMetadata, func() interface{} { return &Monitor{ MonitorCore: *collectd.NewMonitorCore(CollectdTemplate), + logger: logger, } }, &Config{}) } @@ -49,15 +51,17 @@ func (c *Config) Validate() error { // Monitor is the main type that represents the monitor type Monitor struct { collectd.MonitorCore + logger log.FieldLogger } // Configure configures and runs the plugin in collectd -func (am *Monitor) Configure(conf *Config) error { +func (m *Monitor) Configure(conf *Config) error { + m.logger = m.logger.WithField("monitorID", conf.MonitorID) if conf.ProcFSPath != "" { - logger.Warningf("Please set the `procPath` top level agent configuration instead of the monitor level configuration") + m.logger.Warningf("Please set the `procPath` top level agent configuration instead of the monitor level configuration") } else { // get top level configuration for /proc path conf.ProcFSPath = hostfs.HostProc() } - return am.SetConfigurationAndRun(conf) + return m.SetConfigurationAndRun(conf) } diff --git a/pkg/monitors/collectd/python/python.go b/pkg/monitors/collectd/python/python.go index b02b66357f..b43faa4d2a 100644 --- a/pkg/monitors/collectd/python/python.go +++ b/pkg/monitors/collectd/python/python.go @@ -20,6 +20,8 @@ import ( "github.com/signalfx/golib/v3/event" mpCollectd "github.com/signalfx/ingest-protocols/protocol/collectd" collectdformat "github.com/signalfx/ingest-protocols/protocol/collectd/format" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/collectd" @@ -27,7 +29,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/monitors/subproc/signalfx" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils/collectdutil" - log "github.com/sirupsen/logrus" ) const messageTypeValueList subproc.MessageType = 100 diff --git a/pkg/monitors/collectd/rabbitmq/rabbitmq.go b/pkg/monitors/collectd/rabbitmq/rabbitmq.go index c84fb1a9a6..5e316ce457 100644 --- a/pkg/monitors/collectd/rabbitmq/rabbitmq.go +++ b/pkg/monitors/collectd/rabbitmq/rabbitmq.go @@ -4,6 +4,7 @@ import ( "strings" "github.com/signalfx/golib/v3/pointer" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/utils" @@ -12,10 +13,9 @@ import ( "github.com/signalfx/signalfx-agent/pkg/monitors/collectd" "github.com/signalfx/signalfx-agent/pkg/monitors/collectd/python" "github.com/signalfx/signalfx-agent/pkg/monitors/subproc" - log "github.com/sirupsen/logrus" ) -var logger = log.WithFields(log.Fields{"monitorType": monitorType}) +//var logger = log.WithFields(log.Fields{"monitorType": monitorType}) func init() { monitors.Register(&monitorMetadata, func() interface{} { @@ -97,7 +97,7 @@ func (m *Monitor) Configure(conf *Config) error { } if conf.SSLVerify && strings.TrimSpace(conf.SSLCACertFile) == "" { - logger.Warn("Potential configuration error because SSLVerify is enabled while SSLCACertFile is empty. Default system root CA certificates will be used in SSL verification and may fail silently.") + m.Logger().Warn("Potential configuration error because SSLVerify is enabled while SSLCACertFile is empty. Default system root CA certificates will be used in SSL verification and may fail silently.") } conf.pyConf = &python.Config{ diff --git a/pkg/monitors/collectd/templating_linux.go b/pkg/monitors/collectd/templating_linux.go index b7f6572c31..831131eef7 100644 --- a/pkg/monitors/collectd/templating_linux.go +++ b/pkg/monitors/collectd/templating_linux.go @@ -11,15 +11,15 @@ import ( "reflect" "runtime" "strconv" + "strings" "text/template" "github.com/davecgh/go-spew/spew" "github.com/pkg/errors" - "github.com/signalfx/signalfx-agent/pkg/core/services" - "github.com/signalfx/signalfx-agent/pkg/utils" log "github.com/sirupsen/logrus" - "strings" + "github.com/signalfx/signalfx-agent/pkg/core/services" + "github.com/signalfx/signalfx-agent/pkg/utils" ) // WriteConfFile writes a file to the given filePath, ensuring that the diff --git a/pkg/monitors/collectd/write_server.go b/pkg/monitors/collectd/write_server.go index a139d0124a..38b00e73bf 100644 --- a/pkg/monitors/collectd/write_server.go +++ b/pkg/monitors/collectd/write_server.go @@ -9,12 +9,12 @@ import ( "time" "github.com/mailru/easyjson" - log "github.com/sirupsen/logrus" - collectdformat "github.com/signalfx/gateway/protocol/collectd/format" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/event" "github.com/signalfx/ingest-protocols/protocol/collectd" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/utils/collectdutil" ) diff --git a/pkg/monitors/conviva/conviva.go b/pkg/monitors/conviva/conviva.go index 424a480009..e26d79ea77 100644 --- a/pkg/monitors/conviva/conviva.go +++ b/pkg/monitors/conviva/conviva.go @@ -10,14 +10,14 @@ import ( "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + "github.com/sirupsen/logrus" + "golang.org/x/sync/errgroup" + "github.com/signalfx/signalfx-agent/pkg/core/common/dpmeta" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" - "golang.org/x/sync/errgroup" ) const ( @@ -54,7 +54,7 @@ func init() { // Configure monitor func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) m.timeout = time.Duration(conf.TimeoutSeconds) * time.Second m.client = newConvivaClient(&http.Client{ Transport: &http.Transport{ diff --git a/pkg/monitors/cpu/cpu.go b/pkg/monitors/cpu/cpu.go index 4f46ef3b93..63dc16ac40 100644 --- a/pkg/monitors/cpu/cpu.go +++ b/pkg/monitors/cpu/cpu.go @@ -9,12 +9,12 @@ import ( "github.com/shirou/gopsutil/cpu" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) const cpuUtilName = "cpu.utilization" @@ -53,7 +53,7 @@ type Monitor struct { } func (m *Monitor) generatePerCoreDatapoints() []*datapoint.Datapoint { - totals, err := times(true) + totals, err := m.times(true) if err != nil { if err == context.DeadlineExceeded { m.logger.WithField("debug", err).Debugf("unable to get per core cpu times will try again in the next reporting cycle") @@ -105,7 +105,7 @@ func (m *Monitor) generatePerCoreDatapoints() []*datapoint.Datapoint { } func (m *Monitor) generateDatapoints() []*datapoint.Datapoint { - total, err := times(false) + total, err := m.times(false) if err != nil || len(total) == 0 { if err == context.DeadlineExceeded { m.logger.WithField("debug", err).Debugf("unable to get cpu times will try again in the next reporting cycle") @@ -199,7 +199,7 @@ func (m *Monitor) initializeCPUTimes() { // initialize previous values var total []cpu.TimesStat var err error - if total, err = times(false); err != nil { + if total, err = m.times(false); err != nil { m.logger.WithField("debug", err).Debugf("unable to initialize cpu times will try again in the next reporting cycle") } if len(total) > 0 { @@ -211,7 +211,7 @@ func (m *Monitor) initializePerCoreCPUTimes() { // initialize per core cpu times var totals []cpu.TimesStat var err error - if totals, err = times(true); err != nil { + if totals, err = m.times(true); err != nil { m.logger.WithField("debug", err).Debugf("unable to initialize per core cpu times will try again in the next reporting cycle") } m.previousPerCore = make(map[string]*totalUsed, len(totals)) @@ -223,7 +223,7 @@ func (m *Monitor) initializePerCoreCPUTimes() { // Configure is the main function of the monitor, it will report host metadata // on a varied interval func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // create contexts for managing the the plugin loop var ctx context.Context diff --git a/pkg/monitors/cpu/cpu_others.go b/pkg/monitors/cpu/cpu_others.go index 2015d151dc..a5a8b97ff7 100644 --- a/pkg/monitors/cpu/cpu_others.go +++ b/pkg/monitors/cpu/cpu_others.go @@ -7,5 +7,6 @@ import ( "github.com/shirou/gopsutil/cpu" ) -// setting cpu.Times to a package variable for testing purposes -var times = cpu.Times +func (m *Monitor) times(perCore bool) ([]cpu.TimesStat, error) { + return cpu.Times(perCore) +} diff --git a/pkg/monitors/cpu/cpu_windows.go b/pkg/monitors/cpu/cpu_windows.go index edb4640812..9f48eefda0 100644 --- a/pkg/monitors/cpu/cpu_windows.go +++ b/pkg/monitors/cpu/cpu_windows.go @@ -8,7 +8,6 @@ import ( "unsafe" "github.com/shirou/gopsutil/cpu" - "github.com/sirupsen/logrus" "golang.org/x/sys/windows" ) @@ -28,11 +27,6 @@ const ( var ( gopsutilTimes = cpu.Times - // set getTimes function to a package variable to make it easier to test and - // wrap gopsutil on windows - times = getTimes - logger = logrus.WithField("monitorType", monitorType) - // Windows API DLL ntdll = windows.NewLazySystemDLL("Ntdll.dll") ntdllLoadErr = ntdll.Load() // attempt to load the system dll and store the err for reference @@ -127,11 +121,11 @@ func ntQuerySystemInformation() ([]cpu.TimesStat, error) { return coreInfo, nil } -// getTimes has the same parameters and return values as gopsutil's cpu.Times() function +// times has the same parameters and return values as gopsutil's cpu.Times() function // it actually relies on gopsutil's cpu.Times for non-per core information. // when percore is true it will attempt to use windows dll's to get the information // or fall back to gopsutil -func getTimes(perCore bool) ([]cpu.TimesStat, error) { +func (m *Monitor) times(perCore bool) ([]cpu.TimesStat, error) { // non-percore utilization in gopsutil does not rely on wmi so it's fine to // utilize it as is if !perCore { @@ -152,6 +146,6 @@ func getTimes(perCore bool) ([]cpu.TimesStat, error) { } // fall back to gopsutil if there was an error or the dll and proc weren't loaded/found - logger.WithField("debug", err).Debugf("falling back to gopsutil for per core cpu times") + m.logger.WithField("debug", err).Debugf("falling back to gopsutil for per core cpu times") return gopsutilTimes(perCore) } diff --git a/pkg/monitors/diskio/diskio_others.go b/pkg/monitors/diskio/diskio_others.go index 6ac36c4d63..3674308297 100644 --- a/pkg/monitors/diskio/diskio_others.go +++ b/pkg/monitors/diskio/diskio_others.go @@ -11,6 +11,8 @@ import ( "github.com/shirou/gopsutil/disk" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/filter" @@ -25,6 +27,7 @@ type Monitor struct { conf *Config filter *filter.OverridableStringFilter lastOpCount int64 + logger logrus.FieldLogger } func (m *Monitor) makeLinuxDatapoints(disk disk.IOCountersStat, dimensions map[string]string) []*datapoint.Datapoint { @@ -45,7 +48,7 @@ func (m *Monitor) makeLinuxDatapoints(disk disk.IOCountersStat, dimensions map[s func (m *Monitor) emitDatapoints() { iocounts, err := iOCounters() if err != nil { - logger.WithError(err).Errorf("Failed to load disk io counters") + m.logger.WithError(err).Errorf("Failed to load disk io counters") return } @@ -55,7 +58,7 @@ func (m *Monitor) emitDatapoints() { for key, disk := range iocounts { // skip it if the disk doesn't match if !m.filter.Matches(disk.Name) { - logger.Debugf("skipping disk '%s'", disk.Name) + m.logger.Debugf("skipping disk '%s'", disk.Name) continue } @@ -81,12 +84,13 @@ func (m *Monitor) Configure(conf *Config) error { // save conf to monitor for convenience m.conf = conf + m.logger = logger.WithField("monitorID", conf.MonitorID) // configure filters var err error if len(conf.Disks) == 0 { m.filter, err = filter.NewOverridableStringFilter([]string{"*"}) - logger.Debugf("empty disk list defaulting to '*'") + m.logger.Debugf("empty disk list defaulting to '*'") } else { m.filter, err = filter.NewOverridableStringFilter(conf.Disks) } diff --git a/pkg/monitors/diskio/diskio_windows.go b/pkg/monitors/diskio/diskio_windows.go index 1f1d2a2670..6318cc4248 100644 --- a/pkg/monitors/diskio/diskio_windows.go +++ b/pkg/monitors/diskio/diskio_windows.go @@ -9,6 +9,8 @@ import ( "time" "github.com/influxdata/telegraf" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/monitors/winperfcounters" @@ -23,6 +25,7 @@ type Monitor struct { cancel func() conf *Config filter *filter.OverridableStringFilter + logger logrus.FieldLogger } // maps telegraf metricnames to sfx metricnames @@ -42,7 +45,7 @@ func (m *Monitor) filterMeasurements(ms telegraf.Metric) error { // skip it if the disk doesn't match if !ok || !m.filter.Matches(instance) { - logger.Debugf("skipping disk '%s'", instance) + m.logger.Debugf("skipping disk '%s'", instance) // explicitly remove all fields to an empty map so no metrics are emitted for field := range ms.Fields() { ms.RemoveField(field) @@ -67,12 +70,13 @@ func (m *Monitor) Configure(conf *Config) error { // save conf to monitor for convenience m.conf = conf + m.logger = logger.WithField("monitorID", conf.MonitorID) // configure filters var err error if len(conf.Disks) == 0 { m.filter, err = filter.NewOverridableStringFilter([]string{"*"}) - logger.Debugf("empty disk list defaulting to '*'") + m.logger.Debugf("empty disk list defaulting to '*'") } else { m.filter, err = filter.NewOverridableStringFilter(conf.Disks) } @@ -116,7 +120,7 @@ func (m *Monitor) Configure(conf *Config) error { } // create batch emitter - emitter := baseemitter.NewEmitter(m.Output, logger) + emitter := baseemitter.NewEmitter(m.Output, m.logger) // add function to apply exhuastive filters to measurments emitter.AddMeasurementTransformation(m.filterMeasurements) @@ -141,7 +145,7 @@ func (m *Monitor) Configure(conf *Config) error { utils.RunOnInterval(ctx, func() { // gather the perfcounters if err := plugin.Gather(accumulator); err != nil { - logger.WithError(err).Errorf("unable to gather metrics from plugin") + m.logger.WithError(err).Errorf("unable to gather metrics from plugin") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/docker/docker.go b/pkg/monitors/docker/docker.go index 11466cfab8..df42abda3d 100644 --- a/pkg/monitors/docker/docker.go +++ b/pkg/monitors/docker/docker.go @@ -13,6 +13,8 @@ import ( dtypes "github.com/docker/docker/api/types" docker "github.com/docker/docker/client" "github.com/pkg/errors" + "github.com/sirupsen/logrus" + dockercommon "github.com/signalfx/signalfx-agent/pkg/core/common/docker" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" @@ -20,7 +22,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/filter" "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" - "github.com/sirupsen/logrus" ) const dockerAPIVersion = "v1.24" @@ -88,7 +89,7 @@ type dockerContainer struct { // Configure the monitor and kick off volume metric syncing func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType}) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) enhancedMetricsConfig := EnableExtraGroups(conf.EnhancedMetricsConfig, m.Output.EnabledMetrics()) diff --git a/pkg/monitors/dotnet/dotnet.go b/pkg/monitors/dotnet/dotnet.go index d948f4130d..14056e9b02 100644 --- a/pkg/monitors/dotnet/dotnet.go +++ b/pkg/monitors/dotnet/dotnet.go @@ -1,6 +1,8 @@ package dotnet import ( + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" @@ -26,6 +28,7 @@ type Config struct { type Monitor struct { Output types.Output cancel func() + logger logrus.FieldLogger // nolint: structcheck,unused } // Shutdown stops the metric sync diff --git a/pkg/monitors/dotnet/dotnet_windows.go b/pkg/monitors/dotnet/dotnet_windows.go index 255a55a7a3..f50c63f738 100644 --- a/pkg/monitors/dotnet/dotnet_windows.go +++ b/pkg/monitors/dotnet/dotnet_windows.go @@ -8,17 +8,19 @@ import ( "strings" "time" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/monitors/winperfcounters" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) var logger = logrus.WithField("monitorType", monitorType) // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = logger.WithField("monitorID", conf.MonitorID) perfcounterConf := &winperfcounters.Config{ CountersRefreshInterval: conf.CountersRefreshInterval, PrintValid: conf.PrintValid, @@ -70,7 +72,7 @@ func (m *Monitor) Configure(conf *Config) error { } // create base emitter - emitter := baseemitter.NewEmitter(m.Output, logger) + emitter := baseemitter.NewEmitter(m.Output, m.logger) // Hard code the plugin name because the emitter will parse out the // configured measurement name as plugin and that is confusing. @@ -98,7 +100,7 @@ func (m *Monitor) Configure(conf *Config) error { // gather metrics on the specified interval utils.RunOnInterval(ctx, func() { if err := plugin.Gather(ac); err != nil { - logger.WithError(err).Errorf("an error was encountered while gathering metrics from the plugin") + m.logger.WithError(err).Errorf("an error was encountered while gathering metrics from the plugin") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/ecs/ecs.go b/pkg/monitors/ecs/ecs.go index 6c023cacd1..bac71924ec 100644 --- a/pkg/monitors/ecs/ecs.go +++ b/pkg/monitors/ecs/ecs.go @@ -16,6 +16,8 @@ import ( "github.com/pkg/errors" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/common/ecs" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" @@ -23,7 +25,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/filter" - log "github.com/sirupsen/logrus" ) var logger = log.WithFields(log.Fields{"monitorType": monitorType}) @@ -69,10 +70,12 @@ type Monitor struct { // or container metadata is not received. shouldIgnore map[string]bool imageFilter filter.StringFilter + logger log.FieldLogger } // Configure the monitor and kick off volume metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = logger.WithField("monitorID", conf.MonitorID) var err error m.imageFilter, err = filter.NewOverridableStringFilter(conf.ExcludedImages) if err != nil { @@ -94,7 +97,7 @@ func (m *Monitor) Configure(conf *Config) error { if !isRegistered { task, err := fetchTaskMetadata(m.client, m.conf.MetadataEndpoint) if err != nil { - logger.WithFields(log.Fields{ + m.logger.WithFields(log.Fields{ "error": err, }).Error("Could not receive ECS Task Metadata") return @@ -137,14 +140,14 @@ func (m *Monitor) fetchStatsForAll(enhancedMetricsConfig dmonitor.EnhancedMetric body, err := getMetadata(m.client, m.conf.StatsEndpoint) if err != nil { - logger.WithError(err).Error("Failed to read ECS stats") + m.logger.WithError(err).Error("Failed to read ECS stats") return } var stats map[string]dtypes.StatsJSON if err := json.Unmarshal(body, &stats); err != nil { - logger.WithFields(log.Fields{ + m.logger.WithFields(log.Fields{ "error": err, }).Error("Could not parse stats json") return @@ -157,7 +160,7 @@ func (m *Monitor) fetchStatsForAll(enhancedMetricsConfig dmonitor.EnhancedMetric container, ok := m.containers[dockerID] if !ok { - logger.Debugf("Container not found for id %s. Fetching...", dockerID) + m.logger.Debugf("Container not found for id %s. Fetching...", dockerID) if container, err = m.fetchContainer(dockerID); err != nil { m.shouldIgnore[dockerID] = true continue @@ -179,7 +182,7 @@ func (m *Monitor) fetchStatsForAll(enhancedMetricsConfig dmonitor.EnhancedMetric dps, err := dmonitor.ConvertStatsToMetrics(containerJSON, &containerStat, enhancedMetricsConfig) if err != nil { - logger.WithError(err).Errorf("Could not convert docker stats for container id %s", dockerID) + m.logger.WithError(err).Errorf("Could not convert docker stats for container id %s", dockerID) return } diff --git a/pkg/monitors/elasticsearch/query/datapoints.go b/pkg/monitors/elasticsearch/query/datapoints.go index fab74a1350..99236f8a31 100644 --- a/pkg/monitors/elasticsearch/query/datapoints.go +++ b/pkg/monitors/elasticsearch/query/datapoints.go @@ -6,8 +6,9 @@ import ( "time" "github.com/signalfx/golib/v3/datapoint" - "github.com/signalfx/signalfx-agent/pkg/utils" log "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/utils" ) // Struct keeps track of info required at a level of recursion @@ -19,6 +20,7 @@ type dpCollector struct { aggsMeta map[string]*AggregationMeta sfxDimensions map[string]string logger *utils.ThrottledLogger + logFields log.Fields } // Returns aggregation type @@ -28,21 +30,27 @@ func (dpC *dpCollector) getType() string { // Walks through the response, collecting dimensions and datapoints depending on the // type of aggregation at each recursive level -func collectDatapoints(resBody HTTPResponse, aggsMeta map[string]*AggregationMeta, sfxDimensions map[string]string) []*datapoint.Datapoint { +func collectDatapoints(resBody HTTPResponse, aggsMeta map[string]*AggregationMeta, sfxDimensions map[string]string, logFields log.Fields) []*datapoint.Datapoint { out := make([]*datapoint.Datapoint, 0) aggsResult := resBody.Aggregations for k, v := range aggsResult { + fields := log.Fields{ + "aggregation_name": k, + "aggregation_type": aggsMeta[k].Type, + } + for field, val := range logFields { + fields[field] = val + } + // each aggregation at the highest level starts with an empty set of dimensions out = append(out, (&dpCollector{ aggName: k, aggRes: *v, aggsMeta: aggsMeta, sfxDimensions: sfxDimensions, - logger: getNewLoggerWithFields(log.Fields{ - "aggregation_name": k, - "aggregation_type": aggsMeta[k].Type, - }), + logger: getNewLoggerWithFields(fields), + logFields: logFields, }).recursivelyCollectDatapoints()...) } @@ -63,7 +71,7 @@ func (dpC *dpCollector) recursivelyCollectDatapoints() []*datapoint.Datapoint { key, ok := b.Key.(string) if !ok { - log.Warn("Found non string key for bucket. Skipping current aggregation and sub aggregations") + dpC.logger.Warn("Found non string key for bucket. Skipping current aggregation and sub aggregations") break } @@ -80,30 +88,42 @@ func (dpC *dpCollector) recursivelyCollectDatapoints() []*datapoint.Datapoint { } for k, v := range b.SubAggregations { + fields := log.Fields{ + "aggregation_name": k, + "aggregation_type": dpC.aggsMeta[k].Type, + } + for field, val := range dpC.logFields { + fields[field] = val + } + sfxDatapoints = append(sfxDatapoints, (&dpCollector{ aggName: k, aggRes: *v, aggsMeta: dpC.aggsMeta, sfxDimensions: sfxDimensionsForBucket, - logger: getNewLoggerWithFields(log.Fields{ - "aggregation_name": k, - "aggregation_type": dpC.aggsMeta[k].Type, - }), + logger: getNewLoggerWithFields(fields), + logFields: dpC.logFields, }).recursivelyCollectDatapoints()...) } } // Recursively collect datapoints from sub aggregations for k, v := range dpC.aggRes.SubAggregations { + fields := log.Fields{ + "aggregation_name": k, + "aggregation_type": dpC.aggsMeta[k].Type, + } + for field, val := range dpC.logFields { + fields[field] = val + } + sfxDatapoints = append(sfxDatapoints, (&dpCollector{ aggName: k, aggRes: *v, aggsMeta: dpC.aggsMeta, sfxDimensions: dpC.sfxDimensions, - logger: getNewLoggerWithFields(log.Fields{ - "aggregation_name": k, - "aggregation_type": dpC.aggsMeta[k].Type, - }), + logger: getNewLoggerWithFields(fields), + logFields: dpC.logFields, }).recursivelyCollectDatapoints()...) } @@ -139,15 +159,15 @@ func (dpC *dpCollector) collectDatapointsFromMetricAggregation() []*datapoint.Da case "stats": fallthrough case "extended_stats": - out = append(out, getDatapointsFromStats(dpC.aggName, &dpC.aggRes, sfxDimensionsForMetric)...) + out = append(out, dpC.getDatapointsFromStats(dpC.aggName, &dpC.aggRes, sfxDimensionsForMetric)...) case "percentiles": - out = append(out, getDatapointsFromPercentiles(dpC.aggName, &dpC.aggRes, sfxDimensionsForMetric)...) + out = append(out, dpC.getDatapointsFromPercentiles(dpC.aggName, &dpC.aggRes, sfxDimensionsForMetric)...) default: metricName := dpC.aggName dp, ok := collectDatapoint(metricName, dpC.aggRes.Value, sfxDimensionsForMetric) if !ok { - log.Warnf("Invalid value found: %v", dpC.aggRes.Value) + dpC.logger.Warnf("Invalid value found: %v", dpC.aggRes.Value) return out } @@ -175,7 +195,7 @@ func (dpC *dpCollector) collectDatapointsFromMetricAggregation() []*datapoint.Da // } // Metric names from this integration will look like "extended_stats.count", // "extended_stats.min", "extended_stats.std_deviation_bounds.lower" and so on -func getDatapointsFromStats(aggName string, aggRes *aggregationResponse, dims map[string]string) []*datapoint.Datapoint { +func (dpC *dpCollector) getDatapointsFromStats(aggName string, aggRes *aggregationResponse, dims map[string]string) []*datapoint.Datapoint { out := make([]*datapoint.Datapoint, 0) for k, v := range aggRes.OtherValues { @@ -184,7 +204,7 @@ func getDatapointsFromStats(aggName string, aggRes *aggregationResponse, dims ma m, ok := v.(map[string]interface{}) if !ok { - log.WithFields(log.Fields{"extended_stat": k}).Warnf("Invalid value found for stat: %v", v) + dpC.logger.WithFields(log.Fields{"extended_stat": k}).Warnf("Invalid value found for stat: %v", v) continue } @@ -193,7 +213,7 @@ func getDatapointsFromStats(aggName string, aggRes *aggregationResponse, dims ma dp, ok := collectDatapoint(metricName, bv, dims) if !ok { - log.WithFields(log.Fields{"stat": k}).Warnf("Invalid value found for stat: %v", bv) + dpC.logger.WithFields(log.Fields{"stat": k}).Warnf("Invalid value found for stat: %v", bv) continue } @@ -204,7 +224,7 @@ func getDatapointsFromStats(aggName string, aggRes *aggregationResponse, dims ma dp, ok := collectDatapoint(metricName, v, dims) if !ok { - log.WithFields(log.Fields{"stat": k}).Warnf("Invalid value found for stat: %v", v) + dpC.logger.WithFields(log.Fields{"stat": k}).Warnf("Invalid value found for stat: %v", v) continue } @@ -216,7 +236,7 @@ func getDatapointsFromStats(aggName string, aggRes *aggregationResponse, dims ma } // Collect datapoint from "percentiles" metric aggregation -func getDatapointsFromPercentiles(aggName string, aggRes *aggregationResponse, dims map[string]string) []*datapoint.Datapoint { +func (dpC *dpCollector) getDatapointsFromPercentiles(aggName string, aggRes *aggregationResponse, dims map[string]string) []*datapoint.Datapoint { out := make([]*datapoint.Datapoint, 0) // Values are always expected to be a map between the percentile and the @@ -224,7 +244,7 @@ func getDatapointsFromPercentiles(aggName string, aggRes *aggregationResponse, d values, ok := aggRes.Values.(map[string]interface{}) if !ok { - log.Warnf("No valid values found in percentiles aggregation") + dpC.logger.Warnf("No valid values found in percentiles aggregation") } // Metric name is constituted of the aggregation type "percentiles" and the actual percentile @@ -235,7 +255,7 @@ func getDatapointsFromPercentiles(aggName string, aggRes *aggregationResponse, d p, err := strconv.ParseFloat(k, 64) if err != nil { - log.Warnf("Invalid percentile found: %s", k) + dpC.logger.Warnf("Invalid percentile found: %s", k) continue } @@ -244,7 +264,7 @@ func getDatapointsFromPercentiles(aggName string, aggRes *aggregationResponse, d dp, ok := collectDatapoint(metricName, v, dims) if !ok { - log.WithFields(log.Fields{"percentile": k}).Warnf("Invalid value found for percentile: %v", v) + dpC.logger.WithFields(log.Fields{"percentile": k}).Warnf("Invalid value found for percentile: %v", v) continue } diff --git a/pkg/monitors/elasticsearch/query/datapoints_test.go b/pkg/monitors/elasticsearch/query/datapoints_test.go index 9cc3b098e8..e823f55530 100644 --- a/pkg/monitors/elasticsearch/query/datapoints_test.go +++ b/pkg/monitors/elasticsearch/query/datapoints_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" ) @@ -33,7 +34,7 @@ func TestDatapointsFromTerminalBucketAggregation(t *testing.T) { "host": { Type: "filters", }, - }, map[string]string{}) + }, map[string]string{}, logrus.Fields{}) assert.ElementsMatch(t, dps, []*datapoint.Datapoint{ { @@ -97,7 +98,7 @@ func TestMetricAggregationWithTermsAggregation(t *testing.T) { "metric_agg_1": { Type: "avg", }, - }, map[string]string{}) + }, map[string]string{}, logrus.Fields{}) assert.ElementsMatch(t, dps, []*datapoint.Datapoint{ { @@ -185,7 +186,7 @@ func TestExtendedStatsAggregationsFromFiltersAggregation(t *testing.T) { "metric_agg_1": { Type: "extended_stats", }, - }, map[string]string{}) + }, map[string]string{}, logrus.Fields{}) dims := map[string]map[string]string{ "madrid": { @@ -370,7 +371,7 @@ func TestPercentilesAggregationsFromFiltersAggregation(t *testing.T) { "metric_agg_1": { Type: "percentiles", }, - }, map[string]string{}) + }, map[string]string{}, logrus.Fields{}) dims := map[string]map[string]string{ "madrid": { @@ -484,7 +485,7 @@ func TestMultipleMetricAggregationWithTermsAggregation(t *testing.T) { "metric_agg_3": { Type: "extended_stats", }, - }, map[string]string{}) + }, map[string]string{}, logrus.Fields{}) dims := map[string]map[string]string{ "metric_agg_1": { diff --git a/pkg/monitors/elasticsearch/query/monitor.go b/pkg/monitors/elasticsearch/query/monitor.go index 614b8326bc..8de00d357a 100644 --- a/pkg/monitors/elasticsearch/query/monitor.go +++ b/pkg/monitors/elasticsearch/query/monitor.go @@ -5,14 +5,17 @@ import ( "encoding/json" "time" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/common/httpclient" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) +var logger = log.WithField("monitorType", monitorType) + // Config for this monitor type Config struct { config.MonitorConfig `yaml:",inline" acceptsEndpoints:"true"` @@ -35,6 +38,7 @@ type Monitor struct { Output types.FilteringOutput cancel context.CancelFunc ctx context.Context + logger log.FieldLogger } func init() { @@ -43,6 +47,7 @@ func init() { // Configure monitor func (m *Monitor) Configure(config *Config) error { + m.logger = logger.WithField("monitorID", config.MonitorID) httpClient, err := config.HTTPConfig.Build() if err != nil { return err @@ -65,19 +70,19 @@ func (m *Monitor) Configure(config *Config) error { body, err := esClient.makeHTTPRequestFromConfig(config.Index, config.ElasticsearchRequest) if err != nil { - log.Errorf("Failed to make HTTP request: %s", err) + m.logger.Errorf("Failed to make HTTP request: %s", err) return } var resBody HTTPResponse if err := json.Unmarshal(body, &resBody); err != nil { - log.Errorf("Error processing HTTP response: %s", err) + m.logger.Errorf("Error processing HTTP response: %s", err) return } dps := collectDatapoints(resBody, aggsMeta, map[string]string{ "index": config.Index, - }) + }, log.Fields{"monitorID": config.MonitorID}) m.Output.SendDatapoints(dps...) }, time.Duration(config.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/elasticsearch/stats/elasticsearch.go b/pkg/monitors/elasticsearch/stats/elasticsearch.go index ce256af876..4d32d83656 100644 --- a/pkg/monitors/elasticsearch/stats/elasticsearch.go +++ b/pkg/monitors/elasticsearch/stats/elasticsearch.go @@ -8,12 +8,13 @@ import ( "time" "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/common/httpclient" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) // Config for this monitor @@ -140,7 +141,7 @@ func (sinfo *sharedInfo) getAllSharedInfo() (map[string]string, map[string]strin // Configure monitor func (m *Monitor) Configure(c *Config) error { - m.logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorType}), 20*time.Second) + m.logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": c.MonitorID}), 20*time.Second) // conf is a config shallow copy that will be mutated and used to configure monitor conf := &Config{} diff --git a/pkg/monitors/expvar/expvar.go b/pkg/monitors/expvar/expvar.go index 36d78dda91..2e1a94ad0d 100644 --- a/pkg/monitors/expvar/expvar.go +++ b/pkg/monitors/expvar/expvar.go @@ -12,10 +12,11 @@ import ( "time" "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) const ( @@ -50,7 +51,7 @@ type metricVal struct { // Configure monitor func (m *Monitor) Configure(conf *Config) (err error) { - m.logger = log.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) if m.Output.HasAnyExtraMetrics() { conf.EnhancedMetrics = true } diff --git a/pkg/monitors/filesystems/filesystems.go b/pkg/monitors/filesystems/filesystems.go index f66615b636..1e56a2e2c0 100644 --- a/pkg/monitors/filesystems/filesystems.go +++ b/pkg/monitors/filesystems/filesystems.go @@ -9,14 +9,13 @@ import ( gopsutil "github.com/shirou/gopsutil/disk" "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/filter" - - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) func init() { @@ -61,7 +60,7 @@ type Monitor struct { fsTypes *filter.OverridableStringFilter mountPoints *filter.OverridableStringFilter sendModeDimension bool - logger logrus.FieldLogger + logger log.FieldLogger } // returns common dimensions map for every filesystem @@ -222,7 +221,7 @@ func (m *Monitor) emitDatapoints() { // Configure is the main function of the monitor, it will report host metadata // on a varied interval func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) var ctx context.Context ctx, m.cancel = context.WithCancel(context.Background()) diff --git a/pkg/monitors/filesystems/filesystems_test.go b/pkg/monitors/filesystems/filesystems_test.go index 63978640d5..09d8a82383 100644 --- a/pkg/monitors/filesystems/filesystems_test.go +++ b/pkg/monitors/filesystems/filesystems_test.go @@ -4,7 +4,6 @@ import ( "testing" gopsutil "github.com/shirou/gopsutil/disk" - "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" ) @@ -61,7 +60,7 @@ func TestCommonDimensions(t *testing.T) { }, } - logger := logrus.WithFields(log.Fields{"monitorType": monitorType}) + logger := log.WithFields(log.Fields{"monitorType": monitorType}) for _, tt := range cases { m := Monitor{ hostFSPath: tt.hostFSPath, diff --git a/pkg/monitors/forwarder/forwarder.go b/pkg/monitors/forwarder/forwarder.go index 34aeb92d4f..b53506b6f5 100644 --- a/pkg/monitors/forwarder/forwarder.go +++ b/pkg/monitors/forwarder/forwarder.go @@ -17,7 +17,7 @@ import ( type pathSetupFunc = func(*mux.Router, http.Handler) -func startListening(ctx context.Context, listenAddr string, timeout time.Duration, sink signalfx.Sink) (sfxclient.Collector, error) { +func (m *Monitor) startListening(ctx context.Context, listenAddr string, timeout time.Duration, sink signalfx.Sink) (sfxclient.Collector, error) { listener, err := net.Listen("tcp", listenAddr) if err != nil { return nil, errors.WithMessage(err, "cannot open listening address "+listenAddr) @@ -28,23 +28,23 @@ func startListening(ctx context.Context, listenAddr string, timeout time.Duratio next.ServeHTTPC(tryToExtractRemoteAddressToContext(ctx, r), rw, r) }) - jaegerMetrics := setupHandler(ctx, router, signalfx.JaegerV1, sink, func(sink signalfx.Sink) signalfx.ErrorReader { - return signalfx.NewJaegerThriftTraceDecoderV1(golibLogger, sink) + jaegerMetrics := m.setupHandler(ctx, router, signalfx.JaegerV1, sink, func(sink signalfx.Sink) signalfx.ErrorReader { + return signalfx.NewJaegerThriftTraceDecoderV1(m.golibLogger, sink) }, httpChain, setupPathFunc(signalfx.SetupThriftByPaths, signalfx.DefaultTracePathV1)) - protobufDatapoints := setupHandler(ctx, router, "protobufv2", sink, func(sink signalfx.Sink) signalfx.ErrorReader { - return &signalfx.ProtobufDecoderV2{Sink: sink, Logger: golibLogger} + protobufDatapoints := m.setupHandler(ctx, router, "protobufv2", sink, func(sink signalfx.Sink) signalfx.ErrorReader { + return &signalfx.ProtobufDecoderV2{Sink: sink, Logger: m.golibLogger} }, httpChain, setupPathFunc(signalfx.SetupProtobufV2ByPaths, "/v2/datapoint")) - jsonDatapoints := setupHandler(ctx, router, "jsonv2", sink, func(sink signalfx.Sink) signalfx.ErrorReader { - return &signalfx.JSONDecoderV2{Sink: sink, Logger: golibLogger} + jsonDatapoints := m.setupHandler(ctx, router, "jsonv2", sink, func(sink signalfx.Sink) signalfx.ErrorReader { + return &signalfx.JSONDecoderV2{Sink: sink, Logger: m.golibLogger} }, httpChain, setupPathFunc(signalfx.SetupJSONByPaths, "/v2/datapoint")) - zipkinMetrics := setupHandler(ctx, router, signalfx.ZipkinV1, sink, func(sink signalfx.Sink) signalfx.ErrorReader { - return &signalfx.JSONTraceDecoderV1{Logger: golibLogger, Sink: sink} + zipkinMetrics := m.setupHandler(ctx, router, signalfx.ZipkinV1, sink, func(sink signalfx.Sink) signalfx.ErrorReader { + return &signalfx.JSONTraceDecoderV1{Logger: m.golibLogger, Sink: sink} }, httpChain, setupPathFuncN(signalfx.SetupJSONByPathsN, signalfx.DefaultTracePathV1, signalfx.ZipkinTracePathV1, signalfx.ZipkinTracePathV2)) - router.NotFoundHandler = http.HandlerFunc(notFoundHandler) + router.NotFoundHandler = http.HandlerFunc(m.notFoundHandler) server := http.Server{ Handler: router, @@ -58,7 +58,7 @@ func startListening(ctx context.Context, listenAddr string, timeout time.Duratio <-ctx.Done() err := server.Close() if err != nil { - logger.WithError(err).Error("Could not close SignalFx forwarding server") + m.logger.WithError(err).Error("Could not close SignalFx forwarding server") } }() return sfxclient.NewMultiCollector(jsonDatapoints, protobufDatapoints, jaegerMetrics, zipkinMetrics), nil @@ -76,15 +76,15 @@ func setupPathFuncN(setupFunc func(*mux.Router, http.Handler, ...string), paths } } -func setupHandler(ctx context.Context, router *mux.Router, chainType string, sink signalfx.Sink, getReader func(signalfx.Sink) signalfx.ErrorReader, httpChain web.NextConstructor, pathSetup pathSetupFunc) sfxclient.Collector { - handler, internalMetrics := signalfx.SetupChain(ctx, sink, chainType, getReader, httpChain, golibLogger, &dpsink.Counter{}) +func (m *Monitor) setupHandler(ctx context.Context, router *mux.Router, chainType string, sink signalfx.Sink, getReader func(signalfx.Sink) signalfx.ErrorReader, httpChain web.NextConstructor, pathSetup pathSetupFunc) sfxclient.Collector { + handler, internalMetrics := signalfx.SetupChain(ctx, sink, chainType, getReader, httpChain, m.golibLogger, &dpsink.Counter{}) pathSetup(router, handler) return internalMetrics } -func notFoundHandler(w http.ResponseWriter, r *http.Request) { +func (m *Monitor) notFoundHandler(w http.ResponseWriter, r *http.Request) { errMsg := "Datapoint or span request received on invalid path" - logger.ThrottledError(fmt.Sprintf("%s: %s", errMsg, r.URL.Path)) + m.logger.ThrottledError(fmt.Sprintf("%s: %s", errMsg, r.URL.Path)) errMsg = fmt.Sprintf( "%s. Supported paths: /v2/datapoint, %s, %s, and %s.\n", errMsg, diff --git a/pkg/monitors/forwarder/monitor.go b/pkg/monitors/forwarder/monitor.go index 4381305a5a..f611cf8ccd 100644 --- a/pkg/monitors/forwarder/monitor.go +++ b/pkg/monitors/forwarder/monitor.go @@ -4,19 +4,17 @@ import ( "context" "time" - "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" - "github.com/pkg/errors" + goliblog "github.com/signalfx/golib/v3/log" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" ) -var logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorType}), 30*time.Second) -var golibLogger = &utils.LogrusGolibShim{FieldLogger: logger.FieldLogger} - func init() { monitors.Register(&monitorMetadata, func() interface{} { return &Monitor{} }, &Config{}) } @@ -38,17 +36,22 @@ type Config struct { // Monitor that accepts and forwards SignalFx data type Monitor struct { - Output types.Output - cancel context.CancelFunc + Output types.Output + cancel context.CancelFunc + logger *utils.ThrottledLogger + golibLogger goliblog.Logger } // Configure the monitor and kick off volume metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = utils.NewThrottledLogger(logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}), 30*time.Second) + m.golibLogger = &utils.LogrusGolibShim{FieldLogger: m.logger.FieldLogger} + var ctx context.Context ctx, m.cancel = context.WithCancel(context.Background()) sink := &outputSink{Output: m.Output} - listenerMetrics, err := startListening(ctx, conf.ListenAddress, conf.ServerTimeout.AsDuration(), sink) + listenerMetrics, err := m.startListening(ctx, conf.ListenAddress, conf.ServerTimeout.AsDuration(), sink) if err != nil { return errors.WithMessage(err, "could not start forwarder listener") } diff --git a/pkg/monitors/haproxy/helpers.go b/pkg/monitors/haproxy/helpers.go index 4c2020c298..e1e4c1eca8 100644 --- a/pkg/monitors/haproxy/helpers.go +++ b/pkg/monitors/haproxy/helpers.go @@ -14,10 +14,9 @@ import ( "strings" "time" - "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/signalfx/golib/v3/datapoint" - logger "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/utils" ) // Map of HAProxy metrics name to their equivalent SignalFx names. @@ -103,27 +102,27 @@ var sfxMetricsMap = map[string]string{ } // Fetches proxy stats datapoints from an http endpoint. -func statsHTTP(conf *Config, pxs proxies) []*datapoint.Datapoint { - return statsHelper(conf, httpReader, "GET", pxs) +func (m *Monitor) statsHTTP(conf *Config, pxs proxies) []*datapoint.Datapoint { + return m.statsHelper(conf, httpReader, "GET", pxs) } // Fetches proxy stats datapoints from a unix socket. -func statsSocket(conf *Config, pxs proxies) []*datapoint.Datapoint { - return statsHelper(conf, socketReader, "show stat\n", pxs) +func (m *Monitor) statsSocket(conf *Config, pxs proxies) []*datapoint.Datapoint { + return m.statsHelper(conf, socketReader, "show stat\n", pxs) } // A second order function for taking http and socket functions that fetch proxy stats datapoints. -func statsHelper(conf *Config, reader func(*Config, string) (io.ReadCloser, error), cmd string, proxies map[string]bool) []*datapoint.Datapoint { +func (m *Monitor) statsHelper(conf *Config, reader func(*Config, string) (io.ReadCloser, error), cmd string, proxies map[string]bool) []*datapoint.Datapoint { body, err := reader(conf, cmd) defer closeBody(body) if err != nil { - logger.Error(err) + m.logger.Error(err) return nil } dps := make([]*datapoint.Datapoint, 0) csvMap, err := statsMap(body) if err != nil { - logger.Error(err) + m.logger.Error(err) return nil } for _, headerValuePairs := range csvMap { @@ -131,7 +130,7 @@ func statsHelper(conf *Config, reader func(*Config, string) (io.ReadCloser, erro continue } for stat, value := range headerValuePairs { - if dp := newDp(stat, value); dp != nil { + if dp := m.newDp(stat, value); dp != nil { dp.Dimensions["proxy_name"] = headerValuePairs["pxname"] dp.Dimensions["service_name"] = headerValuePairs["svname"] dp.Dimensions["type"] = headerValuePairs["type"] @@ -148,22 +147,22 @@ func statsHelper(conf *Config, reader func(*Config, string) (io.ReadCloser, erro } } if len(dps) == 0 { - logger.Errorf("failed to create proxy stats datapoints") + m.logger.Errorf("failed to create proxy stats datapoints") return nil } return dps } // Fetches process info datapoints from a unix socket. -func infoSocket(conf *Config, _ proxies) []*datapoint.Datapoint { +func (m *Monitor) infoSocket(conf *Config, _ proxies) []*datapoint.Datapoint { dps := make([]*datapoint.Datapoint, 0) infoPairs, err := infoMap(conf) if err != nil { - logger.Error(err) + m.logger.Error(err) return nil } for stat, value := range infoPairs { - if dp := newDp(stat, value); dp != nil { + if dp := m.newDp(stat, value); dp != nil { // WARNING: Both pid and Process_num are HAProxy process identifiers. pid in the context of // proxy stats and Process_num in the context of HAProxy process info. It says in the docs // https://cbonte.github.io/haproxy-dconv/1.8/management.html#9.1 that pid is zero-based. But, we @@ -228,7 +227,7 @@ func infoMap(conf *Config) (map[string]string, error) { } // Creates datapoint from proxy stats and process info key value pairs. -func newDp(stat string, value string) *datapoint.Datapoint { +func (m *Monitor) newDp(stat string, value string) *datapoint.Datapoint { metric := sfxMetricsMap[stat] if metric == "" || value == "" { return nil @@ -242,9 +241,9 @@ func newDp(stat string, value string) *datapoint.Datapoint { if err != nil { switch err.(type) { case *strconv.NumError: - logger.Debug(err) + m.logger.Debug(err) default: - logger.Error(err) + m.logger.Error(err) } return nil } diff --git a/pkg/monitors/haproxy/monitor.go b/pkg/monitors/haproxy/monitor.go index 2a6fb5274c..2f0291818d 100644 --- a/pkg/monitors/haproxy/monitor.go +++ b/pkg/monitors/haproxy/monitor.go @@ -9,11 +9,11 @@ import ( "time" "github.com/signalfx/golib/v3/datapoint" - "github.com/signalfx/signalfx-agent/pkg/utils" + log "github.com/sirupsen/logrus" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" - logger "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/utils" ) func init() { @@ -25,6 +25,7 @@ type Monitor struct { Output types.Output cancel context.CancelFunc ctx context.Context + logger log.FieldLogger } // Map of proxies to monitor @@ -32,6 +33,7 @@ type proxies map[string]bool // Config for this monitor func (m *Monitor) Configure(conf *Config) (err error) { + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) m.ctx, m.cancel = context.WithCancel(context.Background()) url, err := url.Parse(conf.ScrapeURL()) if err != nil { @@ -52,9 +54,9 @@ func (m *Monitor) Configure(conf *Config) (err error) { var fetchFuncs funcs switch url.Scheme { case "http", "https", "file": - fetchFuncs = funcs{statsHTTP} + fetchFuncs = funcs{m.statsHTTP} case "unix": - fetchFuncs = funcs{statsSocket, infoSocket} + fetchFuncs = funcs{m.statsSocket, m.infoSocket} default: return fmt.Errorf("unsupported url scheme:%q", url.Scheme) } @@ -73,7 +75,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { defer wg.Done() select { case <-ctx.Done(): - logger.Error(ctx.Err()) + m.logger.Error(ctx.Err()) return case ch <- fn(conf, pxs): return diff --git a/pkg/monitors/heroku/monitor.go b/pkg/monitors/heroku/monitor.go index fb4cb219cb..235576f82f 100644 --- a/pkg/monitors/heroku/monitor.go +++ b/pkg/monitors/heroku/monitor.go @@ -5,11 +5,12 @@ import ( "os" "time" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) // Config for this monitor @@ -31,7 +32,7 @@ func init() { // Configure monitor func (m *Monitor) Configure(c *Config) error { - m.logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": "heroku-metadata"}), 20*time.Second) + m.logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": "heroku-metadata", "monitorID": c.MonitorID}), 20*time.Second) m.ctx, m.cancel = context.WithCancel(context.Background()) go func() { diff --git a/pkg/monitors/internalmetrics/monitor.go b/pkg/monitors/internalmetrics/monitor.go index cedb61e3f0..6a39b80594 100644 --- a/pkg/monitors/internalmetrics/monitor.go +++ b/pkg/monitors/internalmetrics/monitor.go @@ -8,12 +8,13 @@ import ( "time" "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/core/meta" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) // Config for internal metric monitoring @@ -34,6 +35,7 @@ type Monitor struct { Output types.Output AgentMeta *meta.AgentMeta cancel func() + logger log.FieldLogger } func init() { @@ -42,6 +44,7 @@ func init() { // Configure and kick off internal metric collection func (m *Monitor) Configure(conf *Config) error { + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) var ctx context.Context ctx, m.cancel = context.WithCancel(context.Background()) @@ -72,10 +75,7 @@ func (m *Monitor) Configure(conf *Config) error { url := fmt.Sprintf("http://%s:%d%s", host, port, conf.Path) - logger := log.WithFields(log.Fields{ - "monitorType": monitorType, - "url": url, - }) + logger := m.logger.WithField("url", url) resp, err := client.Get(url) if err != nil { diff --git a/pkg/monitors/jaegergrpc/monitor.go b/pkg/monitors/jaegergrpc/monitor.go index 218c66d9c6..f17d74f797 100644 --- a/pkg/monitors/jaegergrpc/monitor.go +++ b/pkg/monitors/jaegergrpc/monitor.go @@ -7,22 +7,21 @@ import ( "time" "github.com/jaegertracing/jaeger/proto-gen/api_v2" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/peer" + "github.com/signalfx/signalfx-agent/pkg/core/common/constants" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/jaegergrpc/jaegerprotobuf" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/peer" ) const gracefulShutdownTimeout = time.Second * 5 -var logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorType}), 30*time.Second) - func init() { monitors.Register(&monitorMetadata, func() interface{} { return &Monitor{} }, &Config{}) } @@ -62,6 +61,7 @@ type Monitor struct { listenerLock sync.Mutex cancel context.CancelFunc ln net.Listener + logger *utils.ThrottledLogger } var _ api_v2.CollectorServiceServer = (*Monitor)(nil) @@ -119,7 +119,7 @@ func (m *Monitor) PostSpans(ctx context.Context, r *api_v2.PostSpansRequest) (*a return &api_v2.PostSpansResponse{}, nil } -func setupListener(ctx context.Context, conf *Config) (net.Listener, error) { +func (m *Monitor) setupListener(ctx context.Context, conf *Config) (net.Listener, error) { for ctx.Err() == nil { // create a listener with the configured ListenAddress ln, err := net.Listen("tcp", conf.ListenAddress) @@ -129,7 +129,7 @@ func setupListener(ctx context.Context, conf *Config) (net.Listener, error) { return ln, nil } - logger.Errorf("could not start grpc listener %v", err) + m.logger.Errorf("could not start grpc listener %v", err) // wait until the next interval to retry select { @@ -144,6 +144,7 @@ func setupListener(ctx context.Context, conf *Config) (net.Listener, error) { // Configure the monitor and kick off volume metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}), 30*time.Second) ctx, cancel := context.WithCancel(context.Background()) m.cancel = cancel @@ -166,7 +167,7 @@ func (m *Monitor) Configure(conf *Config) error { api_v2.RegisterCollectorServiceServer(m.grpc, m) // setup the listener - ln, err := setupListener(ctx, conf) + ln, err := m.setupListener(ctx, conf) if err != nil { return } @@ -178,7 +179,7 @@ func (m *Monitor) Configure(conf *Config) error { // start the server if err := m.grpc.Serve(m.ln); err != nil { - logger.Errorf("failed to start server in %s monitor", monitorType) + m.logger.Errorf("failed to start server in %s monitor", monitorType) } }() diff --git a/pkg/monitors/kubernetes/cluster/clusterstate.go b/pkg/monitors/kubernetes/cluster/clusterstate.go index 2b19bec119..27e31654aa 100644 --- a/pkg/monitors/kubernetes/cluster/clusterstate.go +++ b/pkg/monitors/kubernetes/cluster/clusterstate.go @@ -4,24 +4,22 @@ import ( "context" "fmt" - "k8s.io/api/autoscaling/v2beta1" - - "k8s.io/client-go/rest" - - "github.com/signalfx/signalfx-agent/pkg/monitors/kubernetes/cluster/metrics" - "github.com/signalfx/signalfx-agent/pkg/utils/k8sutil" - log "github.com/sirupsen/logrus" - quota "github.com/openshift/api/quota/v1" quotav1 "github.com/openshift/client-go/quota/clientset/versioned/typed/quota/v1" + log "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" + "k8s.io/api/autoscaling/v2beta1" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/runtime" k8s "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" + + "github.com/signalfx/signalfx-agent/pkg/monitors/kubernetes/cluster/metrics" + "github.com/signalfx/signalfx-agent/pkg/utils/k8sutil" ) // State makes use of the K8s client's "reflector" helper to watch the API @@ -32,18 +30,20 @@ type State struct { reflectors map[string]*cache.Reflector namespace string cancel func() + logger log.FieldLogger metricCache *metrics.DatapointCache dimHandler *metrics.DimensionHandler } func newState(flavor KubernetesDistribution, restConfig *rest.Config, metricCache *metrics.DatapointCache, - dimHandler *metrics.DimensionHandler, namespace string) (*State, error) { + dimHandler *metrics.DimensionHandler, namespace string, logger log.FieldLogger) (*State, error) { state := &State{ reflectors: make(map[string]*cache.Reflector), metricCache: metricCache, dimHandler: dimHandler, namespace: namespace, + logger: logger, } var err error @@ -65,7 +65,7 @@ func newState(flavor KubernetesDistribution, restConfig *rest.Config, metricCach // Start starts syncing any resource that isn't already being synced func (cs *State) Start() { - log.Info("Starting K8s API resource sync") + cs.logger.Info("Starting K8s API resource sync") var ctx context.Context ctx, cs.cancel = context.WithCancel(context.Background()) @@ -172,7 +172,7 @@ func (cs *State) beginSyncForType(ctx context.Context, resType runtime.Object, r // channel properly. // See https://github.com/kubernetes/client-go/blob/release-8.0/tools/cache/controller.go#L144 func (cs *State) Stop() { - log.Info("Stopping all K8s API resource sync") + cs.logger.Info("Stopping all K8s API resource sync") if cs.cancel != nil { cs.cancel() } diff --git a/pkg/monitors/kubernetes/cluster/metrics/cache.go b/pkg/monitors/kubernetes/cluster/metrics/cache.go index f5ef3e8c7c..a7daf53327 100644 --- a/pkg/monitors/kubernetes/cluster/metrics/cache.go +++ b/pkg/monitors/kubernetes/cluster/metrics/cache.go @@ -29,13 +29,15 @@ type DatapointCache struct { sync.Mutex dpCache map[types.UID][]*datapoint.Datapoint nodeConditionTypesToReport []string + logger log.FieldLogger } // NewDatapointCache creates a new clean cache -func NewDatapointCache(nodeConditionTypesToReport []string) *DatapointCache { +func NewDatapointCache(nodeConditionTypesToReport []string, logger log.FieldLogger) *DatapointCache { return &DatapointCache{ dpCache: make(map[types.UID][]*datapoint.Datapoint), nodeConditionTypesToReport: nodeConditionTypesToReport, + logger: logger, } } @@ -61,7 +63,7 @@ func (dc *DatapointCache) DeleteByKey(key interface{}) { func (dc *DatapointCache) HandleDelete(oldObj runtime.Object) interface{} { key, err := keyForObject(oldObj) if err != nil { - log.WithFields(log.Fields{ + dc.logger.WithFields(log.Fields{ "error": err, "obj": spew.Sdump(oldObj), }).Error("Could not get cache key") @@ -104,9 +106,9 @@ func (dc *DatapointCache) HandleAdd(newObj runtime.Object) interface{} { case *batchv1beta1.CronJob: dps = datapointsForCronJob(o) case *v2beta1.HorizontalPodAutoscaler: - dps = datapointsForHpa(o) + dps = datapointsForHpa(o, dc.logger) default: - log.WithFields(log.Fields{ + dc.logger.WithFields(log.Fields{ "obj": spew.Sdump(newObj), }).Error("Unknown object type in HandleAdd") return nil @@ -114,7 +116,7 @@ func (dc *DatapointCache) HandleAdd(newObj runtime.Object) interface{} { key, err := keyForObject(newObj) if err != nil { - log.WithFields(log.Fields{ + dc.logger.WithFields(log.Fields{ "error": err, "obj": spew.Sdump(newObj), }).Error("Could not get cache key") diff --git a/pkg/monitors/kubernetes/cluster/metrics/dimensions.go b/pkg/monitors/kubernetes/cluster/metrics/dimensions.go index 51847918bc..75f8aff930 100644 --- a/pkg/monitors/kubernetes/cluster/metrics/dimensions.go +++ b/pkg/monitors/kubernetes/cluster/metrics/dimensions.go @@ -4,8 +4,6 @@ import ( "sync" "github.com/davecgh/go-spew/spew" - k8sutil "github.com/signalfx/signalfx-agent/pkg/monitors/kubernetes/utils" - atypes "github.com/signalfx/signalfx-agent/pkg/monitors/types" log "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" "k8s.io/api/autoscaling/v2beta1" @@ -14,6 +12,9 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + + k8sutil "github.com/signalfx/signalfx-agent/pkg/monitors/kubernetes/utils" + atypes "github.com/signalfx/signalfx-agent/pkg/monitors/types" ) type DimensionHandler struct { @@ -26,10 +27,11 @@ type DimensionHandler struct { serviceCache *k8sutil.ServiceCache replicaSetCache *k8sutil.ReplicaSetCache jobCache *k8sutil.JobCache + logger log.FieldLogger } // NewDimensionHandler creates a handler for dimension updates -func NewDimensionHandler(sendDimensionFunc func(*atypes.Dimension)) *DimensionHandler { +func NewDimensionHandler(sendDimensionFunc func(*atypes.Dimension), logger log.FieldLogger) *DimensionHandler { return &DimensionHandler{ uidKindCache: make(map[types.UID]string), sendDimensionFunc: sendDimensionFunc, @@ -37,6 +39,7 @@ func NewDimensionHandler(sendDimensionFunc func(*atypes.Dimension)) *DimensionHa serviceCache: k8sutil.NewServiceCache(), replicaSetCache: k8sutil.NewReplicaSetCache(), jobCache: k8sutil.NewJobCache(), + logger: logger, } } @@ -89,7 +92,7 @@ func (dh *DimensionHandler) HandleAdd(newObj runtime.Object) interface{} { key, err := keyForObject(newObj) if err != nil { - log.WithFields(log.Fields{ + dh.logger.WithFields(log.Fields{ "error": err, "obj": spew.Sdump(newObj), }).Error("Could not get cache key") @@ -107,7 +110,7 @@ func (dh *DimensionHandler) HandleAdd(newObj runtime.Object) interface{} { func (dh *DimensionHandler) HandleDelete(oldObj runtime.Object) interface{} { key, err := keyForObject(oldObj) if err != nil { - log.WithFields(log.Fields{ + dh.logger.WithFields(log.Fields{ "error": err, "obj": spew.Sdump(oldObj), }).Error("Could not get cache key") @@ -133,7 +136,7 @@ func (dh *DimensionHandler) DeleteByKey(key interface{}) { err = dh.jobCache.DeleteByKey(cacheKey) } if err != nil { - log.WithFields(log.Fields{ + dh.logger.WithFields(log.Fields{ "error": err, "UID": cacheKey, }).Error("Could not delete key from internal resource cache") diff --git a/pkg/monitors/kubernetes/cluster/metrics/hpa.go b/pkg/monitors/kubernetes/cluster/metrics/hpa.go index db188babf0..9e43092f3a 100644 --- a/pkg/monitors/kubernetes/cluster/metrics/hpa.go +++ b/pkg/monitors/kubernetes/cluster/metrics/hpa.go @@ -5,16 +5,17 @@ import ( "time" "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" + "k8s.io/api/autoscaling/v2beta1" + v1 "k8s.io/api/core/v1" + "github.com/signalfx/signalfx-agent/pkg/monitors/kubernetes/cluster/meta" k8sutils "github.com/signalfx/signalfx-agent/pkg/monitors/kubernetes/utils" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - "k8s.io/api/autoscaling/v2beta1" - v1 "k8s.io/api/core/v1" ) -func datapointsForHpa(hpa *v2beta1.HorizontalPodAutoscaler) []*datapoint.Datapoint { +func datapointsForHpa(hpa *v2beta1.HorizontalPodAutoscaler, logger logrus.FieldLogger) []*datapoint.Datapoint { dimensions := map[string]string{ "metric_source": "kubernetes", "kubernetes_namespace": hpa.Namespace, @@ -47,7 +48,7 @@ func datapointsForHpa(hpa *v2beta1.HorizontalPodAutoscaler) []*datapoint.Datapoi datapoint.NewIntValue(int64(hpa.Status.DesiredReplicas)), datapoint.Gauge, time.Time{}), - }, newStatusDatapoints(hpa, dimensions)...) + }, newStatusDatapoints(hpa, dimensions, logger)...) } func dimensionForHpa(hpa *v2beta1.HorizontalPodAutoscaler) *types.Dimension { @@ -67,12 +68,12 @@ func dimensionForHpa(hpa *v2beta1.HorizontalPodAutoscaler) *types.Dimension { } } -func newStatusDatapoints(hpa *v2beta1.HorizontalPodAutoscaler, dimensions map[string]string) []*datapoint.Datapoint { +func newStatusDatapoints(hpa *v2beta1.HorizontalPodAutoscaler, dimensions map[string]string, logger logrus.FieldLogger) []*datapoint.Datapoint { dps := make([]*datapoint.Datapoint, 0) for _, condition := range hpa.Status.Conditions { metric, value, err := newStatusMetricValue(condition) if err != nil { - logrus.WithError(err).Errorf("Could not create hpa status datapoint") + logger.WithError(err).Errorf("Could not create hpa status datapoint") continue } dps = append(dps, datapoint.New(metric, dimensions, value, datapoint.Gauge, time.Time{})) diff --git a/pkg/monitors/kubernetes/cluster/monitor.go b/pkg/monitors/kubernetes/cluster/monitor.go index faf3ccc0f5..788f1182d3 100644 --- a/pkg/monitors/kubernetes/cluster/monitor.go +++ b/pkg/monitors/kubernetes/cluster/monitor.go @@ -97,7 +97,7 @@ func init() { // Configure is called by the plugin framework when configuration changes func (m *Monitor) Configure(config *Config) error { var err error - m.logger = logrus.WithFields(logrus.Fields{"monitorType": distributionToMonitorType[m.distribution]}) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": distributionToMonitorType[m.distribution], "monitorID": config.MonitorID}) m.config = config @@ -105,8 +105,8 @@ func (m *Monitor) Configure(config *Config) error { return fmt.Errorf("could not create Kubernetes REST config: %s", err) } - m.datapointCache = metrics.NewDatapointCache(m.config.NodeConditionTypesToReport) - m.dimHandler = metrics.NewDimensionHandler(m.Output.SendDimensionUpdate) + m.datapointCache = metrics.NewDatapointCache(m.config.NodeConditionTypesToReport, m.logger) + m.dimHandler = metrics.NewDimensionHandler(m.Output.SendDimensionUpdate, m.logger) m.stop = make(chan struct{}) return m.Start() @@ -118,7 +118,7 @@ func (m *Monitor) Start() error { shouldReport := m.config.AlwaysClusterReporter - clusterState, err := newState(m.distribution, m.restConfig, m.datapointCache, m.dimHandler, m.config.Namespace) + clusterState, err := newState(m.distribution, m.restConfig, m.datapointCache, m.dimHandler, m.config.Namespace, m.logger) if err != nil { return err } @@ -130,7 +130,7 @@ func (m *Monitor) Start() error { clusterState.Start() } else { var err error - leaderCh, unregister, err = leadership.RequestLeaderNotification(clusterState.clientset.CoreV1(), clusterState.clientset.CoordinationV1()) + leaderCh, unregister, err = leadership.RequestLeaderNotification(clusterState.clientset.CoreV1(), clusterState.clientset.CoordinationV1(), m.logger) if err != nil { return err } diff --git a/pkg/monitors/kubernetes/cluster/monitor_test.go b/pkg/monitors/kubernetes/cluster/monitor_test.go index 373c265ae1..739739fbaf 100644 --- a/pkg/monitors/kubernetes/cluster/monitor_test.go +++ b/pkg/monitors/kubernetes/cluster/monitor_test.go @@ -6,21 +6,18 @@ import ( "os" "testing" - //"github.com/davecgh/go-spew/spew" - + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/signalfx-agent/pkg/core/common/kubernetes" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/neotest" - log "github.com/sirupsen/logrus" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" . "github.com/signalfx/signalfx-agent/pkg/neotest/k8s/testhelpers/fakek8s" ) diff --git a/pkg/monitors/kubernetes/events/events.go b/pkg/monitors/kubernetes/events/events.go index 159dd9b16d..0057304bfc 100644 --- a/pkg/monitors/kubernetes/events/events.go +++ b/pkg/monitors/kubernetes/events/events.go @@ -5,6 +5,11 @@ import ( "time" "github.com/signalfx/golib/v3/event" + log "github.com/sirupsen/logrus" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/fields" + k8s "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" "github.com/signalfx/signalfx-agent/pkg/core/common/dpmeta" "github.com/signalfx/signalfx-agent/pkg/core/common/kubernetes" @@ -13,12 +18,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/monitors/kubernetes/leadership" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - - log "github.com/sirupsen/logrus" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/fields" - k8s "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/cache" ) var logger = log.WithFields(log.Fields{"monitorType": monitorType}) @@ -56,10 +55,12 @@ type Monitor struct { stopper chan struct{} sendAllEvents bool whitelistSet map[EventInclusionSpec]bool + logger log.FieldLogger } // Configure the monitor and kick off event syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = logger.WithField("monitorID", conf.MonitorID) k8sClient, err := kubernetes.MakeClient(conf.KubernetesAPI) if err != nil { return err @@ -95,11 +96,11 @@ func (m *Monitor) start(k8sClient *k8s.Clientset, alwaysReport bool) error { var leaderCh <-chan bool var unregister func() if alwaysReport { - logger.Info("This instance will send K8s events") + m.logger.Info("This instance will send K8s events") runSync() } else { var err error - leaderCh, unregister, err = leadership.RequestLeaderNotification(k8sClient.CoreV1(), k8sClient.CoordinationV1()) + leaderCh, unregister, err = leadership.RequestLeaderNotification(k8sClient.CoreV1(), k8sClient.CoordinationV1(), m.logger) if err != nil { return err } @@ -110,15 +111,15 @@ func (m *Monitor) start(k8sClient *k8s.Clientset, alwaysReport bool) error { select { case isLeader := <-leaderCh: if isLeader { - logger.Info("This instance is now the leader and will send events") + m.logger.Info("This instance is now the leader and will send events") runSync() } else { - logger.Info("No longer leader") + m.logger.Info("No longer leader") close(syncStopper) syncStopper = nil } case <-m.stopper: - logger.Info("Stopping k8s event syncing") + m.logger.Info("Stopping k8s event syncing") if unregister != nil { unregister() } @@ -152,13 +153,13 @@ func (m *Monitor) shouldSendEvent(ev *v1.Event) bool { func (m *Monitor) handleNewEvent(ev *v1.Event) { if m.shouldSendEvent(ev) { - sfxEvent := k8sEventToSignalFxEvent(ev) + sfxEvent := m.k8sEventToSignalFxEvent(ev) sfxEvent.Properties[dpmeta.NotHostSpecificMeta] = true m.Output.SendEvent(sfxEvent) } } -func k8sEventToSignalFxEvent(ev *v1.Event) *event.Event { +func (m *Monitor) k8sEventToSignalFxEvent(ev *v1.Event) *event.Event { dims := map[string]string{ "kubernetes_kind": ev.InvolvedObject.Kind, "kubernetes_namespace": ev.InvolvedObject.Namespace, @@ -187,7 +188,7 @@ func k8sEventToSignalFxEvent(ev *v1.Event) *event.Event { eventType := ev.Reason if eventType == "" { - logger.Debug("ev.Reason is not set; setting event type to unknown_reason") + m.logger.Debug("ev.Reason is not set; setting event type to unknown_reason") eventType = "unknown_reason" } diff --git a/pkg/monitors/kubernetes/kubeletmetrics/monitor.go b/pkg/monitors/kubernetes/kubeletmetrics/monitor.go index 7b69d3089c..7b093bdfef 100644 --- a/pkg/monitors/kubernetes/kubeletmetrics/monitor.go +++ b/pkg/monitors/kubernetes/kubeletmetrics/monitor.go @@ -7,15 +7,16 @@ import ( "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + log "github.com/sirupsen/logrus" + v1 "k8s.io/api/core/v1" + k8stypes "k8s.io/apimachinery/pkg/types" + stats "k8s.io/kubelet/pkg/apis/stats/v1alpha1" + "github.com/signalfx/signalfx-agent/pkg/core/common/kubelet" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" - v1 "k8s.io/api/core/v1" - k8stypes "k8s.io/apimachinery/pkg/types" - stats "k8s.io/kubelet/pkg/apis/stats/v1alpha1" ) func init() { @@ -39,14 +40,15 @@ type Monitor struct { Output types.Output cancel func() kubeletClient *kubelet.Client + logger log.FieldLogger } // Configure the monitor and kick off volume metric syncing func (m *Monitor) Configure(conf *Config) error { - logger := log.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) var err error - m.kubeletClient, err = kubelet.NewClient(&conf.KubeletAPI) + m.kubeletClient, err = kubelet.NewClient(&conf.KubeletAPI, m.logger) if err != nil { return err } @@ -54,13 +56,13 @@ func (m *Monitor) Configure(conf *Config) error { var ctx context.Context ctx, m.cancel = context.WithCancel(context.Background()) utils.RunOnInterval(ctx, func() { - logger.Debug("Collecting kubelet /stats/summary metrics") + m.logger.Debug("Collecting kubelet /stats/summary metrics") dps, err := m.getSummaryMetrics(conf.UsePodsEndpoint) if err != nil { - logger.WithError(err).Error("Could not get summary metrics") + m.logger.WithError(err).Error("Could not get summary metrics") return } - logger.Debugf("Sending kubelet metrics: %v", dps) + m.logger.Debugf("Sending kubelet metrics: %v", dps) now := time.Now() for i := range dps { diff --git a/pkg/monitors/kubernetes/leadership/leadership.go b/pkg/monitors/kubernetes/leadership/leadership.go index c4a5f92489..20828b5669 100644 --- a/pkg/monitors/kubernetes/leadership/leadership.go +++ b/pkg/monitors/kubernetes/leadership/leadership.go @@ -35,12 +35,12 @@ var leaderIdentity string // at which point the channel could send true again and so on. All monitors // that need leader election will share the same election process. There is no // way to stop the leader election process once it starts. -func RequestLeaderNotification(v1Client corev1.CoreV1Interface, coordinationClient coordinationv1.CoordinationV1Interface) (<-chan bool, func(), error) { +func RequestLeaderNotification(v1Client corev1.CoreV1Interface, coordinationClient coordinationv1.CoordinationV1Interface, logger log.FieldLogger) (<-chan bool, func(), error) { lock.Lock() defer lock.Unlock() if !started { - if err := startLeaderElection(v1Client, coordinationClient); err != nil { + if err := startLeaderElection(v1Client, coordinationClient, logger); err != nil { return nil, nil, err } started = true @@ -59,18 +59,18 @@ func RequestLeaderNotification(v1Client corev1.CoreV1Interface, coordinationClie lock.Lock() defer lock.Unlock() - log.Info("Unsubscribing leader notice channel") + logger.Info("Unsubscribing leader notice channel") for i := range noticeChans { if noticeChans[i] == ch { noticeChans = append(noticeChans[:i], noticeChans[i+1:]...) return } } - log.Error("Could not find leader notice channel to unsubscribe") + logger.Error("Could not find leader notice channel to unsubscribe") }, nil } -func startLeaderElection(v1Client corev1.CoreV1Interface, coordinationClient coordinationv1.CoordinationV1Interface) error { +func startLeaderElection(v1Client corev1.CoreV1Interface, coordinationClient coordinationv1.CoordinationV1Interface, logger log.FieldLogger) error { ns := os.Getenv("MY_NAMESPACE") if ns == "" { return errors.New("MY_NAMESPACE envvar is not defined") @@ -109,7 +109,7 @@ func startLeaderElection(v1Client corev1.CoreV1Interface, coordinationClient coo lock.Lock() defer lock.Unlock() - log.Infof("K8s leader is now node %s", identity) + logger.Infof("K8s leader is now node %s", identity) leaderIdentity = identity if identity == nodeName && !isLeader { for i := range noticeChans { diff --git a/pkg/monitors/kubernetes/volumes/volumes.go b/pkg/monitors/kubernetes/volumes/volumes.go index 2bf4dc2726..15e4c2527f 100644 --- a/pkg/monitors/kubernetes/volumes/volumes.go +++ b/pkg/monitors/kubernetes/volumes/volumes.go @@ -7,15 +7,16 @@ import ( "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + log "github.com/sirupsen/logrus" + k8s "k8s.io/client-go/kubernetes" + stats "k8s.io/kubelet/pkg/apis/stats/v1alpha1" + "github.com/signalfx/signalfx-agent/pkg/core/common/kubelet" "github.com/signalfx/signalfx-agent/pkg/core/common/kubernetes" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" - k8s "k8s.io/client-go/kubernetes" - stats "k8s.io/kubelet/pkg/apis/stats/v1alpha1" ) var logger = log.WithFields(log.Fields{"monitorType": monitorType}) @@ -40,12 +41,14 @@ type Monitor struct { kubeletClient *kubelet.Client k8sClient *k8s.Clientset dimCache map[string]map[string]string + logger log.FieldLogger } // Configure the monitor and kick off volume metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = logger.WithField("monitorID", conf.MonitorID) var err error - m.kubeletClient, err = kubelet.NewClient(&conf.KubeletAPI) + m.kubeletClient, err = kubelet.NewClient(&conf.KubeletAPI, m.logger) if err != nil { return err } @@ -62,7 +65,7 @@ func (m *Monitor) Configure(conf *Config) error { utils.RunOnInterval(ctx, func() { dps, err := m.getVolumeMetrics() if err != nil { - logger.WithError(err).Error("Could not get volume metrics") + m.logger.WithError(err).Error("Could not get volume metrics") return } @@ -90,7 +93,7 @@ func (m *Monitor) getVolumeMetrics() ([]*datapoint.Datapoint, error) { volumeDims, err := m.volumeIDDimsForPod(p.PodRef.Name, p.PodRef.Namespace, p.PodRef.UID, v.Name) if err != nil { - logger.WithFields(log.Fields{ + m.logger.WithFields(log.Fields{ "error": err, "volName": v.Name, "podName": p.PodRef.Name, diff --git a/pkg/monitors/load/load.go b/pkg/monitors/load/load.go index bdb4147f38..40d5d1dfb8 100644 --- a/pkg/monitors/load/load.go +++ b/pkg/monitors/load/load.go @@ -7,12 +7,13 @@ import ( "github.com/shirou/gopsutil/load" "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) func init() { @@ -37,7 +38,7 @@ type Monitor struct { // Configure is the main function of the monitor, it will report host metadata // on a varied interval func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // create contexts for managing the the plugin loop var ctx context.Context diff --git a/pkg/monitors/logstash/logstash/monitor.go b/pkg/monitors/logstash/logstash/monitor.go index d34f683e84..21fe32eb3a 100644 --- a/pkg/monitors/logstash/logstash/monitor.go +++ b/pkg/monitors/logstash/logstash/monitor.go @@ -11,14 +11,13 @@ import ( "github.com/pkg/errors" "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) -var logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorType}), 30*time.Second) - const ( nodePath = "/_node/" ) @@ -56,10 +55,12 @@ type Monitor struct { ctx context.Context cancel context.CancelFunc metricTypeMap map[string]datapoint.MetricType + logger *utils.ThrottledLogger } // Configure the monitor and kick off volume metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}), 30*time.Second) m.ctx, m.cancel = context.WithCancel(context.Background()) m.conf = conf m.metricTypeMap = conf.getMetricTypeMap() @@ -75,7 +76,7 @@ func (m *Monitor) Configure(conf *Config) error { dims, err := m.fetchNodeInfo(client, fmt.Sprintf("%s://%s:%d%s", scheme, m.conf.Host, m.conf.Port, nodePath)) if err != nil { - logger.WithError(err).Error("Couldn't get node info.") + m.logger.WithError(err).Error("Couldn't get node info.") } utils.RunOnInterval(m.ctx, func() { @@ -85,7 +86,7 @@ func (m *Monitor) Configure(conf *Config) error { for prefix, path := range prefixPathMap { fetched, err = m.fetchMetrics(client, fmt.Sprintf("%s://%s:%d%s", scheme, m.conf.Host, m.conf.Port, path), prefix, dims) if err != nil { - logger.WithError(err).Errorf("Couldn't fetch metrics for path %s", path) + m.logger.WithError(err).Errorf("Couldn't fetch metrics for path %s", path) continue } dps = append(dps, fetched...) @@ -94,19 +95,19 @@ func (m *Monitor) Configure(conf *Config) error { if fetched, err = m.fetchPipelineMetrics(client, fmt.Sprintf("%s://%s:%d%s", scheme, m.conf.Host, m.conf.Port, pipelinePath), "node.pipelines", dims); err == nil { dps = append(dps, fetched...) } else { - logger.WithError(err).Error("Couldn't fetch metrics for pipelines") + m.logger.WithError(err).Error("Couldn't fetch metrics for pipelines") } if fetched, err = m.fetchPipelineMetrics(client, fmt.Sprintf("%s://%s:%d%s", scheme, m.conf.Host, m.conf.Port, pipelineStatPath), "node.stats.pipelines", dims); err == nil { dps = append(dps, fetched...) } else { - logger.WithError(err).Error("Couldn't fetch metrics for pipeline stats") + m.logger.WithError(err).Error("Couldn't fetch metrics for pipeline stats") } if fetched, err = m.fetchPluginMetrics(client, fmt.Sprintf("%s://%s:%d%s", scheme, m.conf.Host, m.conf.Port, pluginPath), "node.plugins", dims); err == nil { dps = append(dps, fetched...) } else { - logger.WithError(err).Error("Couldn't fetch metrics for plugins") + m.logger.WithError(err).Error("Couldn't fetch metrics for plugins") } now := time.Now() @@ -239,7 +240,7 @@ func (m *Monitor) extractDatapoints(metricPath string, metricsJSON map[string]in } else if metricType, exists := m.metricTypeMap[childPath]; exists { metricValue, err := datapoint.CastMetricValueWithBool(v) if err != nil { - logger.WithError(err).Errorf("Couldn't cast value: %s", childPath) + m.logger.WithError(err).Errorf("Couldn't cast value: %s", childPath) continue } dps = append(dps, &datapoint.Datapoint{ diff --git a/pkg/monitors/logstash/tcp/monitor.go b/pkg/monitors/logstash/tcp/monitor.go index a0f28d881e..3206e0c8b2 100644 --- a/pkg/monitors/logstash/tcp/monitor.go +++ b/pkg/monitors/logstash/tcp/monitor.go @@ -9,20 +9,17 @@ import ( "strings" "time" - "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" - "github.com/davecgh/go-spew/spew" "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" ) -var logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorType}), 30*time.Second) - func init() { monitors.Register(&monitorMetadata, func() interface{} { return &Monitor{} }, &Config{}) } @@ -63,10 +60,13 @@ type Monitor struct { conf *Config ctx context.Context cancel context.CancelFunc + logger *utils.ThrottledLogger } // Configure the monitor and kick off volume metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}), 30*time.Second) + m.ctx, m.cancel = context.WithCancel(context.Background()) m.conf = conf @@ -91,7 +91,7 @@ OUTER: Port: int(port), }) if err != nil { - logger.WithFields(logrus.Fields{ + m.logger.WithFields(log.Fields{ "err": err, "host": host, "port": port, @@ -100,12 +100,12 @@ OUTER: continue } - logger.Infof("Listening for Logstash events on %s", listener.Addr().String()) + m.logger.Infof("Listening for Logstash events on %s", listener.Addr().String()) for { conn, err := listener.Accept() if err != nil { - logger.WithError(err).Error("Could not accept Logstash connections") + m.logger.WithError(err).Error("Could not accept Logstash connections") listener.Close() time.Sleep(m.conf.ReconnectDelay.AsDuration()) continue OUTER @@ -116,7 +116,7 @@ OUTER: if m.ctx.Err() == context.Canceled { return } - logger.WithError(err).Info("Logstash inbound connection terminated") + m.logger.WithError(err).Info("Logstash inbound connection terminated") } }() } @@ -131,7 +131,7 @@ func (m *Monitor) keepReadingFromServer(host string, port uint16) { conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", host, port)) if err != nil { - logger.WithError(err).Error("Logstash TCP output connection failed") + m.logger.WithError(err).Error("Logstash TCP output connection failed") time.Sleep(m.conf.ReconnectDelay.AsDuration()) continue } @@ -141,7 +141,7 @@ func (m *Monitor) keepReadingFromServer(host string, port uint16) { if m.ctx.Err() == context.Canceled { return } - logger.WithError(err).Error("Logstash receive failed") + m.logger.WithError(err).Error("Logstash receive failed") time.Sleep(m.conf.ReconnectDelay.AsDuration()) continue } @@ -151,7 +151,7 @@ func (m *Monitor) keepReadingFromServer(host string, port uint16) { func (m *Monitor) handleConnection(conn net.Conn) error { go func() { <-m.ctx.Done() - logger.Debug("Closing connection") + m.logger.Debug("Closing connection") conn.Close() }() @@ -167,7 +167,7 @@ func (m *Monitor) handleConnection(conn net.Conn) error { dps, err := m.convertEventToDatapoints(ev) if err != nil { - logger.WithError(err).Errorf("Failed to convert event to datapoints: %v", ev) + m.logger.WithError(err).Errorf("Failed to convert event to datapoints: %v", ev) continue } @@ -189,7 +189,7 @@ func (m *Monitor) convertEventToDatapoints(ev event) ([]*datapoint.Datapoint, er var err error timestamp, err = time.Parse(time.RFC3339, timestampStr) if err != nil { - logger.WithField("timestamp", timestampStr).Warn("Could not parse timestamp with RFC3339 format") + m.logger.WithField("timestamp", timestampStr).Warn("Could not parse timestamp with RFC3339 format") } } @@ -206,14 +206,14 @@ func (m *Monitor) convertEventToDatapoints(ev event) ([]*datapoint.Datapoint, er // Both timers and meters have the count field. _, ok = metricMap["count"].(float64) if !ok { - logger.WithField("event", ev).Warnf("Saw event map without a 'count' field, is the Logstash event coming from the metrics filter?") + m.logger.WithField("event", ev).Warnf("Saw event map without a 'count' field, is the Logstash event coming from the metrics filter?") continue } // The mean field indicates a timer value _, ok = metricMap["mean"].(float64) if ok { - dps = append(dps, parseMapAsTimer(k, metricMap, m.conf.DesiredTimerFieldSet())...) + dps = append(dps, m.parseMapAsTimer(k, metricMap, m.conf.DesiredTimerFieldSet())...) } else { dps = append(dps, parseMapAsMeter(k, metricMap)) } @@ -235,12 +235,12 @@ func parseMapAsMeter(key string, metricMap map[string]interface{}) *datapoint.Da return datapoint.New(key+".count", nil, val, datapoint.Counter, time.Time{}) } -func parseMapAsTimer(key string, metricMap map[string]interface{}, desiredFields map[string]bool) []*datapoint.Datapoint { +func (m *Monitor) parseMapAsTimer(key string, metricMap map[string]interface{}, desiredFields map[string]bool) []*datapoint.Datapoint { dps := make([]*datapoint.Datapoint, 0, len(desiredFields)) for fieldName := range desiredFields { floatVal, ok := metricMap[fieldName].(float64) if !ok { - logger.WithField("metric", metricMap).WithField("field", fieldName).Warn("Could not find desired field in map") + m.logger.WithField("metric", metricMap).WithField("field", fieldName).Warn("Could not find desired field in map") } val, _ := datapoint.CastFloatValue(floatVal) typ := datapoint.Gauge diff --git a/pkg/monitors/manager.go b/pkg/monitors/manager.go index a80db73dbd..07787f6a1c 100644 --- a/pkg/monitors/manager.go +++ b/pkg/monitors/manager.go @@ -9,13 +9,14 @@ import ( "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/event" "github.com/signalfx/golib/v3/trace" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/core/meta" "github.com/signalfx/signalfx-agent/pkg/core/services" "github.com/signalfx/signalfx-agent/pkg/monitors/collectd" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) // MonitorManager coordinates the startup and shutdown of monitors based on the diff --git a/pkg/monitors/manager_test.go b/pkg/monitors/manager_test.go index 18e0bf3107..ea60a87bc4 100644 --- a/pkg/monitors/manager_test.go +++ b/pkg/monitors/manager_test.go @@ -6,11 +6,12 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/core/meta" "github.com/signalfx/signalfx-agent/pkg/core/services" "github.com/signalfx/signalfx-agent/pkg/monitors/types" - log "github.com/sirupsen/logrus" ) // Used to make unique service ids diff --git a/pkg/monitors/memory/memory.go b/pkg/monitors/memory/memory.go index 22cd721800..4696b85d22 100644 --- a/pkg/monitors/memory/memory.go +++ b/pkg/monitors/memory/memory.go @@ -5,12 +5,12 @@ import ( "time" "github.com/shirou/gopsutil/mem" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) func init() { @@ -26,7 +26,7 @@ type Config struct { type Monitor struct { Output types.Output cancel func() - logger logrus.FieldLogger + logger log.FieldLogger } // EmitDatapoints emits a set of memory datapoints @@ -51,7 +51,7 @@ func (m *Monitor) emitDatapoints() { // Configure is the main function of the monitor, it will report host metadata // on a varied interval func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // create contexts for managing the the plugin loop var ctx context.Context diff --git a/pkg/monitors/metadata/hostmetadata/hostmetadata.go b/pkg/monitors/metadata/hostmetadata/hostmetadata.go index e0fcf32045..ea56040741 100644 --- a/pkg/monitors/metadata/hostmetadata/hostmetadata.go +++ b/pkg/monitors/metadata/hostmetadata/hostmetadata.go @@ -9,12 +9,13 @@ import ( "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/metadata/hostmetadata" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/common/constants" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/metadata" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) const ( @@ -45,7 +46,7 @@ type Monitor struct { // Configure is the main function of the monitor, it will report host metadata // on a varied interval func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType}) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // metadatafuncs are the functions to collect host metadata. // putting them directly in the array raised issues with the return type of info diff --git a/pkg/monitors/mongodb/atlas/measurements/common.go b/pkg/monitors/mongodb/atlas/measurements/common.go index 18fc33382b..0812b376da 100644 --- a/pkg/monitors/mongodb/atlas/measurements/common.go +++ b/pkg/monitors/mongodb/atlas/measurements/common.go @@ -19,7 +19,7 @@ type Process struct { } // nextPage gets the next page for pagination request. -func nextPage(resp *mongodbatlas.Response) (bool, int) { +func nextPage(resp *mongodbatlas.Response, logger log.FieldLogger) (bool, int) { if resp == nil || len(resp.Links) == 0 || resp.IsLastPage() { return false, -1 } @@ -27,7 +27,7 @@ func nextPage(resp *mongodbatlas.Response) (bool, int) { currentPage, err := resp.CurrentPage() if err != nil { - log.WithError(err).Error("failed to get the next page") + logger.WithError(err).Error("failed to get the next page") return false, -1 } diff --git a/pkg/monitors/mongodb/atlas/measurements/disks.go b/pkg/monitors/mongodb/atlas/measurements/disks.go index 42fc308458..06e6e473be 100644 --- a/pkg/monitors/mongodb/atlas/measurements/disks.go +++ b/pkg/monitors/mongodb/atlas/measurements/disks.go @@ -31,10 +31,11 @@ type disksGetter struct { mutex *sync.Mutex measurementsCache *atomic.Value disksCache *atomic.Value + logger log.FieldLogger } -// NewProcessesGetter returns a new ProcessesGetter. -func NewDisksGetter(projectID string, granularity string, period string, client *mongodbatlas.Client, enableCache bool) DisksGetter { +// NewDisksGetter returns a new DisksGetter. +func NewDisksGetter(projectID string, granularity string, period string, client *mongodbatlas.Client, enableCache bool, logger log.FieldLogger) DisksGetter { return &disksGetter{ projectID: projectID, granularity: granularity, @@ -44,6 +45,7 @@ func NewDisksGetter(projectID string, granularity string, period string, client mutex: new(sync.Mutex), measurementsCache: new(atomic.Value), disksCache: new(atomic.Value), + logger: logger, } } @@ -140,11 +142,11 @@ func (getter *disksGetter) getPartitionNames(ctx context.Context, process Proces list, resp, err := getter.client.ProcessDisks.List(ctx, getter.projectID, process.Host, process.Port, &mongodbatlas.ListOptions{PageNum: page}) if msg, err := errorMsg(err, resp); err != nil { - log.WithError(err).Errorf(msg, "disk partition names", getter.projectID, process.Host, process.Port) + getter.logger.WithError(err).Errorf(msg, "disk partition names", getter.projectID, process.Host, process.Port) return names } - if ok, next := nextPage(resp); ok { + if ok, next := nextPage(resp, getter.logger); ok { names = append(names, getter.getPartitionNames(ctx, process, next)...) } @@ -162,11 +164,11 @@ func (getter *disksGetter) setMeasurements(ctx context.Context, disksMeasurement list, resp, err := getter.client.ProcessDiskMeasurements.List(ctx, getter.projectID, process.Host, process.Port, partitionName, opts) if msg, err := errorMsg(err, resp); err != nil { - log.WithError(err).Errorf(msg, "disk measurements", getter.projectID, process.Host, process.Port) + getter.logger.WithError(err).Errorf(msg, "disk measurements", getter.projectID, process.Host, process.Port) return } - if ok, next := nextPage(resp); ok { + if ok, next := nextPage(resp, getter.logger); ok { getter.setMeasurements(ctx, disksMeasurements, process, partitionName, next) } diff --git a/pkg/monitors/mongodb/atlas/measurements/process.go b/pkg/monitors/mongodb/atlas/measurements/process.go index 6ede77e826..8e0f106d69 100644 --- a/pkg/monitors/mongodb/atlas/measurements/process.go +++ b/pkg/monitors/mongodb/atlas/measurements/process.go @@ -6,9 +6,8 @@ import ( "sync/atomic" "time" - log "github.com/sirupsen/logrus" - "github.com/mongodb/go-client-mongodb-atlas/mongodbatlas" + log "github.com/sirupsen/logrus" ) // ProcessesMeasurements are the metric measurements of a particular MongoDB Process. @@ -30,10 +29,11 @@ type processesGetter struct { mutex *sync.Mutex measurementsCache *atomic.Value processesCache *atomic.Value + logger log.FieldLogger } // NewProcessesGetter returns a new ProcessesGetter. -func NewProcessesGetter(projectID string, granularity string, period string, client *mongodbatlas.Client, enableCache bool) ProcessesGetter { +func NewProcessesGetter(projectID string, granularity string, period string, client *mongodbatlas.Client, enableCache bool, logger log.FieldLogger) ProcessesGetter { return &processesGetter{ projectID: projectID, granularity: granularity, @@ -43,6 +43,7 @@ func NewProcessesGetter(projectID string, granularity string, period string, cli mutex: new(sync.Mutex), measurementsCache: new(atomic.Value), processesCache: new(atomic.Value), + logger: logger, } } @@ -79,21 +80,21 @@ func (getter *processesGetter) getProcessesHelper(ctx context.Context, pageNum i list, resp, err := getter.client.Processes.List(ctx, getter.projectID, &mongodbatlas.ListOptions{PageNum: pageNum}) if err != nil { - log.WithError(err).Errorf("the request for getting processes failed (Atlas project: %s)", getter.projectID) + getter.logger.WithError(err).Errorf("the request for getting processes failed (Atlas project: %s)", getter.projectID) return } if resp == nil { - log.Errorf("the response for getting processes returned empty (Atlas project: %s)", getter.projectID) + getter.logger.Errorf("the response for getting processes returned empty (Atlas project: %s)", getter.projectID) return } if err := mongodbatlas.CheckResponse(resp.Response); err != nil { - log.WithError(err).Errorf("the response for getting processes returned an error (Atlas project: %s)", getter.projectID) + getter.logger.WithError(err).Errorf("the response for getting processes returned an error (Atlas project: %s)", getter.projectID) return } - if ok, next := nextPage(resp); ok { + if ok, next := nextPage(resp, getter.logger); ok { processes = append(processes, getter.getProcessesHelper(ctx, next)...) } @@ -152,11 +153,11 @@ func (getter *processesGetter) setMeasurements(ctx context.Context, process Proc list, resp, err := getter.client.ProcessMeasurements.List(ctx, getter.projectID, process.Host, process.Port, opts) if msg, err := errorMsg(err, resp); err != nil { - log.WithError(err).Errorf(msg, "process measurements", getter.projectID, process.Host, process.Port) + getter.logger.WithError(err).Errorf(msg, "process measurements", getter.projectID, process.Host, process.Port) return } - if ok, next := nextPage(resp); ok { + if ok, next := nextPage(resp, getter.logger); ok { getter.setMeasurements(ctx, process, processesMeasurements, next) } diff --git a/pkg/monitors/mongodb/atlas/monitor.go b/pkg/monitors/mongodb/atlas/monitor.go index fe450975ae..4cc547b059 100644 --- a/pkg/monitors/mongodb/atlas/monitor.go +++ b/pkg/monitors/mongodb/atlas/monitor.go @@ -7,17 +7,16 @@ import ( "sync" "time" - "github.com/signalfx/signalfx-agent/pkg/monitors/mongodb/atlas/measurements" - - "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/Sectorbob/mlab-ns2/gae/ns/digest" "github.com/mongodb/go-client-mongodb-atlas/mongodbatlas" "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" + "github.com/signalfx/signalfx-agent/pkg/monitors/mongodb/atlas/measurements" "github.com/signalfx/signalfx-agent/pkg/monitors/types" - + "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" ) @@ -53,10 +52,12 @@ type Monitor struct { cancel context.CancelFunc processGetter measurements.ProcessesGetter diskGetter measurements.DisksGetter + logger log.FieldLogger } // Configure monitor func (m *Monitor) Configure(conf *Config) (err error) { + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) var client *mongodbatlas.Client var processMeasurements measurements.ProcessesMeasurements var diskMeasurements measurements.DisksMeasurements @@ -70,8 +71,8 @@ func (m *Monitor) Configure(conf *Config) (err error) { return fmt.Errorf("error making HTTP digest client: %+v", err) } - m.processGetter = measurements.NewProcessesGetter(conf.ProjectID, conf.Granularity, conf.Period, client, conf.EnableCache) - m.diskGetter = measurements.NewDisksGetter(conf.ProjectID, conf.Granularity, conf.Period, client, conf.EnableCache) + m.processGetter = measurements.NewProcessesGetter(conf.ProjectID, conf.Granularity, conf.Period, client, conf.EnableCache, m.logger) + m.diskGetter = measurements.NewDisksGetter(conf.ProjectID, conf.Granularity, conf.Period, client, conf.EnableCache, m.logger) utils.RunOnInterval(ctx, func() { processes := m.processGetter.GetProcesses(ctx, timeout) diff --git a/pkg/monitors/monitor.go b/pkg/monitors/monitor.go index f89898d284..7d7f952dbc 100644 --- a/pkg/monitors/monitor.go +++ b/pkg/monitors/monitor.go @@ -5,11 +5,11 @@ import ( "reflect" "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/core/services" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) // MonitorFactory is a niladic function that creates an unconfigured instance diff --git a/pkg/monitors/nagios/nagios.go b/pkg/monitors/nagios/nagios.go index 2acafeb51a..8a83cb8271 100644 --- a/pkg/monitors/nagios/nagios.go +++ b/pkg/monitors/nagios/nagios.go @@ -15,11 +15,12 @@ import ( "github.com/patrickmn/go-cache" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/event" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) func init() { @@ -66,7 +67,7 @@ var ( // Configure and kick off internal metric collection func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType}) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // Define global dimensions used for both datapoint and event dimensions := map[string]string{ "plugin": "nagios", diff --git a/pkg/monitors/netio/netio.go b/pkg/monitors/netio/netio.go index 731999caef..5f398ba116 100644 --- a/pkg/monitors/netio/netio.go +++ b/pkg/monitors/netio/netio.go @@ -7,13 +7,13 @@ import ( "github.com/shirou/gopsutil/net" "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/filter" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) //nolint:gochecknoglobals setting net.IOCounters to a package variable for testing purposes @@ -45,7 +45,7 @@ type Monitor struct { filter *filter.OverridableStringFilter networkTotal uint64 previousInterfaceStats map[string]*netio - logger logrus.FieldLogger + logger log.FieldLogger } func (m *Monitor) updateTotals(iface string, intf *net.IOCountersStat) { @@ -118,7 +118,7 @@ func (m *Monitor) EmitDatapoints() { // Configure is the main function of the monitor, it will report host metadata // on a varied interval func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // create contexts for managing the the plugin loop var ctx context.Context diff --git a/pkg/monitors/ntp/ntp.go b/pkg/monitors/ntp/ntp.go index ced2b5437f..0ef370e1dd 100644 --- a/pkg/monitors/ntp/ntp.go +++ b/pkg/monitors/ntp/ntp.go @@ -4,15 +4,15 @@ import ( "context" "time" + "github.com/beevik/ntp" "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" - "github.com/sirupsen/logrus" - - "github.com/beevik/ntp" ) const minInterval = 30 * time.Minute @@ -43,7 +43,7 @@ type Monitor struct { // Configure and kick off internal metric collection func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType}) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // respect terms of service https://www.pool.ntp.org/tos.html minIntervalSeconds := minInterval.Seconds() if float64(conf.IntervalSeconds) < minIntervalSeconds { diff --git a/pkg/monitors/postgresql/monitor.go b/pkg/monitors/postgresql/monitor.go index 4770900b4b..add3a7c121 100644 --- a/pkg/monitors/postgresql/monitor.go +++ b/pkg/monitors/postgresql/monitor.go @@ -8,6 +8,8 @@ import ( "sync" "time" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/core/dpfilters" "github.com/signalfx/signalfx-agent/pkg/monitors" @@ -15,7 +17,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/filter" - "github.com/sirupsen/logrus" ) func init() { @@ -91,6 +92,8 @@ type Monitor struct { connectionString string // name for execution time column determined by information schema for pg_stat_statement totalTimeColumn string + + logger logrus.FieldLogger } // Configure the monitor and kick off metric collection @@ -98,8 +101,9 @@ func (m *Monitor) Configure(conf *Config) error { m.conf = conf m.ctx, m.cancel = context.WithCancel(context.Background()) - logger := logrus.WithFields(logrus.Fields{ + m.logger = logrus.WithFields(logrus.Fields{ "monitorType": monitorMetadata.MonitorType, + "monitorID": conf.MonitorID, "host": conf.Host, "port": conf.Port, }) @@ -153,7 +157,7 @@ func (m *Monitor) Configure(conf *Config) error { if m.database == nil { m.database, err = dbsql.Open("postgres", connectionStringWithMasterDB) if err != nil { - logger.WithError(err).WithField("connStr", connStr).Error("Failed to open database") + m.logger.WithError(err).WithField("connStr", connStr).Error("Failed to open database") return } } @@ -161,14 +165,14 @@ func (m *Monitor) Configure(conf *Config) error { if m.serverMonitor == nil { m.serverMonitor, err = m.monitorServer(connectionStringWithMasterDB) if err != nil { - logger.WithError(err).Errorf("could not monitor postgresql server: %v", err) + m.logger.WithError(err).Errorf("could not monitor postgresql server: %v", err) } } if queriesGroupEnabled && m.statementsMonitor == nil { m.statementsMonitor, err = m.monitorStatements(connectionStringWithMasterDB) if err != nil { - logger.WithError(err).Errorf("Could not monitor queries: %v", err) + m.logger.WithError(err).Errorf("Could not monitor queries: %v", err) } } @@ -176,12 +180,12 @@ func (m *Monitor) Configure(conf *Config) error { rows, err := m.database.QueryContext(m.ctx, `select AURORA_VERSION();`) if err == nil { defer rows.Close() - logger.Info("Aurora server detected, disabling replication monitor") + m.logger.Info("Aurora server detected, disabling replication monitor") } else { - logger.Debug("Replication metrics enabled") + m.logger.Debug("Replication metrics enabled") m.replicationMonitor, err = m.monitorReplication() if err != nil { - logger.WithError(err).Errorf("Could not monitor replication: %v", err) + m.logger.WithError(err).Errorf("Could not monitor replication: %v", err) } } startedMonitoringReplication = true @@ -189,7 +193,7 @@ func (m *Monitor) Configure(conf *Config) error { databases, err := determineDatabases(m.ctx, m.database) if err != nil { - logger.WithError(err).Error("Could not determine list of PostgreSQL databases") + m.logger.WithError(err).Error("Could not determine list of PostgreSQL databases") } dbSet := map[string]bool{} @@ -204,18 +208,18 @@ func (m *Monitor) Configure(conf *Config) error { if _, ok := m.monitoredDBs[db]; !ok { mon, err := m.startMonitoringDatabase(db) if err != nil { - logger.WithError(err).Errorf("Could not monitor database '%s'", db) + m.logger.WithError(err).Errorf("Could not monitor database '%s'", db) continue } m.monitoredDBs[db] = mon - logger.Infof("Now monitoring PostgreSQL database '%s'", db) + m.logger.Infof("Now monitoring PostgreSQL database '%s'", db) } } // Stop monitoring any dbs that disappear. for name := range m.monitoredDBs { if !dbSet[name] { - logger.Infof("No longer monitoring PostgreSQL database '%s'", name) + m.logger.Infof("No longer monitoring PostgreSQL database '%s'", name) m.monitoredDBs[name].Shutdown() delete(m.monitoredDBs, name) } diff --git a/pkg/monitors/process/process.go b/pkg/monitors/process/process.go index 50addc629e..7d12ba766f 100644 --- a/pkg/monitors/process/process.go +++ b/pkg/monitors/process/process.go @@ -9,12 +9,13 @@ import ( "github.com/prometheus/procfs" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/filter" - "github.com/sirupsen/logrus" ) func init() { @@ -56,12 +57,13 @@ func (c *Config) Validate() error { type Monitor struct { Output types.FilteringOutput cancel func() + logger logrus.FieldLogger } // Configure is the main function of the monitor, it will report host metadata // on a varied interval func (m *Monitor) Configure(conf *Config) error { - logger := logrus.WithField("monitorType", monitorType) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // create contexts for managing the the plugin loop var ctx context.Context @@ -97,7 +99,7 @@ func (m *Monitor) Configure(conf *Config) error { utils.RunOnInterval(ctx, func() { dps, err := gatherProcessMetrics(&fs, processNameFilter, executablesFilter) if err != nil { - logger.WithError(err).Error("Failed to gather process metrics") + m.logger.WithError(err).Error("Failed to gather process metrics") return } diff --git a/pkg/monitors/processlist/processlist.go b/pkg/monitors/processlist/processlist.go index c0d11f4491..6594dc4c95 100644 --- a/pkg/monitors/processlist/processlist.go +++ b/pkg/monitors/processlist/processlist.go @@ -13,18 +13,18 @@ import ( "time" "github.com/signalfx/golib/v3/event" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) const version = "0.0.30" // EVENT(objects.top-info): Process list event. -var logger = log.WithFields(log.Fields{"monitorType": monitorType}) var zlibCompressor = zlib.NewWriter(&bytes.Buffer{}) var now = time.Now @@ -53,6 +53,7 @@ type Monitor struct { cancel func() lastCPUCounts map[procKey]time.Duration nextPurge time.Time + logger log.FieldLogger } // TopProcess is a platform-independent way of representing a process to be @@ -81,7 +82,8 @@ func (tp *TopProcess) key() procKey { // Configure configures the monitor and starts collecting on the configured interval func (m *Monitor) Configure(conf *Config) error { - // create contexts for managing the the plugin loop + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) + // create contexts for managing the plugin loop var ctx context.Context ctx, m.cancel = context.WithCancel(context.Background()) interval := time.Duration(conf.IntervalSeconds) * time.Second @@ -95,15 +97,15 @@ func (m *Monitor) Configure(conf *Config) error { ctx, func() { // get the process list - procs, err := ProcessList(conf, osCache) + procs, err := ProcessList(conf, osCache, m.logger) if err != nil { - logger.WithError(err).Error("Couldn't get process list") + m.logger.WithError(err).Error("Couldn't get process list") return } message, err := m.encodeEventMessage(procs, interval) if err != nil { - logger.WithError(err).Error("Failed to encode process list") + m.logger.WithError(err).Error("Failed to encode process list") } m.Output.SendEvent( diff --git a/pkg/monitors/processlist/processlist_darwin.go b/pkg/monitors/processlist/processlist_darwin.go index 591b1373a0..2ac5161b5f 100644 --- a/pkg/monitors/processlist/processlist_darwin.go +++ b/pkg/monitors/processlist/processlist_darwin.go @@ -3,6 +3,8 @@ package processlist +import "github.com/sirupsen/logrus" + type osCache struct { } @@ -10,6 +12,6 @@ func initOSCache() *osCache { return &osCache{} } -func ProcessList(conf *Config, cache *osCache) ([]*TopProcess, error) { +func ProcessList(conf *Config, cache *osCache, logger logrus.FieldLogger) ([]*TopProcess, error) { return nil, nil } diff --git a/pkg/monitors/processlist/processlist_linux.go b/pkg/monitors/processlist/processlist_linux.go index ee3a585079..f6c264727f 100644 --- a/pkg/monitors/processlist/processlist_linux.go +++ b/pkg/monitors/processlist/processlist_linux.go @@ -10,6 +10,7 @@ import ( "time" "github.com/prometheus/procfs" + "github.com/sirupsen/logrus" ) // A place to hold system info that is assumed not to change (or rarely change) @@ -26,7 +27,7 @@ func initOSCache() *osCache { } // ProcessList takes a snapshot of running processes -func ProcessList(conf *Config, cache *osCache) ([]*TopProcess, error) { +func ProcessList(conf *Config, cache *osCache, logger logrus.FieldLogger) ([]*TopProcess, error) { var fs procfs.FS var err error if conf.ProcPath == "" { @@ -76,7 +77,7 @@ func ProcessList(conf *Config, cache *osCache) ([]*TopProcess, error) { if err == nil { cache.uidCache[uid] = user username = user.Username - } else { + } else if logger != nil { logger.WithError(err).Debugf("Could not lookup user id %s for process id %d", uid, p.PID) } } diff --git a/pkg/monitors/processlist/processlist_linux_test.go b/pkg/monitors/processlist/processlist_linux_test.go index d3c34cbb9e..be6c3250c7 100644 --- a/pkg/monitors/processlist/processlist_linux_test.go +++ b/pkg/monitors/processlist/processlist_linux_test.go @@ -11,7 +11,7 @@ import ( func TestProcessListLinux(t *testing.T) { cache := initOSCache() - tps, err := ProcessList(&Config{}, cache) + tps, err := ProcessList(&Config{}, cache, nil) require.Nil(t, err) require.Greater(t, len(tps), 0) diff --git a/pkg/monitors/processlist/processlist_windows.go b/pkg/monitors/processlist/processlist_windows.go index 0a3424a514..94e1c9865f 100644 --- a/pkg/monitors/processlist/processlist_windows.go +++ b/pkg/monitors/processlist/processlist_windows.go @@ -9,6 +9,7 @@ import ( "github.com/StackExchange/wmi" "github.com/shirou/gopsutil/mem" + "github.com/sirupsen/logrus" "golang.org/x/sys/windows" ) @@ -112,7 +113,7 @@ var getUsername = func(id uint32) (username string, err error) { } // ProcessList takes a snapshot of running processes -func ProcessList(conf *Config, cache *osCache) ([]*TopProcess, error) { +func ProcessList(conf *Config, cache *osCache, logger logrus.FieldLogger) ([]*TopProcess, error) { var procs []*TopProcess // Get all processes @@ -131,7 +132,7 @@ func ProcessList(conf *Config, cache *osCache) ([]*TopProcess, error) { // iterate over each process and build an entry for the process list for _, p := range ps { username, err := getUsername(p.ProcessID) - if err != nil { + if err != nil && logger != nil { logger.Debugf("Unable to collect username for process %v. %v", p, err) } @@ -141,7 +142,7 @@ func ProcessList(conf *Config, cache *osCache) ([]*TopProcess, error) { var memPercent float64 if systemMemory, err := mem.VirtualMemory(); err == nil { memPercent = 100 * float64(p.WorkingSetSize) / float64(systemMemory.Total) - } else { + } else if logger != nil { logger.WithError(err).Error("Unable to collect system memory total") } diff --git a/pkg/monitors/prometheusexporter/prometheus.go b/pkg/monitors/prometheusexporter/prometheus.go index 9ced7949b7..8c5e94d046 100644 --- a/pkg/monitors/prometheusexporter/prometheus.go +++ b/pkg/monitors/prometheusexporter/prometheus.go @@ -10,16 +10,14 @@ import ( "strings" "time" - "github.com/signalfx/signalfx-agent/pkg/core/common/auth" - "github.com/signalfx/signalfx-agent/pkg/core/common/httpclient" - - "k8s.io/client-go/rest" - - "github.com/sirupsen/logrus" - dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" + "k8s.io/client-go/rest" + + "github.com/signalfx/signalfx-agent/pkg/core/common/auth" + "github.com/signalfx/signalfx-agent/pkg/core/common/httpclient" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" @@ -85,7 +83,7 @@ type fetcher func() (io.ReadCloser, expfmt.Format, error) // Configure the monitor and kick off volume metric syncing func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(logrus.Fields{"monitorType": m.monitorName}) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": m.monitorName, "monitorID": conf.MonitorID}) var bearerToken string diff --git a/pkg/monitors/sql/monitor.go b/pkg/monitors/sql/monitor.go index afa8b4802e..528c2f9964 100644 --- a/pkg/monitors/sql/monitor.go +++ b/pkg/monitors/sql/monitor.go @@ -8,13 +8,6 @@ import ( "strings" "time" - "github.com/signalfx/golib/v3/datapoint" - "github.com/signalfx/signalfx-agent/pkg/core/config" - "github.com/signalfx/signalfx-agent/pkg/monitors" - "github.com/signalfx/signalfx-agent/pkg/monitors/types" - "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - // Imports to get sql driver registered _ "github.com/SAP/go-hdb/driver" _ "github.com/denisenkom/go-mssqldb" @@ -22,9 +15,17 @@ import ( _ "github.com/jackc/pgx/v4/stdlib" _ "github.com/lib/pq" _ "github.com/snowflakedb/gosnowflake" + + "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/core/config" + "github.com/signalfx/signalfx-agent/pkg/monitors" + "github.com/signalfx/signalfx-agent/pkg/monitors/types" + "github.com/signalfx/signalfx-agent/pkg/utils" ) -var logger = logrus.WithFields(logrus.Fields{"monitorType": monitorMetadata.MonitorType}) +var logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType}) func init() { monitors.Register(&monitorMetadata, func() interface{} { return &Monitor{} }, &Config{}) @@ -146,10 +147,12 @@ type Monitor struct { database *sql.DB cancel context.CancelFunc ctx context.Context + logger logrus.FieldLogger } // Configure the monitor and kick off metric gathering func (m *Monitor) Configure(conf *Config) error { + m.logger = logger.WithField("monitorID", conf.MonitorID) m.ctx, m.cancel = context.WithCancel(context.Background()) // This will "open" a database by verifying that the config is sane but @@ -167,7 +170,7 @@ func (m *Monitor) Configure(conf *Config) error { } for i := range conf.Queries { - querier, err := newQuerier(&conf.Queries[i], conf.LogQueries) + querier, err := newQuerier(&conf.Queries[i], conf.LogQueries, m.logger) if err != nil { return err } diff --git a/pkg/monitors/sql/querier.go b/pkg/monitors/sql/querier.go index 764fff7f2f..feeb23458e 100644 --- a/pkg/monitors/sql/querier.go +++ b/pkg/monitors/sql/querier.go @@ -12,9 +12,10 @@ import ( "github.com/antonmedv/expr/vm" "github.com/davecgh/go-spew/spew" "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) type querier struct { @@ -29,7 +30,7 @@ type querier struct { logQueries bool } -func newQuerier(query *Query, logQueries bool) (*querier, error) { +func newQuerier(query *Query, logQueries bool, logger logrus.FieldLogger) (*querier, error) { valueColumnNamesToMetrics := map[string]*Metric{} metricToIndex := map[*Metric]int{} diff --git a/pkg/monitors/statsd/monitor.go b/pkg/monitors/statsd/monitor.go index d6f8a0f597..dd962a0c6d 100644 --- a/pkg/monitors/statsd/monitor.go +++ b/pkg/monitors/statsd/monitor.go @@ -7,11 +7,12 @@ import ( "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/sfxclient" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) var metricTypeMap = map[string]datapoint.MetricType{ @@ -21,8 +22,6 @@ var metricTypeMap = map[string]datapoint.MetricType{ "s": datapoint.Gauge, } -var logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorMetadata.MonitorType}), 30*time.Second) - func init() { monitors.Register(&monitorMetadata, func() interface{} { return &Monitor{} }, &Config{}) } @@ -69,10 +68,13 @@ type Monitor struct { cancel context.CancelFunc conf *Config listener *statsDListener + logger *utils.ThrottledLogger } // Configure the monitor and kick off volume metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = utils.NewThrottledLogger(log.WithFields(log.Fields{"monitorType": monitorMetadata.MonitorType, "monitorID": conf.MonitorID}), 30*time.Second) + var ctx context.Context ctx, m.cancel = context.WithCancel(context.Background()) @@ -87,10 +89,10 @@ func (m *Monitor) Configure(conf *Config) error { var converters []*converter for _, ci := range conf.Converters { - converter := initConverter(&ConverterInput{ + converter := newConverter(&ConverterInput{ Pattern: ci.Pattern, MetricName: ci.MetricName, - }) + }, m.logger) if converter != nil { converters = append(converters, converter) } @@ -102,6 +104,7 @@ func (m *Monitor) Configure(conf *Config) error { tcp: false, // Will be added to Config when TCP is supported prefix: conf.MetricPrefix, converters: converters, + logger: m.logger, } err := m.listener.Listen() @@ -113,7 +116,7 @@ func (m *Monitor) Configure(conf *Config) error { utils.RunOnInterval(ctx, func() { metrics := m.listener.FetchMetrics() - dps := convertMetricsToDatapoints(aggregateMetrics(metrics)) + dps := m.convertMetricsToDatapoints(aggregateMetrics(metrics)) m.Output.SendDatapoints(dps...) }, time.Duration(conf.IntervalSeconds)*time.Second) @@ -147,7 +150,7 @@ func aggregateMetrics(metrics []*statsDMetric) map[string]*statsDMetric { return metricsMap } -func convertMetricsToDatapoints(metrics map[string]*statsDMetric) []*datapoint.Datapoint { +func (m *Monitor) convertMetricsToDatapoints(metrics map[string]*statsDMetric) []*datapoint.Datapoint { var dps []*datapoint.Datapoint for _, metric := range metrics { @@ -160,7 +163,7 @@ func convertMetricsToDatapoints(metrics map[string]*statsDMetric) []*datapoint.D case datapoint.Count: dp = sfxclient.Counter(metric.metricName, nil, int64(metric.value)) default: - logger.Errorf("Unsupported StatsD metric type: %s", metric.metricType) + m.logger.Errorf("Unsupported StatsD metric type: %s", metric.metricType) continue } diff --git a/pkg/monitors/statsd/parser.go b/pkg/monitors/statsd/parser.go index 2cb3deb5d2..661ee94cc1 100644 --- a/pkg/monitors/statsd/parser.go +++ b/pkg/monitors/statsd/parser.go @@ -2,6 +2,8 @@ package statsd import ( "strings" + + "github.com/signalfx/signalfx-agent/pkg/utils" ) type fieldPattern struct { @@ -14,22 +16,19 @@ type converter struct { metric *fieldPattern } -func initConverter(input *ConverterInput) *converter { - pattern := parseFields(input.Pattern) - metric := parseFields(input.MetricName) +func newConverter(input *ConverterInput, logger *utils.ThrottledLogger) *converter { + pattern := parseFields(input.Pattern, logger) + metric := parseFields(input.MetricName, logger) if pattern == nil || metric == nil { return nil } - return &converter{ - pattern: parseFields(input.Pattern), - metric: parseFields(input.MetricName), - } + return &converter{pattern: pattern, metric: metric} } // parseDogstatsdTags extracts any dogstatd style tags from a metric. -func parseDogstatsdTags(s string) (string, map[string]string) { +func parseDogstatsdTags(s string, logger *utils.ThrottledLogger) (string, map[string]string) { var dims map[string]string tagsIdx := strings.LastIndex(s, "|#") if tagsIdx >= 0 { @@ -39,7 +38,9 @@ func parseDogstatsdTags(s string) (string, map[string]string) { for _, t := range strings.Split(tagsRaw, ",") { parts := strings.SplitN(t, ":", 2) if len(parts) != 2 { - logger.Warnf("Invalid StatsD metric tag : %s", t) + if logger != nil { + logger.Warnf("Invalid StatsD metric tag : %s", t) + } continue } @@ -52,7 +53,7 @@ func parseDogstatsdTags(s string) (string, map[string]string) { } // parsePattern takes a pattern string and convert it into parsed fieldPattern object -func parseFields(p string) *fieldPattern { +func parseFields(p string, logger *utils.ThrottledLogger) *fieldPattern { var substrs []string inBraces := false @@ -61,20 +62,26 @@ func parseFields(p string) *fieldPattern { switch c { case '{': if inBraces { - logger.Errorf("Invalid pattern, cannot nest opening braces '{' in pattern '%s'", p) + if logger != nil { + logger.Errorf("Invalid pattern, cannot nest opening braces '{' in pattern '%s'", p) + } return nil } inBraces = true if len(currentField) > 0 { substrs = append(substrs, currentField) } else if i != 0 { - logger.Errorf("Cannot have back to back match groups in pattern '%s'", p) + if logger != nil { + logger.Errorf("Cannot have back to back match groups in pattern '%s'", p) + } return nil } currentField = "" case '}': if !inBraces { - logger.Errorf("Invalid pattern, no opening '{' found for pattern '%s'", p) + if logger != nil { + logger.Errorf("Invalid pattern, no opening '{' found for pattern '%s'", p) + } return nil } inBraces = false @@ -86,7 +93,9 @@ func parseFields(p string) *fieldPattern { } if inBraces { - logger.Errorf("Invalid pattern, no ending } found for pattern '%s'", p) + if logger != nil { + logger.Errorf("Invalid pattern, no ending } found for pattern '%s'", p) + } return nil } diff --git a/pkg/monitors/statsd/parser_test.go b/pkg/monitors/statsd/parser_test.go index 162699487d..4fc1ef6eca 100644 --- a/pkg/monitors/statsd/parser_test.go +++ b/pkg/monitors/statsd/parser_test.go @@ -46,8 +46,8 @@ func TestParseMetrics(t *testing.T) { "cluster.cds_egress_ecommerce-demo-mesh_gateway-vn_tcp_8080.update_success:100|g|#svc:svc2", []*converter{ { - pattern: parseFields("cluster.cds_{traffic}_{mesh}_{service}-vn_{}.{action}"), - metric: parseFields("{traffic}.{action}"), + pattern: parseFields("cluster.cds_{traffic}_{mesh}_{service}-vn_{}.{action}", nil), + metric: parseFields("{traffic}.{action}", nil), }, }, statsDMetric{ @@ -69,8 +69,8 @@ func TestParseMetrics(t *testing.T) { "cluster.cds_egress_ecommerce-demo-mesh_gateway-vn_tcp_8080.update_success:100|g", []*converter{ { - pattern: parseFields("cluster.cds_{traffic}_{mesh}_{service}-vn_{}.{action}"), - metric: parseFields("{traffic}.{action}"), + pattern: parseFields("cluster.cds_{traffic}_{mesh}_{service}-vn_{}.{action}", nil), + metric: parseFields("{traffic}.{action}", nil), }, }, statsDMetric{ @@ -91,7 +91,11 @@ func TestParseMetrics(t *testing.T) { for i := range cases { tt := cases[i] t.Run(tt.name, func(t *testing.T) { - sm := parseMetrics([]string{tt.raw}, tt.converters, "") + sl := &statsDListener{ + converters: tt.converters, + prefix: "", + } + sm := sl.parseMetrics([]string{tt.raw}) require.Equal(t, 1, len(sm)) require.Equal(t, tt.parsed, *sm[0]) }) @@ -176,7 +180,7 @@ func TestParseFields(t *testing.T) { for i := range cases { tt := cases[i] t.Run(tt.pattern, func(t *testing.T) { - fp := parseFields(tt.pattern) + fp := parseFields(tt.pattern, nil) if tt.expectNil { require.Nil(t, fp) return diff --git a/pkg/monitors/statsd/statsd.go b/pkg/monitors/statsd/statsd.go index 07259c8c72..a6b96c9a93 100644 --- a/pkg/monitors/statsd/statsd.go +++ b/pkg/monitors/statsd/statsd.go @@ -6,6 +6,8 @@ import ( "strings" "sync" "sync/atomic" + + "github.com/signalfx/signalfx-agent/pkg/utils" ) type statsDListener struct { @@ -18,6 +20,7 @@ type statsDListener struct { converters []*converter metricBuffer []string shutdownCalled int32 + logger *utils.ThrottledLogger } type statsDMetric struct { @@ -46,7 +49,7 @@ func (sl *statsDListener) listenUDP() error { return err } - logger.Infof("SignalFx StatsD monitor: Listening on host & port %s:%s", conn.LocalAddr().Network(), conn.LocalAddr().String()) + sl.logger.Infof("SignalFx StatsD monitor: Listening on host & port %s:%s", conn.LocalAddr().Network(), conn.LocalAddr().String()) sl.udpConn = conn return nil @@ -64,7 +67,7 @@ func (sl *statsDListener) FetchMetrics() []*statsDMetric { sl.metricBuffer = nil sl.Unlock() - parsed := parseMetrics(rawMetrics, sl.converters, sl.prefix) + parsed := sl.parseMetrics(rawMetrics) return parsed } @@ -100,7 +103,7 @@ func (sl *statsDListener) readUDP(chData chan []byte) { break } - logger.WithError(err).Error("Failed reading UDP datagram.") + sl.logger.WithError(err).Error("Failed reading UDP datagram.") continue } @@ -118,18 +121,18 @@ func (sl *statsDListener) Close() { } } -func parseMetrics(raw []string, converters []*converter, prefix string) []*statsDMetric { +func (sl *statsDListener) parseMetrics(raw []string) []*statsDMetric { var metrics []*statsDMetric for _, m := range raw { if m == "" { continue } - m, dims := parseDogstatsdTags(m) + m, dims := parseDogstatsdTags(m, sl.logger) colonIdx := strings.Index(m, ":") pipeIdx := strings.Index(m, "|") if pipeIdx >= len(m)-1 || pipeIdx < 0 || colonIdx-1 > len(m) || colonIdx < 0 { - logger.Warnf("Invalid StatsD metric string : %s", m) + sl.logger.Warnf("Invalid StatsD metric string : %s", m) continue } secondPipeIdx := pipeIdx + strings.Index(m[pipeIdx+1:], "|") @@ -144,14 +147,14 @@ func parseMetrics(raw []string, converters []*converter, prefix string) []*stats metricType = m[pipeIdx+1:] } - if prefix != "" { - metricName = strings.TrimPrefix(rawMetricName, prefix+".") + if sl.prefix != "" { + metricName = strings.TrimPrefix(rawMetricName, sl.prefix+".") } else { metricName = rawMetricName } - if converters != nil { - metricName, dims = convertMetric(metricName, converters, dims) + if sl.converters != nil { + metricName, dims = convertMetric(metricName, sl.converters, dims) } strValue := m[colonIdx+1 : pipeIdx] @@ -166,7 +169,7 @@ func parseMetrics(raw []string, converters []*converter, prefix string) []*stats dimensions: dims, }) } else { - logger.WithError(err).Errorf("Failed parsing metric value %s", strValue) + sl.logger.WithError(err).Errorf("Failed parsing metric value %s", strValue) } } diff --git a/pkg/monitors/subproc/core.go b/pkg/monitors/subproc/core.go index 619f3986e3..b72476b348 100644 --- a/pkg/monitors/subproc/core.go +++ b/pkg/monitors/subproc/core.go @@ -16,9 +16,10 @@ import ( "sync/atomic" "time" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) // RuntimeConfig for subprocs diff --git a/pkg/monitors/subproc/signalfx/handler.go b/pkg/monitors/subproc/signalfx/handler.go index 5b88f373a6..d548393ac1 100644 --- a/pkg/monitors/subproc/signalfx/handler.go +++ b/pkg/monitors/subproc/signalfx/handler.go @@ -16,9 +16,10 @@ import ( signalfxformat "github.com/signalfx/gateway/protocol/signalfx/format" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/ingest-protocols/protocol/signalfx" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/subproc" "github.com/signalfx/signalfx-agent/pkg/monitors/types" - "github.com/sirupsen/logrus" ) const messageTypeDatapointJSONList subproc.MessageType = 200 diff --git a/pkg/monitors/supervisor/supervisor.go b/pkg/monitors/supervisor/supervisor.go index d55cc8ce46..8f7e05c3be 100644 --- a/pkg/monitors/supervisor/supervisor.go +++ b/pkg/monitors/supervisor/supervisor.go @@ -8,11 +8,12 @@ import ( "github.com/mattn/go-xmlrpc" "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) func init() { @@ -70,7 +71,7 @@ func (c *Config) ScrapeURL() string { // Configure and kick off internal metric collection func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType}) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // Start the metric gathering process here var ctx context.Context diff --git a/pkg/monitors/telegraf/common/emitter/baseemitter/baseemitter.go b/pkg/monitors/telegraf/common/emitter/baseemitter/baseemitter.go index c5313d9305..d81df41db2 100644 --- a/pkg/monitors/telegraf/common/emitter/baseemitter/baseemitter.go +++ b/pkg/monitors/telegraf/common/emitter/baseemitter/baseemitter.go @@ -6,8 +6,9 @@ import ( "github.com/influxdata/telegraf" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/event" - "github.com/signalfx/signalfx-agent/pkg/monitors/types" log "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/monitors/types" ) // TelegrafToSFXMetricType returns the signalfx metric type for a telegraf metric diff --git a/pkg/monitors/telegraf/common/emitter/baseemitter/baseemitter_test.go b/pkg/monitors/telegraf/common/emitter/baseemitter/baseemitter_test.go index 4328b75cf4..2e9ea30822 100644 --- a/pkg/monitors/telegraf/common/emitter/baseemitter/baseemitter_test.go +++ b/pkg/monitors/telegraf/common/emitter/baseemitter/baseemitter_test.go @@ -12,8 +12,9 @@ import ( "github.com/influxdata/telegraf/metric" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/event" - "github.com/signalfx/signalfx-agent/pkg/neotest" log "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/neotest" ) func TestImmediateEmitter_Emit(t *testing.T) { diff --git a/pkg/monitors/telegraf/common/emitter/batchemitter/batchemitter.go b/pkg/monitors/telegraf/common/emitter/batchemitter/batchemitter.go index ac2d6b30b4..30794373e8 100644 --- a/pkg/monitors/telegraf/common/emitter/batchemitter/batchemitter.go +++ b/pkg/monitors/telegraf/common/emitter/batchemitter/batchemitter.go @@ -4,9 +4,10 @@ import ( "sync" "github.com/influxdata/telegraf" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/types" - log "github.com/sirupsen/logrus" ) // BatchEmitter gathers a batch of telegraf measurements that can be modified diff --git a/pkg/monitors/telegraf/common/emitter/batchemitter/batchemitter_test.go b/pkg/monitors/telegraf/common/emitter/batchemitter/batchemitter_test.go index 1467b85381..a2c585a116 100644 --- a/pkg/monitors/telegraf/common/emitter/batchemitter/batchemitter_test.go +++ b/pkg/monitors/telegraf/common/emitter/batchemitter/batchemitter_test.go @@ -9,8 +9,9 @@ import ( "github.com/influxdata/telegraf/metric" "github.com/signalfx/golib/v3/datapoint" "github.com/signalfx/golib/v3/event" - "github.com/signalfx/signalfx-agent/pkg/neotest" log "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/neotest" ) func TestImmediateEmitter_Emit(t *testing.T) { diff --git a/pkg/monitors/telegraf/monitors/dns/dns.go b/pkg/monitors/telegraf/monitors/dns/dns.go index eab00775dc..41dbe7ff75 100644 --- a/pkg/monitors/telegraf/monitors/dns/dns.go +++ b/pkg/monitors/telegraf/monitors/dns/dns.go @@ -7,16 +7,15 @@ import ( telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/dns_query" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" - "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) func init() { @@ -46,7 +45,7 @@ type Config struct { type Monitor struct { Output types.Output cancel func() - logger logrus.FieldLogger + logger log.FieldLogger } type Emitter struct { @@ -64,7 +63,7 @@ func (e *Emitter) AddError(err error) { // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) (err error) { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) plugin := telegrafInputs.Inputs["dns_query"]().(*telegrafPlugin.DnsQuery) plugin.Domains = conf.Domains diff --git a/pkg/monitors/telegraf/monitors/exec/exec.go b/pkg/monitors/telegraf/monitors/exec/exec.go index 366033b735..8ddfb01a5c 100644 --- a/pkg/monitors/telegraf/monitors/exec/exec.go +++ b/pkg/monitors/telegraf/monitors/exec/exec.go @@ -9,6 +9,8 @@ import ( telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/exec" "github.com/signalfx/golib/v3/datapoint" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" @@ -17,7 +19,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" - log "github.com/sirupsen/logrus" ) var logger = log.WithFields(log.Fields{"monitorType": monitorType}) @@ -48,6 +49,7 @@ type Monitor struct { Output types.Output cancel func() plugin *telegrafPlugin.Exec + logger log.FieldLogger } // fetch the factory used to generate the perf counter plugin @@ -55,13 +57,14 @@ var factory = telegrafInputs.Inputs["exec"] // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) (err error) { + m.logger = logger.WithField("monitorID", conf.MonitorID) m.plugin = factory().(*telegrafPlugin.Exec) cumulativeCounterSet := utils.StringSliceToMap(conf.SignalFxCumulativeMetrics) // copy configurations to the plugin if err = deepcopier.Copy(conf).To(m.plugin); err != nil { - logger.Error("unable to copy configurations to plugin") + m.logger.Error("unable to copy configurations to plugin") return err } @@ -76,7 +79,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { m.plugin.SetParser(parser) - emitter := baseemitter.NewEmitter(m.Output, logger) + emitter := baseemitter.NewEmitter(m.Output, m.logger) emitter.OmitPluginDimension = true accumulator := accumulator.NewAccumulator(emitter) @@ -100,7 +103,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { // gather metrics on the specified interval utils.RunOnInterval(ctx, func() { if err := m.plugin.Gather(accumulator); err != nil { - logger.WithError(err).Errorf("an error occurred while gathering metrics") + m.logger.WithError(err).Errorf("an error occurred while gathering metrics") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/telegraf/monitors/mssqlserver/mssqlserver.go b/pkg/monitors/telegraf/monitors/mssqlserver/mssqlserver.go index 0bc32cd42c..f87dba86ea 100644 --- a/pkg/monitors/telegraf/monitors/mssqlserver/mssqlserver.go +++ b/pkg/monitors/telegraf/monitors/mssqlserver/mssqlserver.go @@ -11,6 +11,8 @@ import ( "github.com/influxdata/telegraf" telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/sqlserver" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" @@ -18,8 +20,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) func init() { @@ -54,12 +54,12 @@ type Config struct { type Monitor struct { Output types.Output cancel func() - logger logrus.FieldLogger + logger log.FieldLogger } // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) error { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) plugin := telegrafInputs.Inputs["sqlserver"]().(*telegrafPlugin.SQLServer) diff --git a/pkg/monitors/telegraf/monitors/ntpq/ntpq.go b/pkg/monitors/telegraf/monitors/ntpq/ntpq.go index 0bd88519a9..ada039ec0e 100644 --- a/pkg/monitors/telegraf/monitors/ntpq/ntpq.go +++ b/pkg/monitors/telegraf/monitors/ntpq/ntpq.go @@ -6,15 +6,14 @@ import ( telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/ntpq" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" - "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) func init() { @@ -32,7 +31,7 @@ type Config struct { type Monitor struct { Output types.Output cancel func() - logger logrus.FieldLogger + logger log.FieldLogger } type Emitter struct { @@ -41,7 +40,7 @@ type Emitter struct { // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) (err error) { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) plugin := telegrafInputs.Inputs["ntpq"]().(*telegrafPlugin.NTPQ) plugin.DNSLookup = *conf.DNSLookup diff --git a/pkg/monitors/telegraf/monitors/procstat/procstat.go b/pkg/monitors/telegraf/monitors/procstat/procstat.go index b68923d982..3ea560fe19 100644 --- a/pkg/monitors/telegraf/monitors/procstat/procstat.go +++ b/pkg/monitors/telegraf/monitors/procstat/procstat.go @@ -7,10 +7,11 @@ import ( "strings" "time" - "github.com/ulule/deepcopier" - telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/procstat" + log "github.com/sirupsen/logrus" + "github.com/ulule/deepcopier" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" @@ -18,7 +19,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/gopsutilhelper" - log "github.com/sirupsen/logrus" ) var logger = log.WithFields(log.Fields{"monitorType": monitorType}) @@ -58,6 +58,7 @@ type Config struct { type Monitor struct { Output types.Output cancel func() + logger log.FieldLogger } // fetch the factory used to generate the perf counter plugin @@ -65,10 +66,11 @@ var factory = telegrafInputs.Inputs["procstat"] // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) (err error) { + m.logger = logger.WithField("monitorID", conf.MonitorID) plugin := factory().(*telegrafPlugin.Procstat) // create the emitter - em := baseemitter.NewEmitter(m.Output, logger) + em := baseemitter.NewEmitter(m.Output, m.logger) // use the agent's configured host sys to get cgroup information if conf.CGroup != "" { @@ -84,7 +86,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { // copy configurations to the plugin if err = deepcopier.Copy(conf).To(plugin); err != nil { - logger.Error("unable to copy configurations to plugin") + m.logger.Error("unable to copy configurations to plugin") return err } @@ -99,7 +101,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { // gather metrics on the specified interval utils.RunOnInterval(ctx, func() { if err := plugin.Gather(ac); err != nil { - logger.WithError(err).Errorf("an error occurred while gathering metrics") + m.logger.WithError(err).Errorf("an error occurred while gathering metrics") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/telegraf/monitors/tail/tail.go b/pkg/monitors/telegraf/monitors/tail/tail.go index b857e4499e..6a0d4ef8e5 100644 --- a/pkg/monitors/telegraf/monitors/tail/tail.go +++ b/pkg/monitors/telegraf/monitors/tail/tail.go @@ -8,6 +8,9 @@ import ( telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/tail" telegrafParsers "github.com/influxdata/telegraf/plugins/parsers" + log "github.com/sirupsen/logrus" + "github.com/ulule/deepcopier" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" @@ -15,8 +18,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/parser" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" - "github.com/ulule/deepcopier" ) var logger = log.WithFields(log.Fields{"monitorType": monitorType}) @@ -47,6 +48,7 @@ type Monitor struct { Output types.Output cancel context.CancelFunc plugin *telegrafPlugin.Tail + logger log.FieldLogger } // fetch the factory function used to generate the plugin @@ -54,11 +56,12 @@ var factory = telegrafInputs.Inputs["tail"] // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) (err error) { + m.logger = logger.WithField("monitorID", conf.MonitorID) m.plugin = factory().(*telegrafPlugin.Tail) // use the default config if conf.TelegrafParser == nil { - logger.Debug("defaulting to influx parser because no parser was specified") + m.logger.Debug("defaulting to influx parser because no parser was specified") conf.TelegrafParser = &parser.Config{DataFormat: "influx"} } @@ -69,7 +72,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { // copy configurations to the plugin if err = deepcopier.Copy(conf).To(m.plugin); err != nil { - logger.Error("unable to copy configurations to plugin") + m.logger.Error("unable to copy configurations to plugin") return err } @@ -81,7 +84,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { ctx, m.cancel = context.WithCancel(context.Background()) // craete the emitter - em := baseemitter.NewEmitter(m.Output, logger) + em := baseemitter.NewEmitter(m.Output, m.logger) // Hard code the plugin name because the emitter will parse out the // configured measurement name as plugin and that is confusing. @@ -98,7 +101,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { // look for new files to tail on the defined interval utils.RunOnInterval(ctx, func() { if err := m.plugin.Gather(ac); err != nil { - logger.WithError(err).Errorf("an error occurred while gathering metrics") + m.logger.WithError(err).Errorf("an error occurred while gathering metrics") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/telegraf/monitors/telegraflogparser/telegraflogparser.go b/pkg/monitors/telegraf/monitors/telegraflogparser/telegraflogparser.go index f23edf7072..17597d8c0a 100644 --- a/pkg/monitors/telegraf/monitors/telegraflogparser/telegraflogparser.go +++ b/pkg/monitors/telegraf/monitors/telegraflogparser/telegraflogparser.go @@ -7,14 +7,15 @@ import ( telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/logparser" + log "github.com/sirupsen/logrus" + "github.com/ulule/deepcopier" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" - "github.com/ulule/deepcopier" ) var logger = log.WithFields(log.Fields{"monitorType": monitorType}) @@ -52,6 +53,7 @@ type Monitor struct { Output types.Output cancel context.CancelFunc plugin *telegrafPlugin.LogParserPlugin + logger log.FieldLogger } // fetch the factory function used to generate the plugin @@ -59,11 +61,12 @@ var factory = telegrafInputs.Inputs["logparser"] // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) (err error) { + m.logger = logger.WithField("monitorID", conf.MonitorID) m.plugin = factory().(*telegrafPlugin.LogParserPlugin) // copy configurations to the plugin if err = deepcopier.Copy(conf).To(m.plugin); err != nil { - logger.Error("unable to copy configurations to plugin") + m.logger.Error("unable to copy configurations to plugin") return err } @@ -71,7 +74,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { // copy configurations to the plugin if err = deepcopier.Copy(conf).To(&grokConf); err != nil { - logger.Error("unable to copy grok configurations to plugin") + m.logger.Error("unable to copy grok configurations to plugin") return err } @@ -82,7 +85,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { ctx, m.cancel = context.WithCancel(context.Background()) // create the emitter - em := baseemitter.NewEmitter(m.Output, logger) + em := baseemitter.NewEmitter(m.Output, m.logger) // Hard code the plugin name because the emitter will parse out the // configured measurement name as plugin and that is confusing. @@ -99,7 +102,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { // look for new files to tail on the defined interval utils.RunOnInterval(ctx, func() { if err := m.plugin.Gather(ac); err != nil { - logger.WithError(err).Errorf("an error occurred while gathering metrics") + m.logger.WithError(err).Errorf("an error occurred while gathering metrics") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/telegraf/monitors/telegrafsnmp/telegrafsnmp.go b/pkg/monitors/telegraf/monitors/telegrafsnmp/telegrafsnmp.go index 76d60547f6..719b69b6f1 100644 --- a/pkg/monitors/telegraf/monitors/telegrafsnmp/telegrafsnmp.go +++ b/pkg/monitors/telegraf/monitors/telegrafsnmp/telegrafsnmp.go @@ -10,14 +10,14 @@ import ( telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/snmp" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) func init() { @@ -106,7 +106,7 @@ type Config struct { type Monitor struct { Output types.Output cancel context.CancelFunc - logger logrus.FieldLogger + logger log.FieldLogger } // converts our config struct for field to a telegraf field @@ -128,7 +128,7 @@ func getTelegrafFields(incoming []Field) ([]telegrafPlugin.Field, error) { // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) (err error) { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) plugin := telegrafInputs.Inputs["snmp"]().(*telegrafPlugin.Snmp) diff --git a/pkg/monitors/telegraf/monitors/telegrafstatsd/statsd.go b/pkg/monitors/telegraf/monitors/telegrafstatsd/statsd.go index 13d0f04fee..96c9bc157f 100644 --- a/pkg/monitors/telegraf/monitors/telegrafstatsd/statsd.go +++ b/pkg/monitors/telegraf/monitors/telegrafstatsd/statsd.go @@ -8,13 +8,14 @@ import ( telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/statsd" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) var logger = log.WithFields(log.Fields{"monitorType": monitorType}) @@ -70,6 +71,7 @@ type Monitor struct { Output types.Output cancel func() plugin *telegrafPlugin.Statsd + logger log.FieldLogger } // fetch the factory used to generate the perf counter plugin @@ -77,16 +79,17 @@ var factory = telegrafInputs.Inputs["statsd"] // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) (err error) { + m.logger = logger.WithField("monitorID", conf.MonitorID) m.plugin = factory().(*telegrafPlugin.Statsd) // copy configurations to the plugin if err = deepcopier.Copy(conf).To(m.plugin); err != nil { - logger.Error("unable to copy configurations to plugin") + m.logger.Error("unable to copy configurations to plugin") return err } // create the accumulator - ac := accumulator.NewAccumulator(baseemitter.NewEmitter(m.Output, logger)) + ac := accumulator.NewAccumulator(baseemitter.NewEmitter(m.Output, m.logger)) // create contexts for managing the the plugin loop var ctx context.Context @@ -100,7 +103,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { // gather metrics on the specified interval utils.RunOnInterval(ctx, func() { if err := m.plugin.Gather(ac); err != nil { - logger.WithError(err).Errorf("an error occurred while gathering metrics") + m.logger.WithError(err).Errorf("an error occurred while gathering metrics") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/telegraf/monitors/varnish/varnish.go b/pkg/monitors/telegraf/monitors/varnish/varnish.go index e1b53ac592..510d5cbe46 100644 --- a/pkg/monitors/telegraf/monitors/varnish/varnish.go +++ b/pkg/monitors/telegraf/monitors/varnish/varnish.go @@ -9,15 +9,14 @@ import ( telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/varnish" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" - "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" ) func init() { @@ -42,7 +41,7 @@ type Config struct { type Monitor struct { Output types.Output cancel func() - logger logrus.FieldLogger + logger log.FieldLogger } type Emitter struct { @@ -51,7 +50,7 @@ type Emitter struct { // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) (err error) { - m.logger = logrus.WithFields(log.Fields{"monitorType": monitorType}) + m.logger = log.WithFields(log.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) plugin := telegrafInputs.Inputs["varnish"]().(*telegrafPlugin.Varnish) plugin.UseSudo = conf.UseSudo diff --git a/pkg/monitors/telegraf/monitors/winperfcounters/win_perf_counters.go b/pkg/monitors/telegraf/monitors/winperfcounters/win_perf_counters.go index 09e8cb84c9..0e9fcebaf3 100644 --- a/pkg/monitors/telegraf/monitors/winperfcounters/win_perf_counters.go +++ b/pkg/monitors/telegraf/monitors/winperfcounters/win_perf_counters.go @@ -3,12 +3,13 @@ package winperfcounters import ( "strings" - "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" - "github.com/influxdata/telegraf" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" + "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" ) func init() { @@ -75,6 +76,7 @@ type Config struct { type Monitor struct { Output types.Output cancel func() + logger logrus.FieldLogger // nolint: structcheck,unused } // Shutdown stops the metric sync diff --git a/pkg/monitors/telegraf/monitors/winperfcounters/win_perf_counters_windows.go b/pkg/monitors/telegraf/monitors/winperfcounters/win_perf_counters_windows.go index f68af8f50f..33114816e9 100644 --- a/pkg/monitors/telegraf/monitors/winperfcounters/win_perf_counters_windows.go +++ b/pkg/monitors/telegraf/monitors/winperfcounters/win_perf_counters_windows.go @@ -10,11 +10,12 @@ import ( telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/win_perf_counters" + "github.com/sirupsen/logrus" + "github.com/ulule/deepcopier" + "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" - "github.com/ulule/deepcopier" ) var logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType}) @@ -61,13 +62,14 @@ func GetPlugin(conf *Config) (*telegrafPlugin.Win_PerfCounters, error) { // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = logger.WithField("monitorID", conf.MonitorID) plugin, err := GetPlugin(conf) if err != nil { return err } // create the emitter - emitter := baseemitter.NewEmitter(m.Output, logger) + emitter := baseemitter.NewEmitter(m.Output, m.logger) // Hard code the plugin name because the emitter will parse out the // configured measurement name as plugin and that is confusing. @@ -91,7 +93,7 @@ func (m *Monitor) Configure(conf *Config) error { // gather metrics on the specified interval utils.RunOnInterval(ctx, func() { if err := plugin.Gather(ac); err != nil { - logger.WithError(err).Errorf("an error occurred while gathering metrics") + m.logger.WithError(err).Errorf("an error occurred while gathering metrics") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/telegraf/monitors/winservices/winservices.go b/pkg/monitors/telegraf/monitors/winservices/winservices.go index 05969d9bef..22ad586060 100644 --- a/pkg/monitors/telegraf/monitors/winservices/winservices.go +++ b/pkg/monitors/telegraf/monitors/winservices/winservices.go @@ -3,6 +3,8 @@ package winservices import ( "context" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" @@ -23,6 +25,7 @@ type Config struct { type Monitor struct { Output types.Output cancel context.CancelFunc + logger logrus.FieldLogger // nolint: structcheck,unused } // Shutdown stops the metric sync diff --git a/pkg/monitors/telegraf/monitors/winservices/winservices_windows.go b/pkg/monitors/telegraf/monitors/winservices/winservices_windows.go index 91cd21b0f6..481d523f51 100644 --- a/pkg/monitors/telegraf/monitors/winservices/winservices_windows.go +++ b/pkg/monitors/telegraf/monitors/winservices/winservices_windows.go @@ -10,20 +10,22 @@ import ( telegrafInputs "github.com/influxdata/telegraf/plugins/inputs" telegrafPlugin "github.com/influxdata/telegraf/plugins/inputs/win_services" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) var logger = logrus.WithField("monitorType", monitorType) // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) (err error) { + m.logger = logger.WithField("monitorID", conf.MonitorID) plugin := telegrafInputs.Inputs["win_services"]().(*telegrafPlugin.WinServices) // create the emitter - em := baseemitter.NewEmitter(m.Output, logger) + em := baseemitter.NewEmitter(m.Output, m.logger) // Hard code the plugin name because the emitter will parse out the // configured measurement name as plugin and that is confusing. @@ -42,7 +44,7 @@ func (m *Monitor) Configure(conf *Config) (err error) { // gather metrics on the specified interval utils.RunOnInterval(ctx, func() { if err := plugin.Gather(ac); err != nil { - logger.WithError(err).Errorf("an error occurred while gathering metrics") + m.logger.WithError(err).Errorf("an error occurred while gathering metrics") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/vmem/vmem.go b/pkg/monitors/vmem/vmem.go index aff896c1a3..52fcc0a383 100644 --- a/pkg/monitors/vmem/vmem.go +++ b/pkg/monitors/vmem/vmem.go @@ -1,11 +1,12 @@ package vmem import ( + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" - "github.com/sirupsen/logrus" ) func init() { diff --git a/pkg/monitors/vmem/vmem_linux.go b/pkg/monitors/vmem/vmem_linux.go index 87f1c20fe1..45caea8c75 100644 --- a/pkg/monitors/vmem/vmem_linux.go +++ b/pkg/monitors/vmem/vmem_linux.go @@ -12,9 +12,10 @@ import ( "time" "github.com/signalfx/golib/v3/datapoint" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/hostfs" - "github.com/sirupsen/logrus" ) var cumulativeCounters = map[string]string{ @@ -65,7 +66,7 @@ func (m *Monitor) parseFileForDatapoints(contents []byte) []*datapoint.Datapoint // Configure and run the monitor on linux func (m *Monitor) Configure(conf *Config) (err error) { - m.logger = logrus.WithField("monitorType", monitorType) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // create contexts for managing the the plugin loop var ctx context.Context diff --git a/pkg/monitors/vmem/vmem_windows.go b/pkg/monitors/vmem/vmem_windows.go index d47a249b8d..801978f7f3 100644 --- a/pkg/monitors/vmem/vmem_windows.go +++ b/pkg/monitors/vmem/vmem_windows.go @@ -7,11 +7,12 @@ import ( "context" "time" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/monitors/winperfcounters" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) var metricNameMapping = map[string]string{ @@ -22,7 +23,7 @@ var metricNameMapping = map[string]string{ // Configure and run the monitor on windows func (m *Monitor) Configure(conf *Config) (err error) { - m.logger = logrus.WithField("monitorType", monitorType) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) // create contexts for managing the the plugin loop var ctx context.Context diff --git a/pkg/monitors/vsphere/monitor.go b/pkg/monitors/vsphere/monitor.go index d3f79d07d1..18b67eafb9 100644 --- a/pkg/monitors/vsphere/monitor.go +++ b/pkg/monitors/vsphere/monitor.go @@ -4,16 +4,18 @@ import ( "context" "time" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" "github.com/signalfx/signalfx-agent/pkg/monitors/vsphere/model" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) type Monitor struct { Output types.Output cancel func() + logger logrus.FieldLogger } func init() { @@ -27,8 +29,8 @@ func init() { func (m *Monitor) Configure(conf *model.Config) error { var ctx context.Context ctx, m.cancel = context.WithCancel(context.Background()) - log := logrus.WithField("monitorType", "vsphere") - r := newRunner(ctx, log, conf, m) + m.logger = logrus.WithFields(logrus.Fields{"monitorType": monitorType, "monitorID": conf.MonitorID}) + r := newRunner(ctx, m.logger, conf, m) // 20 seconds is the fixed, real-time metrics interval for vsphere/esxi utils.RunOnInterval(ctx, r.run, model.RealtimeMetricsInterval*time.Second) return nil diff --git a/pkg/monitors/vsphere/runner.go b/pkg/monitors/vsphere/runner.go index 435ba660c1..7522cfe085 100644 --- a/pkg/monitors/vsphere/runner.go +++ b/pkg/monitors/vsphere/runner.go @@ -3,19 +3,20 @@ package vsphere import ( "context" - "github.com/signalfx/signalfx-agent/pkg/monitors/vsphere/model" "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/monitors/vsphere/model" ) type runner struct { ctx context.Context - log *logrus.Entry + log logrus.FieldLogger conf *model.Config vsm *vSphereMonitor vsphereReloadInterval int // seconds } -func newRunner(ctx context.Context, log *logrus.Entry, conf *model.Config, monitor *Monitor) runner { +func newRunner(ctx context.Context, log logrus.FieldLogger, conf *model.Config, monitor *Monitor) runner { vsphereReloadInterval := int(conf.InventoryRefreshInterval.AsDuration().Seconds()) vsm := newVsphereMonitor(conf, log, monitor.Output.SendDatapoints) return runner{ diff --git a/pkg/monitors/vsphere/service/auth.go b/pkg/monitors/vsphere/service/auth.go index 6419e7da66..b8051793d7 100644 --- a/pkg/monitors/vsphere/service/auth.go +++ b/pkg/monitors/vsphere/service/auth.go @@ -5,19 +5,20 @@ import ( "crypto/tls" "net/url" - "github.com/signalfx/signalfx-agent/pkg/monitors/vsphere/model" "github.com/sirupsen/logrus" "github.com/vmware/govmomi" "github.com/vmware/govmomi/session" "github.com/vmware/govmomi/vim25" "github.com/vmware/govmomi/vim25/soap" + + "github.com/signalfx/signalfx-agent/pkg/monitors/vsphere/model" ) type AuthService struct { - log *logrus.Entry + log logrus.FieldLogger } -func NewAuthService(log *logrus.Entry) *AuthService { +func NewAuthService(log logrus.FieldLogger) *AuthService { return &AuthService{log: log} } diff --git a/pkg/monitors/vsphere/service/gateway.go b/pkg/monitors/vsphere/service/gateway.go index 33197f6c26..2a1a9b647d 100644 --- a/pkg/monitors/vsphere/service/gateway.go +++ b/pkg/monitors/vsphere/service/gateway.go @@ -28,11 +28,11 @@ type IGateway interface { type Gateway struct { ctx context.Context client *govmomi.Client - log *log.Entry + log log.FieldLogger vcName string } -func NewGateway(ctx context.Context, client *govmomi.Client, log *log.Entry) *Gateway { +func NewGateway(ctx context.Context, client *govmomi.Client, log log.FieldLogger) *Gateway { return &Gateway{ ctx: ctx, client: client, diff --git a/pkg/monitors/vsphere/service/inventory.go b/pkg/monitors/vsphere/service/inventory.go index f550c9a58f..f01df4a995 100644 --- a/pkg/monitors/vsphere/service/inventory.go +++ b/pkg/monitors/vsphere/service/inventory.go @@ -1,20 +1,21 @@ package service import ( - "github.com/signalfx/signalfx-agent/pkg/monitors/vsphere/model" "github.com/sirupsen/logrus" "github.com/vmware/govmomi/vim25/mo" "github.com/vmware/govmomi/vim25/types" + + "github.com/signalfx/signalfx-agent/pkg/monitors/vsphere/model" ) // Traverses the inventory tree and returns all of the hosts and VMs. type InventorySvc struct { - log *logrus.Entry + log logrus.FieldLogger gateway IGateway f InvFilter } -func NewInventorySvc(gateway IGateway, log *logrus.Entry, f InvFilter) *InventorySvc { +func NewInventorySvc(gateway IGateway, log logrus.FieldLogger, f InvFilter) *InventorySvc { return &InventorySvc{gateway: gateway, f: f, log: log} } diff --git a/pkg/monitors/vsphere/service/metrics.go b/pkg/monitors/vsphere/service/metrics.go index ad3cfec4bd..97454d5f92 100644 --- a/pkg/monitors/vsphere/service/metrics.go +++ b/pkg/monitors/vsphere/service/metrics.go @@ -4,17 +4,18 @@ import ( "regexp" "strings" - "github.com/signalfx/signalfx-agent/pkg/monitors/vsphere/model" "github.com/sirupsen/logrus" "github.com/vmware/govmomi/vim25/types" + + "github.com/signalfx/signalfx-agent/pkg/monitors/vsphere/model" ) type MetricsSvc struct { - log *logrus.Entry + log logrus.FieldLogger gateway IGateway } -func NewMetricsService(gateway IGateway, log *logrus.Entry) *MetricsSvc { +func NewMetricsService(gateway IGateway, log logrus.FieldLogger) *MetricsSvc { return &MetricsSvc{log: log, gateway: gateway} } diff --git a/pkg/monitors/vsphere/service/multi_perf_fetcher.go b/pkg/monitors/vsphere/service/multi_perf_fetcher.go index 485832027c..afc8d0c62f 100644 --- a/pkg/monitors/vsphere/service/multi_perf_fetcher.go +++ b/pkg/monitors/vsphere/service/multi_perf_fetcher.go @@ -13,7 +13,7 @@ import ( type multiPagePerfFetcher struct { gateway IGateway pageSize int - log *log.Entry + log log.FieldLogger } func (f *multiPagePerfFetcher) invIterator(inv []*model.InventoryObject, maxSample int32) *invIterator { diff --git a/pkg/monitors/vsphere/service/perf_fetcher.go b/pkg/monitors/vsphere/service/perf_fetcher.go index 98fa865b7f..d95e030b18 100644 --- a/pkg/monitors/vsphere/service/perf_fetcher.go +++ b/pkg/monitors/vsphere/service/perf_fetcher.go @@ -12,7 +12,7 @@ type perfFetcher interface { // Creates a perfFetcher implementation, either a singlePage or multiPage, // depending on pageSize (pageSize==0 turns off pagination). -func newPerfFetcher(gateway IGateway, pageSize int, log *log.Entry) perfFetcher { +func newPerfFetcher(gateway IGateway, pageSize int, log log.FieldLogger) perfFetcher { if pageSize == 0 { return &singlePagePerfFetcher{ gateway: gateway, diff --git a/pkg/monitors/vsphere/service/points.go b/pkg/monitors/vsphere/service/points.go index 41b766ab56..73665a5df2 100644 --- a/pkg/monitors/vsphere/service/points.go +++ b/pkg/monitors/vsphere/service/points.go @@ -13,7 +13,7 @@ import ( ) type PointsSvc struct { - log *logrus.Entry + log logrus.FieldLogger gateway IGateway perfFetcher perfFetcher ptConsumer func(...*datapoint.Datapoint) @@ -21,7 +21,7 @@ type PointsSvc struct { func NewPointsSvc( gateway IGateway, - log *logrus.Entry, + log logrus.FieldLogger, batchSize int, ptConsumer func(...*datapoint.Datapoint), ) *PointsSvc { diff --git a/pkg/monitors/vsphere/service/single_perf_fetcher.go b/pkg/monitors/vsphere/service/single_perf_fetcher.go index db8b96b6e0..62835a605c 100644 --- a/pkg/monitors/vsphere/service/single_perf_fetcher.go +++ b/pkg/monitors/vsphere/service/single_perf_fetcher.go @@ -8,7 +8,7 @@ import ( type singlePagePerfFetcher struct { gateway IGateway - log *log.Entry + log log.FieldLogger } func (f *singlePagePerfFetcher) invIterator( diff --git a/pkg/monitors/vsphere/vsphere_monitor.go b/pkg/monitors/vsphere/vsphere_monitor.go index 9db3ccbf73..e8b21409bc 100644 --- a/pkg/monitors/vsphere/vsphere_monitor.go +++ b/pkg/monitors/vsphere/vsphere_monitor.go @@ -15,7 +15,7 @@ import ( // Encapsulates services and the current state of the vSphere monitor. type vSphereMonitor struct { conf *model.Config - log *logrus.Entry + log logrus.FieldLogger invSvc *service.InventorySvc metricSvc *service.MetricsSvc @@ -31,7 +31,7 @@ type vSphereMonitor struct { func newVsphereMonitor( conf *model.Config, - log *logrus.Entry, + log logrus.FieldLogger, ptConsumer func(...*datapoint.Datapoint), ) *vSphereMonitor { return &vSphereMonitor{ diff --git a/pkg/monitors/windowsiis/windowsiis.go b/pkg/monitors/windowsiis/windowsiis.go index b6c32090ed..18a6f801e5 100644 --- a/pkg/monitors/windowsiis/windowsiis.go +++ b/pkg/monitors/windowsiis/windowsiis.go @@ -1,11 +1,12 @@ package windowsiis import ( - "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" + "github.com/sirupsen/logrus" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" + "github.com/signalfx/signalfx-agent/pkg/utils/timeutil" ) func init() { @@ -27,6 +28,7 @@ type Config struct { type Monitor struct { Output types.Output cancel func() + logger logrus.FieldLogger // nolint: structcheck,unused } // Shutdown stops the metric sync diff --git a/pkg/monitors/windowsiis/windowsiis_windows.go b/pkg/monitors/windowsiis/windowsiis_windows.go index d64dbb2cd4..5ec3407a60 100644 --- a/pkg/monitors/windowsiis/windowsiis_windows.go +++ b/pkg/monitors/windowsiis/windowsiis_windows.go @@ -7,17 +7,19 @@ import ( "context" "time" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/monitors/winperfcounters" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) var logger = logrus.WithField("monitorType", monitorType) // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = logger.WithField("monitorID", conf.MonitorID) perfcounterConf := &winperfcounters.Config{ CountersRefreshInterval: conf.CountersRefreshInterval, PrintValid: conf.PrintValid, @@ -93,7 +95,7 @@ func (m *Monitor) Configure(conf *Config) error { } // create batch emitter - emitter := baseemitter.NewEmitter(m.Output, logger) + emitter := baseemitter.NewEmitter(m.Output, m.logger) // Hard code the plugin name because the emitter will parse out the // configured measurement name as plugin and that is confusing. @@ -121,7 +123,7 @@ func (m *Monitor) Configure(conf *Config) error { // gather metrics on the specified interval utils.RunOnInterval(ctx, func() { if err := plugin.Gather(ac); err != nil { - logger.WithError(err).Errorf("an error occurred while gathering metrics from the plugin") + m.logger.WithError(err).Errorf("an error occurred while gathering metrics from the plugin") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/monitors/windowslegacy/windowslegacy.go b/pkg/monitors/windowslegacy/windowslegacy.go index d43c929244..390e2186b3 100644 --- a/pkg/monitors/windowslegacy/windowslegacy.go +++ b/pkg/monitors/windowslegacy/windowslegacy.go @@ -1,6 +1,8 @@ package windowslegacy import ( + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/monitors" "github.com/signalfx/signalfx-agent/pkg/monitors/types" @@ -26,6 +28,7 @@ type Config struct { type Monitor struct { Output types.Output cancel func() + logger logrus.FieldLogger // nolint: structcheck,unused } // Shutdown stops the metric sync diff --git a/pkg/monitors/windowslegacy/windowslegacy_windows.go b/pkg/monitors/windowslegacy/windowslegacy_windows.go index e7a6501070..c09b1a01b9 100644 --- a/pkg/monitors/windowslegacy/windowslegacy_windows.go +++ b/pkg/monitors/windowslegacy/windowslegacy_windows.go @@ -7,17 +7,19 @@ import ( "context" "time" + "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/accumulator" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/common/emitter/baseemitter" "github.com/signalfx/signalfx-agent/pkg/monitors/telegraf/monitors/winperfcounters" "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/sirupsen/logrus" ) var logger = logrus.WithField("monitorType", monitorType) // Configure the monitor and kick off metric syncing func (m *Monitor) Configure(conf *Config) error { + m.logger = logger.WithField("monitorID", conf.MonitorID) perfcounterConf := &winperfcounters.Config{ CountersRefreshInterval: conf.CountersRefreshInterval, PrintValid: conf.PrintValid, @@ -125,7 +127,7 @@ func (m *Monitor) Configure(conf *Config) error { } // create batch emitter - emitter := baseemitter.NewEmitter(m.Output, logger) + emitter := baseemitter.NewEmitter(m.Output, m.logger) // Hard code the plugin name because the emitter will parse out the // configured measurement name as plugin and that is confusing. @@ -153,7 +155,7 @@ func (m *Monitor) Configure(conf *Config) error { // gather metrics on the specified interval utils.RunOnInterval(ctx, func() { if err := plugin.Gather(ac); err != nil { - logger.WithError(err).Errorf("an error occurred while gathering metrics from the plugin") + m.logger.WithError(err).Errorf("an error occurred while gathering metrics from the plugin") } }, time.Duration(conf.IntervalSeconds)*time.Second) diff --git a/pkg/neotest/k8s/testhelpers/fakek8s/fakek8s.go b/pkg/neotest/k8s/testhelpers/fakek8s/fakek8s.go index 845e8bfe76..6c88389f1f 100644 --- a/pkg/neotest/k8s/testhelpers/fakek8s/fakek8s.go +++ b/pkg/neotest/k8s/testhelpers/fakek8s/fakek8s.go @@ -10,9 +10,8 @@ import ( "sync" "github.com/davecgh/go-spew/spew" - log "github.com/sirupsen/logrus" - "github.com/gorilla/mux" + log "github.com/sirupsen/logrus" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" diff --git a/pkg/observers/docker/docker.go b/pkg/observers/docker/docker.go index 567b28e6b2..adaa724f89 100644 --- a/pkg/observers/docker/docker.go +++ b/pkg/observers/docker/docker.go @@ -8,13 +8,12 @@ import ( "strconv" "strings" + dtypes "github.com/docker/docker/api/types" + "github.com/docker/docker/client" "github.com/pkg/errors" log "github.com/sirupsen/logrus" - dtypes "github.com/docker/docker/api/types" - "github.com/docker/docker/client" dockercommon "github.com/signalfx/signalfx-agent/pkg/core/common/docker" - "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/core/services" "github.com/signalfx/signalfx-agent/pkg/observers" diff --git a/pkg/observers/ecs/ecs.go b/pkg/observers/ecs/ecs.go index 49100af25c..ba96cda62a 100644 --- a/pkg/observers/ecs/ecs.go +++ b/pkg/observers/ecs/ecs.go @@ -10,12 +10,13 @@ import ( "strings" "time" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/common/ecs" "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/core/services" "github.com/signalfx/signalfx-agent/pkg/observers" "github.com/signalfx/signalfx-agent/pkg/observers/docker" - log "github.com/sirupsen/logrus" ) const ( diff --git a/pkg/observers/host/host.go b/pkg/observers/host/host.go index 42cad4d5b7..66e1008251 100644 --- a/pkg/observers/host/host.go +++ b/pkg/observers/host/host.go @@ -10,7 +10,6 @@ import ( "github.com/shirou/gopsutil/net" "github.com/shirou/gopsutil/process" - "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus" "github.com/signalfx/signalfx-agent/pkg/core/config" @@ -41,7 +40,7 @@ type Observer struct { serviceCallbacks *observers.ServiceCallbacks serviceDiffer *observers.ServiceDiffer config *Config - logger logrus.FieldLogger + logger log.FieldLogger } // Config specific to the host observer diff --git a/pkg/observers/kubelet/kubelet.go b/pkg/observers/kubelet/kubelet.go index 640c6daa15..bfde19b92c 100644 --- a/pkg/observers/kubelet/kubelet.go +++ b/pkg/observers/kubelet/kubelet.go @@ -7,7 +7,6 @@ import ( "io/ioutil" "net/http" - "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus" "github.com/signalfx/signalfx-agent/pkg/core/common/kubelet" @@ -78,7 +77,7 @@ type Observer struct { client *kubelet.Client serviceDiffer *observers.ServiceDiffer serviceCallbacks *observers.ServiceCallbacks - logger logrus.FieldLogger + logger log.FieldLogger } // pod structure from kubelet @@ -124,10 +123,10 @@ func init() { // Configure the kubernetes observer/client func (k *Observer) Configure(config *Config) error { - k.logger = logrus.WithFields(logrus.Fields{"observerType": observerType}) + k.logger = log.WithFields(log.Fields{"observerType": observerType}) var err error - k.client, err = kubelet.NewClient(&config.KubeletAPI) + k.client, err = kubelet.NewClient(&config.KubeletAPI, k.logger) if err != nil { return err } diff --git a/pkg/observers/kubernetes/annotations.go b/pkg/observers/kubernetes/annotations.go index 50ebefe237..9664fd691b 100644 --- a/pkg/observers/kubernetes/annotations.go +++ b/pkg/observers/kubernetes/annotations.go @@ -7,11 +7,12 @@ import ( "strings" "github.com/pkg/errors" - "github.com/signalfx/signalfx-agent/pkg/utils" - "github.com/signalfx/signalfx-agent/pkg/utils/k8sutil" log "github.com/sirupsen/logrus" v1 "k8s.io/api/core/v1" k8s "k8s.io/client-go/kubernetes" + + "github.com/signalfx/signalfx-agent/pkg/utils" + "github.com/signalfx/signalfx-agent/pkg/utils/k8sutil" ) var annotationConfigRegexp = regexp.MustCompile( diff --git a/pkg/observers/kubernetes/api.go b/pkg/observers/kubernetes/api.go index ea37126665..ce0ca27913 100644 --- a/pkg/observers/kubernetes/api.go +++ b/pkg/observers/kubernetes/api.go @@ -10,8 +10,13 @@ import ( "os" "reflect" - "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/types" + k8s "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" "github.com/signalfx/signalfx-agent/pkg/core/common/kubernetes" "github.com/signalfx/signalfx-agent/pkg/core/config" @@ -19,12 +24,6 @@ import ( "github.com/signalfx/signalfx-agent/pkg/observers" "github.com/signalfx/signalfx-agent/pkg/utils" "github.com/signalfx/signalfx-agent/pkg/utils/k8sutil" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/types" - k8s "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/cache" ) const ( @@ -164,12 +163,12 @@ type Observer struct { // removed. endpointsByUID map[types.UID][]services.Endpoint stopper chan struct{} - logger logrus.FieldLogger + logger log.FieldLogger } // Configure configures and starts watching for endpoints func (o *Observer) Configure(config *Config) error { - o.logger = logrus.WithFields(log.Fields{"observerType": observerType}) + o.logger = log.WithFields(log.Fields{"observerType": observerType}) // There is a bug/limitation in the k8s go client's Controller where // goroutines are leaked even when using the stop channel properly. So we diff --git a/pkg/observers/manager.go b/pkg/observers/manager.go index a6c72f12bd..36483d5f32 100644 --- a/pkg/observers/manager.go +++ b/pkg/observers/manager.go @@ -4,8 +4,9 @@ import ( "reflect" "sync" - "github.com/signalfx/signalfx-agent/pkg/core/config" log "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/core/config" ) // ObserverWrapper represents an active observer diff --git a/pkg/observers/observer.go b/pkg/observers/observer.go index e42a5e4bb3..81457192fd 100644 --- a/pkg/observers/observer.go +++ b/pkg/observers/observer.go @@ -11,11 +11,12 @@ package observers import ( "github.com/pkg/errors" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/config" "github.com/signalfx/signalfx-agent/pkg/core/config/validation" "github.com/signalfx/signalfx-agent/pkg/core/services" "github.com/signalfx/signalfx-agent/pkg/utils" - log "github.com/sirupsen/logrus" ) // Shutdownable describes an observer that has a shutdown routine. Observers diff --git a/pkg/observers/servicediffer.go b/pkg/observers/servicediffer.go index d473e66430..154e5e7b00 100644 --- a/pkg/observers/servicediffer.go +++ b/pkg/observers/servicediffer.go @@ -3,8 +3,9 @@ package observers import ( "time" - "github.com/signalfx/signalfx-agent/pkg/core/services" log "github.com/sirupsen/logrus" + + "github.com/signalfx/signalfx-agent/pkg/core/services" ) // ServiceDiffer will run the DiscoveryFn every IntervalSeconds and report diff --git a/pkg/selfdescribe/observers.go b/pkg/selfdescribe/observers.go index ea5b71692b..5370526248 100644 --- a/pkg/selfdescribe/observers.go +++ b/pkg/selfdescribe/observers.go @@ -8,9 +8,10 @@ import ( "sort" "strings" + log "github.com/sirupsen/logrus" + "github.com/signalfx/signalfx-agent/pkg/core/services" "github.com/signalfx/signalfx-agent/pkg/observers" - log "github.com/sirupsen/logrus" ) type observerMetadata struct { diff --git a/pkg/utils/log.go b/pkg/utils/log.go index 0bf6c0da8a..bbc6dc3270 100644 --- a/pkg/utils/log.go +++ b/pkg/utils/log.go @@ -55,7 +55,7 @@ type LogrusGolibShim struct { logrus.FieldLogger } -var _ log.Logger = &LogrusGolibShim{} +var _ log.Logger = (*LogrusGolibShim)(nil) // Log conforms to the golib Log interface func (l *LogrusGolibShim) Log(keyvals ...interface{}) { diff --git a/pkg/utils/log_test.go b/pkg/utils/log_test.go index decfe14702..f7319358c4 100644 --- a/pkg/utils/log_test.go +++ b/pkg/utils/log_test.go @@ -5,9 +5,10 @@ import ( "testing" "time" - "github.com/signalfx/signalfx-agent/pkg/neotest" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" + + "github.com/signalfx/signalfx-agent/pkg/neotest" ) func TestThrottledLogger(t *testing.T) {