4
4
"fmt"
5
5
"os"
6
6
"os/exec"
7
- "path"
7
+ "path/filepath "
8
8
"strings"
9
9
"time"
10
10
@@ -28,36 +28,37 @@ func getQueueDirectory() (string, error) {
28
28
return strings .TrimSpace (string (qd )), nil
29
29
}
30
30
31
- func qScan (path string ) (int64 , int64 , int64 , error ) {
32
- f , err := os .Open (path )
33
- if err != nil {
34
- return 0 , 0 , 0 , err
35
- }
36
-
37
- finfos , err := f .Readdir (- 1 )
38
- f .Close ()
39
- if err != nil {
40
- return 0 , 0 , 0 , err
41
- }
42
-
31
+ func qScan (path string , acc telegraf.Accumulator ) (int64 , int64 , int64 , error ) {
43
32
var length , size int64
44
33
var oldest time.Time
45
- for _ , finfo := range finfos {
34
+ err := filepath .Walk (path , func (_ string , finfo os.FileInfo , err error ) error {
35
+ if err != nil {
36
+ acc .AddError (fmt .Errorf ("error scanning %s: %s" , path , err ))
37
+ return nil
38
+ }
39
+ if finfo .IsDir () {
40
+ return nil
41
+ }
42
+
46
43
length ++
47
44
size += finfo .Size ()
48
45
49
46
ctime := statCTime (finfo .Sys ())
50
47
if ctime .IsZero () {
51
- continue
48
+ return nil
52
49
}
53
50
if oldest .IsZero () || ctime .Before (oldest ) {
54
51
oldest = ctime
55
52
}
53
+ return nil
54
+ })
55
+ if err != nil {
56
+ return 0 , 0 , 0 , err
56
57
}
57
58
var age int64
58
59
if ! oldest .IsZero () {
59
60
age = int64 (time .Now ().Sub (oldest ) / time .Second )
60
- } else if len ( finfos ) != 0 {
61
+ } else if length != 0 {
61
62
// system doesn't support ctime
62
63
age = - 1
63
64
}
@@ -77,8 +78,8 @@ func (p *Postfix) Gather(acc telegraf.Accumulator) error {
77
78
}
78
79
}
79
80
80
- for _ , q := range []string {"active" , "hold" , "incoming" , "maildrop" } {
81
- length , size , age , err := qScan (path .Join (p .QueueDirectory , q ))
81
+ for _ , q := range []string {"active" , "hold" , "incoming" , "maildrop" , "deferred" } {
82
+ length , size , age , err := qScan (filepath .Join (p .QueueDirectory , q ), acc )
82
83
if err != nil {
83
84
acc .AddError (fmt .Errorf ("error scanning queue %s: %s" , q , err ))
84
85
continue
@@ -90,30 +91,6 @@ func (p *Postfix) Gather(acc telegraf.Accumulator) error {
90
91
acc .AddFields ("postfix_queue" , fields , map [string ]string {"queue" : q })
91
92
}
92
93
93
- var dLength , dSize int64
94
- dAge := int64 (- 1 )
95
- for _ , q := range []string {"0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "A" , "B" , "C" , "D" , "E" , "F" } {
96
- length , size , age , err := qScan (path .Join (p .QueueDirectory , "deferred" , q ))
97
- if err != nil {
98
- if os .IsNotExist (err ) {
99
- // the directories are created on first use
100
- continue
101
- }
102
- acc .AddError (fmt .Errorf ("error scanning queue deferred/%s: %s" , q , err ))
103
- return nil
104
- }
105
- dLength += length
106
- dSize += size
107
- if age > dAge {
108
- dAge = age
109
- }
110
- }
111
- fields := map [string ]interface {}{"length" : dLength , "size" : dSize }
112
- if dAge != - 1 {
113
- fields ["age" ] = dAge
114
- }
115
- acc .AddFields ("postfix_queue" , fields , map [string ]string {"queue" : "deferred" })
116
-
117
94
return nil
118
95
}
119
96
0 commit comments