|
| 1 | +-- KEYS - rif IDs |
| 2 | +-- ARGV[1] - counters db index |
| 3 | +-- ARGV[2] - counters table name |
| 4 | +-- ARGV[3] - poll time interval |
| 5 | +-- return log |
| 6 | + |
| 7 | +local logtable = {} |
| 8 | + |
| 9 | +local function logit(msg) |
| 10 | + logtable[#logtable+1] = tostring(msg) |
| 11 | +end |
| 12 | + |
| 13 | +local counters_db = ARGV[1] |
| 14 | +local counters_table_name = ARGV[2] |
| 15 | +local rates_table_name = "RATES" |
| 16 | +local sec_to_ms = 1000 |
| 17 | + |
| 18 | +-- Get configuration |
| 19 | +redis.call('SELECT', counters_db) |
| 20 | +local smooth_interval = redis.call('HGET', rates_table_name .. ':' .. 'TUNNEL', 'TUNNEL_SMOOTH_INTERVAL') |
| 21 | +local alpha = redis.call('HGET', rates_table_name .. ':' .. 'TUNNEL', 'TUNNEL_ALPHA') |
| 22 | +if not alpha then |
| 23 | + logit("Alpha is not defined") |
| 24 | + return logtable |
| 25 | +end |
| 26 | +local one_minus_alpha = 1.0 - alpha |
| 27 | +local delta = tonumber(ARGV[3]) |
| 28 | + |
| 29 | +local n = table.getn(KEYS) |
| 30 | +for i = 1, n do |
| 31 | + local state_table = rates_table_name .. ':' .. KEYS[i] .. ':' .. 'TUNNEL' |
| 32 | + local initialized = redis.call('HGET', state_table, 'INIT_DONE') |
| 33 | + logit(initialized) |
| 34 | + |
| 35 | + -- Get new COUNTERS values |
| 36 | + local in_octets = 0 |
| 37 | + local in_packets = 0 |
| 38 | + local out_octets = 0 |
| 39 | + local out_packets = 0 |
| 40 | + |
| 41 | + if redis.call('HEXISTS', counters_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_IN_OCTETS') == 1 then |
| 42 | + in_octets = redis.call('HGET', counters_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_IN_OCTETS') |
| 43 | + end |
| 44 | + if redis.call('HEXISTS', counters_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_IN_PACKETS') == 1 then |
| 45 | + in_packets = redis.call('HGET', counters_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_IN_PACKETS') |
| 46 | + end |
| 47 | + if redis.call('HEXISTS', counters_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_OUT_OCTETS') == 1 then |
| 48 | + out_octets = redis.call('HGET', counters_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_OUT_OCTETS') |
| 49 | + end |
| 50 | + if redis.call('HEXISTS', counters_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_OUT_PACKETS') == 1 then |
| 51 | + out_packets = redis.call('HGET', counters_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_OUT_PACKETS') |
| 52 | + end |
| 53 | + |
| 54 | + if initialized == "DONE" or initialized == "COUNTERS_LAST" then |
| 55 | + -- Get old COUNTERS values |
| 56 | + local in_octets_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_IN_OCTETS_last') |
| 57 | + local in_packets_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_IN_PACKETS_last') |
| 58 | + local out_octets_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_OUT_OCTETS_last') |
| 59 | + local out_packets_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_OUT_PACKETS_last') |
| 60 | + |
| 61 | + -- Calculate new rates values |
| 62 | + local rx_bps_new = (in_octets - in_octets_last)*sec_to_ms/delta |
| 63 | + local tx_bps_new = (out_octets - out_octets_last)*sec_to_ms/delta |
| 64 | + local rx_pps_new = (in_packets - in_packets_last)*sec_to_ms/delta |
| 65 | + local tx_pps_new = (out_packets - out_packets_last)*sec_to_ms/delta |
| 66 | + |
| 67 | + if initialized == "DONE" then |
| 68 | + -- Get old rates values |
| 69 | + local rx_bps_old = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'RX_BPS') |
| 70 | + local rx_pps_old = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'RX_PPS') |
| 71 | + local tx_bps_old = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'TX_BPS') |
| 72 | + local tx_pps_old = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'TX_PPS') |
| 73 | + |
| 74 | + -- Smooth the rates values and store them in DB |
| 75 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'RX_BPS', alpha*rx_bps_new + one_minus_alpha*rx_bps_old) |
| 76 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'RX_PPS', alpha*rx_pps_new + one_minus_alpha*rx_pps_old) |
| 77 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'TX_BPS', alpha*tx_bps_new + one_minus_alpha*tx_bps_old) |
| 78 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'TX_PPS', alpha*tx_pps_new + one_minus_alpha*tx_pps_old) |
| 79 | + else |
| 80 | + -- Store unsmoothed initial rates values in DB |
| 81 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'RX_BPS', rx_bps_new) |
| 82 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'RX_PPS', rx_pps_new) |
| 83 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'TX_BPS', tx_bps_new) |
| 84 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'TX_PPS', tx_pps_new) |
| 85 | + redis.call('HSET', state_table, 'INIT_DONE', 'DONE') |
| 86 | + end |
| 87 | + else |
| 88 | + redis.call('HSET', state_table, 'INIT_DONE', 'COUNTERS_LAST') |
| 89 | + end |
| 90 | + |
| 91 | + -- Set old COUNTERS values |
| 92 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_IN_OCTETS_last', in_octets) |
| 93 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_IN_PACKETS_last', in_packets) |
| 94 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_OUT_OCTETS_last', out_octets) |
| 95 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'SAI_TUNNEL_STAT_OUT_PACKETS_last', out_packets) |
| 96 | +end |
| 97 | + |
| 98 | +return logtable |
0 commit comments