[dev_opt_2.15.0]BadCase添加埋点统计上报

This commit is contained in:
xuxinchao
2023-03-31 18:39:38 +08:00
parent fe5616622e
commit 8639283b78
6 changed files with 200 additions and 46 deletions

View File

@@ -82,6 +82,7 @@ class DevaToolsProvider : IDevaToolsProvider {
moFangManager.init(mContext!!)
bindingCarManager.init(mContext!!)
apmEnvProvider.init(if(DebugConfig.isDebug()) "0" else "1", "${ DebugConfig.getNetMode() }", mDockerVersion ?: "")
BadCaseManager.init()
}
override fun checkMonitorDb() {

View File

@@ -0,0 +1,106 @@
package com.zhjt.mogo_core_function_devatools.badcase
import com.mogo.commons.utils.MogoAnalyticUtils
/**
* BadCase埋点统计管理
*/
object BadCaseAnalyticsManager {
private val bagRecordReceive = "bagrecord_receive" //收到工控机回调时触发(可忽略是否开启美化模式)
private val bagRecordUpload = "bagrecord_upload"//点击上报按钮触发
private val eventParamKey = "key" //Bag包唯一关键字
private val eventParamFileName = "fileName" //文件路径
private val eventParamReceiveTime = "receiveTime" //时间
private val eventParamStat = "stat" //状态record stat100 - record succeed,auto stop | 101 - record succeed,handle stop | 200 - record failed
private val eventParamPlateNumber = "plateNumber" //车牌号
private val eventParamTotalDuration = "totalDuration" //Bag包采集时长
private val eventParamCarSn = "carSn" //鹰眼SN
private val eventParamMapVersion = "mapVersion" //工控机版本
private val eventParamEyeVersion = "eyeVersion" //鹰眼版本
private val eventParamLatitude = "latitude" //纬度
private val eventParamLongitude = "longitude" //经度
private val eventParamUserRole = "userRole"//采集者角色
private val eventParamAudioUrl = "audioUrl" //音频地址
private val eventParamReason = "reason" //采集原因
private val eventParamUploadTime = "uploadTime" //上报时间
private val eventParamChannel = "channel" //渠道
/**
* 收到工控机回调时埋点
* @param key Bag包唯一关键字
* @param fileName 文件路径
* @param receiveTime 时间
* @param stat 状态record
* @param plateNumber 车牌号
* @param totalDuration Bag包采集时长
* @param carSn 鹰眼SN
* @param mapVersion 工控机版本
* @param eyeVersion 鹰眼版本
* @param latitude 纬度
* @param longitude 经度
*/
fun bagRecordReceive(key: String,fileName: String,receiveTime: String,stat: String,plateNumber: String
,totalDuration: String,carSn: String,mapVersion: String
,eyeVersion: String,latitude: String,longitude: String){
val receiverParams = HashMap<String,Any>()
receiverParams[eventParamKey] = key
receiverParams[eventParamFileName] = fileName
receiverParams[eventParamReceiveTime] = receiveTime
receiverParams[eventParamStat] = stat
receiverParams[eventParamPlateNumber] = plateNumber
receiverParams[eventParamTotalDuration] = totalDuration
receiverParams[eventParamCarSn] = carSn
receiverParams[eventParamMapVersion] = mapVersion
receiverParams[eventParamEyeVersion] = eyeVersion
receiverParams[eventParamLatitude] = latitude
receiverParams[eventParamLongitude] = longitude
MogoAnalyticUtils.track(bagRecordReceive,receiverParams)
}
/**
* 点击上报按钮触发埋点
* @param key Bag包唯一关键字
* @param fileName 文件路径
* @param receiveTime 时间
* @param stat 状态record
* @param plateNumber 车牌号
* @param totalDuration Bag包采集时长
* @param carSn 鹰眼SN
* @param mapVersion 工控机版本
* @param eyeVersion 鹰眼版本
* @param latitude 纬度
* @param longitude 经度
* @param userRole 采集者角色
* @param audioUrl 音频地址
* @param reason 采集原因
* @param uploadTime 上报时间
* @param channel 渠道
*/
fun bagRecordUpload(key: String,fileName: String,receiveTime: String,stat: String,plateNumber: String
,totalDuration: String,carSn: String,mapVersion: String
,eyeVersion: String,latitude: String,longitude: String
,userRole: String,audioUrl: String,reason: String,uploadTime: String,channel: String){
val uploadParams = HashMap<String,Any>()
uploadParams[eventParamKey] = key
uploadParams[eventParamFileName] = fileName
uploadParams[eventParamReceiveTime] = receiveTime
uploadParams[eventParamStat] = stat
uploadParams[eventParamPlateNumber] = plateNumber
uploadParams[eventParamTotalDuration] = totalDuration
uploadParams[eventParamCarSn] = carSn
uploadParams[eventParamMapVersion] = mapVersion
uploadParams[eventParamEyeVersion] = eyeVersion
uploadParams[eventParamLatitude] = latitude
uploadParams[eventParamLongitude] = longitude
uploadParams[eventParamUserRole] = userRole
uploadParams[eventParamAudioUrl] = audioUrl
uploadParams[eventParamReason] = reason
uploadParams[eventParamUploadTime] = uploadTime
uploadParams[eventParamChannel] = channel
MogoAnalyticUtils.track(bagRecordUpload,uploadParams)
}
}

View File

@@ -11,12 +11,17 @@ import androidx.lifecycle.LifecycleCoroutineScope
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.RecordBagMsg
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
@@ -35,50 +40,25 @@ import record_cache.RecordPanelOuterClass
import java.lang.ref.WeakReference
import java.util.concurrent.TimeUnit
internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener {
internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener,
IMoGoChassisLocationWGS84Listener {
const val TAG = "BadCase"
/**
* 超过此时间case入口自动消失
*/
private val CASE_EXPIRE_DURATION: Long =
TimeUnit.HOURS.toMillis(4)/* TimeUnit.SECONDS.toMillis(10) */
private var hideFloat: (() -> Unit)? = null
@Volatile
private var record: AutoPilotRecord? = null
@Volatile
private var viewHolder: WeakReference<View>? = null
private var longitude: Double = 0.0
private var latitude: Double?= 0.0
@Volatile
private var dismissJob: Job? = null
@OptIn(ExperimentalCoroutinesApi::class)
private var channel: Channel<AutoPilotRecord> = Channel(Channel.RENDEZVOUS)
get() = if (field.isClosedForReceive || field.isClosedForSend) {
field = Channel(Channel.RENDEZVOUS)
field
} else {
field
}
private val presenter by lazy {
BadCasePresenter()
fun init(){
CallerAutopilotRecordListenerManager.addListener(TAG, this)
// 添加 ADAS车辆状态&定位 监听
CallerChassisLocationWGS84ListenerManager.addListener(TAG, this)
}
@Volatile
private var scope: LifecycleCoroutineScope? = null
get() = if (field == null) {
field = viewHolder?.get()?.lifecycleOwner?.lifecycleScope
field
} else {
field
}
/**
* 展示BadCase配置页面
*/
@@ -120,8 +100,6 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
* 主动采集BadCase
*/
fun initBadCase(view: View) {
CallerAutopilotRecordListenerManager.addListener(TAG, this)
val activity = view.context as? FragmentActivity
?: throw IllegalStateException("please ensure context is FragmentActivity.")
view.setOnClickListener {
@@ -268,6 +246,17 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
)
)
)
//埋点统计
BadCaseAnalyticsManager.bagRecordReceive(recordPanel.key.toString(),recordPanel.filename,
System.currentTimeMillis().toString(),recordPanel.stat.toString(),
AppConfigInfo.plateNumber,recordPanel.duration.toString(),
MoGoAiCloudClientConfig.getInstance().sn,BadCaseConfig.dockerVersion ?:"",
AppUtils.getAppVersionName(),latitude.toString(),longitude.toString())
//日志埋点
CallerLogger.i("$M_DEVA$TAG", "BadCase Receive Analytics="+"key="+recordPanel.key+" filename="+recordPanel.filename+
" receiveTime="+System.currentTimeMillis()+" stat="+recordPanel.stat+" plateNumber="+AppConfigInfo.plateNumber+
" totalDuration="+recordPanel.duration+" carSn="+MoGoAiCloudClientConfig.getInstance().sn+" mapVersion="+BadCaseConfig.dockerVersion+
" eyeVersion="+AppUtils.getAppVersionName()+" latitude="+latitude+" longitude="+longitude)
}
}
}
@@ -277,4 +266,9 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
}
override fun onChassisLocationWGS84(gnssInfo: MogoLocation) {
latitude = gnssInfo.latitude
longitude = gnssInfo.longitude
}
}

View File

@@ -35,6 +35,8 @@ import com.zhidao.loglib.call.LogInfoManagerFactory
import com.zhidao.loglib.upload.OnUploadListener
import com.zhidao.loglib.upload.UploadManager
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.mogo_core_function_devatools.badcase.record.RecordManager
import kotlinx.coroutines.GlobalScope
@@ -86,9 +88,11 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
private var uploadReason: StringBuilder = StringBuilder() //上报原因,标签
@Volatile
private var recordKey: String?=null //录制bag包key
private var recordKey: Long = 0 //录制bag包key
@Volatile
private var recordFileName: String?=null //录制文件包名
private var receiveTime: String?= null
private var uploadStamp: String = System.currentTimeMillis().toString()
private var longitude: Double?=null
private var latitude: Double?=null
@@ -290,7 +294,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
itx["carLicense"] = AppConfigInfo.plateNumber?:"" //车牌号
itx["filename"] = recordFileName?:"" //bag包文件地址
itx["filesize"] = "0" //bag包文件大小
itx["key"] = recordKey?:"" //key
itx["key"] = recordKey.toString() //key
itx["reason"] = uploadReason.toString() //采集原因
itx["duration"] = BadCaseConfig.totalDuration.toString() //采集时长固定为20S
itx["startTime"] = System.currentTimeMillis().toString() //上报时间(时间戳格式)
@@ -301,7 +305,6 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
itx["mapVersion"] = BadCaseConfig.dockerVersion ?:"" //工控机版本
itx["eyeVersion"] = AppUtils.getAppVersionName() //鹰眼版本
itx["coordinate"] = "latitude:${latitude};longitude:${longitude}" //坐标
})
if (uploadResult == null || uploadResult.code != 200) {
TipToast.shortTip("上报失败")
@@ -312,14 +315,32 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
val hasAudio = downloadUrl != null
val descReqEntity = BagDescriptionEntity(uploadReason.toString(),hasAudio,downloadUrl.toString(),true)
bagManagerEntity.reqType = 5
bagManagerEntity.keyReq = it.toLong()
bagManagerEntity.keyReq = it
bagManagerEntity.descReq = descReqEntity
CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity)
}
BadCaseAnalyticsManager.bagRecordUpload(recordKey.toString(),recordFileName?:"",uploadStamp,
"100",AppConfigInfo.plateNumber,BadCaseConfig.totalDuration.toString(),MoGoAiCloudClientConfig.getInstance().sn,
BadCaseConfig.dockerVersion ?:"",AppUtils.getAppVersionName(),latitude.toString(),longitude.toString(),
BadCaseConfig.identity,downloadUrl?:"",uploadReason.toString(),System.currentTimeMillis().toString(),"1")
//日志
CallerLogger.i("$M_DEVA$TAG", "BadCase Initiative Analytics="+"key="+recordKey+" filename="+recordFileName+
" receiveTime="+uploadStamp+" stat="+"100"+" plateNumber="+AppConfigInfo.plateNumber+
" totalDuration="+ BadCaseConfig.totalDuration +" carSn="+MoGoAiCloudClientConfig.getInstance().sn+" mapVersion="+BadCaseConfig.dockerVersion+
" eyeVersion="+AppUtils.getAppVersionName()+" latitude="+ latitude +" longitude="+ longitude+
" identity="+BadCaseConfig.identity + " downloadUrl="+downloadUrl +" uploadReason="+uploadReason+
" uploadTime="+System.currentTimeMillis()+" channel="+"1")
BadCaseConfig.windowNum--
clickListener?.closeWindow()
}
}
//主动上报埋点统计
if(receiveTime!=null){
try {
uploadStamp=TimeUtils.dateToStamp(receiveTime,"yyyyMMddHHmmss")
}catch (e: Exception){
}
}
}
override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean {
@@ -356,11 +377,12 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight()-950
mWindowManager!!.addView(mFloatLayout, mWindowParams)
//开启录包
recordKey = Random(SystemClock.elapsedRealtime()).nextInt().toLong()
if(recordCaseEntity!=null){
CallerAutoPilotControlManager.recordPackage(recordCaseEntity.caseId,Random(SystemClock.elapsedRealtime()).nextInt(),
CallerAutoPilotControlManager.recordPackage(recordCaseEntity.caseId,recordKey.toInt(),
BadCaseConfig.totalDuration, BadCaseConfig.previousDuration,recordCaseEntity.topicList)
}else{
CallerAutoPilotControlManager.recordPackage(BadCaseConfig.type,Random(SystemClock.elapsedRealtime()).nextInt(),
CallerAutoPilotControlManager.recordPackage(BadCaseConfig.type,recordKey.toInt(),
BadCaseConfig.totalDuration, BadCaseConfig.previousDuration)
}
}
@@ -376,8 +398,9 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
mWindowManager!!.addView(mFloatLayout, mWindowParams)
//已经录包无需再次启动录包,只要将录包信息同步到弹窗
bagInfoEntity.let {
recordKey = it.key.toString()
recordKey = it.key
recordFileName = it.bagPath
receiveTime = it.timestamp
}
}
}
@@ -394,7 +417,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
CallerLogger.d("${M_DEVA}${TAG}", "-- 收到工控机录制任务回调 -- $recordPanel")
ThreadUtils.runOnUiThread {
if(recordKey==null){
recordKey = recordPanel.key.toString()
recordKey = recordPanel.key
BadCaseConfig.recordKeyList.add(recordPanel.key)
}
if(recordFileName==null){

View File

@@ -40,6 +40,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import mogo.telematics.pad.MessagePad
import com.zhidao.loglib.upload.UploadManager
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager
import me.jessyan.autosize.utils.AutoSizeUtils
import org.greenrobot.eventbus.EventBus
import java.io.File
@@ -69,9 +70,11 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
private var uploadReason: String = String() //上报原因,标签
private var recordKey: String?=null //录制bag包key
private var recordFileName: String?=null //录制文件包名
private var receiveTime: String ?= null //接收时间
private var stat: String = ""
private var boxBean: MsgBoxBean ?= null
private var longitude: Double?=null
private var latitude: Double?=null
private var longitude: Double = 0.0
private var latitude: Double = 0.0
private var mInViewX = 0f
private var mInViewY = 0f
@@ -250,7 +253,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
private fun upload(downloadUrl: String?){
GlobalScope.launch{
val uploadResult = presenter.upload(mutableMapOf<String, String>().also { itx ->
itx["carLicense"] = AppConfigInfo.plateNumber?:"" //车牌号
itx["carLicense"] = AppConfigInfo.plateNumber //车牌号
itx["filename"] = recordFileName?:"" //bag包文件地址
itx["filesize"] = "0" //bag包文件大小
itx["key"] = recordKey?:"" //key
@@ -279,10 +282,23 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
bagManagerEntity.descReq = descReqEntity
CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity)
}
//被动上报埋点统计
BadCaseAnalyticsManager.bagRecordUpload(recordKey?:"",recordFileName?:"",receiveTime?:System.currentTimeMillis().toString(),
stat,AppConfigInfo.plateNumber,BadCaseConfig.totalDuration.toString(),MoGoAiCloudClientConfig.getInstance().sn,
BadCaseConfig.dockerVersion ?:"",AppUtils.getAppVersionName(),latitude.toString(),longitude.toString(),
BadCaseConfig.identity,downloadUrl?:"",uploadReason,System.currentTimeMillis().toString(),"0")
//日志
CallerLogger.i("$M_DEVA$TAG", "BadCase Passive Analytics="+"key="+recordKey+" filename="+recordFileName+
" receiveTime="+receiveTime+" stat="+"100"+" plateNumber="+AppConfigInfo.plateNumber+
" totalDuration="+ BadCaseConfig.totalDuration +" carSn="+MoGoAiCloudClientConfig.getInstance().sn+" mapVersion="+BadCaseConfig.dockerVersion+
" eyeVersion="+AppUtils.getAppVersionName()+" latitude="+ latitude +" longitude="+ longitude+
" identity="+BadCaseConfig.identity + " downloadUrl="+downloadUrl +" uploadReason="+uploadReason+
" uploadTime="+System.currentTimeMillis()+" channel="+"0")
BadCaseConfig.windowNum--
clickListener?.closeWindow()
}
}
}
override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean {
@@ -378,6 +394,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
val recordBagMsg = (msgBoxBean.bean as RecordBagMsg)
recordKey = recordBagMsg.key.toString()
recordFileName = recordBagMsg.fileName
receiveTime = msgBoxBean.timestamp.toString()
stat = recordBagMsg.stat.toString()
}
fun setClickListener(clickListener: ClickListener) {