├── README.md ├── Templates └── Template_TCP_Stats.xml ├── bin └── tcpstats.sh └── zabbix_agentd.d └── userparameter_tcpstats.conf /README.md: -------------------------------------------------------------------------------- 1 | # Zabbix-TCP 2 | 3 | TCP socket states and connection stats are collected by ss and netstat commands, then sent by zabbix sender. 4 | 5 | **Installation** 6 | 7 | 1. Import the TCP stats template to zabbix and link it to the zabbix host. 8 | 2. Copy the TCP stats script to the host in /usr/local/bin . 9 | 3. Copy TCP stats zabbix agent configuration to /etc/zabbix-agent/zabbix_agentd.d and restart zabbix agent. 10 | 11 | Note: 12 | - Zabbix sender uses zabbix agent configuration to send the metrics, please check the hostname is set in the zabbix agent config /etc/zabbix/zabbix_agentd.conf, by default the hostname may be commented out. 13 | - The script may take longer to run on a busy server, increase the timeout limit "timeout=" on zabbix agent configuration "/etc/zabbix/zabbix_agentd.conf" will allow the script to finish. -------------------------------------------------------------------------------- /Templates/Template_TCP_Stats.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 3.2 4 | 2017-05-08T15:24:05Z 5 | 6 | 7 | Templates 8 | 9 | 10 | 11 | 967 | 968 | 969 | 970 | Network TCP connections 971 | 900 972 | 200 973 | 0.0000 974 | 100.0000 975 | 1 976 | 1 977 | 1 978 | 1 979 | 0 980 | 0.0000 981 | 0.0000 982 | 0 983 | 0 984 | 0 985 | 0 986 | 987 | 988 | 0 989 | 4 990 | 99FF99 991 | 0 992 | 2 993 | 0 994 | 995 | Template TCP Stats 996 | tcp.conn.estab 997 | 998 | 999 | 1000 | 1 1001 | 5 1002 | 1A7C11 1003 | 0 1004 | 2 1005 | 0 1006 | 1007 | Template TCP Stats 1008 | tcp.conn.active.opens 1009 | 1010 | 1011 | 1012 | 2 1013 | 5 1014 | F63100 1015 | 0 1016 | 2 1017 | 0 1018 | 1019 | Template TCP Stats 1020 | tcp.conn.resets.recv 1021 | 1022 | 1023 | 1024 | 3 1025 | 5 1026 | 2774A4 1027 | 0 1028 | 2 1029 | 0 1030 | 1031 | Template TCP Stats 1032 | tcp.conn.failed.attempts 1033 | 1034 | 1035 | 1036 | 4 1037 | 5 1038 | A54F10 1039 | 0 1040 | 2 1041 | 0 1042 | 1043 | Template TCP Stats 1044 | tcp.conn.passive.opens 1045 | 1046 | 1047 | 1048 | 5 1049 | 5 1050 | FC6EA3 1051 | 0 1052 | 2 1053 | 0 1054 | 1055 | Template TCP Stats 1056 | tcp.conn.resets.sent 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | Network TCP segments 1063 | 900 1064 | 200 1065 | 0.0000 1066 | 100.0000 1067 | 1 1068 | 1 1069 | 0 1070 | 1 1071 | 0 1072 | 0.0000 1073 | 0.0000 1074 | 0 1075 | 0 1076 | 0 1077 | 0 1078 | 1079 | 1080 | 0 1081 | 5 1082 | DDDD00 1083 | 0 1084 | 7 1085 | 0 1086 | 1087 | Template TCP Stats 1088 | tcp.seg.send 1089 | 1090 | 1091 | 1092 | 1 1093 | 5 1094 | 00DD00 1095 | 0 1096 | 7 1097 | 0 1098 | 1099 | Template TCP Stats 1100 | tcp.seg.recv 1101 | 1102 | 1103 | 1104 | 2 1105 | 5 1106 | DD0000 1107 | 0 1108 | 7 1109 | 0 1110 | 1111 | Template TCP Stats 1112 | tcp.seg.retrans 1113 | 1114 | 1115 | 1116 | 3 1117 | 5 1118 | 0000DD 1119 | 0 1120 | 7 1121 | 0 1122 | 1123 | Template TCP Stats 1124 | tcp.seg.bad 1125 | 1126 | 1127 | 1128 | 1129 | 1130 | Network TCP Socket States 1131 | 900 1132 | 200 1133 | 0.0000 1134 | 100.0000 1135 | 1 1136 | 1 1137 | 1 1138 | 1 1139 | 0 1140 | 0.0000 1141 | 0.0000 1142 | 0 1143 | 0 1144 | 0 1145 | 0 1146 | 1147 | 1148 | 0 1149 | 0 1150 | C8C800 1151 | 0 1152 | 2 1153 | 0 1154 | 1155 | Template TCP Stats 1156 | tcp.socket.listen 1157 | 1158 | 1159 | 1160 | 1 1161 | 0 1162 | 00BB00 1163 | 0 1164 | 2 1165 | 0 1166 | 1167 | Template TCP Stats 1168 | tcp.socket.syn-sent 1169 | 1170 | 1171 | 1172 | 2 1173 | 0 1174 | 000000 1175 | 0 1176 | 2 1177 | 0 1178 | 1179 | Template TCP Stats 1180 | tcp.socket.syn-recv 1181 | 1182 | 1183 | 1184 | 3 1185 | 0 1186 | 99FF99 1187 | 0 1188 | 2 1189 | 0 1190 | 1191 | Template TCP Stats 1192 | tcp.socket.estab 1193 | 1194 | 1195 | 1196 | 4 1197 | 0 1198 | 0000C8 1199 | 0 1200 | 2 1201 | 0 1202 | 1203 | Template TCP Stats 1204 | tcp.socket.fin-wait-1 1205 | 1206 | 1207 | 1208 | 5 1209 | 0 1210 | CCCCFF 1211 | 0 1212 | 2 1213 | 0 1214 | 1215 | Template TCP Stats 1216 | tcp.socket.fin-wait-2 1217 | 1218 | 1219 | 1220 | 6 1221 | 0 1222 | 00C8C8 1223 | 0 1224 | 2 1225 | 0 1226 | 1227 | Template TCP Stats 1228 | tcp.socket.last-ack 1229 | 1230 | 1231 | 1232 | 7 1233 | 0 1234 | C80000 1235 | 0 1236 | 2 1237 | 0 1238 | 1239 | Template TCP Stats 1240 | tcp.socket.close-wait 1241 | 1242 | 1243 | 1244 | 8 1245 | 0 1246 | 888888 1247 | 0 1248 | 2 1249 | 0 1250 | 1251 | Template TCP Stats 1252 | tcp.socket.time-wait 1253 | 1254 | 1255 | 1256 | 1257 | 1258 | 1259 | -------------------------------------------------------------------------------- /bin/tcpstats.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Date: 22/08/2016 4 | # Author: Long Chen 5 | # Description: A script to send TCP stats to zabbix server by using zabbix sender 6 | # Requires: Zabbix Sender 7 | 8 | # Get TCP socket states by using ss command 9 | get_TCP_socket_states(){ 10 | ss -ant | grep -v State | awk '{print $1}' | tr '[:upper:]' '[:lower:]' | awk 'BEGIN {\ 11 | s["close-wait"]=0;\ 12 | s["estab"]=0;\ 13 | s["fin-wait-1"]=0;\ 14 | s["fin-wait-2"]=0;\ 15 | s["last-ack"]=0;\ 16 | s["syn-recv"]=0;\ 17 | s["syn-sent"]=0;\ 18 | s["time-wait"]=0} \ 19 | {s[$1]++} END \ 20 | {for (i in s) {print "- tcp.socket."i"", s[i]}}' 21 | } 22 | 23 | # Get TCP stats by using netstat command 24 | get_TCP_conn_stats(){ 25 | netstat -st |sed -n '/Tcp:/,+10p' | grep -v "Tcp:" | sed 's/^ //g' | awk '{a[NR]=$0" "$1} END {host="-"; for (i in a) {\ 26 | sub (/^.* active connections openings /, "tcp.conn.active.opens", a[i]); \ 27 | sub (/^.* passive connection openings /, "tcp.conn.passive.opens", a[i]); \ 28 | sub (/^.* failed connection attempts /, "tcp.conn.failed.attempts", a[i]); \ 29 | sub (/^.* resets sent /, "tcp.conn.resets.sent", a[i]); \ 30 | sub (/^.* connection resets received /, "tcp.conn.resets.recv", a[i]); \ 31 | sub (/^.* connections established /, "tcp.conn.estab", a[i]); \ 32 | sub (/^.* segments received /, "tcp.seg.recv", a[i]); \ 33 | sub (/^.* segments send out /, "tcp.seg.send", a[i]); \ 34 | sub (/^.* segments retransmited /, "tcp.seg.retrans", a[i]); \ 35 | sub (/^.* bad segments received. /, "tcp.seg.bad", a[i]); \ 36 | print host, a[i]}}' 37 | } 38 | 39 | # Send the results to zabbix server by using zabbix sender 40 | result=$((get_TCP_socket_states; get_TCP_conn_stats) | /usr/bin/zabbix_sender -c /etc/zabbix/zabbix_agentd.conf -i - 2>&1) 41 | response=$(echo "$result" | awk -F ';' '$1 ~ /^info/ && match($1,/[0-9].*$/) {sum+=substr($1,RSTART,RLENGTH)} END {print sum}') 42 | if [ -n "$response" ]; then 43 | echo "$response" 44 | else 45 | echo "$result" 46 | fi -------------------------------------------------------------------------------- /zabbix_agentd.d/userparameter_tcpstats.conf: -------------------------------------------------------------------------------- 1 | # tcp stats 2 | UserParameter=tcp.zabbix.sender,/usr/local/bin/tcpstats.sh 3 | --------------------------------------------------------------------------------