Bladeren bron

Feature #TASK_QT-18250 MariaDB适配

Carl 7 maanden geleden
bovenliggende
commit
717e65e934

+ 7 - 1
containers/container_apm.go

@@ -231,9 +231,15 @@ func (c *Container) onL7RequestApm(pid uint32, fd uint64, timestamp uint64, r *l
 			//fmt.Println("ok:", ok)
 			//fmt.Println("ok:", ok)
 			//fmt.Println("traceMap:", len(c.traceMap))
 			//fmt.Println("traceMap:", len(c.traceMap))
 			if err == nil {
 			if err == nil {
+				dbSystem := semconv.DBSystemMySQL
+				// 根据端口白名单确定协议类型
+				l7Type := flags.GetProtocolByPort(uint16(conn.ActualDest.Port()))
+				if l7Type == l7.ProtocolMariaDB {
+					dbSystem = semconv.DBSystemMariaDB
+				}
 				//apmTrace.MysqlTraceQuery(query, r.Status.Error(), r.Duration, conn.ActualDest)
 				//apmTrace.MysqlTraceQuery(query, r.Status.Error(), r.Duration, conn.ActualDest)
 				//apmTrace.MysqlTraceQueryEvent(query, r, conn.ActualDest)
 				//apmTrace.MysqlTraceQueryEvent(query, r, conn.ActualDest)
-				apmTrace.SQLTraceQueryEvent(l7.ProtocolMysql, semconv.DBSystemMySQL, query, r, conn.ActualDest)
+				apmTrace.SQLTraceQueryEvent(l7Type, dbSystem, query, r, conn.ActualDest)
 				c.SendEvent(apmTrace, r.TraceId)
 				c.SendEvent(apmTrace, r.TraceId)
 			}
 			}
 		}
 		}

+ 5 - 0
ebpftracer/l7/l7.go

@@ -25,6 +25,7 @@ const (
 	ProtocolDubbo2    Protocol = 12
 	ProtocolDubbo2    Protocol = 12
 	ProtocolDNS       Protocol = 13
 	ProtocolDNS       Protocol = 13
 	ProtocolDM        Protocol = 14
 	ProtocolDM        Protocol = 14
+	ProtocolMariaDB   Protocol = 15
 )
 )
 
 
 func (p Protocol) Int() int {
 func (p Protocol) Int() int {
@@ -63,6 +64,8 @@ func (p Protocol) String() string {
 		return "DNS"
 		return "DNS"
 	case ProtocolDM:
 	case ProtocolDM:
 		return "DM"
 		return "DM"
+	case ProtocolMariaDB:
+		return "Mariadb"
 	}
 	}
 	return "UNKNOWN:" + strconv.Itoa(int(p))
 	return "UNKNOWN:" + strconv.Itoa(int(p))
 }
 }
@@ -99,6 +102,8 @@ func (p Protocol) ServiceNameString() string {
 		return "DNS"
 		return "DNS"
 	case ProtocolDM:
 	case ProtocolDM:
 		return "DM"
 		return "DM"
+	case ProtocolMariaDB:
+		return "MARIA"
 	}
 	}
 	return "UNKNOWN:" + strconv.Itoa(int(p))
 	return "UNKNOWN:" + strconv.Itoa(int(p))
 }
 }

+ 10 - 0
flags/flags.go

@@ -68,6 +68,13 @@ var (
 	FuseTryMax        = kingpin.Flag("fuse_try_max", "The maximum number of the fuse operation try").Default("3").Envar("FUSE_TRY_MAX").Int()
 	FuseTryMax        = kingpin.Flag("fuse_try_max", "The maximum number of the fuse operation try").Default("3").Envar("FUSE_TRY_MAX").Int()
 	// debug
 	// debug
 	Test = kingpin.Flag("test", "Only test").Default("false").Envar("TEST").Bool()
 	Test = kingpin.Flag("test", "Only test").Default("false").Envar("TEST").Bool()
+
+	// l7
+	MysqlDefault = kingpin.Flag("mysql-default", "Default MySQL protocol when port-based detection fails").Envar("MYSQL_DEFAULT").Default("mysql").String()
+
+	// 端口白名单配置
+	MysqlPortWhitelist   = kingpin.Flag("mysql-ports", "Comma-separated list of ports to identify as MySQL").Envar("MYSQL_PORTS").Default("3306").String()
+	MariadbPortWhitelist = kingpin.Flag("mariadb-ports", "Comma-separated list of ports to identify as MariaDB").Envar("MARIADB_PORTS").Default("3307").String()
 )
 )
 
 
 var AgentName = "euspace"
 var AgentName = "euspace"
@@ -171,6 +178,9 @@ func init() {
 	} else {
 	} else {
 		*HostDirPathPrefix = ""
 		*HostDirPathPrefix = ""
 	}
 	}
+
+	// 初始化端口白名单
+	InitPortWhitelists()
 }
 }
 
 
 func ShowVersion() {
 func ShowVersion() {

+ 69 - 0
flags/port_whitelist.go

@@ -0,0 +1,69 @@
+package flags
+
+import (
+	"github.com/coroot/coroot-node-agent/ebpftracer/l7"
+	"strconv"
+	"strings"
+)
+
+// 端口白名单数据结构
+type PortWhitelist struct {
+	Ports map[uint16]bool
+}
+
+// 全局端口白名单实例
+var (
+	MysqlPorts   *PortWhitelist
+	MariadbPorts *PortWhitelist
+)
+
+// 创建端口白名单
+func NewPortWhitelist(portList string) *PortWhitelist {
+	whitelist := &PortWhitelist{
+		Ports: make(map[uint16]bool),
+	}
+
+	if portList == "" {
+		return whitelist
+	}
+
+	ports := strings.Split(portList, ",")
+	for _, portStr := range ports {
+		portStr = strings.TrimSpace(portStr)
+		if port, err := strconv.ParseUint(portStr, 10, 16); err == nil {
+			whitelist.Ports[uint16(port)] = true
+		}
+	}
+
+	return whitelist
+}
+
+// 检查端口是否在白名单中
+func (pw *PortWhitelist) Contains(port uint16) bool {
+	if pw == nil {
+		return false
+	}
+	return pw.Ports[port]
+}
+
+// 获取协议类型(基于端口白名单)
+func GetProtocolByPort(port uint16) l7.Protocol {
+	if MysqlPorts != nil && MysqlPorts.Contains(port) {
+		return l7.ProtocolMysql
+	}
+	if MariadbPorts != nil && MariadbPorts.Contains(port) {
+		return l7.ProtocolMariaDB
+	}
+	// 如果端口不在白名单中,返回默认协议
+	if *MysqlDefault == "mariadb" {
+		return l7.ProtocolMariaDB
+	}
+
+	return l7.ProtocolMysql
+}
+
+// 初始化端口白名单
+func InitPortWhitelists() {
+	MysqlPorts = NewPortWhitelist(*MysqlPortWhitelist)
+	MariadbPorts = NewPortWhitelist(*MariadbPortWhitelist)
+}

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

@@ -184,17 +184,12 @@ func tracetransformData(sdl []tracesdk.ReadOnlySpan) map[int][]RootDataT {
 					buildHttpMapFromEvent(&mNode, event)
 					buildHttpMapFromEvent(&mNode, event)
 				case l7.ProtocolDNS:
 				case l7.ProtocolDNS:
 					buildDNSMapEvent(&mNode, event)
 					buildDNSMapEvent(&mNode, event)
-				case l7.ProtocolMysql:
+				case l7.ProtocolMysql, l7.ProtocolMariaDB, l7.ProtocolPostgres, l7.ProtocolDM:
 					buildSQLMapEvent(&mNode, event)
 					buildSQLMapEvent(&mNode, event)
 				case l7.ProtocolRedis:
 				case l7.ProtocolRedis:
 					buildRedisMapEvent(&mNode, event)
 					buildRedisMapEvent(&mNode, event)
 				case l7.ProtocolMongo:
 				case l7.ProtocolMongo:
 					buildMongoMapEvent(&mNode, event)
 					buildMongoMapEvent(&mNode, event)
-				// dm
-				case l7.ProtocolDM:
-					buildSQLMapEvent(&mNode, event)
-				case l7.ProtocolPostgres:
-					buildSQLMapEvent(&mNode, event)
 				}
 				}
 			}
 			}