2009年8月19日 星期三

app engine即時狀態列表

app engine的admin console有dashboard可以監看應用程式的各項數值
但是app engine應用程式本身並沒有api可以取得這些數據
所以只有開發人員可以在管理界面中看到這些圖表
我花了一點時間研究出如何把圖表匯出到使用者界面中讓一般使用者也看的到

google的認證流程如下圖所示


首先是要先取得google的auth_token,但是http://appengine.google.com本身並沒有開放任何的service可供使用者存取,所以我們要假裝以SDK的身份要求認證(因為SDK本身有上傳程式的權限所以可以進行認證 算是偷吃步的方法 不知道什麼時候會被擋掉 但是現階段可以這樣用就是了),要求的URL如下
"https://www.google.com/accounts/ClientLogin?Email="+ADMIN_EMAIL+"&service=ah&source=Google-appcfg-1.2.3&Passwd="+ADMIN_PASSWORD

取得其中的Auth token後再來是向"http://appengine.google.com/_ah/login?continue=http://localhost&auth="+auth_token進行登入

登入完會取得一組ACSID 再憑藉著此ACSID向http://appengine.google.com/dashboard?&app_id=xxxx取回admin console的程式碼
最後分析程式碼中各個圖表的資訊就好了, 要特別注意的是admin console原始碼裡的圖檔網址是取自http://www.google.com/chart , 但是http://www.google.com/chart外部的web app不能直接用(會檢查Referer) , 因此記得要先替換成http://chart.apis.google.com/chart才能正常讀圖

由於認證的流程很繁雜 圖檔也都不小 在加上我想把圖表做成blog側欄的小貼紙 存取頻率可能會很大 因此我用app engine本身的cron功能排程每分鐘更新一次全部的圖檔到memcahce裡 要讀取的時候直接從memcache裡讀就好 可以省下很多運算成本

以下是"app engine即時狀態列表"的運作畫面 範例網址在 http://5566.appspot.com/state?appid=5566
這個app上主要host了我的blog的一些服務 因此也可以當作我的blog的負載狀態


這個功能算是高風險的項目 因為管理者密碼必須存在程式碼裡以便進行認證 我是另開一個免洗帳號設成有共同編輯權限的管理員 然後用免洗帳號的帳密存在程式碼裡進行認證 ;另外這個認證的方式也不算合法 google可能之後會擋掉這種偽裝成SDK去取得管理員界面的作法 因此還是希望之後app engine本身能提供一套api可讓開發者在程式中簡便的存取這些狀態資訊

相關文章:
app engine即時狀態列表(更新)
blog系統即時負載狀態