Skip to content

Commit ceef728

Browse files
noaOrMlnxjudyjoseph
authored andcommitted
Update port_rates & rif_rates lua scripts to convert poll_interval to MS (#1855)
**What I did** Update the rif_rates/lua script to multiply by 1000 instead of FlexCounter class. related also to this PR - sonic-net/sonic-sairedis#878 Fix issue - sonic-net/sonic-buildimage#8392 **Why I did it** times were not calculated properly. **How I verified it** check that the output of cli and redis is close enough:
1 parent 73f6f68 commit ceef728

File tree

2 files changed

+98
-98
lines changed

2 files changed

+98
-98
lines changed

orchagent/port_rates.lua

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

orchagent/rif_rates.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ for i = 1, n do
4545
local out_pkts_last = redis.call('HGET', rates_table_name .. ':' .. KEYS[i], 'SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS_last')
4646

4747
-- Calculate new rates values
48-
local rx_bps_new = (in_octets - in_octets_last)/delta
49-
local tx_bps_new = (out_octets - out_octets_last)/delta
50-
local rx_pps_new = (in_pkts - in_pkts_last)/delta
51-
local tx_pps_new = (out_pkts - out_pkts_last)/delta
48+
local rx_bps_new = (in_octets - in_octets_last) / delta * 1000
49+
local tx_bps_new = (out_octets - out_octets_last) / delta * 1000
50+
local rx_pps_new = (in_pkts - in_pkts_last) / delta * 1000
51+
local tx_pps_new = (out_pkts - out_pkts_last) / delta * 1000
5252

5353
if initialized == "DONE" then
5454
-- Get old rates values

0 commit comments

Comments
 (0)