Kaynağa Gözat

Feature #TASK_QT-32777 适配TiDB

Tom.Li 5 ay önce
ebeveyn
işleme
758d41ac1a

+ 2 - 0
containers/container_apm.go

@@ -380,6 +380,8 @@ func (c *Container) onL7RequestApm(pid uint32, fd uint64, timestamp uint64, r *l
 				l7Type := flags.GetProtocolByPort(uint16(conn.ActualDest.Port()))
 				if l7Type == l7.ProtocolMariaDB {
 					dbSystem = semconv.DBSystemMariaDB
+				} else if l7Type == l7.ProtocolTiDB {
+					dbSystem = semconv.DBSystemTiDB
 				}
 				//apmTrace.MysqlTraceQuery(query, r.Status.Error(), r.Duration, conn.ActualDest)
 				//apmTrace.MysqlTraceQueryEvent(query, r, conn.ActualDest)

+ 3 - 1
containers/metrics.go

@@ -89,7 +89,7 @@ var metrics = struct {
 	NetListenInfo:            metric("process_net_tcp_listen_info", "Listen address of the process", "listen_addr", "proxy"),
 	NetConnectionsSuccessful: metric("process_net_tcp_successful_connects_total", "Total number of successful TCP connects", "instance_id", "app_id", "target_app_id", "app_name", "src", "destination", "actual_destination"),
 	NetConnectionsTotalTime:  metric("process_net_tcp_connection_time_seconds_total", "Time spent on TCP connections", "instance_id", "app_id", "target_app_id", "app_name", "src", "destination", "actual_destination"),
-	NetConnectionsFailed:     metric("process_net_tcp_failed_connects_total", "Total number of failed TCP connects", "instance_id", "app_id","target_app_id", "app_name", "destination", "actual_destination"),
+	NetConnectionsFailed:     metric("process_net_tcp_failed_connects_total", "Total number of failed TCP connects", "instance_id", "app_id", "target_app_id", "app_name", "destination", "actual_destination"),
 	NetConnectionsActive:     metric("process_net_tcp_active_connections", "Number of active outbound connections used by the process", "destination", "actual_destination"),
 	NetRetransmits:           metric("process_net_tcp_retransmits_total", "Total number of retransmitted TCP segments", "instance_id", "app_id", "target_app_id", "app_name", "src", "destination", "actual_destination"),
 	NetLatency:               metric("process_net_latency_seconds", "Round-trip time between the process and a remote IP", "destination_ip"),
@@ -127,6 +127,7 @@ var (
 		l7.ProtocolRedis:     {Name: "process_redis_queries_total", Help: "Total number of outbound Redis queries"},
 		l7.ProtocolMemcached: {Name: "process_memcached_queries_total", Help: "Total number of outbound Memcached queries"},
 		l7.ProtocolMysql:     {Name: "process_mysql_queries_total", Help: "Total number of outbound Mysql queries"},
+		l7.ProtocolTiDB:      {Name: "process_tidb_queries_total", Help: "Total number of outbound TiDB queries"},
 		l7.ProtocolMongo:     {Name: "process_mongo_queries_total", Help: "Total number of outbound Mongo queries"},
 		l7.ProtocolKafka:     {Name: "process_kafka_requests_total", Help: "Total number of outbound Kafka requests"},
 		l7.ProtocolCassandra: {Name: "process_cassandra_queries_total", Help: "Total number of outbound Cassandra requests"},
@@ -142,6 +143,7 @@ var (
 		l7.ProtocolRedis:     {Name: "process_redis_queries_duration_seconds_total", Help: "Histogram of the execution time for each outbound Redis query"},
 		l7.ProtocolMemcached: {Name: "process_memcached_queries_duration_seconds_total", Help: "Histogram of the execution time for each outbound Memcached query"},
 		l7.ProtocolMysql:     {Name: "process_mysql_queries_duration_seconds_total", Help: "Histogram of the execution time for each outbound Mysql query"},
+		l7.ProtocolTiDB:      {Name: "process_tidb_queries_duration_seconds_total", Help: "Histogram of the execution time for each outbound TiDB query"},
 		l7.ProtocolMongo:     {Name: "process_mongo_queries_duration_seconds_total", Help: "Histogram of the execution time for each outbound Mongo query"},
 		l7.ProtocolKafka:     {Name: "process_kafka_requests_duration_seconds_total", Help: "Histogram of the execution time for each outbound Kafka request"},
 		l7.ProtocolCassandra: {Name: "process_cassandra_queries_duration_seconds_total", Help: "Histogram of the execution time for each outbound Cassandra request"},

+ 2 - 2
ebpftracer/ebpf/ebpf.c

@@ -73,8 +73,8 @@
 #if defined(__x86_64__)
 //TODO 支持kernel-4.18+后打开
 #if __KERNEL_FROM >= 512
-#include "utrace/netcore/net/server.probe.bpf.c"
-#include "utrace/netcore/net/client.probe.bpf.c"
+// #include "utrace/netcore/net/server.probe.bpf.c"
+// #include "utrace/netcore/net/client.probe.bpf.c"
 #endif
 #endif
 

+ 5 - 0
ebpftracer/l7/l7.go

@@ -29,6 +29,7 @@ const (
 	ProtocolMariaDB   Protocol = 15
 	ProtocolGrpc      Protocol = 16
 	ProtocolES        Protocol = 17
+	ProtocolTiDB      Protocol = 18
 )
 
 func (p Protocol) Int() int {
@@ -69,6 +70,8 @@ func (p Protocol) String() string {
 		return "DM"
 	case ProtocolMariaDB:
 		return "Mariadb"
+	case ProtocolTiDB:
+		return "TiDB"
 	case ProtocolGrpc:
 		return "GRPC"
 	case ProtocolES:
@@ -111,6 +114,8 @@ func (p Protocol) ServiceNameString() string {
 		return "DM"
 	case ProtocolMariaDB:
 		return "MARIA"
+	case ProtocolTiDB:
+		return "TIDB"
 	case ProtocolGrpc:
 		return "GRPC"
 	case ProtocolES:

+ 1 - 0
flags/flags.go

@@ -78,6 +78,7 @@ var (
 	// 端口白名单配置
 	MysqlPortWhitelist   = kingpin.Flag("mysql-ports", "Comma-separated list of ports to identify as MySQL").Envar("MYSQL_PORTS").Default("").String()
 	MariadbPortWhitelist = kingpin.Flag("mariadb-ports", "Comma-separated list of ports to identify as MariaDB").Envar("MARIADB_PORTS").Default("").String()
+	TidbPortWhitelist    = kingpin.Flag("tidb-ports", "Comma-separated list of ports to identify as TiDB").Envar("TIDB_PORTS").Default("").String()
 	//APP注册到DOOP
 	RegisterAppToDoop = kingpin.Flag("register-app-to-doop", "Register the app-info to the doop").Default("false").Envar("REGISTER_APP_TO_DOOP").Bool()
 	//是否向平台发送网络数据

+ 10 - 1
flags/port_whitelist.go

@@ -1,9 +1,10 @@
 package flags
 
 import (
-	"github.com/coroot/coroot-node-agent/ebpftracer/l7"
 	"strconv"
 	"strings"
+
+	"github.com/coroot/coroot-node-agent/ebpftracer/l7"
 )
 
 // 端口白名单数据结构
@@ -15,6 +16,7 @@ type PortWhitelist struct {
 var (
 	MysqlPorts   *PortWhitelist
 	MariadbPorts *PortWhitelist
+	TidbPorts    *PortWhitelist
 )
 
 // 创建端口白名单
@@ -54,10 +56,16 @@ func GetProtocolByPort(port uint16) l7.Protocol {
 	if MariadbPorts != nil && MariadbPorts.Contains(port) {
 		return l7.ProtocolMariaDB
 	}
+	if TidbPorts != nil && TidbPorts.Contains(port) {
+		return l7.ProtocolTiDB
+	}
 	// 如果端口不在白名单中,返回默认协议
 	if *MysqlDefault == "mariadb" {
 		return l7.ProtocolMariaDB
 	}
+	if *MysqlDefault == "tidb" {
+		return l7.ProtocolTiDB
+	}
 
 	return l7.ProtocolMysql
 }
@@ -66,4 +74,5 @@ func GetProtocolByPort(port uint16) l7.Protocol {
 func InitPortWhitelists() {
 	MysqlPorts = NewPortWhitelist(*MysqlPortWhitelist)
 	MariadbPorts = NewPortWhitelist(*MariadbPortWhitelist)
+	TidbPorts = NewPortWhitelist(*TidbPortWhitelist)
 }

+ 1 - 1
pkg/go.opentelemetry.io/otel/exporters/otlp/otlptrace/apm_exporter.go

@@ -191,7 +191,7 @@ func tracetransformData(sdl []tracesdk.ReadOnlySpan) map[int][]RootDataT {
 					buildHttpMapFromEvent(&mNode, event)
 				case l7.ProtocolDNS:
 					buildDNSMapEvent(&mNode, event)
-				case l7.ProtocolMysql, l7.ProtocolMariaDB, l7.ProtocolPostgres, l7.ProtocolDM:
+				case l7.ProtocolMysql, l7.ProtocolMariaDB, l7.ProtocolTiDB, l7.ProtocolPostgres, l7.ProtocolDM:
 					buildSQLMapEvent(&mNode, event)
 				case l7.ProtocolRedis, l7.ProtocolMemcached, l7.ProtocolCassandra, l7.ProtocolES:
 					buildNoSqlMapEvent(&mNode, event)

+ 2 - 0
pkg/go.opentelemetry.io/otel/semconv/v1.18.0/trace.go

@@ -474,6 +474,8 @@ var (
 	DBSystemSpanner = DBSystemKey.String("spanner")
 	// DaMengDB
 	DBSystemDaMengDB = DBSystemKey.String("dameng")
+	// TiDB
+	DBSystemTiDB = DBSystemKey.String("tidb")
 )
 
 // DBConnectionString returns an attribute KeyValue conforming to the