(t *testing.T)
| 35 | ) |
| 36 | |
| 37 | func TestFileDescriptorLeak(t *testing.T) { |
| 38 | if _, err := os.Stat(binary); err != nil { |
| 39 | t.Skipf("node_exporter binary not available, try to run `make build` first: %s", err) |
| 40 | } |
| 41 | fs, err := procfs.NewDefaultFS() |
| 42 | if err != nil { |
| 43 | t.Skipf("proc filesystem is not available, but currently required to read number of open file descriptors: %s", err) |
| 44 | } |
| 45 | if _, err := fs.Stat(); err != nil { |
| 46 | t.Errorf("unable to read process stats: %s", err) |
| 47 | } |
| 48 | |
| 49 | exporter := exec.Command(binary, "--web.listen-address", address) |
| 50 | test := func(pid int) error { |
| 51 | if err := queryExporter(address); err != nil { |
| 52 | return err |
| 53 | } |
| 54 | proc, err := procfs.NewProc(pid) |
| 55 | if err != nil { |
| 56 | return err |
| 57 | } |
| 58 | fdsBefore, err := proc.FileDescriptors() |
| 59 | if err != nil { |
| 60 | return err |
| 61 | } |
| 62 | for range 5 { |
| 63 | if err := queryExporter(address); err != nil { |
| 64 | return err |
| 65 | } |
| 66 | } |
| 67 | fdsAfter, err := proc.FileDescriptors() |
| 68 | if err != nil { |
| 69 | return err |
| 70 | } |
| 71 | if want, have := len(fdsBefore), len(fdsAfter); want != have { |
| 72 | return fmt.Errorf("want %d open file descriptors after metrics scrape, have %d", want, have) |
| 73 | } |
| 74 | return nil |
| 75 | } |
| 76 | |
| 77 | if err := runCommandAndTests(exporter, address, test); err != nil { |
| 78 | t.Error(err) |
| 79 | } |
| 80 | } |
| 81 | |
| 82 | func TestHandlingOfDuplicatedMetrics(t *testing.T) { |
| 83 | if _, err := os.Stat(binary); err != nil { |
nothing calls this directly
no test coverage detected