more work on stats

This commit is contained in:
Eric House 2024-08-11 20:45:11 -07:00
parent 0a992c5a4b
commit ad651c6cba
6 changed files with 67 additions and 16 deletions

View file

@ -1764,8 +1764,13 @@ class GamesListDelegate(delegator: Delegator) :
DlgDelegate.Action.WRITE_LOG_DB) DlgDelegate.Action.WRITE_LOG_DB)
R.id.games_menu_statsShow -> { R.id.games_menu_statsShow -> {
val stats = XwJNI.sts_export().toString() val stats = XwJNI.sts_export()
makeOkOnlyBuilder(stats) val pairs = ArrayList<String>()
stats.keys().forEach {
val value = stats.getLong(it)
pairs.add("$it: $value")
}
makeOkOnlyBuilder(TextUtils.join("\n", pairs))
.show() .show()
} }
R.id.games_menu_statsClear -> XwJNI.sts_clearAll() R.id.games_menu_statsClear -> XwJNI.sts_clearAll()

View file

@ -43,6 +43,7 @@ import org.eehouse.android.xw4.jni.CommsAddrRec
import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnType import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnType
import org.eehouse.android.xw4.jni.CommsAddrRec.ConnExpl import org.eehouse.android.xw4.jni.CommsAddrRec.ConnExpl
import org.eehouse.android.xw4.jni.XwJNI import org.eehouse.android.xw4.jni.XwJNI
import org.eehouse.android.xw4.jni.XwJNI.STAT
import org.eehouse.android.xw4.jni.XwJNI.TopicsAndPackets import org.eehouse.android.xw4.jni.XwJNI.TopicsAndPackets
import org.eehouse.android.xw4.loc.LocUtils import org.eehouse.android.xw4.loc.LocUtils
import org.eehouse.android.xw4.TimerReceiver.TimerCallback import org.eehouse.android.xw4.TimerReceiver.TimerCallback
@ -122,7 +123,8 @@ object MQTTUtils {
MQTTServiceHelper(context).handleInvitation(nli) MQTTServiceHelper(context).handleInvitation(nli)
} }
fun handleMessage(context: Context, from: CommsAddrRec, gameID: Int, msg: ByteArray) fun handleMessage(context: Context, from: CommsAddrRec,
gameID: Int, msg: ByteArray)
{ {
val rowids = DBUtils.getRowIDsFor(context, gameID) val rowids = DBUtils.getRowIDsFor(context, gameID)
Log.d(TAG, "handleMessage(): got %d rows for gameID %X", rowids.size, gameID) Log.d(TAG, "handleMessage(): got %d rows for gameID %X", rowids.size, gameID)
@ -409,7 +411,7 @@ object MQTTUtils {
val packet = ByteArray(byteBuf.capacity()) val packet = ByteArray(byteBuf.capacity())
byteBuf.get(packet) byteBuf.get(packet)
add(IncomingTask(topic.toString(), packet)) add(IncomingTask(topic.toString(), packet))
XwJNI.sts_increment(STAT.STAT_MQTT_RCVD)
} else { } else {
Log.d( TAG, "no message found!!") Log.d( TAG, "no message found!!")
} }
@ -493,6 +495,7 @@ object MQTTUtils {
} else { } else {
// Handle successful publish, e.g. logging or incrementing a metric // Handle successful publish, e.g. logging or incrementing a metric
TimerReceiver.setBackoff(mContext, sTimerCallbacks, MIN_BACKOFF) TimerReceiver.setBackoff(mContext, sTimerCallbacks, MIN_BACKOFF)
XwJNI.sts_increment(STAT.STAT_MQTT_SENT)
} }
} }
} }

View file

@ -105,11 +105,15 @@ class DUtilCtxt {
fun store(key: String, data: ByteArray?) { fun store(key: String, data: ByteArray?) {
// Log.d( TAG, "store(key=%s)", key ); // Log.d( TAG, "store(key=%s)", key );
if (null != data) { data?.let {
DBUtils.setBytesFor(m_context, key, data) DBUtils.setBytesFor(m_context, key, it)
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
val tmp = load(key) val tmp = load(key)!!
Assert.assertTrue(tmp.contentEquals(data)) if (! tmp.contentEquals(it)) {
Log.d(TAG, "store($key): race or bad content?; lens"
+ " are ${tmp.size} and ${it.size}")
Assert.failDbg()
}
} }
} }
} }

View file

@ -200,6 +200,25 @@ class XwJNI private constructor() {
ACK_INVITE ACK_INVITE
} }
enum class STAT {
STAT_NONE,
STAT_MQTT_RCVD,
STAT_MQTT_SENT,
STAT_REG_NOROOM,
STAT_NEW_SOLO,
STAT_NEW_TWO,
STAT_NEW_THREE,
STAT_NEW_FOUR,
STAT_NEW_REMATCH,
STAT_SMS_RCVD,
STAT_SMS_SENT,
STAT_NSTATS,
}
class SMSProtoMsg { class SMSProtoMsg {
@JvmField @JvmField
var cmd: SMS_CMD? = null var cmd: SMS_CMD? = null
@ -889,9 +908,8 @@ class XwJNI private constructor() {
val str = sts_export(jNI.m_ptrGlobals) val str = sts_export(jNI.m_ptrGlobals)
return JSONObject(str) return JSONObject(str)
} }
@JvmStatic
fun sts_clearAll() { sts_clearAll(jNI.m_ptrGlobals) } fun sts_clearAll() { sts_clearAll(jNI.m_ptrGlobals) }
fun sts_increment(stat: STAT) {sts_increment(jNI.m_ptrGlobals, stat)}
@JvmStatic @JvmStatic
external fun dict_tilesAreSame(dict1: Long, dict2: Long): Boolean external fun dict_tilesAreSame(dict1: Long, dict2: Long): Boolean
@ -1137,9 +1155,11 @@ class XwJNI private constructor() {
): Array<SMSProtoMsg>? ): Array<SMSProtoMsg>?
@JvmStatic @JvmStatic
private external fun sts_export(jniState: Long): String? private external fun sts_export(jniState: Long): String
@JvmStatic @JvmStatic
private external fun sts_clearAll(jniState: Long) private external fun sts_clearAll(jniState: Long)
@JvmStatic
private external fun sts_increment(jniState: Long, stat: STAT)
// This always returns true on release builds now. // This always returns true on release builds now.
@JvmStatic @JvmStatic

View file

@ -1238,15 +1238,23 @@ Java_org_eehouse_android_xw4_jni_XwJNI_sts_1export
return result; return result;
} }
JNIEXPORT jstring JNICALL JNIEXPORT void JNICALL
Java_org_eehouse_android_xw4_jni_XwJNI_sts_1clearAll Java_org_eehouse_android_xw4_jni_XwJNI_sts_1clearAll
( JNIEnv* env, jclass C, jlong jniGlobalPtr ) ( JNIEnv* env, jclass C, jlong jniGlobalPtr )
{ {
jstring result = NULL;
DVC_HEADER(jniGlobalPtr); DVC_HEADER(jniGlobalPtr);
sts_clearAll( globalState->dutil, env ); sts_clearAll( globalState->dutil, env );
DVC_HEADER_END(); DVC_HEADER_END();
return result; }
JNIEXPORT void JNICALL
Java_org_eehouse_android_xw4_jni_XwJNI_sts_1increment
( JNIEnv* env, jclass C, jlong jniGlobalPtr, jobject jstat )
{
DVC_HEADER(jniGlobalPtr);
STAT stat = (STAT)jEnumToInt( env, jstat );
sts_increment( globalState->dutil, env, stat );
DVC_HEADER_END();
} }
/* Dictionary methods: don't use gamePtr */ /* Dictionary methods: don't use gamePtr */

View file

@ -61,10 +61,10 @@ sts_increment( XW_DUtilCtxt* dutil, XWEnv xwe, STAT stat )
ss->statsVals = loadCounts( dutil, xwe ); ss->statsVals = loadCounts( dutil, xwe );
} }
++ss->statsVals[stat]; ++ss->statsVals[stat];
END_WITH_MUTEX();
XP_LOGFF( "bad: storing after every change" ); XP_LOGFF( "bad: storing after every change" );
storeCounts( dutil, xwe ); storeCounts( dutil, xwe );
END_WITH_MUTEX();
} }
} }
@ -98,8 +98,19 @@ sts_export( XW_DUtilCtxt* dutil, XWEnv xwe )
/* } */ /* } */
void void
sts_clearAll( XW_DUtilCtxt* XP_UNUSED(dutil), XWEnv XP_UNUSED(xwe) ) sts_clearAll( XW_DUtilCtxt* dutil, XWEnv xwe )
{ {
StatsState* ss = dutil->statsState;
XP_ASSERT( !!ss );
WITH_MUTEX( &ss->mutex );
XP_FREEP( dutil->mpool, &ss->statsVals );
ss->statsVals
= XP_CALLOC( dutil->mpool, sizeof(*ss->statsVals) * STAT_NSTATS );
END_WITH_MUTEX();
storeCounts( dutil, xwe );
} }
static const XP_UCHAR* static const XP_UCHAR*