1 | _ = require 'lodash'
|
2 | debug = (require 'debug')('octoblu-flow-canary:stats')
|
3 |
|
4 | class Stats
|
5 |
|
6 | constructor: ({@Date,@stats,@CANARY_UPDATE_INTERVAL,@CANARY_HEALTH_CHECK_MAX_DIFF} = {}) ->
|
7 | @Date ?= Date
|
8 | @stats ?=
|
9 | flows: {}
|
10 | startTime: @Date.now()
|
11 |
|
12 | setCanaryErrors: (error, trimSize) =>
|
13 | @stats.errors ?= []
|
14 | @stats.errors.unshift error
|
15 | @stats.errors = @stats.errors.slice 0, trimSize
|
16 |
|
17 | setFlowNames: (flow) =>
|
18 | @stats.flows[flow.flowId] ?= {}
|
19 | @stats.flows[flow.flowId].name = flow.name
|
20 |
|
21 | getFlowById: (flowId) =>
|
22 | return @stats.flows[flowId]
|
23 |
|
24 | getFlows: =>
|
25 | return @stats.flows
|
26 |
|
27 | getCurrentStats: =>
|
28 | @updateStats()
|
29 | return @stats
|
30 |
|
31 | getPassing: =>
|
32 | @updateStats()
|
33 | return {passing:true} if @stats.passing
|
34 | return @stats
|
35 |
|
36 | updateStats: =>
|
37 | _.each @stats.flows, (flowInfo) =>
|
38 | lastMessage = flowInfo.messageTime?[0] or flowInfo.startTime?[0] or 0
|
39 | flowInfo.currentTimeDiff = @Date.now() - lastMessage
|
40 | flowInfo.passing = @timeDiffLessThanMax flowInfo.currentTimeDiff
|
41 | _.each flowInfo.timeDiffs, (timeDiff) =>
|
42 | flowInfo.passing = false if !@passingTimeDiff timeDiff
|
43 |
|
44 | @stats.passing = _.keys(@stats.flows).length != 0
|
45 | _.each @stats.flows, (flowInfo) =>
|
46 | @stats.passing = false if !flowInfo.passing
|
47 |
|
48 | cleanupFlowStats: (flows) =>
|
49 | debug 'cleaning up flow stats'
|
50 | flowIds = {}
|
51 | _.each flows, (flow) =>
|
52 | debug "has flow id #{flow.flowId}"
|
53 | flowIds[flow.flowId] = true
|
54 | _.each _.keys(@stats.flows), (flowUuid) =>
|
55 | if !flowIds[flowUuid]
|
56 | delete @stats.flows[flowUuid]
|
57 |
|
58 | timeDiffGreaterThanMin: (timeDiff) =>
|
59 | return timeDiff >= (@CANARY_UPDATE_INTERVAL - @CANARY_HEALTH_CHECK_MAX_DIFF)
|
60 |
|
61 | timeDiffLessThanMax: (timeDiff) =>
|
62 | return timeDiff <= (@CANARY_UPDATE_INTERVAL + @CANARY_HEALTH_CHECK_MAX_DIFF)
|
63 |
|
64 | passingTimeDiff: (timeDiff) =>
|
65 | return @timeDiffGreaterThanMin(timeDiff) and @timeDiffLessThanMax(timeDiff)
|
66 |
|
67 | module.exports = Stats
|