Changeset be54f17ae047da3057ed0aaef8b83a0ae58267a3

Show
Ignore:
Timestamp:
04/11/11 17:49:32 (3 years ago)
Author:
neophenix <neophenix@gmail.com>
git-committer:
neophenix <neophenix@gmail.com> 1302544172 -0400
git-parent:

[4fceaf1d5abd353562fe27a897a3597cdceca6b3]

git-author:
neophenix <neophenix@gmail.com> 1302544172 -0400
Message:

support bulk replies and breakout metrics in MGET commands

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/modules-lua/noit/module/redis.lua

    r983d4f5 rbe54f17  
    9898 
    9999  conn:write(redis_comm) 
    100   local res 
    101   local res_len = conn:read("\r\n") 
    102   res_len = string.sub(res_len, 2, -2) 
    103   res = conn:read(res_len) 
    104100  local metric_count = 0 
    105101 
    106   if ( check.config.command ~= nil ) then 
    107     metric_count = get_command_metrics(res, check) 
     102  if ( check.config.command ~= nil and check.config.command:upper() ~= "INFO" ) then 
     103    metric_count = get_command_metrics(conn, check) 
    108104  else 
    109     metric_count = get_info_metrics(res, check) 
     105    metric_count = get_info_metrics(conn, check) 
    110106  end 
    111107 
     
    130126end 
    131127 
    132 function get_info_metrics(redis_result, check) 
    133   local count                 = 0 
     128function get_info_metrics(conn, check) 
     129  local count = 0 
     130  local redis_result 
     131  local result_len = conn:read("\r\n") 
     132  result_len = string.sub(result_len, 2, -2) 
     133  redis_result = conn:read(result_len) 
    134134 
    135135  local list = string.split(redis_result, "\r\n") 
     
    149149        add_check_metric(kv[1] .. "`" .. met[1], met[2], check) 
    150150      end 
     151    elseif ( string.find(kv[1], "^allocation_stats$") ) then 
     152      alloc_metrics = string.split(kv[2], ",") 
     153      for idx in pairs(alloc_metrics) do 
     154        count = count + 1 
     155        met = string.split(alloc_metrics[idx], "=") 
     156        if ( 3 == table.getn(met) ) then 
     157            check.metric_int32("allocation_stats`" .. met[2], met[3]) 
     158        else 
     159            check.metric_int32("allocation_stats`" .. met[1], met[2]) 
     160        end 
     161      end 
    151162    else 
    152163      count = count + 1 
     
    158169end 
    159170 
    160 function get_command_metrics(redis_result, check) 
    161   local count = 1 
    162  
     171metric_names = {} 
     172 
     173function get_command_metrics(conn, check) 
     174  -- the only metric name we know is what we are sending to redis 
     175  metric_names = {} 
    163176  local cs = string.split(check.config.command, "%s+") 
    164   add_check_metric(cs[2], redis_result, check) 
    165  
    166   return count 
     177  if ( string.find(cs[1]:upper(), "MGET") ) then 
     178    for idx in pairs(cs) do 
     179      if ( idx > 1 ) then 
     180        metric_names[idx-2] = cs[idx] 
     181      end 
     182    end 
     183  end 
     184  return read_redis_response(conn, check, cs[2]) 
     185end 
     186 
     187function read_redis_response(conn, check, metric_name) 
     188  local response_type = conn:read(1); 
     189  if ( response_type == "+" ) then 
     190    return redis_response_string(conn, check, metric_name) 
     191  elseif ( response_type == "-" ) then 
     192    return redis_response_error(conn, check) 
     193  elseif ( response_type == ":" ) then 
     194    return redis_response_integer(conn, check, metric_name) 
     195  elseif ( response_type == "$" ) then 
     196    return redis_bulk_response(conn, check, metric_name) 
     197  elseif ( response_type == "*" ) then 
     198    return redis_multibulk_response(conn, check, metric_name) 
     199  end 
     200end 
     201 
     202function redis_bulk_response(conn, check, metric_name) 
     203  local response 
     204  local response_len = conn:read("\r\n") 
     205  response_len = string.sub(response_len, 1, -2) 
     206  if ( -1 == tonumber(response_len) ) then 
     207    return redis_response_null(check, metric_name) 
     208  else 
     209    response = conn:read(response_len) 
     210    add_check_metric(metric_name, response, check) 
     211    -- clean out rest of response 
     212    conn:read("\r\n") 
     213    return 1 
     214  end 
     215end 
     216 
     217function redis_multibulk_response(conn, check, metric_name) 
     218  local responses = conn:read("\r\n") 
     219  responses = string.sub(responses, 1, -2) 
     220 
     221  for i = 1, responses, 1 do 
     222    local m_name = metric_name .. '`' .. (i-1) 
     223    if ( metric_names[i-1] ) then 
     224      m_name = metric_names[i-1] 
     225    end 
     226    read_redis_response(conn, check, m_name) 
     227  end 
     228  return tonumber(responses) 
     229end 
     230 
     231function redis_response_integer(conn, check, metric_name) 
     232  local response = conn:read("\r\n") 
     233  response = string.sub(response, 1, -2) 
     234  add_check_metric(metric_name, response, check) 
     235  return 1 
     236end 
     237 
     238function redis_response_string(conn, check, metric_name) 
     239  local response = conn:read("\r\n") 
     240  response = string.sub(response, 1, -2) 
     241  add_check_metric(metric_name, response, check) 
     242  return 1 
     243end 
     244 
     245function redis_response_error(conn, check) 
     246  local response = conn:read("\r\n") 
     247  response = string.sub(response, 1, -2) 
     248  check.status(response) 
     249  check.bad() 
     250  return 0 
     251end 
     252 
     253function redis_response_null(check, metric_name) 
     254  check.metric_string(metric_name, nil) 
     255  return 1 
    167256end 
    168257