log_query_user_access_count_export.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. package crontab
  2. import (
  3. "context"
  4. "gd_crontab/apis"
  5. "gd_crontab/errors"
  6. "gd_crontab/rpc_apis"
  7. "gd_crontab/rpc_apis/gd_management"
  8. "fmt"
  9. "strconv"
  10. "strings"
  11. "time"
  12. "github.com/astaxie/beego/orm"
  13. )
  14. func getMonthFromtimestamp(timestamp int64) int {
  15. return int(time.Unix(timestamp, 0).Month())
  16. }
  17. func getUserCountWhereExport(req *apis.LogQueryUserAccessCountExportReq) (w string, s []interface{}) {
  18. if req.EndTimestamp != 0 && req.StartTimestamp != 0 {
  19. w += " and " + "timestamp >=" + " ? and timestamp < ?"
  20. s = append(s, req.StartTimestamp, req.EndTimestamp)
  21. } else {
  22. nowTime := time.Now()
  23. zeroTime := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 0, 0, 0, 0, nowTime.Location())
  24. startTimeStamp := zeroTime.Unix()
  25. endTimeStamp := nowTime.Unix()
  26. w += " and " + "timestamp >= " + " ? and timestamp < ?"
  27. s = append(s, startTimeStamp, endTimeStamp)
  28. }
  29. if len(req.ApiIdList) != 0 {
  30. w += " and api_id in (" + strings.Replace(strings.Trim(fmt.Sprint(req.ApiIdList), "[]"), " ", ",", -1) + ")"
  31. }
  32. if req.MerchantId != 0 {
  33. //strings.Replace(strings.Trim(fmt.Sprint(array_or_slice), "[]"), " ", ",", -1)
  34. w += " and " + "merchant_id" + " = ?"
  35. s = append(s, req.MerchantId)
  36. }
  37. if len(s) > 0 {
  38. //有条件才截取最前面的and
  39. w = string([]byte(w)[4:])
  40. w = " where" + w + " and merchant_data_api_id > 0"
  41. return w, s
  42. } else {
  43. return " where merchant_data_api_id > 0", nil
  44. }
  45. }
  46. func getExportSql(req *apis.LogQueryUserAccessCountExportReq, where string) string {
  47. sqlStr := "select create_time as date, group_concat(distinct merchant_data_api_id) as merchant_data_api_id, api_name,count(state) as total ," +
  48. "sum(code=0 or code=1100 or code=1101 or code=1104 or code=1107) as valid" +
  49. ",sum(code=0 or code=1100 ) as success ,sum(code=0) as query," +
  50. "count(distinct case when code = 0 then search end) as nonredundant_query," +
  51. "count(distinct case when code = 0 or code=1100 or code=1101 or code=1104 or code=1107 then search end) as nonredundant," +
  52. "sum(is_reuse and code=0) as reuse, " +
  53. "avg(elapsed) as avg_elapsed, " +
  54. "sum(elapsed) as sum_elapsed, " +
  55. "sum(code=1000 or code=1001) as platform_error, " +
  56. "sum(code=1101) as provider_error,api_id" +
  57. "%s" +
  58. " from " + req.TabName + " as a %s group by create_time, api_id order by timestamp"
  59. if req.GroupByMerchant {
  60. sqlStr = "select create_time as date, merchant_name, api_id, merchant_id, group_concat(distinct merchant_data_api_id) as merchant_data_api_id, api_name,count(state) as total ," +
  61. "sum(code=0 or code=1100 or code=1101 or code=1104 or code=1107) as valid" +
  62. ",sum(code=0 or code=1100 ) as success ,sum(code=0) as query," +
  63. "count(distinct case when code = 0 then search end) as nonredundant_query," +
  64. "count(distinct case when code = 0 or code=1100 or code=1101 or code=1104 or code=1107 then search end) as nonredundant," +
  65. "sum(is_reuse and code=0) as reuse, " +
  66. "avg(elapsed) as avg_elapsed, " +
  67. "sum(elapsed) as sum_elapsed, " +
  68. "sum(code=1000 or code=1001) as platform_error, " +
  69. "sum(code=1101) as provider_error,api_id" +
  70. "%s" +
  71. " from " + req.TabName + " as a %s group by create_time, merchant_id, api_id order by timestamp"
  72. }
  73. concat := ""
  74. subSql := ""
  75. timeList := strings.Split(req.TimeList, ",")
  76. for _, v := range timeList {
  77. if v == "" {
  78. break
  79. }
  80. if subSql == "" {
  81. subSql = fmt.Sprintf("sum(elapsed > %s)", v)
  82. continue
  83. }
  84. subSql = fmt.Sprintf("%s,sum(elapsed > %s)", subSql, v)
  85. }
  86. if subSql != "" {
  87. concat = fmt.Sprintf(",concat_ws(',', %s) as big_elapseds", subSql)
  88. }
  89. sqlStr = fmt.Sprintf(sqlStr, concat, where)
  90. return sqlStr
  91. }
  92. func getUsedCount(o orm.Ormer, info *gd_management.UserMerchantCountCode, timeoutInfo map[string]int, start, end int64, tabname string) int {
  93. used := 0
  94. if info.ComboType == 1 {
  95. start = 0
  96. } else {
  97. start = end - 24*60*60
  98. }
  99. timeout := 3600 * 24
  100. key := fmt.Sprintf("%d%d", info.MerchantDataApiId, info.ApiId)
  101. if t, ok := timeoutInfo[key]; ok && t > 0 {
  102. timeout = t
  103. }
  104. sql := fmt.Sprintf("select count(1) from "+tabname+" where merchant_data_api_id = %d and api_id = %d and elapsed < %d and timestamp >= %d and timestamp < %d ", info.MerchantDataApiId, info.ApiId, timeout, start, end)
  105. if info.CountType == 1 {
  106. if info.CountCode == "" {
  107. return 0
  108. }
  109. sql = fmt.Sprintf("select count(1) from "+tabname+" where merchant_data_api_id = %d and api_id = %d and elapsed < %d and timestamp >= %d and timestamp < %d and raw_code in(%s)", info.MerchantDataApiId, info.ApiId, timeout, start, end, info.CountCode)
  110. }
  111. o.Raw(sql).QueryRow(&used)
  112. return used
  113. }
  114. var lastTimeInfo string
  115. var countInfoCache = map[string]*apis.MerchantApiCountInfo{}
  116. func getApiCountInfo(countCode []gd_management.UserMerchantCountCode, timeoutInfo map[string]int, start, end int64, tabname string) map[string]*apis.MerchantApiCountInfo {
  117. if fmt.Sprintf("%d-%d", start, end) == lastTimeInfo && len(countInfoCache) > 0 {
  118. return countInfoCache
  119. }
  120. m := map[string]*apis.MerchantApiCountInfo{}
  121. for _, v := range countCode {
  122. key := fmt.Sprintf("%d", v.MerchantDataApiId)
  123. if _, ok := m[key]; ok == false {
  124. m[key] = &apis.MerchantApiCountInfo{
  125. MerchantDataApiId: v.MerchantDataApiId,
  126. ComboType: v.ComboType,
  127. Count: v.Count,
  128. Used: v.DayUsed,
  129. Remain: v.Remain,
  130. }
  131. }
  132. }
  133. countInfoCache = m
  134. lastTimeInfo = fmt.Sprintf("%d-%d", start, end)
  135. return m
  136. }
  137. func getNotShow() (map[int64]bool, error) {
  138. req := gd_management.ManagementGetApiShowInfoReq{}
  139. reply, err := rpc_apis.Management.ManagementGetApiShowInfo(context.Background(), &req)
  140. if err != nil {
  141. return nil, err
  142. }
  143. ret := map[int64]bool{}
  144. for _, v := range reply.Infos {
  145. if v.IsShow == false {
  146. ret[v.ApiId] = true
  147. }
  148. }
  149. return ret, nil
  150. }
  151. func getCountCodeInfoNew(req *apis.LogQueryUserAccessCountExportReq, timeoutInfo map[string]int) (map[string]gd_management.UserMerchantCountCode, []gd_management.UserMerchantCountCode, error) {
  152. mReq := gd_management.MangementGetUserMerchantCountCodeReq{}
  153. mreply, err := rpc_apis.Management.MangementGetUserMerchantCountCode(context.Background(), &mReq)
  154. if err != nil {
  155. return nil, nil, err
  156. }
  157. countMap := make(map[string]gd_management.UserMerchantCountCode, len(mreply.UserMerchantCountCode))
  158. for _, v := range mreply.UserMerchantCountCode {
  159. countMap[strconv.Itoa(int(v.MerchantDataApiId))+strconv.Itoa(int(v.ApiId))] = v
  160. }
  161. return countMap, mreply.UserMerchantCountCode, nil
  162. }
  163. func getTimeoutInfo() (map[string]int, error) {
  164. req := gd_management.ManagementGetMerchantApiTimeoutReq{}
  165. reply, err := rpc_apis.Management.ManagementGetMerchantApiTimeout(context.Background(), &req)
  166. if err != nil {
  167. return nil, err
  168. }
  169. ret := map[string]int{}
  170. for _, v := range reply.Infos {
  171. ret[fmt.Sprintf("%d%d", v.MerchantDataApiId, v.ApiId)] = v.Timeout
  172. }
  173. return ret, nil
  174. }
  175. func getStartEndTimestamp(reqStart, reqEnd int64, date string) (int64, int64) {
  176. loc, _ := time.LoadLocation("Local")
  177. t, err := time.ParseInLocation("2006-01-02", date, loc)
  178. if err != nil {
  179. return reqStart, reqEnd
  180. }
  181. if date == "" {
  182. return reqStart, reqEnd
  183. }
  184. dayStart := t.Unix()
  185. dayEnd := t.AddDate(0, 0, 1).Unix()
  186. if reqStart < dayStart || reqStart >= dayEnd {
  187. reqStart = dayStart
  188. }
  189. if reqEnd > dayEnd || reqEnd <= dayStart {
  190. reqEnd = dayEnd
  191. }
  192. return reqStart, reqEnd
  193. }
  194. func computeCharge(req *apis.LogQueryUserAccessCountExportReq,
  195. timeoutInfo map[string]int, info *apis.LogQueryUserAcessCountExport,
  196. countInfo map[string]*apis.MerchantApiCountInfo, countMap map[string]gd_management.UserMerchantCountCode) {
  197. // 用于统计计费中超时的数量
  198. subSql := ""
  199. concat := ""
  200. timeList := strings.Split(req.TimeList, ",")
  201. for _, v := range timeList {
  202. if v == "" {
  203. break
  204. }
  205. if subSql == "" {
  206. subSql = fmt.Sprintf("sum(elapsed > %s)", v)
  207. continue
  208. }
  209. subSql = fmt.Sprintf("%s,sum(elapsed > %s)", subSql, v)
  210. }
  211. if subSql != "" {
  212. concat = fmt.Sprintf(", concat_ws(',', %s) as big_elapseds", subSql)
  213. }
  214. sqlStr := ""
  215. mdids := strings.Split(info.MerchantDataApiId, ",")
  216. for _, mdid := range mdids {
  217. if apiCountInfo, ok := countInfo[mdid]; ok {
  218. info.CountInfos = append(info.CountInfos, *apiCountInfo)
  219. }
  220. }
  221. info.ChargeBigElapsedList = make([]int, len(timeList))
  222. for _, mdid := range mdids {
  223. bigelapsed := ""
  224. v, ok := countMap[mdid+fmt.Sprintf("%d", info.ApiId)]
  225. if ok == false {
  226. continue
  227. }
  228. count := int64(0)
  229. chargeReuseCount := int64(0)
  230. timeout := 3600 * 24
  231. if t, ok := timeoutInfo[mdid+fmt.Sprintf("%d", info.ApiId)]; ok && t > 0 {
  232. timeout = t
  233. }
  234. switch {
  235. case v.CountType == 0 && timeout == 3600*24 && len(mdids) == 1:
  236. chargeReuseCount = info.Reuse
  237. count = info.Total
  238. bigelapsed = info.BigElapseds
  239. case v.CountType == 0 && (timeout != 3600*24 || len(mdids) > 1):
  240. sqlStr = "select count(id), sum(is_reuse)" + concat + " from " + req.TabName + " where merchant_data_api_id = %s and api_id = %d and elapsed < %d and timestamp >= ? and timestamp < ?"
  241. sqlStr = fmt.Sprintf(sqlStr, mdid, info.ApiId, timeout)
  242. start, end := getStartEndTimestamp(req.StartTimestamp, req.EndTimestamp, info.Date)
  243. if concat == "" {
  244. orm.NewOrm().Raw(sqlStr, start, end).QueryRow(&count, &chargeReuseCount)
  245. } else {
  246. orm.NewOrm().Raw(sqlStr, start, end).QueryRow(&count, &chargeReuseCount, &bigelapsed)
  247. }
  248. default:
  249. if v.CountCode == "" {
  250. count = 0
  251. chargeReuseCount = 0
  252. for i := 0; i < len(timeList); i++ {
  253. if bigelapsed == "" {
  254. bigelapsed = "0"
  255. } else {
  256. bigelapsed = fmt.Sprintf("%s,0", bigelapsed)
  257. }
  258. }
  259. } else {
  260. if strings.Contains(v.CountCode, "1100") {
  261. v.CountCode = fmt.Sprintf("%s,1105,1106,1107,1108,1109,1110", v.CountCode)
  262. }
  263. start, end := getStartEndTimestamp(req.StartTimestamp, req.EndTimestamp, info.Date)
  264. sqlStr = "select count(id), sum(is_reuse)" + concat + " from " + req.TabName + " where merchant_data_api_id = %s and api_id = %d and raw_code in (%s) and timestamp >= ? and timestamp < ? and elapsed < %d"
  265. sqlStr = fmt.Sprintf(sqlStr, mdid, info.ApiId, v.CountCode, timeout)
  266. if concat == "" {
  267. orm.NewOrm().Raw(sqlStr, start, end).QueryRow(&count, &chargeReuseCount)
  268. } else {
  269. orm.NewOrm().Raw(sqlStr, start, end).QueryRow(&count, &chargeReuseCount, &bigelapsed)
  270. }
  271. }
  272. }
  273. info.Charge += count
  274. info.ChargeReuse += chargeReuseCount
  275. if bigelapsed != "" {
  276. array := strings.Split(bigelapsed, ",")
  277. for i, _ := range array {
  278. vint, _ := strconv.Atoi(array[i])
  279. info.ChargeBigElapsedList[i] += vint
  280. }
  281. }
  282. }
  283. info.ChargeRate = strconv.FormatFloat(float64(100*info.Charge)/float64(info.Total), 'f', 2, 64) + "%"
  284. if info.Valid == 0 {
  285. info.ChargeReuseRate = "0%"
  286. } else {
  287. info.ChargeReuseRate = strconv.FormatFloat(float64(100*info.ChargeReuse)/float64(info.Valid), 'f', 2, 64) + "%"
  288. }
  289. }
  290. func computeTimeout(info *apis.LogQueryUserAcessCountExport, timeoutInfo map[string]int, tabname string) {
  291. mdids := strings.Split(info.MerchantDataApiId, ",")
  292. for _, mdid := range mdids {
  293. timeout := 3600 * 24
  294. originTimeoutInfo := 0
  295. if t, ok := timeoutInfo[mdid+fmt.Sprintf("%d", info.ApiId)]; ok {
  296. originTimeoutInfo = t
  297. if t > 0 {
  298. timeout = t
  299. }
  300. }
  301. info.TimeoutInfo = fmt.Sprintf("%s,%d", info.TimeoutInfo, originTimeoutInfo)
  302. if len(mdids) == 1 && timeout == 3600*24 {
  303. continue
  304. }
  305. count := 0
  306. sqlStr := "select count(id) from " + tabname + " where merchant_data_api_id = %s and api_id = %d and elapsed >= %d and create_time = ?"
  307. sqlStr = fmt.Sprintf(sqlStr, mdid, info.ApiId, timeout)
  308. orm.NewOrm().Raw(sqlStr, info.Date).QueryRow(&count)
  309. info.TimeoutCount += count
  310. }
  311. info.TimeoutInfo = strings.TrimPrefix(info.TimeoutInfo, ",")
  312. }
  313. func setSearchTimestamp(req *apis.LogQueryUserAccessCountExportReq) {
  314. if req.EndTimestamp == 0 || req.StartTimestamp == 0 {
  315. nowTime := time.Now()
  316. zeroTime := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day(), 0, 0, 0, 0, nowTime.Location())
  317. req.StartTimestamp = zeroTime.Unix()
  318. req.EndTimestamp = nowTime.Unix()
  319. }
  320. }
  321. func computeBigelapse(info *apis.LogQueryUserAcessCountExport) {
  322. if info.BigElapseds != "" {
  323. array := strings.Split(info.BigElapseds, ",")
  324. info.BigElapsedList = make([]int, len(array))
  325. for i, _ := range array {
  326. vint, _ := strconv.Atoi(array[i])
  327. info.BigElapsedList[i] = vint
  328. }
  329. }
  330. }
  331. func computePercent(info *apis.LogQueryUserAcessCountExport) {
  332. if info.Valid != 0 {
  333. info.QueryRate = strconv.FormatFloat(float64(100*info.Query)/float64(info.Valid), 'f', 2, 64) + "%"
  334. info.NonredundantQueryRate = strconv.FormatFloat(float64(100*info.NonredundantQuery)/float64(info.Nonredundant), 'f', 2, 64) + "%"
  335. info.SuccessRate = strconv.FormatFloat(float64(100*info.Success)/float64(info.Valid), 'f', 2, 64) + "%"
  336. info.ReuseRate = strconv.FormatFloat(float64(100*info.Reuse)/float64(info.Valid), 'f', 2, 64) + "%"
  337. info.PlatformErrorRate = strconv.FormatFloat(float64(100*info.PlatformError)/float64(info.Valid), 'f', 2, 64) + "%"
  338. info.ProviderErrorRate = strconv.FormatFloat(float64(100*info.ProviderError)/float64(info.Valid), 'f', 2, 64) + "%"
  339. } else {
  340. info.QueryRate = "0%"
  341. info.SuccessRate = "0%"
  342. info.ReuseRate = "0%"
  343. }
  344. if info.Nonredundant == 0 {
  345. info.NonredundantQueryRate = "0%"
  346. } else {
  347. info.NonredundantQueryRate = strconv.FormatFloat(float64(100*info.NonredundantQuery)/float64(info.Nonredundant), 'f', 2, 64) + "%"
  348. }
  349. if info.Total != 0 {
  350. info.ValidRate = strconv.FormatFloat(float64(100*info.Valid)/float64(info.Total), 'f', 2, 64) + "%"
  351. } else {
  352. info.ValidRate = "0%"
  353. }
  354. }
  355. func getMonthTab(prefix string, timestamp int64) string {
  356. month := getMonthFromtimestamp(timestamp)
  357. if month > 12 || month < 1 {
  358. return ""
  359. }
  360. return fmt.Sprintf("%s%d", prefix, month)
  361. }
  362. type exportTime struct {
  363. start int64
  364. end int64
  365. month int
  366. }
  367. func nextMonthDay(t time.Time) time.Time {
  368. month := t.Month()
  369. for {
  370. t = t.AddDate(0, 0, 1)
  371. if t.Month() != month {
  372. return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
  373. }
  374. }
  375. return t
  376. }
  377. func getExportTimes(startTimestamp, endTimestamp int64) []exportTime {
  378. if time.Unix(startTimestamp, 0).Month() == time.Unix(endTimestamp, 0).Month() {
  379. return []exportTime{{
  380. start: startTimestamp,
  381. end: endTimestamp,
  382. month: int(time.Unix(startTimestamp, 0).Month()),
  383. }}
  384. }
  385. ret := []exportTime{}
  386. start := startTimestamp
  387. for {
  388. end := nextMonthDay(time.Unix(start, 0))
  389. if end.Unix() >= endTimestamp {
  390. item := exportTime{
  391. start: start,
  392. end: endTimestamp,
  393. month: int(time.Unix(start, 0).Month()),
  394. }
  395. ret = append(ret, item)
  396. break
  397. }
  398. item := exportTime{
  399. start: start,
  400. end: end.Unix(),
  401. month: int(time.Unix(start, 0).Month()),
  402. }
  403. ret = append(ret, item)
  404. start = end.Unix()
  405. }
  406. return ret
  407. }
  408. func logQueryUserAccessCountExport(req *apis.LogQueryUserAccessCountExportReq, reply *apis.LogQueryUserAccessCountExportReply, noShowMap map[int64]bool, timeoutInfo map[string]int, countMap map[string]gd_management.UserMerchantCountCode, countCodes []gd_management.UserMerchantCountCode) error {
  409. countInfo := map[string]*apis.MerchantApiCountInfo{}
  410. if req.NeedCount {
  411. countInfo = getApiCountInfo(countCodes, timeoutInfo, req.StartTimestamp, req.EndTimestamp, req.TabName)
  412. }
  413. // 查询
  414. where, val := getUserCountWhereExport(req)
  415. sqlStr := getExportSql(req, where)
  416. o := orm.NewOrm()
  417. _, err := o.Raw(sqlStr, val).QueryRows(&reply.LogQueryUserAcessCount)
  418. if err != nil && err != orm.ErrNoRows {
  419. return errors.DataBaseError
  420. }
  421. // 计算指标
  422. for index, info := range reply.LogQueryUserAcessCount {
  423. computeCharge(req, timeoutInfo, &reply.LogQueryUserAcessCount[index], countInfo, countMap)
  424. computeTimeout(&reply.LogQueryUserAcessCount[index], timeoutInfo, req.TabName)
  425. computeBigelapse(&reply.LogQueryUserAcessCount[index])
  426. computePercent(&reply.LogQueryUserAcessCount[index])
  427. if noShowMap != nil {
  428. if _, ok := noShowMap[info.ApiId]; ok == true {
  429. continue
  430. reply.LogQueryUserAcessCount[index].NotShow = true
  431. }
  432. }
  433. }
  434. // clear
  435. countMap = nil
  436. noShowMap = nil
  437. countInfo = nil
  438. timeoutInfo = nil
  439. return nil
  440. }
  441. func LogQueryUserAccessCountExportNew(req *apis.LogQueryUserAccessCountExportReq, reply *apis.LogQueryUserAccessCountExportReply) error {
  442. setSearchTimestamp(req)
  443. showInfo, err := getNotShow()
  444. if err != nil {
  445. return err
  446. }
  447. timeoutInfo, err := getTimeoutInfo()
  448. if err != nil {
  449. return err
  450. }
  451. countCodeInfo, countCodes, err := getCountCodeInfoNew(req, timeoutInfo)
  452. if err != nil {
  453. return err
  454. }
  455. if req.TabName == "t_gd_access_log_day" {
  456. return logQueryUserAccessCountExport(req, reply, showInfo, timeoutInfo, countCodeInfo, countCodes)
  457. }
  458. exportTimes := getExportTimes(req.StartTimestamp, req.EndTimestamp)
  459. for _, v := range exportTimes {
  460. req.StartTimestamp = v.start
  461. req.EndTimestamp = v.end
  462. req.TabName = getMonthTab("t_gd_access_log_month", req.StartTimestamp)
  463. subReply := &apis.LogQueryUserAccessCountExportReply{}
  464. err := logQueryUserAccessCountExport(req, subReply, showInfo, timeoutInfo, countCodeInfo, countCodes)
  465. if err != nil {
  466. return err
  467. }
  468. reply.LogQueryUserAcessCount = append(reply.LogQueryUserAcessCount, subReply.LogQueryUserAcessCount...)
  469. }
  470. return nil
  471. }
  472. func LogQueryUserAccessCountExport(ctx context.Context, req *apis.LogQueryUserAccessCountExportReq, reply *apis.LogQueryUserAccessCountExportReply) error {
  473. return LogQueryUserAccessCountExportNew(req, reply)
  474. }