common/portcounter.lua (58 lines of code) (raw):

local counters_db = ARGV[1] local gb_counters_db = ARGV[2] local counters_table = ARGV[3] local separator = ARGV[4] local operator = ARGV[5] local gb_counter_list= { SAI_PORT_STAT_IF_IN_ERRORS = {'SAI_PORT_STAT_IF_OUT_ERRORS', 'SAI_PORT_STAT_IF_IN_ERRORS'}, SAI_PORT_STAT_IF_IN_DISCARDS = {'SAI_PORT_STAT_IF_OUT_DISCARDS', 'SAI_PORT_STAT_IF_IN_DISCARDS'}, SAI_PORT_STAT_IF_OUT_ERRORS = {'SAI_PORT_STAT_IF_IN_ERRORS', 'SAI_PORT_STAT_IF_OUT_ERRORS'}, SAI_PORT_STAT_IF_OUT_DISCARDS = {'SAI_PORT_STAT_IF_IN_DISCARDS', 'SAI_PORT_STAT_IF_OUT_DISCARDS'}, SAI_PORT_STAT_ETHER_RX_OVERSIZE_PKTS = {'SAI_PORT_STAT_ETHER_TX_OVERSIZE_PKTS', 'SAI_PORT_STAT_ETHER_RX_OVERSIZE_PKTS'}, SAI_PORT_STAT_ETHER_TX_OVERSIZE_PKTS = {'SAI_PORT_STAT_ETHER_RX_OVERSIZE_PKTS', 'SAI_PORT_STAT_ETHER_TX_OVERSIZE_PKTS'}, SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS = {'', 'SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS'}, SAI_PORT_STAT_ETHER_STATS_JABBERS = {'', 'SAI_PORT_STAT_ETHER_STATS_JABBERS'}, SAI_PORT_STAT_ETHER_STATS_FRAGMENTS = {'', 'SAI_PORT_STAT_ETHER_STATS_FRAGMENTS'}, SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES = {'', 'SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES'}, SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS = {'', 'SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS'} } local function get_gbcounter(counter_id) local r = 0 local counter = gb_counter_list[counter_id] local num if counter then for i,id in ipairs(counter) do if #id > 0 then num = redis.call('HGET', counters_table .. separator .. KEYS[i+1], id) if num then r = r + num end end end end return r end -- KEYS: (portID, portID_systemSide, portID_lineSide) if #KEYS < 3 then return nil end if operator == "HGET" then local field = ARGV[6] redis.call('SELECT', counters_db) local counter = redis.call('HGET', counters_table .. separator .. KEYS[1], field) if counter then redis.call('SELECT', gb_counters_db) counter = counter + get_gbcounter(field) return tostring(counter) end elseif operator == "HGETALL" then redis.call('SELECT', counters_db) local counter_list = redis.call('HGETALL', counters_table .. separator .. KEYS[1]) if counter_list then redis.call('SELECT', gb_counters_db) for j = 1, #counter_list, 2 do counter_list[j+1] = tostring(counter_list[j+1] + get_gbcounter(counter_list[j])) end return counter_list end end return nil