C#アプリケーションの利用ログライブラリ調査(Mixpanel、GoogleAnalytics for Firebase)


## 背景

これまでC#で開発されたアプリケーションの利用ログを収集するためにMicrosoftのAppCenterを使用していました。しかし、AppCenterのサービス終了が発表され、代替となるライブラリを調査する必要が生じました。

今回、はじめての調査タスクとして、以下の問題と課題に取り組みました。

- **問題:** AppCenterがサービス終了となる。
- **課題:** AppCenterの代替となるライブラリを見つける。

## 調査プロセス

### 初期調査

これまでAppCenterが担っていた役割を実現するため以下の3つの機能が必須要件となります。

- 利用人数の記録
  - 指定した日のアプリ利用人数を取得できること。
- 操作ログの記録
  - アプリケーション内で行われた具体的な操作内容を記録できること。

上記要件を元にwebでの検索、AIとの会話を行っていったところ利用ログを登録するツールとして7つが候補として挙がりました  
( Sentry 、 Raygun 、 Rollbar 、 Airbrake 、ELMAH 、MixPanel 、Google Analytics for Firebase )。  

しかし、C#のデスクトップアプリとして利用することができない、もしくはデスクトップアプリはメインの用途ではない（主な用途がWebアプリのツール）であるため、それらを対象外としました。
Mixpanel と Google Analytics for Firebase の2つが候補として残りました。

### 詳細調査

さらに具体的に、「C#のデスクトップアプリの利用ログ取得に特化したライブラリ」を再調査したところ、以下の候補が挙げられました。

- **Mixpanel**
- **Google Analytics**

両者はHTTP APIを提供しており、C#でHttpClientクラスを使用してログデータを送信できることがわかりました。

ここからは最終候補として残った二つのツールについて説明と比較を行っていきます。

## MixPanel
#### 公式サイト(https://mixpanel.com/)
(以下ChatGPTによる公式サイトの要約)
Mixpanelは、ユーザーの行動データを追跡・分析するための強力なツールです。ウェブサイトやアプリケーションでのユーザーの操作（クリック、購入、滞在時間など）をリアルタイムで収集し、直感的なダッシュボードで可視化します。これにより、製品チームはユーザーの行動パターンを理解し、機能改善や収益向上に向けた意思決定を行いやすくなります。さらに、カスタマイズ可能なレポートやセグメント分析、A/Bテストのサポートを提供し、顧客エンゲージメントの向上を目指せます。特に、エンジニアリングリソースを節約しつつデータ駆動型の意思決定を可能にする点が特徴です。

### 前提条件

- Mixpanelのアカウント作成しておく
- プロジェクトトークンの取得しておく

### 実装例

以下は、Mixpanelに利用ログを送信するC#のサンプルコードです。

```csharp
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

class Program
{
    private static readonly string MixpanelToken = "作成したプロジェクトのプロジェクトトークン";
    private static readonly string MixpanelEndpoint = "https://api.mixpanel.com/track";

    static async Task Main(string[] args)
    {
        var eventData = new
        {
            @event = "User Action",
            properties = new
            {
                token = MixpanelToken,
                distinct_id = "user123",
                action = "Button Click",
                timestamp = DateTime.UtcNow.ToString("o")
            }
        };

        var jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(eventData);

        using (var client = new HttpClient())
        {
            var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
            var response = await client.PostAsync(MixpanelEndpoint, content);

            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine("ログが正常に送信されました。");
            }
            else
            {
                Console.WriteLine("エラー: " + response.StatusCode);
            }
        }
    }
}
```

### 実装のポイント

実装のポイントとしては以下の3点があげられます。

- **APIエンドポイント:** Mixpanelが提供するAPIエンドポイントを使用する
- **データ形式:** JSON形式でイベントデータを構築する
- **認証:** トークンを`properties.token`に含めて送信する


### 確認出来る図
送信されたログは、Mixpanelのページにて以下のように確認することができます。
これらのウィジェットは用途にあわせて自由にカスタマイズできます！便利ですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629646/ddb2984d-3a62-8a29-d900-d9ec302419f2.png)


## GoogleAnalytics for FireBase
#### 公式サイト(https://firebase.google.com/?hl=ja)
(以下ChatGPTによる公式サイトの要約)
Google Analytics for Firebase は、モバイルアプリやウェブアプリのユーザー行動を無料で分析できるツールです。Firebase プラットフォームに統合されており、アプリの使用状況やユーザーのアクションをリアルタイムでトラッキングできます。使いやすいダッシュボードでユーザー層、セッション時間、イベントの詳細なデータを確認でき、アプリの成長や収益化に役立つインサイトを提供します。また、Firebase の他のサービス（Crashlytics、リモートコンフィグ、A/B テストなど）と連携し、ユーザー体験の最適化をサポートします。特に、Google 広告との連携でマーケティング効果を測定しやすい点が特徴です。

### 前提条件

- FireBaseのコンソールからプロジェクトを作成する
- 上記プロジェクトに対してGoogleAnalyticsを有効にする


### 実装例

以下は、GoogleAnalyticsに利用ログを送信するC#のサンプルコードです。

```csharp
public static async Task TrackEventAsync(string name, IDictionary<string, string> properties = null)
{
    try
    {
        // イベントデータを作成
        var eventPayload = new
        {
            client_id = "client_id_123456", // ユーザー識別子
            events = new[]
            {
                new
                {
                    name = name,
                    // propertiesがnullでない場合、プロパティを追加
                    parameters = properties ?? new Dictionary<string, string>()
                }
            }
        };

        // JSON ペイロードの作成
        var jsonContent = JsonConvert.SerializeObject(eventPayload);
        var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");

        // APIキーをURLに含める
        string url = "https://www.google-analytics.com/mp/collect?a pi_secret=XXXXXXXXXXXXXXX&measurement_id=G-XXXXXXXXXXXX";

        // Firebase に POST リクエストを送信
        var response = await client.PostAsync(url, content);

        // レスポンスを確認
        response.EnsureSuccessStatusCode(); // ステータスコードがエラーの場合例外スロー
        Debug.WriteLine($"Response Status Code: {response.StatusCode}");
    }
    catch (Exception ex)
    {
        // 例外処理
        Debug.WriteLine($"Error tracking event: {ex.Message}");
    }
}

```

### 実装のポイント

- **APIエンドポイント:** 
以下のようにAPIキーを含める必要がある
https://www.google-analytics.com/mp/collect?measurement_id=<your_measurement_id>&api_secret=<your_api_secret>


### 確認出来る図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629646/ae37e478-cbc6-6f27-1037-4b497e63dcd0.png)

(自社ツールでの固有のイベント名も含まれていますのでそこは隠してあります)

## コスト面の比較

MixPanelの無料プランにおいてはログを送信できるデータ数に上限があります。(一か月100万セッション上限)(https://mixpanel.com/pricing/)
一方GoogleAnalytics for FireBaseにはそのような記述は見当たりませんでした。

## データ反映時間の比較

GoogleAnalyticsのレポート生成は12時間ほどかかります。
(https://support.google.com/analytics/answer/11198161?sjid=3294368920912877372-AP)
しかしMixPanelは操作後5分ほどで反映されることを確認できました。リアルタイムなログ計測を行いたい場合はMixPanelを半日ほどラグがあっても構わない場合はGoogleAnalytics for Firebaseを用いるのがよいと考えます。

## 結論

早くレポートにまとめられたデータを見たい方　→Mixpanel
無料で多くのイベントを取得したい方　→　GoogleAnalytics for Firebase


こちらの記事で触れた内容はあくまで私の独自調べであり、今後変更される場合や正確でない場合もございます。その点ご理解のほどよろしくお願いします。