טריגרים של התראות ב-Firebase

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

  • ב-Crashlytics, אנחנו יכולים להתריע אם יש עלייה חדה במספר הקריסות באפליקציה.
  • ב-Performance Monitoring, אנחנו יכולים להתריע אליכם אם זמן ההפעלה של האפליקציה חורג מהסף שהגדרתם.
  • לגבי App Distribution, אנחנו יכולים להתריע אותך אם אחד מהבודקים שלך ירשום מכשיר iOS חדש.

בהתאם לסוג ההתראה ולהעדפות שהוגדרו על ידי חברי הפרויקט, מערכת Firebase מציגה את סוגי ההתראות האלה במסוף Firebase או שולחת אותן באימייל.

בדף הזה נסביר איך לכתוב פונקציות ב-Cloud Functions for Firebase (דור שני) שמטפלות באירועי התראות.

איך זה עובד?

אתם יכולים להפעיל פונקציות בתגובה לאירועי התראות שמתקבלים מהמקורות הבאים:

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

  1. האזנה/המתנה להפעלה של סוג התראה ספציפי מ-Firebase.
  2. מופעל כשההתראה מושמעת, ומקבלת את המטען הייעודי (Payload) של האירוע שמכיל מידע ספציפי על האירוע.
  3. הפעלת קוד הפונקציה כדי לטפל במטען הייעודי (Payload) של האירוע.

הפעלת פונקציה באירועי התראה

משתמשים בחבילת המשנה firebase-functions/v2/alerts כדי לכתוב פונקציה שמטפלת באירועי התראות. בדוגמאות הבאות, ספציפיות למוצרים, מוצג תהליך עבודה שבו פונקציה משתמשת ב-webhook כדי לפרסם הודעה בערוץ Discord כשמתקבלת התראה לגבי המוצר הזה מ-Firebase.

טיפול באירוע התראה מסוג Crashlytics

בדוגמה הבאה של Crashlytics, משתמשים ב-Cloud Functions for Firebase כדי לטפל באירוע התראה על בעיה חדשה של תאונה קטלנית. הפונקציה הזו מפרסמת את פרטי ההתראה בהודעה לערוץ Discord.

דוגמה להתראות על קריסה ב-Discord

הודעה לדוגמה על בעיה חדשה של תאונה קטלנית

הפונקציה מאזינה לאירוע שקשור לאירוע שבו מתפרסם בעיה חמורה חדשה ב-Firebase:

Node.js

exports.postfatalissuetodiscord = onNewFatalIssuePublished(async (event) => {

Python

@crashlytics_fn.on_new_fatal_issue_published(secrets=["DISCORD_WEBHOOK_URL"])
def post_fatal_issue_to_discord(event: crashlytics_fn.CrashlyticsNewFatalIssueEvent) -> None:
    """Publishes a message to Discord whenever a new Crashlytics fatal issue occurs."""

לאחר מכן הפונקציה מנתחת את אובייקט האירוע שהוחזר, מנתחת מידע שימושי מהמטען הייעודי (Payload) של האירוע ויוצרת הודעה לפרסום בערוץ Discord:

Node.js

  // construct a helpful message to send to Discord
  const appId = event.appId;
  const {id, title, subtitle, appVersion} = event.data.payload.issue;
  const message = `
🚨 New fatal issue for ${appId} in version ${appVersion} 🚨

**${title}**

${subtitle}

id: \`${id}\`
`;

Python

    # Construct a helpful message to send to Discord.
    app_id = event.app_id
    issue = event.data.payload.issue
    message = f"""
🚨 New fatal issue for {app_id} in version {issue.app_version} 🚨

# {issue.title}

{issue.subtitle}

ID: `{issue.id}`
""".strip()

לבסוף, הפונקציה שולחת את ההודעה שנוצרה ל-Discord באמצעות בקשת HTTP:

Node.js

const response = await postMessageToDiscord("Crashlytics Bot", message);
if (response.ok) {
  logger.info(
      `Posted fatal Crashlytics alert ${id} for ${appId} to Discord`,
      event.data.payload,
  );
} else {
  throw new Error(response.error);
}

Python

response = post_message_to_discord("Crashlytics Bot", message, DISCORD_WEBHOOK_URL.value)
if response.ok:
    print(f"Posted fatal Crashlytics alert {issue.id} for {app_id} to Discord.")
    pprint.pp(event.data.payload)
else:
    response.raise_for_status()

למידע על כל אירועי ההתראות של Crashlytics שאפשר לתעד, אפשר לעיין במסמכי העזרה בנושא התראות Crashlytics.

טיפול באירוע התראה מסוג Performance Monitoring

בדוגמה הזו מייצאים פונקציה שמקשיבה לאירועי התראות של ערכי סף ביצועים:

Node.js

exports.postperformancealerttodiscord = onThresholdAlertPublished(
    async (event) => {

Python

@performance_fn.on_threshold_alert_published(secrets=["DISCORD_WEBHOOK_URL"])
def post_performance_alert_to_discord(event: performance_fn.PerformanceThresholdAlertEvent) -> None:
    """Publishes a message to Discord whenever a performance threshold alert is fired."""

לאחר מכן, הפונקציה מנתחת את אובייקט האירוע שהוחזר, מנתחת מידע שימושי ממטען הנתונים של האירוע ומרכיבת הודעה לפרסום בערוץ Discord:

Node.js

      // construct a helpful message to send to Discord
      const appId = event.appId;
      const {
        eventName,
        metricType,
        eventType,
        numSamples,
        thresholdValue,
        thresholdUnit,
        conditionPercentile,
        appVersion,
        violationValue,
        violationUnit,
        investigateUri,
      } = event.data.payload;
      const message = `
    ⚠️ Performance Alert for ${metricType} of ${eventType}: **${eventName}** ⚠️
    
    App id: ${appId}
    Alert condition: ${thresholdValue} ${thresholdUnit}
    Percentile (if applicable): ${conditionPercentile}
    App version (if applicable): ${appVersion}
    
    Violation: ${violationValue} ${violationUnit}
    Number of samples checked: ${numSamples}
    
    **Investigate more:** ${investigateUri}
    `;

Python

    # Construct a helpful message to send to Discord.
    app_id = event.app_id
    perf = event.data.payload
    message = f"""
⚠️ Performance Alert for {perf.metric_type} of {perf.event_type}: **{perf.event_name}** ⚠️

App ID: {app_id}
Alert condition: {perf.threshold_value} {perf.threshold_unit}
Percentile (if applicable): {perf.condition_percentile}
App version (if applicable): {perf.app_version}

Violation: {perf.violation_value} {perf.violation_unit}
Number of samples checked: {perf.num_samples}

**Investigate more:** {perf.investigate_uri}
""".strip()

לבסוף, הפונקציה שולחת את ההודעה שנוצרה ל-Discord באמצעות בקשת HTTP:

Node.js

const response = await postMessageToDiscord(
    "Firebase Performance Bot", message);
if (response.ok) {
  logger.info(
      `Posted Firebase Performance alert ${eventName} to Discord`,
      event.data.payload,
  );
} else {
  throw new Error(response.error);
}

Python

response = post_message_to_discord("App Performance Bot", message,
                                   DISCORD_WEBHOOK_URL.value)
if response.ok:
    print(f"Posted Firebase Performance alert {perf.event_name} to Discord.")
    pprint.pp(event.data.payload)
else:
    response.raise_for_status()

כדי לקבל מידע נוסף על כל האירועים של התראות הביצועים שאפשר לתעד, תוכלו לקרוא את מאמרי העזרה של התראות Performance Monitoring.

טיפול באירוע התראה מסוג App Distribution

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

בדוגמה הזו, הפונקציה מקשיבה לאירועים שנשלחים בכל פעם שמבצע בדיקה רושם מכשיר iOS חדש. כשרושמים מכשיר iOS חדש, צריך לעדכן את פרופיל הקצאת המשאבים באמצעות ה-UDID של המכשיר הזה, ואז להפיץ מחדש את האפליקציה.

Node.js

exports.postnewduuidtodiscord = onNewTesterIosDevicePublished(async (event) => {

Python

@app_distribution_fn.on_new_tester_ios_device_published(secrets=["DISCORD_WEBHOOK_URL"])
def post_new_udid_to_discord(event: app_distribution_fn.NewTesterDeviceEvent) -> None:
    """Publishes a message to Discord whenever someone registers a new iOS test device."""

לאחר מכן, הפונקציה מנתחת את האובייקט שהוחזר, מנתחת מידע שימושי מהמטען הייעודי של האירוע ומרכיבת הודעה לפרסום בערוץ Discord:

Node.js

  // construct a helpful message to send to Discord
  const appId = event.appId;
  const {
    testerDeviceIdentifier,
    testerDeviceModelName,
    testerEmail,
    testerName,
  } = event.data.payload;
  const message = `
📱 New iOS device registered by ${testerName} <${testerEmail}> for ${appId}

UDID **${testerDeviceIdentifier}** for ${testerDeviceModelName}
`;

Python

    # Construct a helpful message to send to Discord.
    app_id = event.app_id
    app_dist = event.data.payload
    message = f"""
📱 New iOS device registered by {app_dist.tester_name} <{app_dist.tester_email}> for {app_id}

UDID **{app_dist.tester_device_identifier}** for {app_dist.tester_device_model_name}
""".strip()

לבסוף, הפונקציה שולחת את ההודעה שנוצרה ל-Discord באמצעות בקשת HTTP:

Node.js

const response = await postMessageToDiscord("AppDistribution Bot", message);
if (response.ok) {
  logger.info(
      `Posted iOS device registration alert for ${testerEmail} to Discord`,
  );
} else {
  throw new Error(response.error);
}

Python

response = post_message_to_discord("App Distro Bot", message, DISCORD_WEBHOOK_URL.value)
if response.ok:
    print(f"Posted iOS device registration alert for {app_dist.tester_email} to Discord.")
    pprint.pp(event.data.payload)
else:
    response.raise_for_status()

למידע על כל אירועי ההתראות של App Distribution שאפשר לתעד, אפשר לעיין במסמכי העזרה בנושא התראות App Distribution.

במאמר שליחת משוב מהאפליקציה ל-Jira מוסבר איך משתמשים בפונקציה שמופעל על ידי התראה מ-Firebase על משוב מהאפליקציה מ-App Distribution.