From a4ca2628dc498603cbb62bc6cd6936613cfc00f3 Mon Sep 17 00:00:00 2001 From: kehaoyuan Date: Fri, 28 Aug 2020 18:44:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=86=E7=89=87=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E4=B8=8B=E8=BD=BD=E8=BF=9B=E5=BA=A6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=20https://gitlab.ghzs.com/stats/stats-issues/-/issues/188#note?= =?UTF-8?q?=5F66919?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/FixedRateJobHelper.kt | 15 ++++- .../com/gh/download/DownloadDataHelper.kt | 58 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/FixedRateJobHelper.kt b/app/src/main/java/com/gh/common/FixedRateJobHelper.kt index 7708bcbc8d..8b24e5a026 100644 --- a/app/src/main/java/com/gh/common/FixedRateJobHelper.kt +++ b/app/src/main/java/com/gh/common/FixedRateJobHelper.kt @@ -4,7 +4,9 @@ import com.gh.common.exposure.ExposureManager import com.gh.common.filter.RegionSettingHelper import com.gh.common.loghub.LoghubUtils import com.gh.common.util.doOnMainProcessOnly +import com.gh.common.util.tryCatchInRelease import com.gh.common.videolog.VideoRecordUtils +import com.gh.download.DownloadDataHelper import com.gh.gamecenter.entity.TimeEntity import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager @@ -12,13 +14,16 @@ import com.halo.assistant.HaloApp import kotlin.concurrent.fixedRateTimer object FixedRateJobHelper { - private const val CHECKER_PERIOD: Long = 60 * 1000L + private const val CHECKER_PERIOD: Long = 15 * 1000L private const val TIME_PERIOD: Long = 600 * 1000L private const val LOGHUB_PERIOD: Long = 120 * 1000L private const val EXPOSURE_PERIOD: Long = 300 * 1000L private const val REGION_SETTING_PERIOD: Long = 300 * 1000L private const val VIDEO_RECORD_PERIOD: Long = 60 * 1000L + private const val DOWNLOAD_HEARTBEAT_PERIOD: Long = 60 * 1000L + private const val DOWNLOAD_HEARTBEAT_SHEET_PERIOD: Long = 15 * 1000L + private var mExecuteCount: Int = 0 var timeDeltaBetweenServerAndClient: Long = 0 @@ -44,6 +49,14 @@ object FixedRateJobHelper { ExposureManager.commitSavedExposureEvents(true) } + // 分片检测下载进度 + if ((mExecuteCount * CHECKER_PERIOD) % DOWNLOAD_HEARTBEAT_SHEET_PERIOD == 0L) { + tryCatchInRelease { + val upload = (mExecuteCount * CHECKER_PERIOD) % DOWNLOAD_HEARTBEAT_PERIOD == 0L + DownloadDataHelper.uploadDownloadHeartbeat(upload) + } + } + // 提交普通 loghub 数据 if ((mExecuteCount * CHECKER_PERIOD) % LOGHUB_PERIOD == 0L) { LoghubUtils.commitSavedLoghubEvents() diff --git a/app/src/main/java/com/gh/download/DownloadDataHelper.kt b/app/src/main/java/com/gh/download/DownloadDataHelper.kt index c5c6ad5024..9d777d0e83 100644 --- a/app/src/main/java/com/gh/download/DownloadDataHelper.kt +++ b/app/src/main/java/com/gh/download/DownloadDataHelper.kt @@ -28,6 +28,9 @@ object DownloadDataHelper { private val mDownloadSpeedMap = HashMap>() + private val mDownloadHeartbeatList = mutableListOf() + private val mDownloadHeartbeatSheet = HashMap() + @JvmStatic fun getDownloadStatusAlias(downloadEntity: DownloadEntity, downloadStatus: DownloadStatus? = null): String { val status = downloadStatus ?: downloadEntity.status @@ -221,6 +224,61 @@ object DownloadDataHelper { LoghubUtils.log(jsonObject, "download_debug", false) } + /** + * 分片检测下载进度,每隔15秒内记录一次,60秒上传一次 + * + * 请见:https://gitlab.ghzs.com/stats/stats-issues/-/issues/188#note_66919 + */ + fun uploadDownloadHeartbeat(upload: Boolean) { + val allDownloadEntity = DownloadManager.getInstance(HaloApp.getInstance().application).allDownloadEntity + for (downloadEntity in allDownloadEntity) { + // 刚开始下载时 size 有可能为空,但是过滤的话就少了一条数据 + if (downloadEntity.status == DownloadStatus.downloading && downloadEntity.size > 0) { + var sheet = mDownloadHeartbeatSheet[downloadEntity.url] + if (sheet == null) { + sheet = JSONObject() + sheet.put("game_id", downloadEntity.gameId) + sheet.put("platform", downloadEntity.platform) + sheet.put("package", downloadEntity.packageName) + sheet.put("filename", downloadEntity.path.substring(downloadEntity.path.lastIndexOf("/") + 1)) + sheet.put("total_size", downloadEntity.size / 1024 / 1024) + sheet.put("current_progress_size", downloadEntity.progress / 1024) + mDownloadHeartbeatSheet[downloadEntity.url] = sheet + } else { + val progressSize = sheet.getLong("current_progress_size") + sheet.put("progress_size", downloadEntity.progress / 1024 - progressSize) + sheet.put("current_progress_size", downloadEntity.progress / 1024) + mDownloadHeartbeatList.add(JSONObject(sheet.toString())) + } + } else { + mDownloadHeartbeatSheet.remove(downloadEntity.url) + } + } + + if (upload && mDownloadHeartbeatList.isNotEmpty()) { + val jsonObject = JSONObject() + try { + jsonObject.put("event", "progress") + jsonObject.put("meta", getMetaJson()) + jsonObject.put("timestamp", System.currentTimeMillis() / 1000) + + val payloads = JSONArray() + for (heartbeatData in mDownloadHeartbeatList) { + heartbeatData.remove("current_progress_size") + payloads.put(heartbeatData) + } + jsonObject.put("payloads", payloads) + } catch (e: Exception) { + e.printStackTrace() + } + if (BuildConfig.DEBUG) { + Utils.log("LogUtils->$jsonObject") + } + mDownloadHeartbeatList.clear() + LoghubUtils.log(jsonObject, "download_debug", false) + } + } + private fun getMetaJson(): JSONObject { val context = HaloApp.getInstance().application val meta = getMeta()