Open quynhvuongg opened 4 years ago
Em đọc thêm làm thế nào để exporter collect được các metrics như vậy nhé. Dẫn chứng đến code luôn.
Exporter sử dụng các client library của Golang, Prometheus, Java, Ruby xây dựng Collector để collect metrics.
Để có được metrics như node_netstat.*
node_socket.*
node_network.*
Node-exporter sử dụng Collector để thu thập số liệu từ /proc/net
trên Linux OS và xử lý các số liệu đó.
Ex: node_exporter/collector/tcp_linux.go Khởi tạo collector
type tcpStatCollector struct {
desc typedDesc
logger log.Logger
}
func init() {
registerCollector("tcpstat", defaultDisabled, NewTCPStatCollector)
}
// NewTCPStatCollector returns a new Collector exposing network stats.
func NewTCPStatCollector(logger log.Logger) (Collector, error) {
return &tcpStatCollector{
desc: typedDesc{prometheus.NewDesc(
prometheus.BuildFQName(namespace, "tcp", "connection_states"),
"Number of connection states.",
[]string{"state"}, nil,
), prometheus.GaugeValue},
logger: logger,
}, nil
}
Thu thập và xử lý metrics
func (c *tcpStatCollector) Update(ch chan<- prometheus.Metric) error {
tcpStats, err := getTCPStats(procFilePath("net/tcp"))
if err != nil {
return fmt.Errorf("couldn't get tcpstats: %s", err)
}
// if enabled ipv6 system
tcp6File := procFilePath("net/tcp6")
if _, hasIPv6 := os.Stat(tcp6File); hasIPv6 == nil {
tcp6Stats, err := getTCPStats(tcp6File)
if err != nil {
return fmt.Errorf("couldn't get tcp6stats: %s", err)
}
for st, value := range tcp6Stats {
tcpStats[st] += value
}
}
for st, value := range tcpStats {
ch <- c.desc.mustNewConstMetric(value, st.String())
}
return nil
}
func getTCPStats(statsFile string) (map[tcpConnectionState]float64, error) {
file, err := os.Open(statsFile)
if err != nil {
return nil, err
}
defer file.Close()
return parseTCPStats(file)
}
func parseTCPStats(r io.Reader) (map[tcpConnectionState]float64, error) {
tcpStats := map[tcpConnectionState]float64{}
contents, err := ioutil.ReadAll(r)
if err != nil {
return nil, err
}
for _, line := range strings.Split(string(contents), "\n")[1:] {
parts := strings.Fields(line)
if len(parts) == 0 {
continue
}
if len(parts) < 5 {
return nil, fmt.Errorf("invalid TCP stats line: %q", line)
}
qu := strings.Split(parts[4], ":")
if len(qu) < 2 {
return nil, fmt.Errorf("cannot parse tx_queues and rx_queues: %q", line)
}
tx, err := strconv.ParseUint(qu[0], 16, 64)
if err != nil {
return nil, err
}
tcpStats[tcpConnectionState(tcpTxQueuedBytes)] += float64(tx)
rx, err := strconv.ParseUint(qu[1], 16, 64)
if err != nil {
return nil, err
}
tcpStats[tcpConnectionState(tcpRxQueuedBytes)] += float64(rx)
st, err := strconv.ParseInt(parts[3], 16, 8)
if err != nil {
return nil, err
}
tcpStats[tcpConnectionState(st)]++
}
return tcpStats, nil
}
Exposes metrics
func (st tcpConnectionState) String() string {
switch st {
case tcpEstablished:
return "established"
case tcpSynSent:
return "syn_sent"
case tcpSynRecv:
return "syn_recv"
case tcpFinWait1:
return "fin_wait1"
case tcpFinWait2:
return "fin_wait2"
case tcpTimeWait:
return "time_wait"
case tcpClose:
return "close"
case tcpCloseWait:
return "close_wait"
case tcpLastAck:
return "last_ack"
case tcpListen:
return "listen"
case tcpClosing:
return "closing"
case tcpRxQueuedBytes:
return "rx_queued_bytes"
case tcpTxQueuedBytes:
return "tx_queued_bytes"
default:
return "unknown"
}
}
@vtdat Đây ạ
OK, đọc kĩ và hiểu TẤT CẢ metrics trên, xem cả đoạn code lấy metrics đó.
Hôm sau a sẽ hỏi.
Chỉ node-exporter thôi hay tất ạ :<
OK, đọc kĩ và hiểu TẤT CẢ metrics trên, xem cả đoạn code lấy metrics đó.
Hôm sau a sẽ hỏi.
Chỉ node-exporter thôi hay tất ạ :<
OK, đọc kĩ và hiểu TẤT CẢ metrics trên, xem cả đoạn code lấy metrics đó. Hôm sau a sẽ hỏi.
scope là node-exporter trước đi
Monitoring Network
Các tiêu chí giám sát mạng trên host
Độ khả dụng của máy chủ như CPU,memory,disk,...
Độ khả dụng của các thiết bị mạng(router,switch,...) như CPU, memory, interfaces,...
Độ khả dụng của đường truyền như tốc độ lưu lượng, thông lượng,lỗi, các kết nối như TCP,UDP,ICMP,IP,... (in,out,error)
Metrics liên quan
1. Độ khả dụng của máy chủ
CPU
Node-exporter
Cadvisor
Memory
Node-exporter
Cadvisor
Disk
Node-exporter
...
2. Độ khả dụng của các thiết bị mạng
SNMP-exporter (Router)
_cpuusage1min:
1.3.6.1.4.1.9.9.109.1.1.1.1.7
_memomryusage:
1.3.6.1.4.1.9.9.48.1.1.1.5
_listport:
1.3.6.1.2.1.17.1.4.1.2 (ifIndex)
_porttraffic:
1.3.6.1.2.1.2.2.1.10 (ifInOctets)
1.3.6.1.2.1.2.2.1.16 (ifOutOctets)
_portspeed:
1.3.6.1.2.1.2.2.1.5 (ifSpeed)
_descriptioninterfaces:
1.3.6.1.2.1.2.2.1.2 (ifDescr)
_packeterror:
1.3.6.1.2.1.2.2.1.20 (ifOutErrors)
1.3.6.1.2.1.2.2.1.20 (ifInErrors)
...
3. Độ khả dụng của đường truyền
Node-exporter
Network speed:
Network traffic:
node_network_transmit_bytes_total
node_network_transmit_drop_total
node_network_transmit_errs_total
node_network_transmit_packets_total
node_network_receive_bytes_total
node_network_receive_carrier_total
node_network_receive_drop_total
node_network_receive_errs_total
node_network_receive_packets_total
node_network_receive_frame_total
Network mtu:
Network Socket:
node_sockstat_sockets_used
node_sockstat_TCP_alloc
node_sockstat_TCP_inuse
node_sockstat_TCP_mem
node_sockstat_TCP_mem_bytes
node_sockstat_TCP_orphan
node_sockstat_TCP_tw
node_sockstat_UDPLITE_inuse
node_sockstat_UDPLITE_inuse
node_sockstat_UDP_mem
node_sockstat_UDP_mem_bytes
Network Static:
node_netstat_Icmp_InMsgs
node_netstat_Icmp_OutMsgs
node_netstat_Icmp_InErrors
node_netstat_IpExt_InOctets
node_netstat_IpExt_OutOctets
node_netstat_Tcp_InSegs
node_netstat_Tcp_OutSegs
node_netstat_Tcp_InErrs
node_netstat_Tcp_ActiveOpens
node_netstat_Tcp_PassiveOpens
node_netstat_Tcp_RetransSegs
node_netstat_TcpExt_ListenDrops
node_netstat_TcpExt_ListenOverflows
node_netstat_TcpExt_SyncookiesFailed
node_netstat_TcpExt_SyncookiesRecv
node_netstat_TcpExt_SyncookiesSent
node_netstat_TcpExt_TCPSynRetrans
Alert rules
Socket
Netstat
SNMP