Changeset 14d983031447161dd01662030191c821275e40a3

Show
Ignore:
Timestamp:
11/01/11 01:38:52 (3 years ago)
Author:
Brian Clapper <bclapper@omniti.com>
git-committer:
Brian Clapper <bclapper@omniti.com> 1320111532 -0400
git-parent:

[e520e98b8f3e66fdfa978ec0f096baad8a7dfb38]

git-author:
Brian Clapper <bclapper@omniti.com> 1320111532 -0400
Message:

better support for hash commands, specifically HMGET and HGETALL. use the hash key in the metric name, HMGET will use the various fields as the rest of the metric, HGETALL will use every other return (the keys) as part of the metric name

Files:

Legend:

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

    rbe54f17 r14d9830  
    126126end 
    127127 
     128metric_names = {} 
     129hash_key = nil 
     130need_key = 0 
     131metric_name = nil 
     132 
    128133function get_info_metrics(conn, check) 
    129134  local count = 0 
     
    147152        count = count + 1 
    148153        met = string.split(db_metrics[idx], "=") 
    149         add_check_metric(kv[1] .. "`" .. met[1], met[2], check) 
     154        metric_name = kv[1] .. "`" .. met[1] 
     155        add_check_metric(met[2], check) 
    150156      end 
    151157    elseif ( string.find(kv[1], "^allocation_stats$") ) then 
     
    162168    else 
    163169      count = count + 1 
    164       add_check_metric(kv[1], kv[2], check) 
     170      metric_name = kv[1] 
     171      add_check_metric(kv[2], check) 
    165172    end 
    166173  end 
     
    168175  return count 
    169176end 
    170  
    171 metric_names = {} 
    172177 
    173178function get_command_metrics(conn, check) 
     
    175180  metric_names = {} 
    176181  local cs = string.split(check.config.command, "%s+") 
    177   if ( string.find(cs[1]:upper(), "MGET") ) then 
     182  if ( string.find(cs[1]:upper(), "HGET") ) then 
     183    hash_key = cs[2] 
     184  elseif ( string.find(cs[1]:upper(), "MGET") ) then 
    178185    for idx in pairs(cs) do 
    179186      if ( idx > 1 ) then 
    180         metric_names[idx-2] = cs[idx] 
     187        if ( string.find(cs[1]:upper(), "HMGET") and idx > 2 ) then 
     188          metric_names[idx-3] = cs[2] .. '`' .. cs[idx] 
     189        else 
     190          metric_names[idx-2] = cs[idx] 
     191        end 
    181192      end 
    182193    end 
    183194  end 
    184   return read_redis_response(conn, check, cs[2]) 
    185 end 
    186  
    187 function read_redis_response(conn, check, metric_name) 
     195  metric_name = cs[2] 
     196  return read_redis_response(conn, check) 
     197end 
     198 
     199function read_redis_response(conn, check) 
    188200  local response_type = conn:read(1); 
    189201  if ( response_type == "+" ) then 
    190     return redis_response_string(conn, check, metric_name
     202    return redis_response_string(conn, check
    191203  elseif ( response_type == "-" ) then 
    192204    return redis_response_error(conn, check) 
    193205  elseif ( response_type == ":" ) then 
    194     return redis_response_integer(conn, check, metric_name
     206    return redis_response_integer(conn, check
    195207  elseif ( response_type == "$" ) then 
    196     return redis_bulk_response(conn, check, metric_name
     208    return redis_bulk_response(conn, check
    197209  elseif ( response_type == "*" ) then 
    198     return redis_multibulk_response(conn, check, metric_name
    199   end 
    200 end 
    201  
    202 function redis_bulk_response(conn, check, metric_name
     210    return redis_multibulk_response(conn, check
     211  end 
     212end 
     213 
     214function redis_bulk_response(conn, check
    203215  local response 
    204216  local response_len = conn:read("\r\n") 
    205217  response_len = string.sub(response_len, 1, -2) 
    206218  if ( -1 == tonumber(response_len) ) then 
    207     return redis_response_null(check, metric_name
     219    return redis_response_null(check
    208220  else 
    209221    response = conn:read(response_len) 
    210     add_check_metric(metric_name, response, check) 
     222    if ( 1 == need_key ) then 
     223      metric_name = hash_key .. '`' .. response 
     224    else 
     225      add_check_metric(response, check) 
     226    end 
    211227    -- clean out rest of response 
    212228    conn:read("\r\n") 
     
    215231end 
    216232 
    217 function redis_multibulk_response(conn, check, metric_name
     233function redis_multibulk_response(conn, check
    218234  local responses = conn:read("\r\n") 
    219235  responses = string.sub(responses, 1, -2) 
    220236 
    221237  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) 
     238    if ( hash_key ~= nil ) then 
     239      need_key = (need_key + 1) % 2 
     240    else 
     241      metric_name = metric_name .. '`' .. (i-1) 
     242      if ( metric_names[i-1] ) then 
     243        metric_name = metric_names[i-1] 
     244      end 
     245    end 
     246    read_redis_response(conn, check) 
    227247  end 
    228248  return tonumber(responses) 
    229249end 
    230250 
    231 function redis_response_integer(conn, check, metric_name
     251function redis_response_integer(conn, check
    232252  local response = conn:read("\r\n") 
    233253  response = string.sub(response, 1, -2) 
    234   add_check_metric(metric_name, response, check) 
     254  add_check_metric(response, check) 
    235255  return 1 
    236256end 
    237257 
    238 function redis_response_string(conn, check, metric_name
     258function redis_response_string(conn, check
    239259  local response = conn:read("\r\n") 
    240260  response = string.sub(response, 1, -2) 
    241   add_check_metric(metric_name, response, check) 
     261  add_check_metric(response, check) 
    242262  return 1 
    243263end 
     
    251271end 
    252272 
    253 function redis_response_null(check, metric_name
     273function redis_response_null(check
    254274  check.metric_string(metric_name, nil) 
    255275  return 1 
    256276end 
    257277 
    258 function add_check_metric(name, value, check) 
     278function add_check_metric(value, check) 
    259279  if ( string.find(value, "^%d+$") ) then 
    260     check.metric_uint64(name, value) 
     280    check.metric_uint64(metric_name, value) 
    261281  elseif ( string.find(value, "^%d+?.%d+$") ) then 
    262     check.metric_double(name, value) 
     282    check.metric_double(metric_name, value) 
    263283  else 
    264     check.metric(name, value) 
     284    check.metric(metric_name, value) 
    265285  end 
    266286end