statpot:使用mongo+bootstrap+highcharts做統計報表


最近做了一個統計項目,這個統計項目大致的需求是統計接口的訪問速度。客戶端會調用一個接口來記錄接口的訪問情況,我的需求就需要分析這些數據,然后做出個統計報表。

需求實現

最初的時候想着每天把這些接口訪問情況的信息存儲到mysql中,然后根據這些訪問情況做個分析再做報表。然后第一個問題就來了,信息包含太多字段了,如果我將每個信息解析成mysql表的一個字段,那么這個字段很長,而且還有一個致命缺陷,不容易擴展。如果將所有字段都存儲為一個json,然后存儲到text字段呢,又沒法建立索引了。所以這種情況,最適合搬出mongo來了。

相比於mysql,mongo的好處就是擴展性好,靈活。像統計數據這樣很容易需求不確定的數據確實是個很好的選擇。我另外想想還有個好處就是不用的數據我可以很方便地將數據json化,然后存為文件。然后在需要的時候,也很容易讀取直接放入到mongo中去。比如我可以將一個月的數據做一個持久備份之類的操作。

接着是生成統計報表的部分。各種圖是很需要的,由於是給內部做統計報表,不需要兼顧各種瀏覽器。所以我選擇了強大的highCharts。highCharts是一個JS圖表庫。很方便的就可以生成圖表了。親身體會是這個比flash做圖表開發時間縮短多了。你可以從http://www.highcharts.com/上下載3.0版本。

后續呢,由於后面有很多統計變化的需求。每次都寫一個過程來生成js代碼從而渲染統計報表也是個很繁瑣的事情。於是我就打算寫一個工具,大致的思路就是依靠修改配置文件就可以直接生成統計報表,報表的頁面為了美觀我引入了bootstrap 3.0。於是發現這種數據存儲mongo,加上配置文件生成報表的模式是很容易實現,也確實很好使用。甚至於你在mongo中增加了一種統計結構,我可以什么都不用修改,只需要增加一個配置項就可以生成新統計結構的圖表了,這大都是歸功於mongo的json結構化。

statpot工具

這個工具statpot開源在github上了:

https://github.com/jianfengye/statpot

可以下載result/stat_20130925.html來看生成的報表。

生成的報表如下:

Image(12)

現在是實現了兩種:餅圖和柱狀圖。后續有可能的話還會繼續加上一些其他統計圖表。

還能想到的一個問題是這個頁面如果是動態的,那么必然實時分析需要的時間比較多,而統計報表一般不需要動態的,所以完全可以做成生成靜態文件的方式,於是web/目錄下就有動態和靜態的入口。這種生成靜態報表然后存儲的方式也是很好的,比如每天我生成一次動態報表,然后就把mongo中的數據清空或這靜態文件化。

當然后來想想,這種唯配置至上的工具唯一的弊端是配置本身就是一種學習成本,你需要花時間來掌握這個配置。但是這個問題在我看來,和代碼一樣,應該由配置的語義來解決。

問題記錄

記錄下開發過程中特別是使用mongo中遇到的問題:

如何獲取一個字段的所有可能的值

使用distinct

Image(11)

如何獲取一個字段的所有可能的值,並且計算出每個值有多少個條目

需要使用group命令

group的命令文檔在:http://docs.mongodb.org/manual/reference/method/db.collection.group/

> db.feedbacks.group({

     "key" : {"keys.properties.network_type": true},

     "initial":{"count":0},
     "$reduce":function(cur,prev){

            prev.count=prev.count+1;

     }

})

對應的PHP mongo的API是:http://www.php.net/manual/zh/mongocollection.group.php

參考文章

http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html

http://api.highcharts.com/highcharts

http://docs.mongodb.org/ecosystem/drivers/php/

http://v3.bootcss.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM