worker.lua 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. local g = require('g')
  2. -- run in master worker
  3. if ngx.worker.id() ~= 0 then
  4. return
  5. end
  6. local function buildDevTrafficFn(dev)
  7. local regex = dev ..
  8. [[:\s+(\d+)\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+(\d+)]]
  9. -- 0 1 2 3 4 5 6 7 | 8
  10. -- eth0: bytes packets errs drop fifo frame compress multi| bytes
  11. local lastRxBytes = 0
  12. local lastTxBytes = 0
  13. return function(str)
  14. local m = ngx.re.match(str, regex, 'oi')
  15. local sRxBytes = m[1]
  16. local sTxBytes = m[2]
  17. if sTxBytes == nil then
  18. return '0,0'
  19. end
  20. local nRxBytes = tonumber(sRxBytes)
  21. local nTxBytes = tonumber(sTxBytes)
  22. local rxBPS = nRxBytes - lastRxBytes
  23. local txBPS = nTxBytes - lastTxBytes
  24. lastRxBytes = nRxBytes
  25. lastTxBytes = nTxBytes
  26. return rxBPS .. ',' .. txBPS
  27. end
  28. end
  29. local fileStat = io.open('/proc/net/dev')
  30. if fileStat == nil then
  31. ngx.log(ngx.ERR, 'open `/proc/net/dev` fail')
  32. return
  33. end
  34. local firstRun = true
  35. local getDevTraffic = buildDevTrafficFn('eth0')
  36. local function updateTraffic()
  37. local r, err = fileStat:seek('set')
  38. local out = fileStat:read('*all')
  39. local traffDev = getDevTraffic(out)
  40. if firstRun then
  41. firstRun = false
  42. return
  43. end
  44. g.syn()
  45. local traffHttp = g.update()
  46. local stat = traffDev .. ',' .. traffHttp
  47. g.setStat(stat)
  48. end
  49. ngx.timer.every(1, updateTraffic)