| 
									
										
										
										
											2015-09-26 08:36:40 -07:00
										 |  |  | // Copyright 2015 The Prometheus Authors
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-15 02:38:13 -07:00
										 |  |  | //go:build !notcpstat
 | 
					
						
							|  |  |  | // +build !notcpstat
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 04:34:48 -07:00
										 |  |  | package collector | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2022-03-21 03:38:05 -07:00
										 |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"encoding/binary" | 
					
						
							|  |  |  | 	"syscall" | 
					
						
							| 
									
										
										
										
											2015-03-24 04:34:48 -07:00
										 |  |  | 	"testing" | 
					
						
							| 
									
										
										
										
											2022-03-21 03:38:05 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-22 02:05:47 -07:00
										 |  |  | 	"github.com/josharian/native" | 
					
						
							| 
									
										
										
										
											2022-03-21 03:38:05 -07:00
										 |  |  | 	"github.com/mdlayher/netlink" | 
					
						
							| 
									
										
										
										
											2015-03-24 04:34:48 -07:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-21 03:38:05 -07:00
										 |  |  | func Test_parseTCPStats(t *testing.T) { | 
					
						
							|  |  |  | 	encode := func(m InetDiagMsg) []byte { | 
					
						
							|  |  |  | 		var buf bytes.Buffer | 
					
						
							| 
									
										
										
										
											2022-10-22 02:05:47 -07:00
										 |  |  | 		err := binary.Write(&buf, native.Endian, m) | 
					
						
							| 
									
										
										
										
											2022-03-21 03:38:05 -07:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			panic(err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return buf.Bytes() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	msg := []netlink.Message{ | 
					
						
							| 
									
										
										
										
											2020-03-31 01:46:32 -07:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2022-03-21 03:38:05 -07:00
										 |  |  | 			Data: encode(InetDiagMsg{ | 
					
						
							|  |  |  | 				Family:  syscall.AF_INET, | 
					
						
							|  |  |  | 				State:   uint8(tcpEstablished), | 
					
						
							|  |  |  | 				Timer:   0, | 
					
						
							|  |  |  | 				Retrans: 0, | 
					
						
							|  |  |  | 				ID:      InetDiagSockID{}, | 
					
						
							|  |  |  | 				Expires: 0, | 
					
						
							|  |  |  | 				RQueue:  11, | 
					
						
							|  |  |  | 				WQueue:  21, | 
					
						
							|  |  |  | 				UID:     0, | 
					
						
							|  |  |  | 				Inode:   0, | 
					
						
							|  |  |  | 			}), | 
					
						
							| 
									
										
										
										
											2020-03-31 01:46:32 -07:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2022-03-21 03:38:05 -07:00
										 |  |  | 			Data: encode(InetDiagMsg{ | 
					
						
							|  |  |  | 				Family:  syscall.AF_INET, | 
					
						
							|  |  |  | 				State:   uint8(tcpListen), | 
					
						
							|  |  |  | 				Timer:   0, | 
					
						
							|  |  |  | 				Retrans: 0, | 
					
						
							|  |  |  | 				ID:      InetDiagSockID{}, | 
					
						
							|  |  |  | 				Expires: 0, | 
					
						
							|  |  |  | 				RQueue:  11, | 
					
						
							|  |  |  | 				WQueue:  21, | 
					
						
							|  |  |  | 				UID:     0, | 
					
						
							|  |  |  | 				Inode:   0, | 
					
						
							|  |  |  | 			}), | 
					
						
							| 
									
										
										
										
											2020-03-31 01:46:32 -07:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2018-10-27 00:21:36 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-03-31 01:46:32 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-21 03:38:05 -07:00
										 |  |  | 	tcpStats, err := parseTCPStats(msg) | 
					
						
							| 
									
										
										
										
											2015-03-24 04:34:48 -07:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-28 08:44:53 -08:00
										 |  |  | 	if want, got := 1, int(tcpStats[tcpEstablished]); want != got { | 
					
						
							| 
									
										
										
										
											2015-03-24 04:34:48 -07:00
										 |  |  | 		t.Errorf("want tcpstat number of established state %d, got %d", want, got) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-28 08:44:53 -08:00
										 |  |  | 	if want, got := 1, int(tcpStats[tcpListen]); want != got { | 
					
						
							| 
									
										
										
										
											2015-03-24 04:34:48 -07:00
										 |  |  | 		t.Errorf("want tcpstat number of listen state %d, got %d", want, got) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-03-31 01:46:32 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if want, got := 42, int(tcpStats[tcpTxQueuedBytes]); want != got { | 
					
						
							|  |  |  | 		t.Errorf("want tcpstat number of bytes in tx queue %d, got %d", want, got) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-03-21 03:38:05 -07:00
										 |  |  | 	if want, got := 22, int(tcpStats[tcpRxQueuedBytes]); want != got { | 
					
						
							| 
									
										
										
										
											2020-03-31 01:46:32 -07:00
										 |  |  | 		t.Errorf("want tcpstat number of bytes in rx queue %d, got %d", want, got) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |