apm_exporter.go 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379
  1. package otlptrace
  2. import (
  3. "crypto/md5"
  4. "encoding/json"
  5. "fmt"
  6. "math"
  7. "net/url"
  8. "sort"
  9. "strconv"
  10. "sync"
  11. . "github.com/coroot/coroot-node-agent/ebpftracer"
  12. "github.com/coroot/coroot-node-agent/ebpftracer/l7"
  13. "github.com/coroot/coroot-node-agent/utils"
  14. klog "github.com/sirupsen/logrus"
  15. "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform"
  16. tracesdk "go.opentelemetry.io/otel/sdk/trace"
  17. tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
  18. )
  19. const (
  20. APP_SERVICE_TYPE = "APPLICATION"
  21. SQL_SERVICE_TYPE = "SQL"
  22. NOSQL_SERVICE_TYPE = "NOSQL"
  23. HTTP_SERVICE_TYPE = "HTTP"
  24. NET_SERVICE_TYPE = "L7_NET"
  25. RPC_SERVICE_TYPE = "RPC"
  26. MQ_SERVICE_TYPE = "MQ"
  27. )
  28. const (
  29. GO_SERVICE_NAME = "GO"
  30. MYSQL_SERVICE_NAME = "MYSQL"
  31. DM_SERVICE_NAME = "DM"
  32. REDIS_SERVICE_NAME = "REDIS"
  33. MONGO_SERVICE_NAME = "MONGODB"
  34. HTTP_SERVICE_NAME = "HTTPCLIENT"
  35. POSTGRESQL_SERVICE_NAME = "POSTGRESQL"
  36. GRPC_SERVICE_NAME = "GRPC"
  37. )
  38. type apmTraceSpan tracesdk.ReadOnlySpan
  39. // GO:0:10154813500555812:5450531005555981:5610250100539899:ee022542c3940f1b:1001025098564810:888ceb3df1bdbe2c:110
  40. type RootDataT struct {
  41. AccountId int `json:"account_id"`
  42. AgentId int64 `json:"agent_id"`
  43. AgentVersion string `json:"agent_version"`
  44. AppId int64 `json:"app_id"`
  45. AppIdFrom int64 `json:"app_id_from"` // from header app_id
  46. AppName string `json:"app_name"`
  47. CalledId int64 `json:"called_id"` // from header assumed_app_id
  48. ClientIp string `json:"client_ip"`
  49. CollTime uint64 `json:"coll_time"`
  50. Cpu int `json:"cpu"`
  51. Custom string `json:"custom"`
  52. HostId int64 `json:"host_id"`
  53. HostName string `json:"host_name"`
  54. HttpCode int64 `json:"http_code"`
  55. HttpMethod string `json:"http_method"`
  56. InstanceId int64 `json:"instance_id"`
  57. InstanceIdFrom int64 `json:"instance_id_from"` // from header instance_id
  58. LocalPort int64 `json:"local_port"`
  59. Maps []MapInfoT `json:"maps"`
  60. MemU int `json:"mem_u"`
  61. MemUP int `json:"mem_u_p"`
  62. OperType string `json:"oper_type"`
  63. Parameters []ParamStruct `json:"parameters,omitempty"`
  64. ParentTaskName string `json:"parent_task_name"`
  65. Period int `json:"period"`
  66. RespTime uint64 `json:"resp_time"`
  67. Sampling int `json:"sampling"`
  68. ServiceName string `json:"service_name"`
  69. ServiceType string `json:"service_type"`
  70. Sip string `json:"sip"`
  71. Sn string `json:"sn"`
  72. SpanIdFrom string `json:"span_id_from"` // from header span_id
  73. Sport int64 `json:"sport"`
  74. TId int `json:"t_id"`
  75. TName string `json:"t_name"`
  76. TraceId string `json:"trace_id"` // from header trace_id
  77. TransIds []interface{} `json:"trans_ids"`
  78. TypeFrom string `json:"type_from"`
  79. Uri string `json:"uri"`
  80. UserDir string `json:"user_dir"`
  81. VipIds []interface{} `json:"vip_ids"`
  82. SrcAddr string `json:"src_addr"`
  83. DestinationAddr string `json:"destination_addr"`
  84. UserAgent string `json:"user_agent"`
  85. // op 新增字段
  86. Pid uint32 `json:"pid"`
  87. ContainerID string `json:"container_id"`
  88. Sys string `json:"sys"`
  89. SystemUUID string `json:"system_uuid"`
  90. ParentSys string `json:"parent_sys"` // from cwother header: SysTag
  91. AppNameFrom string `json:"app_name_from"` // from cwother header: app_name
  92. ServiceTypeFrom string `json:"service_type_from"` // from cwother header: appServiceType
  93. }
  94. // ParamStruct 定义目标结构
  95. type ParamStruct struct {
  96. Name string `json:"name"`
  97. Values []string `json:"values"`
  98. }
  99. type MapInfoT struct {
  100. Dbn string `json:"dbn,omitempty"`
  101. Exception int `json:"exception,omitempty"`
  102. ExceptionMsg string `json:"exception_msg,omitempty"`
  103. ExceptionStack string `json:"exception_stack,omitempty"`
  104. Ip string `json:"ip,omitempty"`
  105. Level int `json:"level"`
  106. MethodDesc string `json:"method_desc,omitempty"`
  107. MethodName string `json:"method_name"`
  108. Nid int `json:"nid"`
  109. OperType string `json:"oper_type,omitempty"`
  110. Pid int `json:"pid"`
  111. Port int64 `json:"port,omitempty"`
  112. Ps []string `json:"ps,omitempty"`
  113. PureTime uint64 `json:"pure_time"`
  114. ServiceName string `json:"service_name"`
  115. ServiceType string `json:"service_type"`
  116. StartTime uint64 `json:"-"`
  117. EndTime uint64 `json:"-"`
  118. StartTimeMs uint64 `json:"start_time"`
  119. EndTimeMs uint64 `json:"end_time"`
  120. WallTime uint64 `json:"wall_time"`
  121. Schema string `json:"schema,omitempty"`
  122. AssumedAppId int64 `json:"assumed_app_id,omitempty"`
  123. Uri string `json:"uri,omitempty"`
  124. SpanId string `json:"span_id,omitempty"`
  125. SrcAddr string `json:"src_addr,omitempty"`
  126. DestinationAddr string `json:"destination_addr,omitempty"`
  127. }
  128. type TraceMapT struct {
  129. RootData RootDataT
  130. Index int
  131. lock *sync.RWMutex
  132. TheEnd bool
  133. }
  134. var TraceRootMap map[string]*TraceMapT
  135. func init() {
  136. TraceRootMap = make(map[string]*TraceMapT)
  137. //go func() {
  138. // for {
  139. // //fmt.Println(G_sdl)
  140. // time.Sleep(5 * time.Second)
  141. // }
  142. //}()
  143. }
  144. var G_sdl int
  145. func tracetransformData(sdl []tracesdk.ReadOnlySpan) map[int][]RootDataT {
  146. //G_sdl += len(sdl)
  147. if len(sdl) == 0 {
  148. return nil
  149. }
  150. // 多次请求 sdl
  151. sendDataMap := make(map[int][]RootDataT)
  152. //sendData := []RootDataT{}
  153. for _, sd := range sdl {
  154. if sd == nil {
  155. continue
  156. }
  157. //traceId := sd.SpanContext().TraceID().String()
  158. //fmt.Println("------event_num---- "+sd.Name(), "--->", len(sd.Events())) // 一次请求完整数据
  159. // 构建map *RootDataT
  160. var rootData RootDataT
  161. rootData = initRootDataFromEvent()
  162. // build http入口 MapInfoT
  163. code_type := buildAppMapFromEvent(&rootData, sd)
  164. // 构建maps
  165. for _, event := range sd.Events() {
  166. //aaa, _ := json.Marshal(event)
  167. //fmt.Println("event.info", string(aaa))
  168. mNode := buildMapNodeFromEvent(event)
  169. switch EventType(event.EventType) {
  170. // stack
  171. case EventTypeFunEnt:
  172. // l7 event
  173. case EventTypeL7Request:
  174. switch l7.Protocol(event.ProtocolType) {
  175. case l7.ProtocolHTTP:
  176. buildHttpMapFromEvent(&mNode, event)
  177. case l7.ProtocolDNS:
  178. buildDNSMapEvent(&mNode, event)
  179. case l7.ProtocolMysql, l7.ProtocolMariaDB, l7.ProtocolTiDB, l7.ProtocolPostgres, l7.ProtocolDM:
  180. buildSQLMapEvent(&mNode, event)
  181. case l7.ProtocolRedis, l7.ProtocolMemcached, l7.ProtocolCassandra, l7.ProtocolES:
  182. buildNoSqlMapEvent(&mNode, event)
  183. case l7.ProtocolMongo:
  184. buildMongoMapEvent(&mNode, event)
  185. case l7.ProtocolGrpc:
  186. buildGrpcMapEvent(&mNode, event)
  187. case l7.ProtocolKafka:
  188. buildMQMapEvent(&mNode, event)
  189. }
  190. }
  191. rootData.Maps = append(rootData.Maps, mNode)
  192. //fmt.Println(event.Name)
  193. //buildAndAssemblyMapFromEvent(event, rootData)
  194. }
  195. buildLevelFromEvent(&rootData)
  196. sendDataMap[code_type] = append(sendDataMap[code_type], rootData)
  197. //a, _ := json.Marshal(rootData)
  198. //fmt.Println(string(a))
  199. //sendData = append(sendData, rootData)
  200. //if _, ok := TraceRootMap[traceId]; !ok {
  201. //TraceRootMap[traceId] = &TraceMapT{RootData: initRootData(traceId), Index: 1}
  202. //}
  203. //TraceRootMap[traceId].Index++
  204. //buildAndAssemblyMap(sd, TraceRootMap[traceId])
  205. }
  206. // 发送完整数据 | 大量长耗时请求会增加内存占用
  207. //sendData := []RootDataT{}
  208. //for traceId, v := range TraceRootMap {
  209. // if v.TheEnd {
  210. // buildLevel(v)
  211. // sendData = append(sendData, v.RootData)
  212. // delete(TraceRootMap, traceId)
  213. // //fmt.Println("the end!")
  214. // } else {
  215. // //fmt.Println("not end!")
  216. // }
  217. //}
  218. //Transform the categorized map into a slice
  219. data, _ := json.Marshal(sendDataMap)
  220. klog.Debug(string(data))
  221. //fmt.Println(len(sendData))
  222. //fmt.Println("sdl len:", len(sdl))
  223. return sendDataMap
  224. }
  225. type TimeMap struct {
  226. Time uint64
  227. Type int
  228. Map *MapInfoT
  229. }
  230. //type TraceMapT struct {
  231. // RootData RootDataT
  232. // Index int
  233. // lock *sync.RWMutex
  234. // TheEnd bool
  235. //}
  236. //func buildLevel(sdl *TraceMapT) {
  237. // nidMap := make(map[int]*MapInfoT)
  238. //
  239. // mapSlice := []TimeMap{}
  240. //
  241. // for i, v := range sdl.RootData.Maps {
  242. // if v.ServiceType == "APPLICATION" {
  243. // continue
  244. // }
  245. // nidMap[v.Nid] = &sdl.RootData.Maps[i]
  246. // timeStartMap := TimeMap{
  247. // Time: v.StartTime,
  248. // Type: 0,
  249. // Map: &sdl.RootData.Maps[i],
  250. // }
  251. // mapSlice = append(mapSlice, timeStartMap)
  252. // timeEndMap := TimeMap{
  253. // Time: v.EndTime,
  254. // Type: 1,
  255. // Map: &sdl.RootData.Maps[i],
  256. // }
  257. // mapSlice = append(mapSlice, timeEndMap)
  258. // }
  259. // sort.Slice(mapSlice, func(i, j int) bool {
  260. // return mapSlice[i].Time < mapSlice[j].Time
  261. // })
  262. //
  263. // funStack := []TimeMap{}
  264. //
  265. // currentNid := 1
  266. // Nid := 2
  267. // level := 2
  268. //
  269. // for _, v := range mapSlice {
  270. // // fmt.Println("SliceSliceindex", k, "value", v.Time, v.Type, v.Map.MethodName, v.Map.Nid)
  271. // if v.Type == 0 {
  272. // // 函数入口
  273. // funStack = append(funStack, v)
  274. // v.Map.Pid = currentNid
  275. // v.Map.Level = level
  276. // v.Map.Nid = Nid
  277. // currentNid = Nid
  278. // level += 1
  279. // Nid += 1
  280. // } else if v.Type == 1 {
  281. // // 函数出口
  282. // len := len(funStack)
  283. // funStack = funStack[:len-1]
  284. // if (len - 2) < 0 {
  285. // currentNid = 1
  286. // } else {
  287. // currentNid = funStack[len-2].Map.Nid
  288. // }
  289. //
  290. // level -= 1
  291. // }
  292. // }
  293. //}
  294. func buildLevelFromEvent(sdl *RootDataT) {
  295. nidMap := make(map[int]*MapInfoT)
  296. mapSlice := []TimeMap{}
  297. for i, v := range sdl.Maps {
  298. if v.ServiceType == "APPLICATION" || v.Level == 1 {
  299. continue
  300. }
  301. nidMap[v.Nid] = &sdl.Maps[i]
  302. timeStartMap := TimeMap{
  303. Time: v.StartTime,
  304. Type: 0,
  305. Map: &sdl.Maps[i],
  306. }
  307. mapSlice = append(mapSlice, timeStartMap)
  308. timeEndMap := TimeMap{
  309. Time: v.EndTime,
  310. Type: 1,
  311. Map: &sdl.Maps[i],
  312. }
  313. mapSlice = append(mapSlice, timeEndMap)
  314. }
  315. sort.Slice(mapSlice, func(i, j int) bool {
  316. return mapSlice[i].Time < mapSlice[j].Time
  317. })
  318. funStack := []TimeMap{}
  319. currentNid := 1
  320. Nid := 2
  321. level := 2
  322. for _, v := range mapSlice {
  323. //klog.Debugln("SliceSliceindex", k, "value", v.Time, v.Type, v.Map.MethodName, v.Map.Nid)
  324. if v.Type == 0 {
  325. // 函数入口
  326. funStack = append(funStack, v)
  327. v.Map.Pid = currentNid
  328. v.Map.Level = level
  329. v.Map.Nid = Nid
  330. currentNid = Nid
  331. level += 1
  332. Nid += 1
  333. } else if v.Type == 1 {
  334. // 函数出口
  335. len := len(funStack)
  336. funStack = funStack[:len-1]
  337. if (len - 2) < 0 {
  338. currentNid = 1
  339. } else {
  340. currentNid = funStack[len-2].Map.Nid
  341. }
  342. level -= 1
  343. }
  344. }
  345. }
  346. //func initRootData(traceId string) RootDataT {
  347. // data := RootDataT{
  348. // AccountId: 110,
  349. // AgentId: 1011005252979954, // TODO 更新 基于 ip:port + process_name + exe路径生成
  350. // AgentVersion: "2.1.0",
  351. // AppId: 5410049101545798, // TODO 更新 基于appname生成
  352. // AppIdFrom: -1,
  353. // AppName: "eBPF-agent", // TODO 更新 ip:port || process_name
  354. // CalledId: -1,
  355. // ClientIp: "",
  356. // CollTime: 0,
  357. // Cpu: 0,
  358. // Custom: "",
  359. // HostId: 10154813500555812,
  360. // HostName: "localhost",
  361. // HttpCode: 0,
  362. // HttpMethod: "",
  363. // InstanceId: 1005051101515357, // TODO 更新 基于ip:port
  364. // InstanceIdFrom: -1,
  365. // Maps: []MapInfoT{},
  366. // MemU: 0,
  367. // MemUP: 0,
  368. // OperType: "",
  369. // Parameters: []interface{}{},
  370. // ParentTaskName: 0,
  371. // Period: -1,
  372. // RespTime: 0,
  373. // Sampling: 0,
  374. // ServiceName: "GO",
  375. // ServiceType: APP_SERVICE_TYPE,
  376. // Sip: "",
  377. // Sn: "",
  378. // SpanIdFrom: "",
  379. // Sport: 0,
  380. // TId: -1,
  381. // TName: "",
  382. // TraceId: traceId,
  383. // TransIds: []interface{}{},
  384. // TypeFrom: "",
  385. // Uri: "",
  386. // UserDir: 0,
  387. // VipIds: []interface{}{},
  388. // }
  389. // return data
  390. //}
  391. func initRootDataFromEvent() RootDataT {
  392. hostID := utils.GetHostID()
  393. accountID := utils.GetAccountID()
  394. sip := utils.GetHostIP()
  395. sysTag := utils.GetSysTag()
  396. systemUUID := utils.GetSystemUUID()
  397. agentVersion := utils.GetAgentVersion()
  398. data := RootDataT{
  399. // todo AccountId
  400. AccountId: accountID,
  401. AgentId: 0, // 基于 ip:port + process_name + exe路径生成
  402. AgentVersion: agentVersion,
  403. AppId: 0, // 基于appname生成
  404. AppIdFrom: -1,
  405. AppName: "eBPF-agent", // server配置
  406. CalledId: -1,
  407. ClientIp: "",
  408. CollTime: 0,
  409. Cpu: 0,
  410. Custom: "",
  411. HostId: hostID,
  412. HostName: "localhost",
  413. HttpCode: 0,
  414. HttpMethod: "",
  415. InstanceId: 0, // 基于ip:port
  416. InstanceIdFrom: -1,
  417. Maps: []MapInfoT{},
  418. MemU: 0,
  419. MemUP: 0,
  420. OperType: "",
  421. Parameters: []ParamStruct{},
  422. ParentTaskName: "",
  423. Period: -1,
  424. RespTime: 0,
  425. Sampling: 0,
  426. ServiceName: "",
  427. ServiceType: APP_SERVICE_TYPE,
  428. Sip: sip,
  429. Sn: "",
  430. SpanIdFrom: "",
  431. Sport: 0,
  432. TId: -1,
  433. TName: "",
  434. TraceId: "",
  435. TransIds: []interface{}{},
  436. TypeFrom: "",
  437. Uri: "",
  438. UserDir: "",
  439. VipIds: []interface{}{},
  440. SrcAddr: "",
  441. DestinationAddr: "",
  442. Sys: sysTag,
  443. SystemUUID: systemUUID,
  444. UserAgent: "",
  445. }
  446. return data
  447. }
  448. func initRootDataJava() RootDataT {
  449. data := RootDataT{
  450. AccountId: 110,
  451. AgentId: 3934815089541000, // TODO 更新 基于 ip:port + process_name + exe路径生成
  452. AgentVersion: "2.21.0",
  453. AppId: 3365853273187618, // TODO 更新 基于appname生成
  454. AppIdFrom: -1,
  455. AppName: "eBPF-javaApplication", // TODO 更新 ip:port || process_name
  456. CalledId: -1,
  457. ClientIp: "",
  458. CollTime: 0,
  459. Cpu: 0,
  460. Custom: "",
  461. HostId: 2315065183171055,
  462. HostName: "localhost",
  463. HttpCode: 0,
  464. HttpMethod: "",
  465. InstanceId: 1128864082033413, // TODO 更新 基于ip:port
  466. InstanceIdFrom: -1,
  467. Maps: []MapInfoT{},
  468. MemU: 0,
  469. MemUP: 0,
  470. OperType: "",
  471. Parameters: []ParamStruct{},
  472. ParentTaskName: "",
  473. Period: -1,
  474. RespTime: 0,
  475. Sampling: 0,
  476. ServiceName: "TOMCAT",
  477. ServiceType: APP_SERVICE_TYPE,
  478. Sip: "",
  479. Sn: "",
  480. SpanIdFrom: "",
  481. Sport: 0,
  482. TId: -1,
  483. TName: "",
  484. TraceId: "",
  485. TransIds: []interface{}{},
  486. TypeFrom: "",
  487. Uri: "",
  488. UserDir: "",
  489. VipIds: []interface{}{},
  490. }
  491. return data
  492. }
  493. //func initMapNode(spanSd *tracepb.Span) (MapInfoT, string) {
  494. // mNode := MapInfoT{
  495. // Exception: 0,
  496. // ExceptionMsg: "",
  497. // ExceptionStack: "",
  498. // Ip: "",
  499. // Level: 2,
  500. // Pid: 1,
  501. // Port: 0,
  502. // Ps: []string{},
  503. // ServiceName: "",
  504. // ServiceType: "",
  505. // WallTime: 0,
  506. // }
  507. // mNode.MethodName = spanSd.Name
  508. // mNode.PureTime = (spanSd.EndTimeUnixNano - spanSd.StartTimeUnixNano) / 1e3
  509. // mNode.WallTime = mNode.PureTime
  510. // mNode.StartTime = spanSd.StartTimeUnixNano
  511. // mNode.EndTime = spanSd.EndTimeUnixNano
  512. //
  513. // for _, attr := range spanSd.GetAttributes() {
  514. // fmt.Println(attr.Key, ":", attr.Value.GetValue())
  515. //
  516. // switch attr.Key {
  517. // case "nid":
  518. // mNode.Nid = int(attr.Value.GetIntValue())
  519. // case "pid":
  520. // mNode.Pid = int(attr.Value.GetIntValue())
  521. // case "level":
  522. // mNode.Level = int(attr.Value.GetIntValue())
  523. // }
  524. // }
  525. //
  526. // return mNode, spanSd.Name
  527. //}
  528. func buildMapNodeFromEvent(event tracesdk.Event) MapInfoT {
  529. mNode := MapInfoT{
  530. Exception: 0,
  531. ExceptionMsg: "",
  532. ExceptionStack: "",
  533. Ip: "",
  534. Level: 2,
  535. Pid: 1,
  536. Port: 0,
  537. Ps: []string{},
  538. ServiceName: "",
  539. ServiceType: "",
  540. WallTime: 0,
  541. }
  542. mNode.MethodName = event.Name
  543. //mNode.PureTime = (event.EndTimeUnixNano - event.StartTimeUnixNano) / 1e3
  544. //mNode.WallTime = mNode.PureTime
  545. //mNode.StartTime = spanSd.StartTimeUnixNano
  546. //mNode.EndTime = spanSd.EndTimeUnixNano
  547. for _, attr := range event.Attributes {
  548. //fmt.Println(event.Name, "--->buildMapNodeFromEvent--->", attr.Key, ":", attr.Value.AsInterface())
  549. switch attr.Key {
  550. case "nid":
  551. mNode.Nid = int(attr.Value.AsInt64())
  552. case "pid":
  553. mNode.Pid = int(attr.Value.AsInt64())
  554. case "level":
  555. mNode.Level = int(attr.Value.AsInt64())
  556. case "time.start_at":
  557. mNode.StartTime, mNode.StartTimeMs = cleanNsTime(attr.Value.AsInt64())
  558. case "time.end_at":
  559. mNode.EndTime, mNode.EndTimeMs = cleanNsTime(attr.Value.AsInt64())
  560. case "time.duration":
  561. //mNode.PureTime = uint64(attr.Value.AsInt64()) / 1e3
  562. mNode.WallTime = uint64(attr.Value.AsInt64()) / 1e3
  563. }
  564. }
  565. return mNode
  566. }
  567. func parseURIToParams(input string) (string, []ParamStruct, error) {
  568. // 解析输入 URI
  569. parsedURL, err := url.Parse(input)
  570. if err != nil {
  571. return "", nil, fmt.Errorf("failed to parse URI: %w", err)
  572. }
  573. // 提取查询参数
  574. queryParams := parsedURL.Query()
  575. // 转换为目标结构
  576. var params []ParamStruct
  577. for key, values := range queryParams {
  578. params = append(params, ParamStruct{
  579. Name: key,
  580. Values: values,
  581. })
  582. }
  583. return parsedURL.Path, params, nil
  584. }
  585. // 构建拼装
  586. //func buildAndAssemblyMap(sd apmTraceSpan, traceRoot *TraceMapT) MapInfoT {
  587. // mNode, mapType := initMapNode(span(sd))
  588. // switch mapType {
  589. // case "APPLICATION":
  590. // buildAppMap(&mNode, traceRoot, sd)
  591. // traceRoot.TheEnd = true
  592. // case "HTTP":
  593. // buildHttpMap(&mNode, sd)
  594. // case "Mysql":
  595. // buildMysqlMap(&mNode, sd)
  596. // case "Redis":
  597. // buildRedisMap(&mNode, sd)
  598. // }
  599. // if mapType != "" {
  600. // mNode.Nid = traceRoot.Index
  601. // traceRoot.RootData.Maps = append(traceRoot.RootData.Maps, mNode)
  602. // }
  603. // return mNode
  604. //}
  605. //func buildAndAssemblyMapFromEvent(event tracesdk.Event, traceRoot *RootDataT) MapInfoT {
  606. // mNode := buildMapNodeFromEvent(event)
  607. // switch mapType {
  608. // case "HTTP":
  609. // buildHttpMapFromEvent(mNode, event)
  610. // //case "Mysql":
  611. // // buildMysqlMap(mNode, sd)
  612. // //case "Redis":
  613. // // buildRedisMap(mNode, sd)
  614. // }
  615. // if mapType != "" {
  616. // //mNode.Nid = traceRoot.Index
  617. // traceRoot.Maps = append(traceRoot.Maps, mNode)
  618. // }
  619. // return mNode
  620. //}
  621. //func buildAppMap(mNode *MapInfoT, traceRoot *TraceMapT, sd apmTraceSpan) {
  622. // mNode.ServiceName = GO_SERVICE_NAME
  623. // mNode.ServiceType = APP_SERVICE_TYPE
  624. // mNode.MethodName = "net/http.(*Transport).roundTrip()"
  625. // mNode.Level = 1
  626. // mNode.Pid = 0
  627. // mNode.Nid = 1
  628. // // 构建root节点
  629. // traceRoot.RootData.RespTime = mNode.PureTime
  630. // traceRoot.RootData.CollTime = mNode.StartTime
  631. // traceRoot.Index = 1
  632. // for _, attr := range sd.Attributes() {
  633. // fmt.Println(attr.Key, ":", attr.Value.AsInterface())
  634. // switch attr.Key {
  635. // case "http.uri":
  636. // traceRoot.RootData.Uri = attr.Value.AsString()
  637. // case "http.method":
  638. // traceRoot.RootData.HttpMethod = attr.Value.AsString()
  639. // case "http.status_code":
  640. // traceRoot.RootData.HttpCode = attr.Value.AsInt64()
  641. // case "net.peer.name":
  642. // traceRoot.RootData.ClientIp = attr.Value.AsString()
  643. // traceRoot.RootData.Sip = attr.Value.AsString()
  644. // traceRoot.RootData.Sn = attr.Value.AsString()
  645. // case "net.peer.port":
  646. // traceRoot.RootData.Sport = attr.Value.AsInt64()
  647. // traceRoot.RootData.LocalPort = attr.Value.AsInt64()
  648. // case "server.trace_id_from":
  649. // traceRoot.RootData.TraceId = attr.Value.AsString()
  650. // case "server.called_id":
  651. // traceRoot.RootData.CalledId = attr.Value.AsInt64()
  652. // case "server.instance_id_from":
  653. // traceRoot.RootData.InstanceIdFrom = attr.Value.AsInt64()
  654. // case "server.app_id_from":
  655. // traceRoot.RootData.AppIdFrom = attr.Value.AsInt64()
  656. // case "server.span_id_from":
  657. // traceRoot.RootData.SpanIdFrom = attr.Value.AsString()
  658. // case "server.type_from":
  659. // traceRoot.RootData.TypeFrom = attr.Value.AsString()
  660. // }
  661. // }
  662. //
  663. //}
  664. func buildAppMapFromEvent(traceRoot *RootDataT, sd apmTraceSpan) int {
  665. mNode := MapInfoT{
  666. Exception: 0,
  667. ExceptionMsg: "",
  668. ExceptionStack: "",
  669. Ip: "",
  670. Level: 1,
  671. Pid: 1,
  672. Port: 0,
  673. Ps: []string{},
  674. ServiceName: "",
  675. ServiceType: "",
  676. WallTime: 0,
  677. }
  678. mNode.ServiceName = GO_SERVICE_NAME
  679. mNode.ServiceType = APP_SERVICE_TYPE
  680. mNode.MethodName = "Kernel Endpoint()"
  681. mNode.Level = 1
  682. mNode.Pid = 0
  683. mNode.Nid = 1
  684. var code_type int64
  685. // 构建root节点
  686. //traceRoot.RespTime = mNode.PureTimex
  687. //traceRoot.CollTime = mNode.StartTime
  688. for _, attr := range sd.Attributes() {
  689. klog.Debugln("Appmap:", attr.Key, ":", attr.Value.AsInterface())
  690. switch attr.Key {
  691. case "http.uri":
  692. traceRoot.Uri, traceRoot.Parameters, _ = parseURIToParams(attr.Value.AsString())
  693. case "rpc.uri":
  694. traceRoot.Uri = attr.Value.AsString()
  695. mNode.Uri = attr.Value.AsString()
  696. case "http.method":
  697. traceRoot.HttpMethod = attr.Value.AsString()
  698. case "http.status_code":
  699. traceRoot.HttpCode = attr.Value.AsInt64()
  700. case "net.peer.name":
  701. // TODO 修改 ClientIp sip获取方式
  702. traceRoot.ClientIp = attr.Value.AsString()
  703. //traceRoot.Sip = attr.Value.AsString()
  704. traceRoot.Sn = attr.Value.AsString()
  705. case "net.peer.port":
  706. traceRoot.Sport = attr.Value.AsInt64()
  707. traceRoot.LocalPort = attr.Value.AsInt64()
  708. case "server.trace_id_from":
  709. traceRoot.TraceId = attr.Value.AsString()
  710. case "server.called_id":
  711. traceRoot.CalledId = attr.Value.AsInt64()
  712. case "server.instance_id_from":
  713. traceRoot.InstanceIdFrom = attr.Value.AsInt64()
  714. case "server.app_id_from":
  715. traceRoot.AppIdFrom = attr.Value.AsInt64()
  716. case "server.span_id_from":
  717. traceRoot.SpanIdFrom = attr.Value.AsString()
  718. case "server.type_from":
  719. traceRoot.TypeFrom = attr.Value.AsString()
  720. case "time.start_at":
  721. mNode.StartTime, mNode.StartTimeMs = cleanNsTime(attr.Value.AsInt64())
  722. traceRoot.CollTime = mNode.StartTimeMs
  723. case "time.end_at":
  724. mNode.EndTime, mNode.EndTimeMs = cleanNsTime(attr.Value.AsInt64())
  725. case "time.duration":
  726. traceRoot.RespTime = uint64(attr.Value.AsInt64()) / 1e3
  727. mNode.PureTime = traceRoot.RespTime
  728. mNode.WallTime = uint64(attr.Value.AsInt64()) / 1e3
  729. case "server.code_type":
  730. code_type = attr.Value.AsInt64()
  731. case "server.app_name":
  732. traceRoot.AppName = attr.Value.AsString()
  733. case "server.service_name":
  734. traceRoot.ServiceName = attr.Value.AsString()
  735. mNode.ServiceName = attr.Value.AsString()
  736. case "rpc.service_type":
  737. traceRoot.ServiceType = RPC_SERVICE_TYPE
  738. mNode.ServiceType = RPC_SERVICE_TYPE
  739. case "rpc.oper_type":
  740. traceRoot.OperType = "PROVIDER"
  741. mNode.OperType = "PROVIDER"
  742. // map tag
  743. case "service_type":
  744. mNode.ServiceType = attr.Value.AsString()
  745. // map tag
  746. case "oper_type":
  747. mNode.OperType = attr.Value.AsString()
  748. case "server.app_id":
  749. traceRoot.AppId = attr.Value.AsInt64()
  750. case "server.agent_id":
  751. traceRoot.AgentId = attr.Value.AsInt64()
  752. case "server.instance_id":
  753. traceRoot.InstanceId = attr.Value.AsInt64()
  754. case "server.src_addr":
  755. traceRoot.SrcAddr = attr.Value.AsString()
  756. case "server.dst_addr":
  757. traceRoot.DestinationAddr = attr.Value.AsString()
  758. case "server.pid":
  759. traceRoot.Pid = uint32(attr.Value.AsInt64())
  760. case "server.container_id":
  761. traceRoot.ContainerID = attr.Value.AsString()
  762. case "server.user_agent":
  763. traceRoot.UserAgent = attr.Value.AsString()
  764. case "method_name":
  765. mNode.MethodName = attr.Value.AsString()
  766. case "mq.ip":
  767. mNode.Ip = attr.Value.AsString()
  768. case "mq.port":
  769. mNode.Port = attr.Value.AsInt64()
  770. // root tag
  771. case "server.service_type":
  772. traceRoot.ServiceType = attr.Value.AsString()
  773. // root tag
  774. case "server.oper_type":
  775. traceRoot.OperType = attr.Value.AsString()
  776. case "server.sysvc_from":
  777. // 解析 SysvcFrom 格式:{app_name_len}:app_name:{appServiceType_len}:appServiceType:{SysTagLen}[:SysTag]
  778. // 例如:08:eBPF-APP:12:APPLICATION:00 或 08:eBPF-APP:12:APPLICATION:03:tag
  779. sysvcFrom := attr.Value.AsString()
  780. appNameFrom, serviceTypeFrom, parentSys := parseSysvcFrom(sysvcFrom)
  781. traceRoot.AppNameFrom = appNameFrom
  782. traceRoot.ServiceTypeFrom = serviceTypeFrom
  783. traceRoot.ParentSys = parentSys
  784. case "service.parent_sys":
  785. // 支持直接从 attribute 传递
  786. traceRoot.ParentSys = attr.Value.AsString()
  787. case "app_name_from":
  788. // 支持直接从 attribute 传递
  789. traceRoot.AppNameFrom = attr.Value.AsString()
  790. }
  791. }
  792. traceRoot.Maps = append(traceRoot.Maps, mNode)
  793. return int(code_type)
  794. }
  795. //func buildHttpMap(mNode *MapInfoT, sd apmTraceSpan) {
  796. // mNode.ServiceName = HTTP_SERVICE_NAME
  797. // mNode.ServiceType = HTTP_SERVICE_TYPE
  798. // mNode.Schema = "http"
  799. // mNode.MethodName = "net/http.serverHandler.ServeHTTP()"
  800. // var descAddr string
  801. // for _, attr := range sd.Attributes() {
  802. // //fmt.Println(attr.Key, ":", attr.Value.AsInterface())
  803. // switch attr.Key {
  804. // case "http.ip":
  805. // mNode.Ip = attr.Value.AsString()
  806. // descAddr += mNode.Ip
  807. // case "http.port":
  808. // mNode.Port = attr.Value.AsInt64()
  809. // descAddr += ":" + attr.Value.AsString()
  810. // case "http.uri":
  811. // mNode.Uri = attr.Value.AsString()
  812. // case "http.assumed_app_id":
  813. // mNode.AssumedAppId = attr.Value.AsInt64()
  814. // case "http.span_id":
  815. // mNode.SpanId = attr.Value.AsString()
  816. // }
  817. // }
  818. // //mNode.AssumedAppId = Md5ToInt64(descAddr, 16)
  819. //}
  820. func buildGrpcMapEvent(mNode *MapInfoT, event tracesdk.Event) {
  821. mNode.ServiceName = GRPC_SERVICE_NAME
  822. mNode.ServiceType = RPC_SERVICE_TYPE
  823. mNode.Schema = "grpc"
  824. //mNode.MethodName = "HTTP"
  825. //var descAddr string
  826. // var method string
  827. for _, attr := range event.Attributes {
  828. switch attr.Key {
  829. case "rpc.ip":
  830. mNode.Ip = attr.Value.AsString()
  831. //descAddr += mNode.Ip
  832. case "rpc.port":
  833. mNode.Port = attr.Value.AsInt64()
  834. case "rpc.method":
  835. //mNode.MethodName += " " + attr.Value.AsString()
  836. // method = attr.Value.AsString()
  837. mNode.MethodName = attr.Value.AsString()
  838. //descAddr += ":" + attr.Value.AsString()
  839. case "rpc.uri":
  840. mNode.Uri = attr.Value.AsString()
  841. //mNode.MethodName += " " + attr.Value.AsString()
  842. case "rpc.oper_type":
  843. mNode.OperType = attr.Value.AsString()
  844. case "rpc.assumed_app_id":
  845. mNode.AssumedAppId = attr.Value.AsInt64()
  846. case "rpc.span_id":
  847. mNode.SpanId = attr.Value.AsString()
  848. case "time.start_at":
  849. mNode.StartTime = uint64(attr.Value.AsInt64())
  850. case "time.end_at":
  851. mNode.EndTime = uint64(attr.Value.AsInt64())
  852. case "time.duration":
  853. //mNode.PureTime = uint64(attr.Value.AsInt64()) / 1e3
  854. mNode.WallTime = uint64(attr.Value.AsInt64()) / 1e3
  855. }
  856. }
  857. // mNode.MethodName = fmt.Sprintf("%s %s %s:%d%s", "HTTP", method, mNode.Ip, mNode.Port, mNode.Uri)
  858. //mNode.AssumedAppId = Md5ToInt64(descAddr, 16)
  859. }
  860. func buildHttpMapFromEvent(mNode *MapInfoT, event tracesdk.Event) {
  861. mNode.ServiceName = HTTP_SERVICE_NAME
  862. mNode.ServiceType = HTTP_SERVICE_TYPE
  863. mNode.Schema = "http"
  864. //mNode.MethodName = "HTTP"
  865. //var descAddr string
  866. var method string
  867. for _, attr := range event.Attributes {
  868. klog.Debugln("HTTP--->", attr.Key, ":", attr.Value.AsInterface())
  869. switch attr.Key {
  870. case "http.ip":
  871. mNode.Ip = attr.Value.AsString()
  872. //descAddr += mNode.Ip
  873. case "http.port":
  874. mNode.Port = attr.Value.AsInt64()
  875. case "http.method":
  876. //mNode.MethodName += " " + attr.Value.AsString()
  877. method = attr.Value.AsString()
  878. //descAddr += ":" + attr.Value.AsString()
  879. case "http.uri":
  880. mNode.Uri = attr.Value.AsString()
  881. //mNode.MethodName += " " + attr.Value.AsString()
  882. case "http.assumed_app_id":
  883. mNode.AssumedAppId = attr.Value.AsInt64()
  884. case "http.span_id":
  885. mNode.SpanId = attr.Value.AsString()
  886. case "time.start_at":
  887. mNode.StartTime = uint64(attr.Value.AsInt64())
  888. case "time.end_at":
  889. mNode.EndTime = uint64(attr.Value.AsInt64())
  890. case "time.duration":
  891. //mNode.PureTime = uint64(attr.Value.AsInt64()) / 1e3
  892. mNode.WallTime = uint64(attr.Value.AsInt64()) / 1e3
  893. case "http.src_addr":
  894. mNode.SrcAddr = attr.Value.AsString()
  895. case "http.destination_addr":
  896. mNode.DestinationAddr = attr.Value.AsString()
  897. case "http.is_tls":
  898. if attr.Value.AsBool() {
  899. mNode.Schema = "https"
  900. }
  901. }
  902. }
  903. mNode.MethodName = fmt.Sprintf("%s %s %s:%d%s", "HTTP", method, mNode.Ip, mNode.Port, mNode.Uri)
  904. //mNode.AssumedAppId = Md5ToInt64(descAddr, 16)
  905. }
  906. //func buildMysqlMap(mNode *MapInfoT, sd apmTraceSpan) {
  907. // mNode.Dbn = "unknown"
  908. // mNode.ServiceName = MYSQL_SERVICE_NAME
  909. // mNode.ServiceType = SQL_SERVICE_TYPE
  910. // mNode.MethodName = "database/sql.Query()"
  911. // for _, attr := range sd.Attributes() {
  912. // //fmt.Println(attr.Key, ":", attr.Value.AsInterface())
  913. // switch attr.Key {
  914. // case "net.peer.name":
  915. // mNode.Ip = attr.Value.AsString()
  916. // case "net.peer.port":
  917. // mNode.Port = attr.Value.AsInt64()
  918. // case "db.statement":
  919. // query := attr.Value.AsString()
  920. // mNode.Ps = []string{query}
  921. // words := strings.Fields(query)
  922. // if len(words) > 0 {
  923. // mNode.OperType = strings.ToUpper(words[0])
  924. // }
  925. // }
  926. // }
  927. //}
  928. func buildSQLMapEvent(mNode *MapInfoT, event tracesdk.Event) {
  929. mNode.Dbn = "-"
  930. mNode.ServiceName = l7.Protocol(event.ProtocolType).ServiceNameString()
  931. mNode.ServiceType = SQL_SERVICE_TYPE
  932. //mNode.MethodName = "database/sql.Query()"
  933. for _, attr := range event.Attributes {
  934. //fmt.Println(attr.Key, ":", attr.Value.AsInterface())
  935. switch attr.Key {
  936. case "net.peer.name":
  937. mNode.Ip = attr.Value.AsString()
  938. case "net.peer.port":
  939. mNode.Port = attr.Value.AsInt64()
  940. case "db.statement":
  941. query := attr.Value.AsString()
  942. mNode.MethodName = query
  943. mNode.Ps = []string{query}
  944. //words := strings.Fields(query)
  945. //if len(words) > 0 {
  946. // mNode.OperType = strings.ToUpper(words[0])
  947. //}
  948. case "sql.exception":
  949. if attr.Value.AsBool() {
  950. mNode.Exception = 1
  951. } else {
  952. mNode.Exception = 0
  953. }
  954. case "sql.exception_msg":
  955. mNode.ExceptionMsg = attr.Value.AsString()
  956. case "sql.src_addr":
  957. mNode.SrcAddr = attr.Value.AsString()
  958. case "sql.destination_addr":
  959. mNode.DestinationAddr = attr.Value.AsString()
  960. case "sql.dbn":
  961. mNode.Dbn = attr.Value.AsString()
  962. }
  963. }
  964. }
  965. func buildDNSMapEvent(mNode *MapInfoT, event tracesdk.Event) {
  966. mNode.ServiceName = l7.Protocol(event.ProtocolType).ServiceNameString()
  967. mNode.ServiceType = NET_SERVICE_TYPE
  968. var _type string
  969. var fqdn string
  970. var ips string
  971. var ttl int64
  972. for _, attr := range event.Attributes {
  973. switch attr.Key {
  974. case "dns.type":
  975. _type = attr.Value.AsString()
  976. case "dns.fqdn":
  977. fqdn = attr.Value.AsString()
  978. case "dns.ttl":
  979. ttl = attr.Value.AsInt64()
  980. case "dns.ips":
  981. if attr.Value.AsString() != "" {
  982. ips = "Addr: " + attr.Value.AsString()
  983. }
  984. }
  985. }
  986. mNode.MethodName = fmt.Sprintf("DNS Name: %s Type: %s TTL: %d %s", fqdn, _type, ttl, ips)
  987. }
  988. func buildPostGreSqlMapEvent(mNode *MapInfoT, event tracesdk.Event) {
  989. mNode.Dbn = "-"
  990. mNode.ServiceName = POSTGRESQL_SERVICE_NAME
  991. mNode.ServiceType = SQL_SERVICE_TYPE
  992. //mNode.MethodName = "database/sql.Query()"
  993. for _, attr := range event.Attributes {
  994. //fmt.Println(attr.Key, ":", attr.Value.AsInterface())
  995. switch attr.Key {
  996. case "net.peer.name":
  997. mNode.Ip = attr.Value.AsString()
  998. case "net.peer.port":
  999. mNode.Port = attr.Value.AsInt64()
  1000. case "db.statement":
  1001. query := attr.Value.AsString()
  1002. mNode.Ps = []string{query}
  1003. //words := strings.Fields(query)
  1004. //if len(words) > 0 {
  1005. // mNode.OperType = strings.ToUpper(words[0])
  1006. //}
  1007. case "sql.exception":
  1008. if attr.Value.AsBool() {
  1009. mNode.Exception = 1
  1010. } else {
  1011. mNode.Exception = 0
  1012. }
  1013. case "sql.src_addr":
  1014. mNode.SrcAddr = attr.Value.AsString()
  1015. case "sql.destination_addr":
  1016. mNode.DestinationAddr = attr.Value.AsString()
  1017. }
  1018. }
  1019. }
  1020. func buildMysqlMapEvent(mNode *MapInfoT, event tracesdk.Event) {
  1021. mNode.Dbn = "-"
  1022. mNode.ServiceName = MYSQL_SERVICE_NAME
  1023. mNode.ServiceType = SQL_SERVICE_TYPE
  1024. //mNode.MethodName = "database/sql.Query()"
  1025. for _, attr := range event.Attributes {
  1026. //fmt.Println(attr.Key, ":", attr.Value.AsInterface())
  1027. switch attr.Key {
  1028. case "net.peer.name":
  1029. mNode.Ip = attr.Value.AsString()
  1030. case "net.peer.port":
  1031. mNode.Port = attr.Value.AsInt64()
  1032. case "db.statement":
  1033. query := attr.Value.AsString()
  1034. mNode.MethodName = query
  1035. mNode.Ps = []string{query}
  1036. //words := strings.Fields(query)
  1037. //if len(words) > 0 {
  1038. // mNode.OperType = strings.ToUpper(words[0])
  1039. //}
  1040. case "sql.exception":
  1041. if attr.Value.AsBool() {
  1042. mNode.Exception = 1
  1043. } else {
  1044. mNode.Exception = 0
  1045. }
  1046. case "sql.src_addr":
  1047. mNode.SrcAddr = attr.Value.AsString()
  1048. case "sql.destination_addr":
  1049. mNode.DestinationAddr = attr.Value.AsString()
  1050. }
  1051. }
  1052. }
  1053. func buildDMMapEvent(mNode *MapInfoT, event tracesdk.Event) {
  1054. mNode.Dbn = "TEST"
  1055. mNode.ServiceName = DM_SERVICE_NAME
  1056. mNode.ServiceType = SQL_SERVICE_TYPE
  1057. mNode.MethodName = "database/sql.Query()"
  1058. for _, attr := range event.Attributes {
  1059. //fmt.Println(attr.Key, ":", attr.Value.AsInterface())
  1060. switch attr.Key {
  1061. case "net.peer.name":
  1062. mNode.Ip = attr.Value.AsString()
  1063. case "net.peer.port":
  1064. mNode.Port = attr.Value.AsInt64()
  1065. case "db.statement":
  1066. query := attr.Value.AsString()
  1067. mNode.Ps = []string{query}
  1068. //words := strings.Fields(query)
  1069. //if len(words) > 0 {
  1070. // mNode.OperType = strings.ToUpper(words[0])
  1071. //}
  1072. case "sql.exception":
  1073. if attr.Value.AsBool() {
  1074. mNode.Exception = 1
  1075. } else {
  1076. mNode.Exception = 0
  1077. }
  1078. case "sql.src_addr":
  1079. mNode.SrcAddr = attr.Value.AsString()
  1080. case "sql.destination_addr":
  1081. mNode.DestinationAddr = attr.Value.AsString()
  1082. }
  1083. }
  1084. }
  1085. func buildNoSqlMapEvent(mNode *MapInfoT, event tracesdk.Event) {
  1086. mNode.ServiceName = l7.Protocol(event.ProtocolType).ServiceNameString()
  1087. mNode.ServiceType = NOSQL_SERVICE_TYPE
  1088. for _, attr := range event.Attributes {
  1089. switch attr.Key {
  1090. case "net.peer.name":
  1091. mNode.Ip = attr.Value.AsString()
  1092. case "net.peer.port":
  1093. mNode.Port = attr.Value.AsInt64()
  1094. case "db.statement":
  1095. query := attr.Value.AsString()
  1096. mNode.MethodName = query
  1097. mNode.Ps = []string{query}
  1098. case "nosql.src_addr":
  1099. mNode.SrcAddr = attr.Value.AsString()
  1100. case "nosql.destination_addr":
  1101. mNode.DestinationAddr = attr.Value.AsString()
  1102. case "nosql.exception":
  1103. if attr.Value.AsBool() {
  1104. mNode.Exception = 1
  1105. }
  1106. case "nosql.exception_msg":
  1107. mNode.ExceptionMsg = attr.Value.AsString()
  1108. }
  1109. }
  1110. }
  1111. func buildMQMapEvent(mNode *MapInfoT, event tracesdk.Event) {
  1112. mNode.ServiceName = l7.Protocol(event.ProtocolType).ServiceNameString()
  1113. mNode.ServiceType = MQ_SERVICE_TYPE
  1114. for _, attr := range event.Attributes {
  1115. switch attr.Key {
  1116. case "net.peer.name":
  1117. mNode.Ip = attr.Value.AsString()
  1118. case "net.peer.port":
  1119. mNode.Port = attr.Value.AsInt64()
  1120. case "mq.info":
  1121. query := attr.Value.AsString()
  1122. mNode.MethodName = query
  1123. case "mq.topic":
  1124. mNode.Uri = "/" + attr.Value.AsString()
  1125. case "mq.destination_addr":
  1126. mNode.DestinationAddr = attr.Value.AsString()
  1127. case "mq.exception":
  1128. if attr.Value.AsBool() {
  1129. mNode.Exception = 1
  1130. }
  1131. case "mq.exception_msg":
  1132. mNode.ExceptionMsg = attr.Value.AsString()
  1133. case "mq.oper_type":
  1134. mNode.OperType = attr.Value.AsString()
  1135. case "mq.assumed_app_id":
  1136. mNode.AssumedAppId = attr.Value.AsInt64()
  1137. case "mq.span_id":
  1138. mNode.SpanId = attr.Value.AsString()
  1139. }
  1140. }
  1141. }
  1142. func buildMongoMapEvent(mNode *MapInfoT, event tracesdk.Event) {
  1143. mNode.ServiceName = MONGO_SERVICE_NAME
  1144. mNode.ServiceType = NOSQL_SERVICE_TYPE
  1145. for _, attr := range event.Attributes {
  1146. switch attr.Key {
  1147. case "net.peer.name":
  1148. mNode.Ip = attr.Value.AsString()
  1149. case "net.peer.port":
  1150. mNode.Port = attr.Value.AsInt64()
  1151. case "db.statement":
  1152. query := attr.Value.AsString()
  1153. mNode.MethodName = query
  1154. mNode.Ps = []string{query}
  1155. case "nosql.src_addr":
  1156. mNode.SrcAddr = attr.Value.AsString()
  1157. case "nosql.destination_addr":
  1158. mNode.DestinationAddr = attr.Value.AsString()
  1159. }
  1160. }
  1161. }
  1162. func isEnter(_type string) bool {
  1163. if _type == "APPLICATION" {
  1164. return true
  1165. }
  1166. return false
  1167. }
  1168. func span(sd apmTraceSpan) *tracepb.Span {
  1169. if sd == nil {
  1170. return nil
  1171. }
  1172. tid := sd.SpanContext().TraceID()
  1173. sid := sd.SpanContext().SpanID()
  1174. s := &tracepb.Span{
  1175. TraceId: tid[:],
  1176. SpanId: sid[:],
  1177. TraceState: sd.SpanContext().TraceState().String(),
  1178. //Status: status(sd.Status().Code, sd.Status().Description),
  1179. StartTimeUnixNano: uint64(sd.StartTime().UnixNano()),
  1180. EndTimeUnixNano: uint64(sd.EndTime().UnixNano()),
  1181. //Links: links(sd.Links()),
  1182. //Kind: spanKind(sd.SpanKind()),
  1183. Name: sd.Name(),
  1184. Attributes: tracetransform.KeyValues(sd.Attributes()),
  1185. //Events: spanEvents(sd.Events()),
  1186. DroppedAttributesCount: uint32(sd.DroppedAttributes()),
  1187. DroppedEventsCount: uint32(sd.DroppedEvents()),
  1188. DroppedLinksCount: uint32(sd.DroppedLinks()),
  1189. }
  1190. if psid := sd.Parent().SpanID(); psid.IsValid() {
  1191. s.ParentSpanId = psid[:]
  1192. }
  1193. return s
  1194. }
  1195. func Md5ToInt64(strParam string, Len int) int64 {
  1196. sign := md5.Sum([]byte(strParam))
  1197. signStr := fmt.Sprintf("%x", sign)
  1198. charArr := []rune(signStr)
  1199. var intStr string
  1200. for _, value := range charArr {
  1201. intStr += strconv.Itoa(int(value))
  1202. }
  1203. intStr = intStr[:Len]
  1204. int64Data, err := strconv.ParseInt(intStr, 10, 64)
  1205. if err != nil {
  1206. return 0
  1207. }
  1208. return int64Data
  1209. }
  1210. // ns,ms
  1211. func cleanNsTime(time int64) (uint64, uint64) {
  1212. return uint64(time), uint64(math.Round(float64(time) / 1e6))
  1213. }
  1214. func parseLen2(s string, i int) (int, bool) {
  1215. if len(s) < i+2 {
  1216. return 0, false
  1217. }
  1218. c1, c2 := s[i], s[i+1]
  1219. if c1 < '0' || c1 > '9' || c2 < '0' || c2 > '9' {
  1220. return 0, false
  1221. }
  1222. return int(c1-'0')*10 + int(c2-'0'), true
  1223. }
  1224. func parseSysvcFrom(sysvcFrom string) (string, string, string) {
  1225. // 新格式:{app_name_len}:app_name:{appServiceType_len}:appServiceType[:{SysTagLen}:SysTag]
  1226. // 例如:08:eBPF-APP:12:APPLICATION 或 08:eBPF-APP:12:APPLICATION:03:tag
  1227. // 最小长度:12 (如 "08:x:12:APPLICATION")
  1228. if len(sysvcFrom) < 12 {
  1229. return "", "", ""
  1230. }
  1231. // 解析 app_name_len(前2位)
  1232. appNameLen, ok := parseLen2(sysvcFrom, 0)
  1233. if !ok || appNameLen < 0 || appNameLen > 32 {
  1234. return "", "", ""
  1235. }
  1236. // 检查第一个冒号
  1237. if len(sysvcFrom) < 3 || sysvcFrom[2] != ':' {
  1238. return "", "", ""
  1239. }
  1240. // 提取 app_name(从位置 3 开始,长度为 appNameLen)
  1241. appNameStart := 3
  1242. appNameEnd := appNameStart + appNameLen
  1243. if len(sysvcFrom) < appNameEnd {
  1244. return "", "", ""
  1245. }
  1246. appNameFrom := sysvcFrom[appNameStart:appNameEnd]
  1247. // 检查 app_name 后的冒号
  1248. if len(sysvcFrom) < appNameEnd+1 || sysvcFrom[appNameEnd] != ':' {
  1249. return appNameFrom, "", ""
  1250. }
  1251. // 解析 appServiceType_len(app_name 后的2位)
  1252. appServiceTypeLenStart := appNameEnd + 1
  1253. appServiceTypeLen, ok := parseLen2(sysvcFrom, appServiceTypeLenStart)
  1254. if !ok || appServiceTypeLen < 0 || appServiceTypeLen > 32 {
  1255. return appNameFrom, "", ""
  1256. }
  1257. // 检查 appServiceType_len 后的冒号
  1258. appServiceTypeStart := appServiceTypeLenStart + 2
  1259. if len(sysvcFrom) < appServiceTypeStart+1 || sysvcFrom[appServiceTypeStart] != ':' {
  1260. return appNameFrom, "", ""
  1261. }
  1262. // 提取 appServiceType
  1263. appServiceTypeStart++
  1264. appServiceTypeEnd := appServiceTypeStart + appServiceTypeLen
  1265. if len(sysvcFrom) < appServiceTypeEnd {
  1266. return appNameFrom, "", ""
  1267. }
  1268. serviceTypeFrom := sysvcFrom[appServiceTypeStart:appServiceTypeEnd]
  1269. // 检查 appServiceType 后的冒号
  1270. if len(sysvcFrom) < appServiceTypeEnd+1 || sysvcFrom[appServiceTypeEnd] != ':' {
  1271. return appNameFrom, serviceTypeFrom, ""
  1272. }
  1273. // 解析 sysTagLen(appServiceType 后的2位)
  1274. sysTagLenStart := appServiceTypeEnd + 1
  1275. sysTagLen, ok := parseLen2(sysvcFrom, sysTagLenStart)
  1276. if !ok || sysTagLen < 0 || sysTagLen > 32 {
  1277. return appNameFrom, serviceTypeFrom, ""
  1278. }
  1279. // 如果 sysTagLen == 0,则没有 sysTag
  1280. if sysTagLen == 0 {
  1281. return appNameFrom, serviceTypeFrom, ""
  1282. }
  1283. // 检查 sysTagLen 后的冒号
  1284. sysTagStart := sysTagLenStart + 2
  1285. if len(sysvcFrom) < sysTagStart+1 || sysvcFrom[sysTagStart] != ':' {
  1286. return appNameFrom, serviceTypeFrom, ""
  1287. }
  1288. // 提取 sysTag
  1289. sysTagStart++
  1290. sysTagEnd := sysTagStart + sysTagLen
  1291. if len(sysvcFrom) < sysTagEnd {
  1292. return appNameFrom, serviceTypeFrom, ""
  1293. }
  1294. parentSys := sysvcFrom[sysTagStart:sysTagEnd]
  1295. return appNameFrom, serviceTypeFrom, parentSys
  1296. }