Handle process collector errors gracefully

As it is expected that the process collector can fail under certain
conditions (proc information for a process only readable by root or
other user for example) and as there is currently no option to configure
the error behavior of the client, this change reverts the error
reporting introduced in 159e96f. This effectively means that errors are
simply ignored and there won't be any samples for the process_* metrics
in case of an error.

Once a user can control how to behave in case of errors returned by
collectors, this change should probably be reverted.
This commit is contained in:
Tobias Schmidt 2015-02-10 16:19:27 -05:00
parent c70db11f1e
commit 7faf9e76ef
1 changed files with 4 additions and 27 deletions

View File

@ -27,23 +27,15 @@ func processCollectSupported() bool {
func (c *processCollector) processCollect(ch chan<- Metric) { func (c *processCollector) processCollect(ch chan<- Metric) {
pid, err := c.pidFn() pid, err := c.pidFn()
if err != nil { if err != nil {
c.reportCollectErrors(ch, err)
return return
} }
p, err := procfs.NewProc(pid) p, err := procfs.NewProc(pid)
if err != nil { if err != nil {
c.reportCollectErrors(ch, err)
return return
} }
if stat, err := p.NewStat(); err != nil { if stat, err := p.NewStat(); err == nil {
// Report collect errors for metrics depending on stat.
ch <- NewInvalidMetric(c.vsize.Desc(), err)
ch <- NewInvalidMetric(c.rss.Desc(), err)
ch <- NewInvalidMetric(c.startTime.Desc(), err)
ch <- NewInvalidMetric(c.cpuTotal.Desc(), err)
} else {
c.cpuTotal.Set(stat.CPUTime()) c.cpuTotal.Set(stat.CPUTime())
ch <- c.cpuTotal ch <- c.cpuTotal
c.vsize.Set(float64(stat.VirtualMemory())) c.vsize.Set(float64(stat.VirtualMemory()))
@ -51,34 +43,19 @@ func (c *processCollector) processCollect(ch chan<- Metric) {
c.rss.Set(float64(stat.ResidentMemory())) c.rss.Set(float64(stat.ResidentMemory()))
ch <- c.rss ch <- c.rss
if startTime, err := stat.StartTime(); err != nil { if startTime, err := stat.StartTime(); err == nil {
ch <- NewInvalidMetric(c.startTime.Desc(), err)
} else {
c.startTime.Set(startTime) c.startTime.Set(startTime)
ch <- c.startTime ch <- c.startTime
} }
} }
if fds, err := p.FileDescriptorsLen(); err != nil { if fds, err := p.FileDescriptorsLen(); err == nil {
ch <- NewInvalidMetric(c.openFDs.Desc(), err)
} else {
c.openFDs.Set(float64(fds)) c.openFDs.Set(float64(fds))
ch <- c.openFDs ch <- c.openFDs
} }
if limits, err := p.NewLimits(); err != nil { if limits, err := p.NewLimits(); err == nil {
ch <- NewInvalidMetric(c.maxFDs.Desc(), err)
} else {
c.maxFDs.Set(float64(limits.OpenFiles)) c.maxFDs.Set(float64(limits.OpenFiles))
ch <- c.maxFDs ch <- c.maxFDs
} }
} }
func (c *processCollector) reportCollectErrors(ch chan<- Metric, err error) {
ch <- NewInvalidMetric(c.cpuTotal.Desc(), err)
ch <- NewInvalidMetric(c.openFDs.Desc(), err)
ch <- NewInvalidMetric(c.maxFDs.Desc(), err)
ch <- NewInvalidMetric(c.vsize.Desc(), err)
ch <- NewInvalidMetric(c.rss.Desc(), err)
ch <- NewInvalidMetric(c.startTime.Desc(), err)
}