😎

Cloudflare Workers Analytics Engineを試してみる

2023/06/04に公開

Cloudflare Workers Analytics EngineはWorkersと連携して動作するデータ解析用サービスです。Workersの動作履歴を管理するものではなく、Workers経由で書き込まれたデータが蓄積されそれをSQLもしくはGraphQLで解析できます。

データスキーマ

Workers Analytics Engineのデータスキーマの考え方は少し特殊です。独自でスキーマを作成することは行えず、機能をオンにし、データが初めて書き込まれた時点で以下のスキーマが自動で作成されます。

このスキーマのうち、index,blob,doubleをどういう目的で使うかは開発者の自由です。逆にこれを変更、追加することはできませんのでご注意ください。JavaScriptからはそれぞれindexes,blobs,doublesオブジェクトで値を挿入します。つまり、KV,D1や外部DBを使うことなくデータの蓄積および解析が簡単にできることが特徴です。

やってみる

まずアカウント管理者画面のWorkers&Pagesトップ画面右にあるAnalytics Engineをクリックします。

はじめて利用する場合Enable Analytics Engineのボタンを押してください。

すでに利用してデータが書き込まれている場合以下のようにデータ書き込み履歴が確認可能です。この例だと2つのデータ保存箇所ができています。

次にWorkersでバインドします。データスキーマは前述の通り自動で生成されますが、データセットは独自の名前で作成が可能です。
まずこの記事に従ってWorkersでHello Worldを作ります。
wrangler.tomlに以下を追記します。

analytics_engine_datasets = [
    { binding = "testanalytics" }
]

これによりPublish時点でtestanalyticsというデータセットが作成されます。
index.jsをいかに書き換えます。

export default {
	async fetch(request, env, ctx) {
		env.testanalytics.writeDataPoint({
			'blobs': [ 
			  request.cf.colo, 
			  request.cf.country, 
			  request.cf.city, 
			  request.cf.region, 
			  request.cf.timezone
			],
			'doubles': [
			  request.cf.metroCode, 
			  request.cf.longitude, 
			  request.cf.latitude
			],
			'indexes': [
			  request.cf.postalCode
			] 
		  });
		return new Response("Hello World!");
	},
};

ここで使われているcfオブジェクトとはCloudflare Workersを呼び出した際に、呼び出し元(今回の例でいうとブラウザ)の情報がいろいろ含まれているオブジェクトです。つまりこのサンプルではWorkersの呼び出し元を記録するものになります。
wrangler publishを行い、ブラウザでアクセスしてください。
これによりtestanalyticsにデータが蓄積されていきます。

トークン発行とSQLクエリ

ではこれより、SQLによりデータを呼び出していきますが、その前にトークンを作成します。管理者画面一番トップからMy Profilesをクリックします。

API Tokensをクリックします。

Create Tokenをクリックします。

Custom tokenGet startedを押します。

適当な名前を付けて以下のようにAnalyticsRead権限を持つトークンを発行します。

アカウントIDおよびトークンを以下のSQLで置換し実行してみて下さい。

curl.exe -X POST "https://api.cloudflare.com/client/v4/accounts/<accountID>/analytics_engine/sql" -H "Authorization: Bearer <tokenID>" -d "SELECT blob1 FROM testanalytics"

blob1の値が出てくるはずです。

{
        "meta":
        [
                {
                        "name": "blob1",
                        "type": "String"
                }
        ],
        "data":
        [
                {
                        "blob1": "NRT"
                }
        ],
        "rows": 1,
}

書き込まれているデータをフルで取り出すSQLは以下の通りです。

curl.exe -X POST "https://api.cloudflare.com/client/v4/accounts/<accountID>/analytics_engine/sql" -H "Authorization: Bearer <tokenID>" -d "SELECT blob1,blob2,blob3,blob4,blob5,double1,double2,double3,index1 FROM testanalytics"

SQLリファレンスはこちらにあります。

制限について

リクエスト内のすべての BLOB の合計サイズは 5120 バイトです。またインデックスは 32 バイトまでです。リクエストごとに 25 回の書き込みをサポートしています。

Discussion