۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

با Sentry برنامه های Jetpack Compose بهتر بسازید

ادغام خارج از جعبه Sentry با Jetpack Compose به شما امکان می دهد تا به سرعت خطاها و مشکلات عملکرد را در برنامه های Android خود شناسایی و حل کنید. در اینجا نحوه شروع به کار آمده است.

ادغام خارج از جعبه Sentry با Jetpack Compose به شما امکان می دهد تا به سرعت خطاها و مشکلات عملکرد را در برنامه های Android خود شناسایی و حل کنید. در اینجا نحوه شروع به کار آمده است.

Jetpack Compose ابزار پیشنهادی Android برای ساخت رابط‌های کاربری بومی است که نشان‌دهنده تغییر آشکار پلتفرم از رابط‌های کاربری ضروری به اعلانی است. گوگل فشار زیادی را برای پذیرش پذیرش انجام می دهد و نتیجه می دهد. همانطور که در Android Dev Summit ’22 اکتبر گذشته اعلام شد ، ۱۶۰ برنامه از ۱۰۰۰ برنامه برتر در فروشگاه Google Play، Jetpack Compose را ارسال می کنند، از جمله شرکت هایی مانند Airbnb، Lyft، و Square.

Jetpack Compose مزایای بسیاری را ارائه می‌کند—بصری‌تر است، به کد کمتری نیاز دارد و توسعه را تسریع می‌کند. اما بدون چالش نیست. انتقال از یک جعبه ابزار ضروری به Jetpack Compose با یک منحنی یادگیری همراه است که با اسناد محدود، جامعه کوچکتر و مشکلات عملکرد تشدید می شود.

Sentry اخیراً پشتیبانی خود از Jetpack Compose را با یکپارچگی خارج از جعبه که اجازه می دهد تا توسعه دهندگان برای شناسایی و حل سریع مشکلات در برنامه خود. دقیقاً در اینجا آمده است که چگونه Sentry به تیم‌ها کمک می‌کند برای شروع کار با Jetpack Compose< /a>.

با Android Studio شروع کنید

اگر در حال ساختن یک برنامه جدید از ابتدا با Jetpack Compose هستید، ابتدا Android Studio را دانلود و نصب کنید، یک محیط توسعه یکپارچه (IDE) که برای برنامه های اندروید بهینه شده است. سپس، یک پروژه جدید ایجاد کنید و یا Empty Compose Activity را انتخاب کنید که از Material v2 استفاده می کند، یا Empty Compose Activity (Material3) که از Material v3 استفاده می کند. می توانید هر دو گزینه را در سمت راست بالای این اسکرین شات ببینید:

jetpack compose sentry 01

اگر می‌خواهید Jetpack Compose را در یک برنامه Android موجود ادغام کنید، پیکربندی‌های ساخت زیر را در فایل build.gradle برنامه خود اضافه کنید.

android {
    buildFeatures {
        // this flag enables Jetpack Compose
        compose true
    }
    composeOptions {
        // the compiler version should match
        // your project's Kotlin version
        kotlinCompilerExtensionVersion = "1.3.2"
    }
}

سپس، Compose BOM (Bill of Materials) و زیر مجموعه را اضافه کنید از وابستگی ها را به وابستگی های خود بنویسید.

dependencies {
    def composeBom = platform('androidx.compose:compose-bom:2023.01.00')
    implementation composeBom
    androidTestImplementation composeBom
    // Choose one of the following:
    // Material Design 3
    implementation 'androidx.compose.material3:material3'
    // or Material Design 2
    implementation 'androidx.compose.material:material'
    // or skip Material Design and build directly on top of foundational components
    implementation 'androidx.compose.foundation:foundation'
    // or only import the main APIs for the underlying toolkit systems,
    // such as input and measurement/layout
    implementation 'androidx.compose.ui:ui'      
    // Android Studio Preview support
    implementation 'androidx.compose.ui:ui-tooling-preview'
    debugImplementation 'androidx.compose.ui:ui-tooling'
    // UI Tests
    androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
    debugImplementation 'androidx.compose.ui:ui-test-manifest'
    // Optional - Included automatically by material, only add when you need
    // the icons but not the material library (e.g. when using Material3 or a
    // custom design system based on Foundation)
    implementation 'androidx.compose.material:material-icons-core'
    // Optional - Add full set of material icons
    implementation 'androidx.compose.material:material-icons-extended'
    // Optional - Add window size utils
    implementation 'androidx.compose.material3:material3-window-size-class'
    // Optional - Integration with activities
    implementation 'androidx.activity:activity-compose:1.5.1'
    // Optional - Integration with ViewModels
    implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1'
    // Optional - Integration with LiveData
    implementation 'androidx.compose.runtime:runtime-livedata'
    // Optional - Integration with RxJava
    implementation 'androidx.compose.runtime:runtime-rxjava2'
}

Sentry را یکپارچه کنید

برای ادغام Sentry در برنامه جدید Jetpack Compose، تنها کاری که باید انجام دهید این است که افزونه Sentry’s Gradle را در فایل build.gradle ماژول خود اضافه کنید و سپس یک همگام سازی Gradle را انجام دهید.

buildscript {
  repositories {
    mavenCentral()
  }
}
plugins {
  id "com.android.application"
  id "io.sentry.android.gradle" version "3.4.2"
}

و سپس مقادیر لازم را در فایل AndroidManifest.xml اضافه کنید.

<application>
  <!-- Required: set your sentry.io project identifier (DSN) -->
  <meta-data android:name="io.sentry.dsn" android:value="https://examplePublicKey@o0.ingest.sentry.io/0" />
  <!-- enable automatic breadcrumbs for user interactions (clicks, swipes, scrolls) -->
  <meta-data android:name="io.sentry.traces.user-interaction.enable" android:value="true" />
  <!-- enable screenshot for crashes -->
  <meta-data android:name="io.sentry.attach-screenshot" android:value="true" />
  <!-- enable view hierarchy for crashes -->
  <meta-data android:name="io.sentry.attach-view-hierarchy" android:value="true" />
  <!-- enable the performance API by setting a sample-rate, adjust in production env -->
  <meta-data android:name="io.sentry.traces.sample-rate" android:value="1.0" />
  <!-- enable profiling when starting transactions, adjust in production env -->
  <meta-data android:name="io.sentry.traces.profiling.sample-rate" android:value="1.0" />
</application>

این دو مرحله Sentry را در پروژه خود نصب و پیکربندی کنید. جدای از گزارش خطا، پروژه شما اکنون دارای نظارت خودکار بر عملکرد نیز می باشد. Sentry SDK به طور خودکار نمایه‌های عملکرد را جمع‌آوری و تجزیه و تحلیل می‌کند تا بتوانید عملکرد برنامه‌تان را در موارد مختلف مشاهده کنید. دستگاه های کاربر در حال تولید.

افزونه Mastodon اکنون در Steampipe Hub در دسترس است

خطاهای ضبط

به‌طور پیش‌فرض، Sentry همه خطاها و خرابی‌ها را به‌طور خودکار برای شما ثبت می‌کند. اگر می‌خواهید خطاها و استثناها را به صورت دستی ثبت کنید، می‌توانید از روش captureException استفاده کنید.

import io.sentry.Sentry
try {
  aMethodThatMightFail()
} catch (e: Exception) {
  Sentry.captureException(e)
}

افزودن زمینه

شما این گزینه را دارید که زمینه اضافی را به همه خطاهایی که در برنامه شما رخ می دهد اضافه کنید. این داده‌های دلخواه است که به‌طور خودکار به رویداد متصل می‌شود و در صفحه جزئیات مشکل قابل مشاهده است. برای انجام این کار، می‌توانیم زمینه‌های سفارشی را در محدوده فعلی به این صورت پیوست کنیم:

import io.sentry.Sentry
Sentry.configureScope { scope ->
  scope.setContexts("Hero Details", mapOf(
    "Name" to "Mighty Fighter",
    "Age" to 19,
    "Attack type" to "Melee",
  ))
}

این داده‌ها اکنون به هر شماره اضافه می‌شوند. می‌توانیم آن را در صفحه جزئیات مشکل بررسی کنیم:

jetpack compose sentry 02

مهم: دو محدودیت وجود دارد که باید از آنها آگاه باشید. یعنی:

  • این داده قابل جستجو نیست. فقط برای الصاق مقادیر به رویدادها استفاده می شود. اگر باید بتوانید روی داده های سفارشی جستجو کنید، به جای آن از برچسب ها استفاده کنید.
  • محدودیت‌های اندازه در مورد اینکه چه مقدار داده می‌توانید به محدوده اضافه کنید وجود دارد. Sentry ارسال کل وضعیت برنامه و حباب های داده بزرگ را در زمینه ها توصیه نمی کند. در صورت ضمیمه داده های بیش از حد، Sentry با خطای HTTP “413 Payload Too Large” پاسخ می دهد و رویداد را رد می کند.
RHEL 9 دارای مدیریت لبه، بازگشت کانتینر است

افزودن برچسب

درست مانند زمینه اضافی، ما همچنین می‌توانیم برچسب‌های سفارشی را روی رویدادهای شما اضافه کنیم، که در مقابل ایندکس شده و قابل جستجو هستند. می توانید از برچسب ها برای دسترسی سریع به رویدادهای مرتبط و مشاهده توزیع برچسب برای مجموعه ای از رویدادها استفاده کنید. کاربردهای متداول برچسب‌ها شامل نام میزبان، نسخه پلتفرم و زبان کاربر است.

افزودن برچسب ها بسیار شبیه به افزودن زمینه های اضافی است. آنها جفت های کلید-مقدار هستند و می توانند با استفاده از روش setTag به محدوده فعلی اضافه شوند.

import io.sentry.Sentry
Sentry.configureScope { scope ->
  scope.setTag(“user-type”, “premium”)
}

jetpack compose sentry 03

همانطور که گفته شد، برچسب‌ها نمایه‌سازی و جستجو می‌شوند، بنابراین اگر در قسمت جستجوی سفارشی در صفحه مشکلات، “user-type:premium” را اضافه کنید، همه مشکلاتی را خواهید دید که دارای آن برچسب هستند:

jetpack compose sentry 04

سه نکته که هنگام کار با برچسب ها باید از آنها آگاه بود:

  • Sentry به طور خودکار برخی از برچسب ها را به هر شماره اضافه می کند. بازنویسی آن برچسب ها ایده خوبی نیست. در عوض، برچسب‌های خود را با استفاده از نام‌گذاری سازمانتان نام‌گذاری کنید.
  • کلیدها حداکثر ۳۲ کاراکتر طول دارند و می‌توانند فقط شامل حروف، اعداد، زیرخط، نقطه، دو نقطه و خط تیره باشند.
  • مقادیر حداکثر ۲۰۰ کاراکتر طول دارند و نمی‌توانند حاوی نویسه خط جدید (\n) باشند.

افزودن پیوست

افزودن پیوست‌ها راه دیگری برای تکمیل رویدادها با داده‌های اضافی است، و اگر نیاز به اضافه کردن داده‌های بزرگ‌تر از زمینه‌ها و برچسب‌ها دارید، این روش توصیه‌شده است. پیوست ها می توانند هر نوع فایلی باشند.

برای افزودن یک پیوست، می‌توانید آن را به دامنه اضافه کنید، آن را به یکی از روش‌های capture منتقل کنید، یا فهرست پیوست‌ها را در EventProcessor دستکاری کنید یا قبل از ارسال.

برخی قوانینی که باید هنگام کار با پیوست ها از آنها آگاه باشید:

  • پیوست ها به مدت ۳۰ روز نگهداری می شوند. اگر از کل سهمیه فضای ذخیره‌سازی شما بیشتر شود، پیوست‌ها ذخیره نمی‌شوند.
  • می‌توانید پیوست‌ها را در هر زمانی حذف کنید، اما این روی سهمیه شما تأثیری نخواهد داشت. Sentry یک پیوست را به محض ذخیره شدن در سهمیه شما حساب می کند.
  • می توانید دسترسی به پیوست ها را بر اساس نقش کاربر مدیریت کنید. به تنظیمات عمومی سازمان خود بروید، سپس منوی کشویی Attachment Access را برای تنظیم دسترسی مناسب انتخاب کنید. به‌طور پیش‌فرض، وقتی فضای ذخیره‌سازی فعال است، دسترسی به همه اعضا اعطا می‌شود.
  • حداکثر اندازه برای هر پیوست در options.maxAttachmentSize در روش init تنظیم شده است. مقیاس بر حسب بایت و پیش فرض ۲۰ مگابایت است. می توانید اندازه را به این صورت تغییر دهید:
    Sentry.init { options ->
      options.maxAttachmentSize = 5 * 1024 * 1024 // 5 مگابایت
    }
Sentry.init { options ->
  options.maxAttachmentSize = 5 * 1024 * 1024 // 5 MiB
}

ارسال پیوست‌ها به روش‌های عکسبرداری

این احتمالاً ساده‌ترین راه برای افزودن پیوست‌ها است. هر زمان که از یکی از روش‌های capture استفاده می‌کنید، می‌توانید با استفاده از روش Hint.withAttachment، پیوست را به عنوان آرگومان دوم اضافه کنید.

import io.sentry.Attachment
import io.sentry.Hint
import io.sentry.Sentry
…
try {
  …
} catch (e: Exception) {
  Sentry.captureException(e, Hint.withAttachment(“/path/to/file.txt”))
}

افزودن پیوست‌ها در قبل از ارسال

یک راه دیگر برای افزودن پیوست استفاده از پاسخ تماس قبل از ارسال است.

import io.sentry.Sentry
import io.sentry.SentryOptions.BeforeSendCallback
import io.sentry.Hint
import io.sentry.Attachment
Sentry.init(this) { options ->
  options.beforeSend = BeforeSendCallback { event, hint ->
    hint.addAttachment(Attachment(“/path/to/file.txt”))
  }
}

این پیکربندی فایل file.txt را قبل از ارسال به ابر به هر مشکلی اضافه می‌کند.

Grafana: تابش نور به خوشه های Kubernetes

مشاهده پیوست‌ها

می‌توانید پیوست‌های مربوط به یک مشکل را در پایین صفحه جزئیات مشکل مشاهده کنید. یک بخش پیوست‌ها وجود دارد که همه پیوست‌ها را فهرست می‌کند و شما می‌توانید آن‌ها را حذف، دانلود یا پیش‌نمایش کنید.

jetpack compose sentry 05

همچنین می‌توانید از طریق برگه پیوست‌ها در همان صفحه به پیوست‌ها دسترسی داشته باشید، جایی که می‌توانید نوع پیوست و همچنین رویدادهای مرتبط را مشاهده کنید. می‌توانید روی شناسه رویداد کلیک کنید تا جزئیات مربوط به آن رویداد خاص باز شود.

jetpack compose sentry 06

اندازه گیری عملکرد

اگر مقدار Sample Rate (io.sentry.traces.sample-rate) را در فایل AndroidManifest.xml خود ارائه کرده‌اید، Sentry را قبلاً پیکربندی کرده‌اید تا به طور خودکار برنامه خود را ابزار کند. Sentry به طور خودکار تراکنش‌ها را برای رویدادهای چرخه حیات فعالیت‌ها و قطعات، شروع سرد و گرم برنامه، فریم‌های آهسته و ثابت و رویدادهای دیگر ضبط می‌کند.

همچنین این امکان وجود دارد که به صورت دستی یک تابع خاص را تنظیم کنید، به عنوان مثال تابعی که مدتی را صرف تغییر شکل بخشی بزرگ از داده ها می کند، یا تابعی که داده ها را از یک API دریافت می کند و در حافظه محلی قرار می دهد، و غیره. ابزار دقیق سفارشی ایجاد کنید، باید با فراخوانی روش startTransaction یک تراکنش را شروع کنید.

import io.sentry.Sentry
import io.sentry.SpanStatus
val transaction = Sentry.startTransaction(“processOrderBatch()”, “task”)
try {
  processOrderBatch()
} catch (e: Exception) {
  transaction.throwable = e
  transaction.status = SpanStatus.INTERNAL_ERROR
  throw e
} finally {
  transaction.finish()
}

هشدار: فراموش نکنید که روش finish() را در تراکنش فراخوانی کنید، در غیر این صورت تراکنش به Sentry ارسال نخواهد شد.

اگر تابعی که می‌خواهید ابزارسازی کنید پیچیده‌تر است و شامل چندین تابع فرعی است که ترجیح می‌دهید به صورت جداگانه ابزار کنید، می‌توانید برای هر یک از آنها Spans ایجاد کنید و آنها را به تراکنش اصلی متصل کنید.

>

import io.sentry.SpanStatus
val transaction = Sentry.startTransaction("processOrderBatch()", "task")
try {
  processOrderBatch(transaction)
} catch (e: Exception) {
  transaction.throwable = e
  transaction.status = SpanStatus.INTERNAL_ERROR
  throw e
} finally {
  transaction.finish()
}
fun processOrderBatch(span: ISpan) {
  // span operation: task, span description: operation
  val innerSpan = it.startChild("task", "operation")
  try {
    // omitted code
  } catch (e: FileNotFoundException) {
    innerSpan.throwable = e
    innerSpan.status = SpanStatus.NOT_FOUND
    throw e
  } finally {
    innerSpan.finish()
  }
}

فراموش نکنید که قبل از فراخوانی روش finish() تراکنش اصلی، متد finish() را در هر یک از دهانه ها فراخوانی کنید! اگر این کار را نکنید، آنها به تراکنش اصلی متصل نخواهند شد.