Firebase アラートのトリガー

Firebase には、さまざまなプロジェクトやアプリ管理イベントに対応するアラートが用意されています。Firebase でこのようなアラートを送信できるイベントの例を次に示します。

  • Crashlytics では、アプリのクラッシュが急増した場合にアラートが通知されます。
  • Performance Monitoring では、アプリの起動時間が構成済みのしきい値を超えた場合にアラートが通知されます。
  • App Distribution では、テスターが新しい iOS デバイスを登録した場合にアラートが通知されます。

Firebase では、アラートの種類やプロジェクト メンバーによる設定に応じて、アラートは Firebase コンソールに表示されるか、メールで送信されます。

このページでは、アラート イベントを処理する関数を Cloud Functions for Firebase(第 2 世代)で記述する方法について説明します。

仕組み

次のソースで生じたアラート イベントに対応して、関数をトリガーできます。

一般的なライフサイクルの場合、アラート イベントによってトリガーされる関数は以下のように機能します。

  1. Firebase から、特定の種類のアラートが生じるまでリッスン / 待機します。
  2. アラートが発生するとトリガーされて、イベントに関する特定の情報を含むイベント ペイロードを受信します。
  3. 関数のコードを呼び出して、イベント ペイロードを処理します。

アラート イベント発生時に関数をトリガーする

firebase-functions/v2/alerts サブパッケージを使用して、アラート イベントを処理する関数を作成します。以下のプロダクト固有の例は、当該プロダクトに関するアラートが Firebase から出された場合に、関数で Webhook を使用して Discord チャネルにメッセージを投稿するワークフローを示しています。

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."""

続いてこの関数は、返されたイベント オブジェクトを解析し、イベント ペイロードに含まれる有用な情報を解析して、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()

最後に、作成したメッセージを HTTP リクエストを介して Discord に送信します。

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()

最後に、作成したメッセージを HTTP リクエストを介して Discord に送信します。

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()

最後に、作成したメッセージを HTTP リクエストを介して Discord に送信します。

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 のアラートのリファレンス ドキュメントをご覧ください。

App Distribution のアプリ内フィードバック Firebase アラートによってトリガーされる関数の使用方法については、アプリ内フィードバックを Jira に送信するをご覧ください。