Fix postfix plugin age to use ctime, not mtime (#3525)
This commit is contained in:
		
							parent
							
								
									2c70958c24
								
							
						
					
					
						commit
						bf65e19486
					
				|  | @ -45,15 +45,23 @@ func qScan(path string) (int64, int64, int64, error) { | ||||||
| 	for _, finfo := range finfos { | 	for _, finfo := range finfos { | ||||||
| 		length++ | 		length++ | ||||||
| 		size += finfo.Size() | 		size += finfo.Size() | ||||||
| 		if oldest.IsZero() || finfo.ModTime().Before(oldest) { | 
 | ||||||
| 			oldest = finfo.ModTime() | 		ctime := statCTime(finfo.Sys()) | ||||||
|  | 		if ctime.IsZero() { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		if oldest.IsZero() || ctime.Before(oldest) { | ||||||
|  | 			oldest = ctime | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	var age time.Duration | 	var age int64 | ||||||
| 	if !oldest.IsZero() { | 	if !oldest.IsZero() { | ||||||
| 		age = time.Now().Sub(oldest) / time.Second | 		age = int64(time.Now().Sub(oldest) / time.Second) | ||||||
|  | 	} else if len(finfos) != 0 { | ||||||
|  | 		// system doesn't support ctime
 | ||||||
|  | 		age = -1 | ||||||
| 	} | 	} | ||||||
| 	return length, size, int64(age), nil | 	return length, size, age, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Postfix struct { | type Postfix struct { | ||||||
|  | @ -75,11 +83,15 @@ func (p *Postfix) Gather(acc telegraf.Accumulator) error { | ||||||
| 			acc.AddError(fmt.Errorf("error scanning queue %s: %s", q, err)) | 			acc.AddError(fmt.Errorf("error scanning queue %s: %s", q, err)) | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		fields := map[string]interface{}{"length": length, "size": size, "age": age} | 		fields := map[string]interface{}{"length": length, "size": size} | ||||||
|  | 		if age != -1 { | ||||||
|  | 			fields["age"] = age | ||||||
|  | 		} | ||||||
| 		acc.AddFields("postfix_queue", fields, map[string]string{"queue": q}) | 		acc.AddFields("postfix_queue", fields, map[string]string{"queue": q}) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var dLength, dSize, dAge int64 | 	var dLength, dSize int64 | ||||||
|  | 	dAge := int64(-1) | ||||||
| 	for _, q := range []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"} { | 	for _, q := range []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"} { | ||||||
| 		length, size, age, err := qScan(path.Join(p.QueueDirectory, "deferred", q)) | 		length, size, age, err := qScan(path.Join(p.QueueDirectory, "deferred", q)) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  | @ -96,7 +108,10 @@ func (p *Postfix) Gather(acc telegraf.Accumulator) error { | ||||||
| 			dAge = age | 			dAge = age | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	fields := map[string]interface{}{"length": dLength, "size": dSize, "age": dAge} | 	fields := map[string]interface{}{"length": dLength, "size": dSize} | ||||||
|  | 	if dAge != -1 { | ||||||
|  | 		fields["age"] = dAge | ||||||
|  | 	} | ||||||
| 	acc.AddFields("postfix_queue", fields, map[string]string{"queue": "deferred"}) | 	acc.AddFields("postfix_queue", fields, map[string]string{"queue": "deferred"}) | ||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
|  |  | ||||||
|  | @ -5,7 +5,6 @@ import ( | ||||||
| 	"os" | 	"os" | ||||||
| 	"path" | 	"path" | ||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" |  | ||||||
| 
 | 
 | ||||||
| 	"github.com/influxdata/telegraf/testutil" | 	"github.com/influxdata/telegraf/testutil" | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
|  | @ -26,7 +25,6 @@ func TestGather(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 	require.NoError(t, ioutil.WriteFile(path.Join(td, "active", "01"), []byte("abc"), 0644)) | 	require.NoError(t, ioutil.WriteFile(path.Join(td, "active", "01"), []byte("abc"), 0644)) | ||||||
| 	require.NoError(t, ioutil.WriteFile(path.Join(td, "active", "02"), []byte("defg"), 0644)) | 	require.NoError(t, ioutil.WriteFile(path.Join(td, "active", "02"), []byte("defg"), 0644)) | ||||||
| 	require.NoError(t, os.Chtimes(path.Join(td, "active", "02"), time.Now(), time.Now().Add(-time.Hour))) |  | ||||||
| 	require.NoError(t, ioutil.WriteFile(path.Join(td, "hold", "01"), []byte("abc"), 0644)) | 	require.NoError(t, ioutil.WriteFile(path.Join(td, "hold", "01"), []byte("abc"), 0644)) | ||||||
| 	require.NoError(t, ioutil.WriteFile(path.Join(td, "incoming", "01"), []byte("abcd"), 0644)) | 	require.NoError(t, ioutil.WriteFile(path.Join(td, "incoming", "01"), []byte("abcd"), 0644)) | ||||||
| 	require.NoError(t, ioutil.WriteFile(path.Join(td, "deferred", "0", "01"), []byte("abc"), 0644)) | 	require.NoError(t, ioutil.WriteFile(path.Join(td, "deferred", "0", "01"), []byte("abc"), 0644)) | ||||||
|  | @ -46,7 +44,7 @@ func TestGather(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 	assert.Equal(t, int64(2), metrics["active"].Fields["length"]) | 	assert.Equal(t, int64(2), metrics["active"].Fields["length"]) | ||||||
| 	assert.Equal(t, int64(7), metrics["active"].Fields["size"]) | 	assert.Equal(t, int64(7), metrics["active"].Fields["size"]) | ||||||
| 	assert.InDelta(t, int64(time.Hour/time.Second), metrics["active"].Fields["age"], 10) | 	assert.InDelta(t, 0, metrics["active"].Fields["age"], 10) | ||||||
| 
 | 
 | ||||||
| 	assert.Equal(t, int64(1), metrics["hold"].Fields["length"]) | 	assert.Equal(t, int64(1), metrics["hold"].Fields["length"]) | ||||||
| 	assert.Equal(t, int64(3), metrics["hold"].Fields["size"]) | 	assert.Equal(t, int64(3), metrics["hold"].Fields["size"]) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,16 @@ | ||||||
|  | // +build dragonfly linux netbsd openbsd solaris
 | ||||||
|  | 
 | ||||||
|  | package postfix | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"syscall" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func statCTime(sys interface{}) time.Time { | ||||||
|  | 	stat, ok := sys.(*syscall.Stat_t) | ||||||
|  | 	if !ok { | ||||||
|  | 		return time.Time{} | ||||||
|  | 	} | ||||||
|  | 	return time.Unix(stat.Ctim.Unix()) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,16 @@ | ||||||
|  | // +build darwin freebsd
 | ||||||
|  | 
 | ||||||
|  | package postfix | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"syscall" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func statCTime(sys interface{}) time.Time { | ||||||
|  | 	stat, ok := sys.(*syscall.Stat_t) | ||||||
|  | 	if !ok { | ||||||
|  | 		return time.Time{} | ||||||
|  | 	} | ||||||
|  | 	return time.Unix(stat.Ctimespec.Unix()) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | // +build !dragonfly,!linux,!netbsd,!openbsd,!solaris,!darwin,!freebsd
 | ||||||
|  | 
 | ||||||
|  | package postfix | ||||||
|  | 
 | ||||||
|  | func statCTime(_ interface{}) time.Time { | ||||||
|  | 	return time.Time{} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue