main.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. package main
  2. import (
  3. "log"
  4. "net/http"
  5. "os"
  6. "strconv"
  7. "time"
  8. "github.com/prometheus/client_golang/prometheus"
  9. "github.com/prometheus/client_golang/prometheus/promhttp"
  10. sls "github.com/aliyun/aliyun-log-go-sdk"
  11. )
  12. var (
  13. AccessKeyID = "LTAIWYUujJAm7CbH"
  14. AccessKeySecret = "RfSjdiWwED1sGFlsjXv0DlfTnZTG1P"
  15. Endpoint = "cn-hangzhou.log.aliyuncs.com"
  16. adActionLogStore *sls.LogStore
  17. adOwnActionLogStore *sls.LogStore
  18. adOwnConvLogStore *sls.LogStore
  19. longvideoReqeustLogStore *sls.LogStore
  20. videoPlayStore *sls.LogStore
  21. videoActionStore *sls.LogStore
  22. simpleeventStore *sls.LogStore
  23. userShareStore *sls.LogStore
  24. adRequestStore *sls.LogStore
  25. adReportQuerySQL = `* | SELECT appType, json_extract_scalar(extParams, '$.eventInfos.ab_test002') AS adGroup, CASE WHEN adType = 1 THEN 'BANNER广告' WHEN adType = 2 THEN '视频广告' WHEN adType = 3 THEN '贴片广告' WHEN adType = 4 THEN '插屏广告' WHEN adType = 5 THEN '开屏广告' WHEN adType = 6 THEN '激励广告' ELSE ' ' END AS adType, COUNT( DISTINCT CASE WHEN businessType = 'adLoaded' THEN machineCode END ) AS adLoaded, COUNT( DISTINCT CASE WHEN businessType = 'adRequest' THEN machineCode END ) AS adRequest, COUNT( DISTINCT CASE WHEN businessType = 'adView' THEN machineCode END ) AS adView, COUNT( DISTINCT CASE WHEN businessType = 'adClick' THEN machineCode END ) AS adClick, COUNT( DISTINCT CASE WHEN businessType = 'adCloseBtnTap' THEN machineCode END ) AS adCloseBtnTap, COUNT( DISTINCT CASE WHEN businessType = 'adCloseGestureTap' THEN machineCode END ) AS adCloseGestureTap, COUNT( DISTINCT CASE WHEN businessType = 'adCloseMaskTap' THEN machineCode END ) AS adCloseMaskTap, COUNT( DISTINCT CASE WHEN businessType = 'adShowError' THEN machineCode END ) AS adShowError, COUNT( DISTINCT CASE WHEN businessType = 'adLoadError' THEN machineCode END ) AS adLoadError, COUNT( DISTINCT CASE WHEN businessType = 'adConfigRequest' THEN machineCode END ) AS adConfigRequest, COUNT( DISTINCT CASE WHEN businessType = 'adConfigLoaded' THEN machineCode END ) AS adConfigLoaded GROUP BY adGroup, adType, appType HAVING adGroup IS NOT NULL AND adType != ' ' ORDER BY appType ASC LIMIT 1000`
  26. adOwnWecahtReportQuerySQL = `* and ownAdSystemType:weixin| SELECT appType, json_extract_scalar(extParams, '$.eventInfos.ab_test002') AS adGroup, CASE WHEN adType = 1 THEN 'BANNER广告' WHEN adType = 2 THEN '视频广告' WHEN adType = 3 THEN '贴片广告' WHEN adType = 4 THEN '插屏广告' WHEN adType = 5 THEN '开屏广告' WHEN adType = 6 THEN '激励广告' ELSE ' ' END AS adType, COUNT( DISTINCT CASE WHEN businessType = 'adLoaded' THEN machineCode END ) AS adLoaded, COUNT( DISTINCT CASE WHEN businessType = 'adRequest' THEN machineCode END ) AS adRequest, COUNT( DISTINCT CASE WHEN businessType = 'adView' THEN machineCode END ) AS adView, COUNT( DISTINCT CASE WHEN businessType = 'adClick' THEN machineCode END ) AS adClick, COUNT( DISTINCT CASE WHEN businessType = 'adCloseBtnTap' THEN machineCode END ) AS adCloseBtnTap, COUNT( DISTINCT CASE WHEN businessType = 'adCloseGestureTap' THEN machineCode END ) AS adCloseGestureTap, COUNT( DISTINCT CASE WHEN businessType = 'adCloseMaskTap' THEN machineCode END ) AS adCloseMaskTap, COUNT( DISTINCT CASE WHEN businessType = 'adShowError' THEN machineCode END ) AS adShowError, COUNT( DISTINCT CASE WHEN businessType = 'adLoadError' THEN machineCode END ) AS adLoadError, COUNT( DISTINCT CASE WHEN businessType = 'adConfigRequest' THEN machineCode END ) AS adConfigRequest, COUNT( DISTINCT CASE WHEN businessType = 'adConfigLoaded' THEN machineCode END ) AS adConfigLoaded GROUP BY adGroup, adType, appType HAVING adGroup IS NOT NULL AND adType != ' ' ORDER BY appType ASC LIMIT 1000`
  27. adOwnReportQuerySQL = `* and ownAdSystemType:own| SELECT appType, json_extract_scalar(extParams, '$.eventInfos.ab_test002') AS adGroup, ownAdPositionId, COUNT( DISTINCT CASE WHEN businessType = 'adLoaded' THEN machineCode END ) AS adLoaded, COUNT( DISTINCT CASE WHEN businessType = 'adRequest' THEN machineCode END ) AS adRequest, COUNT( DISTINCT CASE WHEN businessType = 'adView' THEN machineCode END ) AS adView, COUNT( DISTINCT CASE WHEN businessType = 'adClick' THEN machineCode END ) AS adClick, COUNT( DISTINCT CASE WHEN businessType = 'adH5View' THEN machineCode END ) AS adH5View,COUNT( DISTINCT CASE WHEN businessType = 'adH5Load' THEN machineCode END ) AS adH5Load, COUNT( DISTINCT CASE WHEN businessType = 'adCloseBtnTap' THEN machineCode END ) AS adCloseBtnTap, COUNT( DISTINCT CASE WHEN businessType = 'adCloseGestureTap' THEN machineCode END ) AS adCloseGestureTap, COUNT( DISTINCT CASE WHEN businessType = 'adCloseMaskTap' THEN machineCode END ) AS adCloseMaskTap, COUNT( DISTINCT CASE WHEN businessType = 'adLoadError' THEN machineCode END ) AS adLoadError GROUP BY adGroup, ownAdPositionId, appType HAVING adGroup IS NOT NULL AND ownAdPositionId IS NOT NULL ORDER BY appType ASC LIMIT 1000`
  28. adOwnConvReportQuerySQL = `* and ownAdSystemType:own| SELECT appType, json_extract_scalar(extParams, '$.eventInfos.ab_test002') AS adGroup, COUNT( DISTINCT CASE WHEN businessType = 'adLoaded' THEN machineCode END ) AS adLoaded, COUNT( DISTINCT CASE WHEN businessType = 'adRequest' THEN machineCode END ) AS adRequest, COUNT( DISTINCT CASE WHEN businessType = 'adView' THEN machineCode END ) AS adView, COUNT( DISTINCT CASE WHEN businessType = 'adClick' THEN machineCode END ) AS adClick, COUNT( DISTINCT CASE WHEN businessType = 'adH5View' THEN machineCode END ) AS adH5View,COUNT( DISTINCT CASE WHEN businessType = 'adH5Load' THEN machineCode END ) AS adH5Load, COUNT( DISTINCT CASE WHEN businessType = 'adCloseBtnTap' THEN machineCode END ) AS adCloseBtnTap, COUNT( DISTINCT CASE WHEN businessType = 'adCloseGestureTap' THEN machineCode END ) AS adCloseGestureTap, COUNT( DISTINCT CASE WHEN businessType = 'adCloseMaskTap' THEN machineCode END ) AS adCloseMaskTap, COUNT( DISTINCT CASE WHEN businessType = 'adLoadError' THEN machineCode END ) AS adLoadError GROUP BY adGroup, ownAdPositionId, appType HAVING adGroup IS NOT NULL AND ownAdPositionId IS NOT NULL ORDER BY appType ASC LIMIT 1000`
  29. adReportQuerySQL4 = `* | SELECT appType, json_extract_scalar(extParams, '$.eventInfos.ab_test004') AS adGroup, CASE WHEN adType = 1 THEN 'BANNER广告' WHEN adType = 2 THEN '视频广告' WHEN adType = 3 THEN '贴片广告' WHEN adType = 4 THEN '插屏广告' WHEN adType = 5 THEN '开屏广告' WHEN adType = 6 THEN '激励广告' ELSE ' ' END AS adType, COUNT( DISTINCT CASE WHEN businessType = 'adLoaded' THEN machineCode END ) AS adLoaded, COUNT( DISTINCT CASE WHEN businessType = 'adRequest' THEN machineCode END ) AS adRequest, COUNT( DISTINCT CASE WHEN businessType = 'adView' THEN machineCode END ) AS adView, COUNT( DISTINCT CASE WHEN businessType = 'adClick' THEN machineCode END ) AS adClick, COUNT( DISTINCT CASE WHEN businessType = 'adShowError' THEN machineCode END ) AS adShowError, COUNT( DISTINCT CASE WHEN businessType = 'adLoadError' THEN machineCode END ) AS adLoadError, COUNT( DISTINCT CASE WHEN businessType = 'adConfigRequest' THEN machineCode END ) AS adConfigRequest, COUNT( DISTINCT CASE WHEN businessType = 'adConfigLoaded' THEN machineCode END ) AS adConfigLoaded GROUP BY adGroup, adType, appType HAVING adGroup IS NOT NULL AND adType != ' ' ORDER BY appType ASC LIMIT 1000`
  30. apiQuerySQL = `* and requestUri: "/longvideoapi/video/distribute/category/videoList/v2" or requestUri: "/longvideoapi/video/v2/detail" or requestUri: "/longvideoapi/video/v2/sharePageDetail" or requestUri: "/longvideoapi/video/recommend/sharePage/list" | SELECT requestUri, json_extract_scalar(params, '$.appType') as appType, COUNT(*) as total, count( case when resultCode = 0 THEN 1 else null end ) as success, count( case when resultCode != 0 THEN 1 else null end ) as error GROUP by appType, requestUri order by requestUri asc limit 1000`
  31. videoPlayQuerySQL = `* | select appType, COUNT(*) as cnt, businessType, pageSource GROUP by appType, businessType, pageSource ORDER BY appType ASC, cnt DESC LIMIT 1000`
  32. // videoPlayCountQuerySQL = `* AND businessType : videoPlay | select appType, COUNT(*) as plyaCount, pageSource GROUP BY appType, pageSource ORDER BY appType ASC`
  33. // adConfigQuerySQL = `* and requestUri: /longvideoapi/ad/position/info | select json_extract_scalar(params, '$.appType') as appType,count(*) as total, count(case when resultCode = 0 then 1 else null end) as success,count(case when resultCode != 0 then 1 else null end) as error,count(case when resultSize > 0 then 1 else null end) as hasAds,count(case when resultSize <= 0 then 1 else null end) as noAds group by appType`
  34. adConfigQuerySQL = `* and url : "/ad/position/info" | SELECT count(*) as total, count( case when json_extract_scalar(responseBody, '$.code') = '0' then 1 else null end ) as success, count( case when json_extract_scalar(responseBody, '$.code') != '0' then 1 else null end ) as error, count( case when json_array_length(json_extract(responseBody, '$.data')) <= 0 then 1 else null end ) as noAds, count( case when json_array_length(json_extract(responseBody, '$.data')) > 0 then 1 else null end ) as hasAds, json_extract(requestBody, '$.baseInfo.appType') as appType group by appType `
  35. apiRtQuerySQL = `* and requestUri: "/longvideoapi/video/distribute/category/videoList/v2" or requestUri: "/longvideoapi/video/v2/detail" or requestUri: "/longvideoapi/video/v2/sharePageDetail" or requestUri: "/longvideoapi/video/recommend/sharePage/list" | select "requestUri", "params.appType" as "appType" , avg("expendTime") as "rt" from log group by "requestUri", "appType" order by "appType" asc limit 1000`
  36. videoDataQuerySQL = `* | select appType, COUNT(*) as cnt, businessType, pageSource GROUP by appType, businessType, pageSource ORDER BY appType ASC, businessType LIMIT 1000`
  37. distributeApiQuerySQL = ` * and (requestUri: "/longvideoapi/video/distribute/category/videoList/v2" or requestUri: "/longvideoapi/video/recommend/sharePage/list") and not resultSize: 4 | SELECT json_extract_scalar(params, '$.appType') as appType, requestUri, COUNT( DISTINCT CASE WHEN resultSize = 0 THEN json_extract_scalar(params, '$.machineCode') END ) AS "等于0", COUNT( DISTINCT CASE WHEN (resultSize < 4 and resultSize >0) THEN json_extract_scalar(params, '$.machineCode') END ) AS "小于4" GROUP BY requestUri, appType ORDER BY appType ASC LIMIT 1000`
  38. shareDataQuerySQL = `* and ( businessType = 'videoShareFriend' OR businessType = 'videoShareH5' OR businessType = 'videoPublish' ) | select appType, COUNT(DISTINCT mid) as cnt, COUNT(*) as cnt1, businessType, pageSource GROUP by appType, pageSource, businessType ORDER BY appType ASC, cnt DESC LIMIT 1000 `
  39. shareOperation1QuerySQL = `* and objectType: weapp_quitbutton OR objectType: weapp_share_navigator_moveVideo OR objectType: weapp_share_upload OR ( objectType: weapp_share_shareFriendWindow AND businessType: buttonClick ) | select objectType, appType, COUNT(*) as cnt GROUP by objectType, appType ORDER BY appType asc, objectType asc `
  40. shareOperation2QuerySQL = `* and pageSource: "user-videos-share" | select COUNT(*) as cnt, ( CASE WHEN groupShare IS NULL THEN 'shareFriend' WHEN groupShare = 1 THEN 'shareGroup' ELSE ' ' END ) as type, appType GROUP BY type, appType ORDER BY appType asc, type asc `
  41. )
  42. func init() {
  43. client := sls.CreateNormalInterface(Endpoint, AccessKeyID, AccessKeySecret, "")
  44. var err error
  45. longvideoReqeustLogStore, err = client.GetLogStore("wqsd-longvideoapi", "request-log")
  46. if err != nil {
  47. panic(err)
  48. }
  49. adActionLogStore, err = client.GetLogStore("wqsd-longvideo-frontend-log-prd", "ad-action-log")
  50. if err != nil {
  51. panic(err)
  52. }
  53. adOwnActionLogStore, err = client.GetLogStore("video-upload-data-prod", "own-ad-action-log")
  54. if err != nil {
  55. panic(err)
  56. }
  57. adOwnConvLogStore, err = client.GetLogStore("video-upload-data-prod", "ad_own_open_conv")
  58. if err != nil {
  59. panic(err)
  60. }
  61. videoActionStore, err = client.GetLogStore("wqsd-video", "video-action-log")
  62. if err != nil {
  63. panic(err)
  64. }
  65. videoPlayStore, err = client.GetLogStore("wqsd-video", "video-play-log")
  66. if err != nil {
  67. panic(err)
  68. }
  69. simpleeventStore, err = client.GetLogStore("wqsd-longvideo-frontend-log-prd", "simpleevent-log")
  70. if err != nil {
  71. panic(err)
  72. }
  73. userShareStore, err = client.GetLogStore("wqsd-user", "user-share-log")
  74. if err != nil {
  75. panic(err)
  76. }
  77. adRequestStore, err = client.GetLogStore("ms-ad", "request-log")
  78. if err != nil {
  79. panic(err)
  80. }
  81. }
  82. func (c *CustomCollector) Describe(ch chan<- *prometheus.Desc) {
  83. ch <- c.AdInfoDesc
  84. ch <- c.AdOwnWechatInfoDesc
  85. ch <- c.AdOwnInfoDesc
  86. ch <- c.ApiInfoDesc
  87. ch <- c.VideoPlayDesc
  88. ch <- c.AdConfigDesc
  89. ch <- c.AdInfo4Desc
  90. ch <- c.ApiRtDesc
  91. ch <- c.VideoDataDesc
  92. ch <- c.DistributeApiDesc
  93. ch <- c.ShareDataDesc
  94. ch <- c.ShareOperationDesc
  95. }
  96. func (c *CustomCollector) Collect(ch chan<- prometheus.Metric) {
  97. resp, err := longvideoReqeustLogStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), apiQuerySQL, 0, 0, true)
  98. if err != nil || resp == nil {
  99. log.Printf("get api logs error %+v resp is %+v.", err, resp)
  100. return
  101. }
  102. for _, v := range resp.Logs {
  103. for k, v2 := range v {
  104. if k == "total" ||
  105. k == "success" ||
  106. k == "error" {
  107. v3, _ := strconv.ParseFloat(v2, 64)
  108. ch <- prometheus.MustNewConstMetric(
  109. c.ApiInfoDesc,
  110. prometheus.GaugeValue,
  111. v3,
  112. v["appType"], v["requestUri"], k,
  113. )
  114. }
  115. }
  116. }
  117. resp, err = adActionLogStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), adReportQuerySQL, 0, 0, true)
  118. if err != nil || resp == nil {
  119. log.Printf("get ad report logs ab_test002 error %+v resp is %+v.", err, resp)
  120. return
  121. }
  122. for _, v := range resp.Logs {
  123. for k, v2 := range v {
  124. if k == "adRequest" ||
  125. k == "adShowError" ||
  126. k == "adLoadError" ||
  127. k == "adConfigRequest" ||
  128. k == "adConfigLoaded" ||
  129. k == "adLoaded" ||
  130. k == "adView" ||
  131. k == "adClick" {
  132. v3, _ := strconv.ParseFloat(v2, 64)
  133. ch <- prometheus.MustNewConstMetric(
  134. c.AdInfoDesc,
  135. prometheus.GaugeValue,
  136. v3,
  137. v["appType"], v["adGroup"], v["adType"], k,
  138. )
  139. }
  140. }
  141. }
  142. resp, err = adActionLogStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), adReportQuerySQL4, 0, 0, true)
  143. if err != nil || resp == nil {
  144. log.Printf("get ad report logs ab_test004 error %+v resp is %+v.", err, resp)
  145. return
  146. }
  147. for _, v := range resp.Logs {
  148. for k, v2 := range v {
  149. if k == "adRequest" ||
  150. k == "adShowError" ||
  151. k == "adLoadError" ||
  152. k == "adConfigRequest" ||
  153. k == "adConfigLoaded" ||
  154. k == "adLoaded" ||
  155. k == "adView" ||
  156. k == "adClick" {
  157. v3, _ := strconv.ParseFloat(v2, 64)
  158. ch <- prometheus.MustNewConstMetric(
  159. c.AdInfo4Desc,
  160. prometheus.GaugeValue,
  161. v3,
  162. v["appType"], v["adGroup"], v["adType"], k,
  163. )
  164. }
  165. }
  166. }
  167. resp, err = adOwnActionLogStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), adOwnWecahtReportQuerySQL, 0, 0, true)
  168. if err != nil || resp == nil {
  169. log.Printf("get own ad report logs ab_test002 error %+v resp is %+v.", err, resp)
  170. return
  171. }
  172. for _, v := range resp.Logs {
  173. for k, v2 := range v {
  174. if k == "adRequest" ||
  175. k == "adShowError" ||
  176. k == "adLoadError" ||
  177. k == "adConfigRequest" ||
  178. k == "adConfigLoaded" ||
  179. k == "adLoaded" ||
  180. k == "adView" ||
  181. k == "adCloseBtnTap" ||
  182. k == "adCloseGestureTap" ||
  183. k == "adCloseMaskTap" ||
  184. k == "adClick" {
  185. v3, _ := strconv.ParseFloat(v2, 64)
  186. ch <- prometheus.MustNewConstMetric(
  187. c.AdOwnWechatInfoDesc,
  188. prometheus.GaugeValue,
  189. v3,
  190. v["appType"], v["adGroup"], v["adType"], k,
  191. )
  192. }
  193. }
  194. }
  195. resp, err = adOwnActionLogStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), adOwnReportQuerySQL, 0, 0, true)
  196. if err != nil || resp == nil {
  197. log.Printf("get own ad report logs ab_test002 error %+v resp is %+v.", err, resp)
  198. return
  199. }
  200. for _, v := range resp.Logs {
  201. for k, v2 := range v {
  202. if k == "adRequest" ||
  203. k == "adLoadError" ||
  204. k == "adConfigRequest" ||
  205. k == "adConfigLoaded" ||
  206. k == "adLoaded" ||
  207. k == "adView" ||
  208. k == "adH5View" ||
  209. k == "adH5Load" ||
  210. k == "adCloseBtnTap" ||
  211. k == "adCloseGestureTap" ||
  212. k == "adCloseMaskTap" ||
  213. k == "adClick" {
  214. v3, _ := strconv.ParseFloat(v2, 64)
  215. ch <- prometheus.MustNewConstMetric(
  216. c.AdOwnInfoDesc,
  217. prometheus.GaugeValue,
  218. v3,
  219. v["appType"], v["adGroup"], v["ownAdPositionId"], k,
  220. )
  221. }
  222. }
  223. }
  224. resp, err = adRequestStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), adConfigQuerySQL, 0, 0, true)
  225. if err != nil || resp == nil {
  226. log.Printf("get ad config logs error %+v resp is %+v.", err, resp)
  227. return
  228. }
  229. for _, v := range resp.Logs {
  230. for k, v2 := range v {
  231. if k == "total" ||
  232. k == "success" ||
  233. k == "error" ||
  234. k == "hasAds" ||
  235. k == "noAds" {
  236. v3, _ := strconv.ParseFloat(v2, 64)
  237. ch <- prometheus.MustNewConstMetric(
  238. c.AdConfigDesc,
  239. prometheus.GaugeValue,
  240. v3,
  241. v["appType"], k,
  242. )
  243. }
  244. }
  245. }
  246. // resp, err = videoActionStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), videoPlayCountQuerySQL, 0, 0, true)
  247. // if err != nil || resp == nil {
  248. // log.Printf("get video plyaCount logs error %+v resp is %+v.", err, resp)
  249. // return
  250. // }
  251. // for _, v := range resp.Logs {
  252. // v2, _ := strconv.ParseFloat(v["plyaCount"], 64)
  253. // ch <- prometheus.MustNewConstMetric(
  254. // c.VideoPlayDesc,
  255. // prometheus.GaugeValue,
  256. // v2,
  257. // v["appType"], "videoPlayTotal", v["pageSource"],
  258. // )
  259. // }
  260. resp, err = videoPlayStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), videoPlayQuerySQL, 0, 0, true)
  261. if err != nil || resp == nil {
  262. log.Printf("get video play logs error %+v resp is %+v.", err, resp)
  263. return
  264. }
  265. for _, v := range resp.Logs {
  266. v2, _ := strconv.ParseFloat(v["cnt"], 64)
  267. ch <- prometheus.MustNewConstMetric(
  268. c.VideoPlayDesc,
  269. prometheus.GaugeValue,
  270. v2,
  271. v["appType"], v["businessType"], v["pageSource"],
  272. )
  273. }
  274. resp, err = longvideoReqeustLogStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), apiRtQuerySQL, 0, 0, true)
  275. if err != nil || resp == nil {
  276. log.Printf("get api rt logs error %+v resp is %+v.", err, resp)
  277. return
  278. }
  279. for _, v := range resp.Logs {
  280. v3, _ := strconv.ParseFloat(v["rt"], 64)
  281. ch <- prometheus.MustNewConstMetric(
  282. c.ApiRtDesc,
  283. prometheus.GaugeValue,
  284. v3,
  285. v["appType"], v["requestUri"],
  286. )
  287. }
  288. resp, err = videoActionStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), videoDataQuerySQL, 0, 0, true)
  289. if err != nil || resp == nil {
  290. log.Printf("get video data logs error %+v resp is %+v.", err, resp)
  291. return
  292. }
  293. for _, v := range resp.Logs {
  294. v3, _ := strconv.ParseFloat(v["cnt"], 64)
  295. ch <- prometheus.MustNewConstMetric(
  296. c.VideoDataDesc,
  297. prometheus.GaugeValue,
  298. v3,
  299. v["appType"], v["businessType"], v["pageSource"],
  300. )
  301. }
  302. resp, err = longvideoReqeustLogStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), distributeApiQuerySQL, 0, 0, true)
  303. if err != nil || resp == nil {
  304. log.Printf("get distribute api logs error %+v resp is %+v.", err, resp)
  305. return
  306. }
  307. for _, v := range resp.Logs {
  308. // log.Printf("get distribute api logs %+v \n", v)
  309. for k, v2 := range v {
  310. if k == "等于0" ||
  311. k == "小于4" {
  312. v3, _ := strconv.ParseFloat(v2, 64)
  313. ch <- prometheus.MustNewConstMetric(
  314. c.DistributeApiDesc,
  315. prometheus.GaugeValue,
  316. v3,
  317. v["appType"], v["requestUri"], k,
  318. )
  319. }
  320. }
  321. }
  322. resp, err = videoActionStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), shareDataQuerySQL, 0, 0, true)
  323. if err != nil || resp == nil {
  324. log.Printf("get share data logs error %+v resp is %+v.", err, resp)
  325. return
  326. }
  327. for _, v := range resp.Logs {
  328. v3, _ := strconv.ParseFloat(v["cnt"], 64)
  329. ch <- prometheus.MustNewConstMetric(
  330. c.ShareDataDesc,
  331. prometheus.GaugeValue,
  332. v3,
  333. v["appType"], v["businessType"], v["pageSource"], "user",
  334. )
  335. v3, _ = strconv.ParseFloat(v["cnt1"], 64)
  336. ch <- prometheus.MustNewConstMetric(
  337. c.ShareDataDesc,
  338. prometheus.GaugeValue,
  339. v3,
  340. v["appType"], v["businessType"], v["pageSource"], "all",
  341. )
  342. }
  343. resp, err = simpleeventStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), shareOperation1QuerySQL, 0, 0, true)
  344. if err != nil || resp == nil {
  345. log.Printf("get share operation1 logs error %+v resp is %+v.", err, resp)
  346. return
  347. }
  348. for _, v := range resp.Logs {
  349. v3, _ := strconv.ParseFloat(v["cnt"], 64)
  350. ch <- prometheus.MustNewConstMetric(
  351. c.ShareOperationDesc,
  352. prometheus.GaugeValue,
  353. v3,
  354. v["appType"], v["objectType"],
  355. )
  356. }
  357. resp, err = userShareStore.GetLogs("", time.Now().Unix()-60, time.Now().Unix(), shareOperation2QuerySQL, 0, 0, true)
  358. if err != nil || resp == nil {
  359. log.Printf("get share operation2 logs error %+v resp is %+v.", err, resp)
  360. return
  361. }
  362. for _, v := range resp.Logs {
  363. v3, _ := strconv.ParseFloat(v["cnt"], 64)
  364. ch <- prometheus.MustNewConstMetric(
  365. c.ShareOperationDesc,
  366. prometheus.GaugeValue,
  367. v3,
  368. v["appType"], v["type"],
  369. )
  370. }
  371. }
  372. type CustomCollector struct {
  373. AdInfoDesc *prometheus.Desc
  374. AdOwnWechatInfoDesc *prometheus.Desc
  375. AdOwnInfoDesc *prometheus.Desc
  376. AdOwnConvDesc *prometheus.Desc
  377. ApiInfoDesc *prometheus.Desc
  378. AdConfigDesc *prometheus.Desc
  379. AdInfo4Desc *prometheus.Desc
  380. // 视频播放
  381. VideoPlayDesc *prometheus.Desc
  382. // 接口响应时间
  383. ApiRtDesc *prometheus.Desc
  384. // 播放数据
  385. VideoDataDesc *prometheus.Desc
  386. // 分发服务
  387. DistributeApiDesc *prometheus.Desc
  388. // 分享卡片数据
  389. ShareDataDesc *prometheus.Desc
  390. // 分享卡片操作
  391. ShareOperationDesc *prometheus.Desc
  392. }
  393. func main() {
  394. // 注册一个采集器
  395. reg := prometheus.NewPedanticRegistry()
  396. reg.MustRegister(&CustomCollector{
  397. AdInfoDesc: prometheus.NewDesc(
  398. "ad_metrics_info",
  399. "Front report ad metrics info",
  400. []string{"app_type", "ad_group", "ad_type", "_type"},
  401. prometheus.Labels{},
  402. ),
  403. AdOwnWechatInfoDesc: prometheus.NewDesc(
  404. "ad_own_wechat_metrics_info",
  405. "Front report ad own metrics info",
  406. []string{"app_type", "ad_group", "ad_type", "_type"},
  407. prometheus.Labels{},
  408. ),
  409. AdOwnInfoDesc: prometheus.NewDesc(
  410. "ad_own_metrics_info",
  411. "Front report ad own metrics info",
  412. []string{"app_type", "ad_group", "ad_type", "_type"},
  413. prometheus.Labels{},
  414. ),
  415. AdOwnConvDesc: prometheus.NewDesc(
  416. "ad_own_conv_metrics_info",
  417. "Front report ad own metrics info",
  418. []string{"app_type", "ad_group", "ad_type", "_type"},
  419. prometheus.Labels{},
  420. ),
  421. ApiInfoDesc: prometheus.NewDesc(
  422. "api_metrics_info",
  423. "Core API Metrics Info",
  424. []string{"app_type", "url", "_type"},
  425. prometheus.Labels{},
  426. ),
  427. VideoPlayDesc: prometheus.NewDesc(
  428. "video_play_metrics_info",
  429. "Video Play Metrics Info",
  430. []string{"app_type", "_type", "source"},
  431. prometheus.Labels{},
  432. ),
  433. AdConfigDesc: prometheus.NewDesc(
  434. "ad_config_metrics_info",
  435. "Ad system deal request metrics info",
  436. []string{"app_type", "_type"},
  437. prometheus.Labels{},
  438. ),
  439. AdInfo4Desc: prometheus.NewDesc(
  440. "ad_metrics_info_004",
  441. "Front report ad metrics info ab_test004",
  442. []string{"app_type", "ad_group", "ad_type", "_type"},
  443. prometheus.Labels{},
  444. ),
  445. ApiRtDesc: prometheus.NewDesc(
  446. "api_metrics_rt",
  447. "Core API Metrics Response Time",
  448. []string{"app_type", "url"},
  449. prometheus.Labels{},
  450. ),
  451. VideoDataDesc: prometheus.NewDesc(
  452. "video_data_metrics",
  453. "Video Data Metrics",
  454. []string{"app_type", "_type", "source"},
  455. prometheus.Labels{},
  456. ),
  457. DistributeApiDesc: prometheus.NewDesc(
  458. "distribute_api_metrics",
  459. "Distribute Api Metrics",
  460. []string{"app_type", "url", "_type"},
  461. prometheus.Labels{},
  462. ),
  463. ShareDataDesc: prometheus.NewDesc(
  464. "share_data_metrics",
  465. "Share Data Metrics",
  466. []string{"app_type", "_type", "source", "catg"},
  467. prometheus.Labels{},
  468. ),
  469. ShareOperationDesc: prometheus.NewDesc(
  470. "share_operation_metrics",
  471. "Share Operation Metrics",
  472. []string{"app_type", "_type"},
  473. prometheus.Labels{},
  474. ),
  475. })
  476. http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {
  477. promhttp.HandlerFor(prometheus.Gatherers{reg}, promhttp.HandlerOpts{}).ServeHTTP(w, r)
  478. })
  479. log.Println("pq Collector Start server at :10000")
  480. if err := http.ListenAndServe(":10000", nil); err != nil {
  481. log.Printf("Error occur when start server %v", err)
  482. os.Exit(1)
  483. }
  484. }