|
|
@@ -4,7 +4,9 @@ import (
|
|
|
"crypto/md5"
|
|
|
"encoding/json"
|
|
|
"fmt"
|
|
|
- "os"
|
|
|
+ . "github.com/coroot/coroot-node-agent/ebpftracer"
|
|
|
+ "github.com/coroot/coroot-node-agent/ebpftracer/l7"
|
|
|
+ "github.com/coroot/coroot-node-agent/utils"
|
|
|
"sort"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
@@ -143,12 +145,9 @@ func tracetransformData(sdl []tracesdk.ReadOnlySpan) map[int][]RootDataT {
|
|
|
fmt.Println("------event_num---- "+sd.Name(), "--->", len(sd.Events())) // 一次请求完整数据
|
|
|
// 构建map *RootDataT
|
|
|
var rootData RootDataT
|
|
|
- // todo 应用注册逻辑
|
|
|
- if os.Getenv("JAVA") == "1" {
|
|
|
- rootData = initRootDataJava()
|
|
|
- } else {
|
|
|
- rootData = initRootDataFromEvent()
|
|
|
- }
|
|
|
+
|
|
|
+ rootData = initRootDataFromEvent()
|
|
|
+
|
|
|
// build http入口 MapInfoT
|
|
|
code_type := buildAppMapFromEvent(&rootData, sd)
|
|
|
// 构建maps
|
|
|
@@ -156,20 +155,17 @@ func tracetransformData(sdl []tracesdk.ReadOnlySpan) map[int][]RootDataT {
|
|
|
aaa, _ := json.Marshal(event)
|
|
|
fmt.Println("event.info", string(aaa))
|
|
|
mNode := buildMapNodeFromEvent(event)
|
|
|
- switch event.EventType {
|
|
|
+ switch EventType(event.EventType) {
|
|
|
// stack
|
|
|
- case 11:
|
|
|
+ case EventTypeFunEnt:
|
|
|
// l7 event
|
|
|
- case 10:
|
|
|
- switch event.ProtocolType {
|
|
|
- // http
|
|
|
- case 1:
|
|
|
+ case EventTypeL7Request:
|
|
|
+ switch l7.Protocol(event.ProtocolType) {
|
|
|
+ case l7.ProtocolHTTP:
|
|
|
buildHttpMapFromEvent(&mNode, event)
|
|
|
- // mysql
|
|
|
- case 5:
|
|
|
+ case l7.ProtocolMysql:
|
|
|
buildMysqlMapEvent(&mNode, event)
|
|
|
- // redis
|
|
|
- case 3:
|
|
|
+ case l7.ProtocolRedis:
|
|
|
buildRedisMapEvent(&mNode, event)
|
|
|
}
|
|
|
}
|
|
|
@@ -344,70 +340,71 @@ func buildLevelFromEvent(sdl *RootDataT) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func initRootData(traceId string) RootDataT {
|
|
|
- data := RootDataT{
|
|
|
- AccountId: 110,
|
|
|
- AgentId: 1011005252979954, // TODO 更新 基于 ip:port + process_name + exe路径生成
|
|
|
- AgentVersion: "2.1.0",
|
|
|
- AppId: 5410049101545798, // TODO 更新 基于appname生成
|
|
|
- AppIdFrom: -1,
|
|
|
- AppName: "eBPF-agent", // TODO 更新 ip:port || process_name
|
|
|
- CalledId: -1,
|
|
|
- ClientIp: "",
|
|
|
- CollTime: 0,
|
|
|
- Cpu: 0,
|
|
|
- Custom: "",
|
|
|
- HostId: 10154813500555812,
|
|
|
- HostName: "localhost",
|
|
|
- HttpCode: 0,
|
|
|
- HttpMethod: "",
|
|
|
- InstanceId: 1005051101515357, // TODO 更新 基于ip:port
|
|
|
- InstanceIdFrom: -1,
|
|
|
- Maps: []MapInfoT{},
|
|
|
- MemU: 0,
|
|
|
- MemUP: 0,
|
|
|
- OperType: "",
|
|
|
- Parameters: []interface{}{},
|
|
|
- ParentTaskName: 0,
|
|
|
- Period: -1,
|
|
|
- RespTime: 0,
|
|
|
- Sampling: 0,
|
|
|
- ServiceName: "GO",
|
|
|
- ServiceType: APP_SERVICE_TYPE,
|
|
|
- Sip: "",
|
|
|
- Sn: "",
|
|
|
- SpanIdFrom: "",
|
|
|
- Sport: 0,
|
|
|
- TId: -1,
|
|
|
- TName: "",
|
|
|
- TraceId: traceId,
|
|
|
- TransIds: []interface{}{},
|
|
|
- TypeFrom: "",
|
|
|
- Uri: "",
|
|
|
- UserDir: 0,
|
|
|
- VipIds: []interface{}{},
|
|
|
- }
|
|
|
- return data
|
|
|
-}
|
|
|
+//func initRootData(traceId string) RootDataT {
|
|
|
+// data := RootDataT{
|
|
|
+// AccountId: 110,
|
|
|
+// AgentId: 1011005252979954, // TODO 更新 基于 ip:port + process_name + exe路径生成
|
|
|
+// AgentVersion: "2.1.0",
|
|
|
+// AppId: 5410049101545798, // TODO 更新 基于appname生成
|
|
|
+// AppIdFrom: -1,
|
|
|
+// AppName: "eBPF-agent", // TODO 更新 ip:port || process_name
|
|
|
+// CalledId: -1,
|
|
|
+// ClientIp: "",
|
|
|
+// CollTime: 0,
|
|
|
+// Cpu: 0,
|
|
|
+// Custom: "",
|
|
|
+// HostId: 10154813500555812,
|
|
|
+// HostName: "localhost",
|
|
|
+// HttpCode: 0,
|
|
|
+// HttpMethod: "",
|
|
|
+// InstanceId: 1005051101515357, // TODO 更新 基于ip:port
|
|
|
+// InstanceIdFrom: -1,
|
|
|
+// Maps: []MapInfoT{},
|
|
|
+// MemU: 0,
|
|
|
+// MemUP: 0,
|
|
|
+// OperType: "",
|
|
|
+// Parameters: []interface{}{},
|
|
|
+// ParentTaskName: 0,
|
|
|
+// Period: -1,
|
|
|
+// RespTime: 0,
|
|
|
+// Sampling: 0,
|
|
|
+// ServiceName: "GO",
|
|
|
+// ServiceType: APP_SERVICE_TYPE,
|
|
|
+// Sip: "",
|
|
|
+// Sn: "",
|
|
|
+// SpanIdFrom: "",
|
|
|
+// Sport: 0,
|
|
|
+// TId: -1,
|
|
|
+// TName: "",
|
|
|
+// TraceId: traceId,
|
|
|
+// TransIds: []interface{}{},
|
|
|
+// TypeFrom: "",
|
|
|
+// Uri: "",
|
|
|
+// UserDir: 0,
|
|
|
+// VipIds: []interface{}{},
|
|
|
+// }
|
|
|
+// return data
|
|
|
+//}
|
|
|
|
|
|
func initRootDataFromEvent() RootDataT {
|
|
|
+ hostID, _ := utils.GetHostID()
|
|
|
data := RootDataT{
|
|
|
AccountId: 110,
|
|
|
- AgentId: 1011005252979954, // TODO 更新 基于 ip:port + process_name + exe路径生成
|
|
|
+ AgentId: 0, // 基于 ip:port + process_name + exe路径生成
|
|
|
AgentVersion: "2.1.0",
|
|
|
- AppId: 5410049101545798, // TODO 更新 基于appname生成
|
|
|
+ AppId: 0, // 基于appname生成
|
|
|
AppIdFrom: -1,
|
|
|
- AppName: "eBPF-agent", // TODO 更新 ip:port || process_name
|
|
|
+ AppName: "eBPF-agent", // server配置
|
|
|
CalledId: -1,
|
|
|
ClientIp: "",
|
|
|
CollTime: 0,
|
|
|
Cpu: 0,
|
|
|
Custom: "",
|
|
|
- HostId: 10154813500555812,
|
|
|
+ HostId: hostID,
|
|
|
HostName: "localhost",
|
|
|
HttpCode: 0,
|
|
|
HttpMethod: "",
|
|
|
- InstanceId: 1005051101515357, // TODO 更新 基于ip:port
|
|
|
+ InstanceId: 0, // 基于ip:port
|
|
|
InstanceIdFrom: -1,
|
|
|
Maps: []MapInfoT{},
|
|
|
MemU: 0,
|
|
|
@@ -418,7 +415,7 @@ func initRootDataFromEvent() RootDataT {
|
|
|
Period: -1,
|
|
|
RespTime: 0,
|
|
|
Sampling: 0,
|
|
|
- ServiceName: "GO",
|
|
|
+ ServiceName: "",
|
|
|
ServiceType: APP_SERVICE_TYPE,
|
|
|
Sip: "",
|
|
|
Sn: "",
|
|
|
@@ -561,25 +558,25 @@ func buildMapNodeFromEvent(event tracesdk.Event) MapInfoT {
|
|
|
}
|
|
|
|
|
|
// 构建拼装
|
|
|
-func buildAndAssemblyMap(sd apmTraceSpan, traceRoot *TraceMapT) MapInfoT {
|
|
|
- mNode, mapType := initMapNode(span(sd))
|
|
|
- switch mapType {
|
|
|
- case "APPLICATION":
|
|
|
- buildAppMap(&mNode, traceRoot, sd)
|
|
|
- traceRoot.TheEnd = true
|
|
|
- case "HTTP":
|
|
|
- buildHttpMap(&mNode, sd)
|
|
|
- case "Mysql":
|
|
|
- buildMysqlMap(&mNode, sd)
|
|
|
- case "Redis":
|
|
|
- buildRedisMap(&mNode, sd)
|
|
|
- }
|
|
|
- if mapType != "" {
|
|
|
- mNode.Nid = traceRoot.Index
|
|
|
- traceRoot.RootData.Maps = append(traceRoot.RootData.Maps, mNode)
|
|
|
- }
|
|
|
- return mNode
|
|
|
-}
|
|
|
+//func buildAndAssemblyMap(sd apmTraceSpan, traceRoot *TraceMapT) MapInfoT {
|
|
|
+// mNode, mapType := initMapNode(span(sd))
|
|
|
+// switch mapType {
|
|
|
+// case "APPLICATION":
|
|
|
+// buildAppMap(&mNode, traceRoot, sd)
|
|
|
+// traceRoot.TheEnd = true
|
|
|
+// case "HTTP":
|
|
|
+// buildHttpMap(&mNode, sd)
|
|
|
+// case "Mysql":
|
|
|
+// buildMysqlMap(&mNode, sd)
|
|
|
+// case "Redis":
|
|
|
+// buildRedisMap(&mNode, sd)
|
|
|
+// }
|
|
|
+// if mapType != "" {
|
|
|
+// mNode.Nid = traceRoot.Index
|
|
|
+// traceRoot.RootData.Maps = append(traceRoot.RootData.Maps, mNode)
|
|
|
+// }
|
|
|
+// return mNode
|
|
|
+//}
|
|
|
|
|
|
//func buildAndAssemblyMapFromEvent(event tracesdk.Event, traceRoot *RootDataT) MapInfoT {
|
|
|
// mNode := buildMapNodeFromEvent(event)
|
|
|
@@ -598,49 +595,49 @@ func buildAndAssemblyMap(sd apmTraceSpan, traceRoot *TraceMapT) MapInfoT {
|
|
|
// return mNode
|
|
|
//}
|
|
|
|
|
|
-func buildAppMap(mNode *MapInfoT, traceRoot *TraceMapT, sd apmTraceSpan) {
|
|
|
- mNode.ServiceName = GO_SERVICE_NAME
|
|
|
- mNode.ServiceType = APP_SERVICE_TYPE
|
|
|
- mNode.MethodName = "net/http.(*Transport).roundTrip()"
|
|
|
- mNode.Level = 1
|
|
|
- mNode.Pid = 0
|
|
|
- mNode.Nid = 1
|
|
|
- // 构建root节点
|
|
|
- traceRoot.RootData.RespTime = mNode.PureTime
|
|
|
- traceRoot.RootData.CollTime = mNode.StartTime
|
|
|
- traceRoot.Index = 1
|
|
|
- for _, attr := range sd.Attributes() {
|
|
|
- fmt.Println(attr.Key, ":", attr.Value.AsInterface())
|
|
|
- switch attr.Key {
|
|
|
- case "http.uri":
|
|
|
- traceRoot.RootData.Uri = attr.Value.AsString()
|
|
|
- case "http.method":
|
|
|
- traceRoot.RootData.HttpMethod = attr.Value.AsString()
|
|
|
- case "http.status_code":
|
|
|
- traceRoot.RootData.HttpCode = attr.Value.AsInt64()
|
|
|
- case "net.peer.name":
|
|
|
- traceRoot.RootData.ClientIp = attr.Value.AsString()
|
|
|
- traceRoot.RootData.Sip = attr.Value.AsString()
|
|
|
- traceRoot.RootData.Sn = attr.Value.AsString()
|
|
|
- case "net.peer.port":
|
|
|
- traceRoot.RootData.Sport = attr.Value.AsInt64()
|
|
|
- traceRoot.RootData.LocalPort = attr.Value.AsInt64()
|
|
|
- case "server.trace_id_from":
|
|
|
- traceRoot.RootData.TraceId = attr.Value.AsString()
|
|
|
- case "server.called_id":
|
|
|
- traceRoot.RootData.CalledId = attr.Value.AsInt64()
|
|
|
- case "server.instance_id_from":
|
|
|
- traceRoot.RootData.InstanceIdFrom = attr.Value.AsInt64()
|
|
|
- case "server.app_id_from":
|
|
|
- traceRoot.RootData.AppIdFrom = attr.Value.AsInt64()
|
|
|
- case "server.span_id_from":
|
|
|
- traceRoot.RootData.SpanIdFrom = attr.Value.AsString()
|
|
|
- case "server.type_from":
|
|
|
- traceRoot.RootData.TypeFrom = attr.Value.AsString()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
+//func buildAppMap(mNode *MapInfoT, traceRoot *TraceMapT, sd apmTraceSpan) {
|
|
|
+// mNode.ServiceName = GO_SERVICE_NAME
|
|
|
+// mNode.ServiceType = APP_SERVICE_TYPE
|
|
|
+// mNode.MethodName = "net/http.(*Transport).roundTrip()"
|
|
|
+// mNode.Level = 1
|
|
|
+// mNode.Pid = 0
|
|
|
+// mNode.Nid = 1
|
|
|
+// // 构建root节点
|
|
|
+// traceRoot.RootData.RespTime = mNode.PureTime
|
|
|
+// traceRoot.RootData.CollTime = mNode.StartTime
|
|
|
+// traceRoot.Index = 1
|
|
|
+// for _, attr := range sd.Attributes() {
|
|
|
+// fmt.Println(attr.Key, ":", attr.Value.AsInterface())
|
|
|
+// switch attr.Key {
|
|
|
+// case "http.uri":
|
|
|
+// traceRoot.RootData.Uri = attr.Value.AsString()
|
|
|
+// case "http.method":
|
|
|
+// traceRoot.RootData.HttpMethod = attr.Value.AsString()
|
|
|
+// case "http.status_code":
|
|
|
+// traceRoot.RootData.HttpCode = attr.Value.AsInt64()
|
|
|
+// case "net.peer.name":
|
|
|
+// traceRoot.RootData.ClientIp = attr.Value.AsString()
|
|
|
+// traceRoot.RootData.Sip = attr.Value.AsString()
|
|
|
+// traceRoot.RootData.Sn = attr.Value.AsString()
|
|
|
+// case "net.peer.port":
|
|
|
+// traceRoot.RootData.Sport = attr.Value.AsInt64()
|
|
|
+// traceRoot.RootData.LocalPort = attr.Value.AsInt64()
|
|
|
+// case "server.trace_id_from":
|
|
|
+// traceRoot.RootData.TraceId = attr.Value.AsString()
|
|
|
+// case "server.called_id":
|
|
|
+// traceRoot.RootData.CalledId = attr.Value.AsInt64()
|
|
|
+// case "server.instance_id_from":
|
|
|
+// traceRoot.RootData.InstanceIdFrom = attr.Value.AsInt64()
|
|
|
+// case "server.app_id_from":
|
|
|
+// traceRoot.RootData.AppIdFrom = attr.Value.AsInt64()
|
|
|
+// case "server.span_id_from":
|
|
|
+// traceRoot.RootData.SpanIdFrom = attr.Value.AsString()
|
|
|
+// case "server.type_from":
|
|
|
+// traceRoot.RootData.TypeFrom = attr.Value.AsString()
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+//}
|
|
|
|
|
|
func buildAppMapFromEvent(traceRoot *RootDataT, sd apmTraceSpan) int {
|
|
|
mNode := MapInfoT{
|
|
|
@@ -705,37 +702,48 @@ func buildAppMapFromEvent(traceRoot *RootDataT, sd apmTraceSpan) int {
|
|
|
mNode.WallTime = uint64(attr.Value.AsInt64()) / 1e3
|
|
|
case "server.code_type":
|
|
|
code_type = attr.Value.AsInt64()
|
|
|
+ case "server.app_name":
|
|
|
+ traceRoot.AppName = attr.Value.AsString()
|
|
|
+ case "server.service_name":
|
|
|
+ traceRoot.ServiceName = attr.Value.AsString()
|
|
|
+ mNode.ServiceName = attr.Value.AsString()
|
|
|
+ case "server.app_id":
|
|
|
+ traceRoot.AppId = attr.Value.AsInt64()
|
|
|
+ case "server.agent_id":
|
|
|
+ traceRoot.AgentId = attr.Value.AsInt64()
|
|
|
+ case "server.instance_id":
|
|
|
+ traceRoot.InstanceId = attr.Value.AsInt64()
|
|
|
}
|
|
|
}
|
|
|
traceRoot.Maps = append(traceRoot.Maps, mNode)
|
|
|
return int(code_type)
|
|
|
}
|
|
|
|
|
|
-func buildHttpMap(mNode *MapInfoT, sd apmTraceSpan) {
|
|
|
- mNode.ServiceName = HTTP_SERVICE_NAME
|
|
|
- mNode.ServiceType = HTTP_SERVICE_TYPE
|
|
|
- mNode.Schema = "http"
|
|
|
- mNode.MethodName = "net/http.serverHandler.ServeHTTP()"
|
|
|
- var descAddr string
|
|
|
- for _, attr := range sd.Attributes() {
|
|
|
- //fmt.Println(attr.Key, ":", attr.Value.AsInterface())
|
|
|
- switch attr.Key {
|
|
|
- case "http.ip":
|
|
|
- mNode.Ip = attr.Value.AsString()
|
|
|
- descAddr += mNode.Ip
|
|
|
- case "http.port":
|
|
|
- mNode.Port = attr.Value.AsInt64()
|
|
|
- descAddr += ":" + attr.Value.AsString()
|
|
|
- case "http.uri":
|
|
|
- mNode.Uri = attr.Value.AsString()
|
|
|
- case "http.assumed_app_id":
|
|
|
- mNode.AssumedAppId = attr.Value.AsInt64()
|
|
|
- case "http.span_id":
|
|
|
- mNode.SpanId = attr.Value.AsString()
|
|
|
- }
|
|
|
- }
|
|
|
- //mNode.AssumedAppId = Md5ToInt64(descAddr, 16)
|
|
|
-}
|
|
|
+//func buildHttpMap(mNode *MapInfoT, sd apmTraceSpan) {
|
|
|
+// mNode.ServiceName = HTTP_SERVICE_NAME
|
|
|
+// mNode.ServiceType = HTTP_SERVICE_TYPE
|
|
|
+// mNode.Schema = "http"
|
|
|
+// mNode.MethodName = "net/http.serverHandler.ServeHTTP()"
|
|
|
+// var descAddr string
|
|
|
+// for _, attr := range sd.Attributes() {
|
|
|
+// //fmt.Println(attr.Key, ":", attr.Value.AsInterface())
|
|
|
+// switch attr.Key {
|
|
|
+// case "http.ip":
|
|
|
+// mNode.Ip = attr.Value.AsString()
|
|
|
+// descAddr += mNode.Ip
|
|
|
+// case "http.port":
|
|
|
+// mNode.Port = attr.Value.AsInt64()
|
|
|
+// descAddr += ":" + attr.Value.AsString()
|
|
|
+// case "http.uri":
|
|
|
+// mNode.Uri = attr.Value.AsString()
|
|
|
+// case "http.assumed_app_id":
|
|
|
+// mNode.AssumedAppId = attr.Value.AsInt64()
|
|
|
+// case "http.span_id":
|
|
|
+// mNode.SpanId = attr.Value.AsString()
|
|
|
+// }
|
|
|
+// }
|
|
|
+// //mNode.AssumedAppId = Md5ToInt64(descAddr, 16)
|
|
|
+//}
|
|
|
|
|
|
func buildHttpMapFromEvent(mNode *MapInfoT, event tracesdk.Event) {
|
|
|
mNode.ServiceName = HTTP_SERVICE_NAME
|
|
|
@@ -770,28 +778,28 @@ func buildHttpMapFromEvent(mNode *MapInfoT, event tracesdk.Event) {
|
|
|
//mNode.AssumedAppId = Md5ToInt64(descAddr, 16)
|
|
|
}
|
|
|
|
|
|
-func buildMysqlMap(mNode *MapInfoT, sd apmTraceSpan) {
|
|
|
- mNode.Dbn = "unknown"
|
|
|
- mNode.ServiceName = MYSQL_SERVICE_NAME
|
|
|
- mNode.ServiceType = SQL_SERVICE_TYPE
|
|
|
- mNode.MethodName = "database/sql.Query()"
|
|
|
- for _, attr := range sd.Attributes() {
|
|
|
- //fmt.Println(attr.Key, ":", attr.Value.AsInterface())
|
|
|
- switch attr.Key {
|
|
|
- case "net.peer.name":
|
|
|
- mNode.Ip = attr.Value.AsString()
|
|
|
- case "net.peer.port":
|
|
|
- mNode.Port = attr.Value.AsInt64()
|
|
|
- case "db.statement":
|
|
|
- query := attr.Value.AsString()
|
|
|
- mNode.Ps = []string{query}
|
|
|
- words := strings.Fields(query)
|
|
|
- if len(words) > 0 {
|
|
|
- mNode.OperType = strings.ToUpper(words[0])
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
+//func buildMysqlMap(mNode *MapInfoT, sd apmTraceSpan) {
|
|
|
+// mNode.Dbn = "unknown"
|
|
|
+// mNode.ServiceName = MYSQL_SERVICE_NAME
|
|
|
+// mNode.ServiceType = SQL_SERVICE_TYPE
|
|
|
+// mNode.MethodName = "database/sql.Query()"
|
|
|
+// for _, attr := range sd.Attributes() {
|
|
|
+// //fmt.Println(attr.Key, ":", attr.Value.AsInterface())
|
|
|
+// switch attr.Key {
|
|
|
+// case "net.peer.name":
|
|
|
+// mNode.Ip = attr.Value.AsString()
|
|
|
+// case "net.peer.port":
|
|
|
+// mNode.Port = attr.Value.AsInt64()
|
|
|
+// case "db.statement":
|
|
|
+// query := attr.Value.AsString()
|
|
|
+// mNode.Ps = []string{query}
|
|
|
+// words := strings.Fields(query)
|
|
|
+// if len(words) > 0 {
|
|
|
+// mNode.OperType = strings.ToUpper(words[0])
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+//}
|
|
|
|
|
|
func buildMysqlMapEvent(mNode *MapInfoT, event tracesdk.Event) {
|
|
|
mNode.Dbn = "unknown"
|