הגדרת עובד להעלאת פרופיל

הכלי ProfilingManager שומר את המעקבים באופן מקומי במכשיר. אפשר לאחזר את הקבצים האלה באמצעות ADB לצורך ניפוי באגים מקומי, אבל כדי לאסוף נתוני שדות צריך להעלות אותם לשרת.

קובצי מעקב יכולים להיות גדולים (לעתים קרובות כמה מגה-בייט). כדי לא לפגוע בחוויית המשתמש או לצרוך חבילת גלישה, כדאי לתזמן את ההעלאות כך שיתבצעו ברקע, ועדיף כשהמכשיר מחובר לרשת ללא הגבלה (Wi-Fi), בטעינה ובמצב לא פעיל.

הגדרת משימת העלאה ב-WorkManager

ProfilingManager לא תלוי בענן; אתם יכולים להעלות עקבות לכל תשתית שתבחרו. בדוגמה הבאה אפשר לראות איך משתמשים ב-WorkManager כדי לתזמן עבודת העלאה שלא תפריע למשתמשים.

דוגמה לקוד להגדרת משימת העלאה

הנה דוגמה להגדרת משימה שלא מפריעה למשתמש להעלות עקבות לשרת.

הוספת יחסי תלות של WorkManager

בנוסף לתלות הקיימת ב-ProfilingManager, מוסיפים את ספריות Jetpack הבאות לקובץ build.gradle.kts. WorkManager צריך אותם.

Kotlin

   dependencies {
       implementation("androidx.work:work-runtime:2.11.0")
   }
   

Groovy

   dependencies {
       implementation 'androidx.work:work-runtime:2.11.0'
   }
   

קטע קוד

בדוגמת הקוד הזו מוסבר איך להגדיר משימה להעלאת נתוני מעקב. העבודה צריכה להיות מוגדרת כשמתקבלת ProfilingResult באפליקציה. הקטע של יצירת הפרופיל לא מופיע כאן, אבל אפשר למצוא דוגמה במאמר תיעוד של מעקב אחר המערכת.

Kotlin

class TraceUploadWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    override fun doWork(): Result {
        // Perform your uploading work here
        Log.d("ProfileTest", "Uploading trace: " + inputData.getString("PROFILE_PATH"))

        return Result.success()
    }
}

fun setupProfileUploadWorker(profileFilepath: String?) {
    val workMgr = WorkManager.getInstance(applicationContext)
    val workRequestBuilder = OneTimeWorkRequest.Builder(TraceUploadWorker::class)

    val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.UNMETERED)
        .setRequiresDeviceIdle(true)
        .setRequiresCharging(true)
        .build()
    workRequestBuilder.setConstraints(constraints)

    val inputDataBuilder = Data.Builder()
    inputDataBuilder.putString("PROFILE_PATH", profileFilepath)
    workRequestBuilder.setInputData(inputDataBuilder.build())

    workMgr.enqueue(workRequestBuilder.build())
}

Java

public static class TraceUploadWorker extends Worker {

  public TraceUploadWorker(
      @androidx.annotation.NonNull Context context,
      @androidx.annotation.NonNull WorkerParameters workerParams) {
    super(context, workerParams);
  }

  @androidx.annotation.NonNull
  @Override
  public Result doWork() {
    // Perform your uploading work here
    Log.d("ProfileTest", "Uploading trace: " + getInputData().getString("PROFILE_PATH"));

    return Result.success();
  }
}

public void setupProfileUploadWorker(String profileFilepath) {
  WorkManager workMgr = WorkManager.getInstance(getApplicationContext());
  OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder(
      TraceUploadWorker.class);

  Constraints constraints = new Constraints.Builder()
      .setRequiredNetworkType(NetworkType.UNMETERED)
      .setRequiresDeviceIdle(true)
      .build();
  workRequestBuilder.setConstraints(constraints);

  Data.Builder inputDataBuilder = new Data.Builder();
  inputDataBuilder.putString("PROFILE_PATH", profileFilepath);
  workRequestBuilder.setInputData(inputDataBuilder.build());

  workMgr.enqueue(workRequestBuilder.build());
}

הסבר על הקוד

הקוד מבצע את הפעולות הבאות:

  • הגדרת העובד: יוצרים מחלקה TraceUploadWorker שמרחיבה את Worker. מטמיעים את השיטה doWork() כדי לטפל בלוגיקה של העלאת הקובץ בפועל באמצעות ה-SDK או לקוח ה-HTTP המועדפים שלכם.

  • יצירת פרופיל של בקשה: משתמשים ב-SystemTraceRequestBuilder כדי להגדיר את המעקב (משך, מדיניות מאגר) וב-Profiling.requestProfiling כדי להתחיל אותו.

  • קביעת זמנים להשהיית האפליקציות לעבודה:

    • יוצרים OneTimeWorkRequest לעובד.

    • הגדרת מגבלות: משתמשים בתווים setRequiredNetworkType(NetworkType.UNMETERED), setRequiresDeviceIdle(true) ו-setRequiresCharging(true) כדי לוודא שההעלאה מתבצעת רק כשהמשתמש מחובר ל-Wi-Fi, המכשיר בטעינה ולא בשימוש פעיל. חשוב לעשות את זה כדי למנוע שיבוש של העלאת המשימה למשתמש.

    • העברת נתונים: משתמשים ב-setInputData כדי להעביר את נתיב המעקב אל ה-Worker.

    • הוספה לתור: שולחים את הבקשה ל-WorkManager באמצעות הקריאה ל-WorkManager#enqueue.

השלבים הבאים

אחרי העלאת העקבות, אפשר לנתח אותן בנפרד או לבצע ניתוח של עקבות בכמות גדולה. הוראות להגדרת צינור עיבוד נתונים של ניתוח שניתן להרחבה זמינות במאמר פריסת Bigtrace ב-Kubernetes.