|
| 1 | +-- KEYS - port 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 | + |
| 17 | +-- Get configuration |
| 18 | +redis.call('SELECT', counters_db) |
| 19 | +local smooth_interval = redis.call('HGET', rates_table_name .. ':' .. 'PORT', 'PORT_SMOOTH_INTERVAL') |
| 20 | +local alpha = redis.call('HGET', rates_table_name .. ':' .. 'PORT', 'PORT_ALPHA') |
| 21 | +local one_minus_alpha = 1.0 - alpha |
| 22 | +local delta = tonumber(ARGV[3]) |
| 23 | + |
| 24 | +logit(alpha) |
| 25 | +logit(one_minus_alpha) |
| 26 | +logit(delta) |
| 27 | + |
| 28 | +local initialized = redis.call('HGET', rates_table_name, 'INIT_DONE') |
| 29 | + |
| 30 | +logit(initialized) |
| 31 | + |
| 32 | +for i = 1, n do |
| 33 | + -- Get new COUNTERS values |
| 34 | + local in_ucast_pkts = redis.call('HGET', counters_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_IN_UCAST_PKTS') |
| 35 | + local in_non_ucast_pkts = redis.call('HGET', counters_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS') |
| 36 | + local out_ucast_pkts = redis.call('HGET', counters_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_OUT_UCAST_PKTS') |
| 37 | + local out_non_ucast_pkts = redis.call('HGET', counters_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_OUT_NON_UCAST_PKTS') |
| 38 | + local in_octets = redis.call('HGET', counters_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_IN_OCTETS') |
| 39 | + local out_octets = redis.call('HGET', counters_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_OUT_OCTETS') |
| 40 | + |
| 41 | + if initialized == 'DONE' or initialized == 'COUNTERS_LAST' then |
| 42 | + -- Get old COUNTERS values |
| 43 | + local in_ucast_pkts_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_IN_UCAST_PKTS_last') |
| 44 | + local in_non_ucast_pkts_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS_last') |
| 45 | + local out_ucast_pkts_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_OUT_UCAST_PKTS_last') |
| 46 | + local out_non_ucast_pkts_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_OUT_NON_UCAST_PKTS_last') |
| 47 | + local in_octets_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_IN_OCTETS_last') |
| 48 | + local out_octets_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_OUT_OCTETS_last') |
| 49 | + |
| 50 | + -- Calculate new rates values |
| 51 | + local rx_bps_new = (in_octets - in_octets_last)/delta |
| 52 | + local tx_bps_new = (out_octets - out_octets_last)/delta |
| 53 | + local rx_pps_new = ((in_ucast_pkts + in_non_ucast_pkts) - (in_ucast_pkts_last + in_non_ucast_pkts_last))/delta |
| 54 | + local tx_pps_new = ((out_ucast_pkts + out_non_ucast_pkts) - (out_ucast_pkts_last + out_non_ucast_pkts_last))/delta |
| 55 | + |
| 56 | + if initialized == "DONE" then |
| 57 | + -- Get old rates values |
| 58 | + local rx_bps_old = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'RX_BPS') |
| 59 | + local rx_pps_old = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'RX_PPS') |
| 60 | + local tx_bps_old = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'TX_BPS') |
| 61 | + local tx_pps_old = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'TX_PPS') |
| 62 | + |
| 63 | + -- Smooth the rates values and store them in DB |
| 64 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'RX_BPS', alpha*rx_bps_new + one_minus_alpha*rx_bps_old) |
| 65 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'RX_PPS', alpha*rx_pps_new + one_minus_alpha*rx_pps_old) |
| 66 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'TX_BPS', alpha*tx_bps_new + one_minus_alpha*tx_bps_old) |
| 67 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'TX_PPS', alpha*tx_pps_new + one_minus_alpha*tx_pps_old) |
| 68 | + else |
| 69 | + -- Store unsmoothed initial rates values in DB |
| 70 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'RX_BPS', rx_bps_new) |
| 71 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'RX_PPS', rx_pps_new) |
| 72 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'TX_BPS', tx_bps_new) |
| 73 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'TX_PPS', tx_pps_new) |
| 74 | + redis.call('HSET', rates_table_name, 'INIT_DONE', 'DONE') |
| 75 | + end |
| 76 | + else |
| 77 | + -- Set old COUNTERS values |
| 78 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_IN_UCAST_PKTS_last', in_ucast_pkts) |
| 79 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS_last', in_non_ucast_pkts) |
| 80 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_OUT_UCAST_PKTS_last', out_ucast_pkts) |
| 81 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_OUT_NON_UCAST_PKTS_last', out_non_ucast_pkts) |
| 82 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_IN_OCTETS_last', in_octets) |
| 83 | + redis.call('HSET', rates_table_name .. ':' .. KEYS[i], 'SAI_PORT_STAT_IF_OUT_OCTETS_last', out_octets) |
| 84 | + redis.call('HSET', rates_table_name, 'INIT_DONE', 'COUNTERS_LAST') |
| 85 | + end |
| 86 | +end |
| 87 | + |
| 88 | +return logtable |
0 commit comments