apm_exporter.go 40 KB

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