5.02021-11-21T21:58:52ZTemplates AppApp NutcrackerApp Nutcracker## Overview
Template for collecting [nutcracker (twemproxy)](https://github.com/twitter/twemproxy) metrics.
By default template use system.run to collect metrics from <http://localhost:22222> (can be altered via macro) via zabbix-agent, but it can be changed to userparameter or http agent if remote commands are forbidden.
Some of the features:
* Pool and server discovery.
* Single request for LLD and metrics.
* Minimum host dependencies - only curl needed if system.run used. No host dependencies with http agent.
* No host scripts, utilizing Zabbix features: dependent items and JavaScript preprocessing.
## Author
Oleg Morozov aka zigmund
Templates AppNutcracker- Nutcracker current connectionsDEPENDENTnutcracker[stats,curr_connections]07d90dNumber of all active connections (client + server)NutcrackerJSONPATH$.curr_connectionsDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]
- Nutcracker connections per secondDEPENDENTnutcracker[stats,total_connections]07d90dFLOATNumber of new connections per secondNutcrackerJSONPATH$.total_connectionsCHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]
- Number of nutcracker processesZABBIX_ACTIVEproc.num[nutcracker]00Nutcracker{last()}=0Nutcracker is deadHIGH
- Nutcracker statsZABBIX_ACTIVEsystem.run[curl -s {$NUTCRACKER_URL}]00TEXTNutcracker JSON statsNutcracker
Pool discoveryDEPENDENTnutcracker[stats,pool_discovery]07dNutcracker pool {#POOL} client connectionsDEPENDENTnutcracker[stats,pools,{#POOL},client_connections]07d90dNumber of active client connectionsNutcrackerJSONPATH$['{#POOL}']['client_connections']DISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker pool {#POOL} client EOF per secondDEPENDENTnutcracker[stats,pools,{#POOL},client_eof]07d90dFLOATNumber of eof on client connections per secondNutcrackerJSONPATH$['{#POOL}']['client_eof']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker pool {#POOL} client errors per secondDEPENDENTnutcracker[stats,pools,{#POOL},client_err]07d90dFLOATNumber of errors on client connections per secondNutcrackerJSONPATH$['{#POOL}']['client_err']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker pool {#POOL} forward errors per secondDEPENDENTnutcracker[stats,pools,{#POOL},forward_error]07d90dFLOATNumber of forwarding errors per secondNutcrackerJSONPATH$['{#POOL}']['forward_error']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]{last()}>0Nutcracker pool {#POOL} forward errorsAVERAGENutcracker pool {#POOL} fragments per secondDEPENDENTnutcracker[stats,pools,{#POOL},fragments]07d90dFLOATNumber of fragments created from a multi-vector request per secondNutcrackerJSONPATH$['{#POOL}']['fragments']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker pool {#POOL} server ejects per secondDEPENDENTnutcracker[stats,pools,{#POOL},server_ejects]07d90dFLOATNumber of times backend server was ejected per secondNutcrackerJSONPATH$['{#POOL}']['server_ejects']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]system.run[curl -s {$NUTCRACKER_URL}]JAVASCRIPTvar stats = JSON.parse(value),
pool_keys = Object.keys(stats),
pools = [];
for(var i in pool_keys) {
if(typeof stats[pool_keys[i]] === 'object') {
pools.push({"{#POOL}": pool_keys[i]});
}
}
return JSON.stringify(pools)Server discoveryDEPENDENTnutcracker[stats,server_discovery]07dNutcracker server {#POOL}/{#SERVER} incoming queue requestsDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},in_queue]07d90dBCurrent number of requests in incoming queueNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['in_queue']DISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker server {#POOL}/{#SERVER} incoming queue bytesDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},in_queue_bytes]07d90dBCurrent number of bytes in incoming queueNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['in_queue_bytes']DISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker server {#POOL}/{#SERVER} outgoing queue requestsDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},out_queue]07d90dCurrent number of requests in outgoing queueNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['out_queue']DISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker server {#POOL}/{#SERVER} outgoing queue bytesDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},out_queue_bytes]07d90dBCurrent number of bytes in outgoing queueNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['out_queue_bytes']DISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker server {#POOL}/{#SERVER} requests per secondDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},requests]07d90dFLOATrpsNumber of requests per secondNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['requests']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker server {#POOL}/{#SERVER} request bytes per secondDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},request_bytes]07d90dFLOATBpsNumber of request bytes per secondNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['request_bytes']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker server {#POOL}/{#SERVER} responses per secondDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},responses]07d90dFLOATrpsNumber of responses per secondNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['responses']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker server {#POOL}/{#SERVER} response bytes per secondDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},response_bytes]07d90dFLOATBpsNumber of response bytes per secondNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['response_bytes']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker server {#POOL}/{#SERVER} connectionsDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},server_connections]07d90dNumber of active server connectionsNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['server_connections']DISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker server {#POOL}/{#SERVER} last ejection timestampDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},server_ejected_at]07d90dunixtimeLast time when server was ejected atNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['server_ejected_at']MULTIPLIER0.000001DISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]{change()}>1Nutcracker server {#POOL}/{#SERVER} was ejectedAVERAGENutcracker server {#POOL}/{#SERVER} EOF per secondDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},server_eof]07d90dFLOATNumber of eof on server connections per secondNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['server_eof']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]Nutcracker server {#POOL}/{#SERVER} errors per secondDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},server_err]07d90dFLOATNumber of errors on server connections per secondNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['server_err']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]{last()}>0Nutcracker server {#POOL}/{#SERVER} errorsAVERAGENutcracker server {#POOL}/{#SERVER} timeouts per secondDEPENDENTnutcracker[stats,servers,{#POOL},{#SERVER},server_timedout]07d90dFLOATNumber of timeouts on server connections per secondNutcrackerJSONPATH$['{#POOL}']['{#SERVER}']['server_timedout']CHANGE_PER_SECONDDISCARD_UNCHANGED_HEARTBEAT10msystem.run[curl -s {$NUTCRACKER_URL}]system.run[curl -s {$NUTCRACKER_URL}]JAVASCRIPTvar stats = JSON.parse(value),
pool_keys = Object.keys(stats),
servers = [];
for(var i in pool_keys) {
if(typeof stats[pool_keys[i]] === 'object') {
var server_keys = Object.keys(stats[pool_keys[i]]);
for(var j in server_keys) {
if(typeof stats[pool_keys[i]][server_keys[j]] === 'object') {
servers.push({"{#POOL}": pool_keys[i], "{#SERVER}": server_keys[j]});
}
}
}
}
return JSON.stringify(servers){$NUTCRACKER_URL}http://localhost:22222Nutcracker stats URL