Ranaly
Ranaly是一个基于Redis的数�?�统计�?�视化工具。
Ranaly的Node.js客户端库node_ranaly已�?完�?。
特点如下:
- 使用简�?�,容易维护
- 基于Redis,性能优异
- 支�?模�?�级别的�?��?控制
- 长连接实时数�?�统计
- 多�?图表�?�以选择,�?�以自定义模�?��?模�?�
快速入门
在项目ä¸ä½¿ç”¨Ranaly统计数�?��??分简�?�,æ¥éª¤å¦‚下。
1. 安装Node.js和Redis
Ranaly使用Node.js开�?�,所以需�?先安装Node.js。�?ï¿½æ ·å› ä¸ºRanaly的统计数�?�å˜å‚¨äºŽRedisä¸ï¼Œæ‰€ä»¥éœ€ï¿½?安装Redis。
2. 安装Ranaly
git clone git://github.com/luin/ranaly.git
cd ranaly
npm install
3. 在已有项目ä¸åŠ å…¥ç»Ÿè®¡ä»£ï¿½?
å¦‚æžœä½ çš„é¡¹ç›®ä½¿ç”¨Node.js开�?�,�?�以使用Ranalyçš„node客户端库,安装方法如下:
npm install node_ranaly
如果希望统计项目注册用户的�?�化趋势,�?�以在用户注册�?功�?ï¿½åŠ ä¸Šå¦‚ä¸‹ä»£ï¿½?:
var ranaly = require('node_ranaly').createClient();
var rUsers = new ranaly.Amount('Users');
rUsers.incr();
node_ranaly库会将�??为“Users�?çš„Amount类型的桶的值增1并和当�?时间一起写入到Redisä¸ã€‚
4. 查看统计结果
建立�?置文件,内容如下:
app_name: Demo
users:
- username: admin
password: admin123
pages:
- title: Overview
widgets:
- type: amount_line_chart
bucket: Users
将文件�?å˜ï¼Œå¹¶è¿›å…¥Ranaly的目录执行:
node ranaly /path/to/config_file
å…¶ä¸/path/to/config_file表示�?ç½®æ–‡ä»¶è·¯å¾„ã€‚æ¤æ—¶å°±ï¿½?�以访问 http://127.0.0.1:3000 进入数�?�查看页�?�了,使用adminå’Œadmin123登录系统,能看到用户数�?的折线图。
文档
Ranaly由两个部分组�?,分别是客户端库和数�?�展示部分,本页�?�项目是数�?�展示部分。在程�?ä¸é€šè¿‡å®¢æˆ·ç«¯åº“在Redisä¸è®°å½•统计数�?�,而本页�?�项目的作用是将这些数�?�以图表的形�?显示出�?�。
1. 客户端库
Node.js:node_ranaly
2. 数�?�类型
为了适应�?�?�场�?�的统计需�?,Ranaly支�?3�?类型的数�?�统计:
(1) Amount
当�?记录�?一个数�?�的在�?用时间的数�?�?�化时就需�?使用Amount类型,如想记录用户数�?的�?�化趋势ç‰ã€‚
(2) Realtime
Realtime用�?�记录实时数�?�,如当�?系统内å˜ä½¿ç”¨æƒ…况ç‰ã€‚
(3) DataList
DataList用�?�记录数�?�列表,数�?��?�以是数å—�?å—符串甚至对象。如新注册的用户头�?地�?�列表�?新注册的用户资料列表ç‰ã€‚DataList�?��?留数�?�列表ä¸çš„�?N�?�数�?�(N的数值�?�以指定)。
3. Ranaly�?置文件
为了能够通过Ranaly�?�将Redisä¸è®°å½•的统计数�?��?�视化,需�?�??供一份�?置文件。�?ç½®æ–‡ä»¶çš„æ ¼ï¿½?为YAMLï¼Œæ ·ä¾‹å¦‚ä¸‹ï¼š
app_name: 应用�??称
port: Ranaly使用的端�?��?�,默认是3000
redis:
host: Redis的主机地�?�,默认是127.0.0.1
port: Redis的端�?��?�,默认是6379
key_prefix: å˜å‚¨ç»Ÿè®¡æ•°ï¿½?�的键�??�?缀,需�?和客户端库的�?ç½®ä¸€æ ·
users:
- username: 用户�??
password: 密�?
role: æ•°å—,表示用户的�?��?,默认是0
pages:
- title: 页�?ï¿½çš„æ ‡é¢˜
widgets:
- type: widget的类型
bucket: widget对应的bucket
title: widgetçš„æ ‡é¢˜
role: æ•°å—,�?�对拥有大于或ç‰äºŽè¯¥role的用户�?��?
4. 桶(bucket)
为了区分�?�?�的统计数�?�,需�?为�?类数�?�起个�??å—(桶),如统计用户�??称的桶�?�以命�??为“Users�?,统计访问�?的桶�?�以命�??为“Page views�?。�?�?�数�?�类型的桶�?�以�?�??,桶的�??称�?�以包�?ï¿½ç©ºæ ¼ã€‚
5. Widget类型
在�?置文件ä¸ï¿½?�以看到�?一个项目是由若干个page组�?的,�?个page由若干个widget组�?。widget分为�?�?��?类,�?一�?widget�?�适用于一�?数�?�类型,�?�以从其命�??看出�?�。
(1) amount_line_chart
该类型的widget用�?�显示折线图,�?�支�?Amount。�?个widget除了type�?bucket�?title和role四个�?�数外还支�?其它�?�?�的�?�数。amount_line_chart类型支�?的�?�数如下:
| �?�数�?? | �?义 | �?�值 |
|---|---|---|
| default_range | 默认显示的时间范围 | today(显示当天的数�?�),yesterday(昨天的数�?�),7days(最近7天的数�?�),30days(最近30天的数�?�) |
| update_interval | 数�?�更新间隔,默认为20-40ç§’ | æ•°å—,�?��?为秒 |
amount_line_chart支�?�?�时显示多个bucket的数�?�,在�?置文件ä¸ä»¥æ•°ç»„形�?设置,如:
type: amount_line_chart
bucket: [Users, Page views, Groups]
(2) amount_pie_chart
用�?�显示饼图。amount_pie_chart类型支�?的其它�?�数如下:
| �?�数�?? | �?义 | �?�值 |
|---|---|---|
| default_range | 默认显示的时间范围 | today(显示当天的数�?�),yesterday(昨天的数�?�),7days(最近7天的数�?�),30days(最近30天的数�?�),all(所有数�?�) |
| update_interval | 数�?�更新间隔,默认为20-40ç§’ | æ•°å—,�?��?为秒 |
amount_pie_chart支�?�?�时比对多个bucket的数�?�。
(3) amount_today_count
用�?�显示当天的数�?ï¿½ï¼Œå¹¶æ ¹ï¿½?�昨天�?�时间的数�?�预测今天的全天的数�?�。支�?的其它�?�数如下:
| �?�数�?? | �?义 | �?�值 |
|---|---|---|
| update_interval | 数�?�更新间隔,默认为20-40ç§’ | æ•°å—,�?��?为秒 |
amount_today_count支�?�?�时显示多个bucket的数�?�。
(4) amount_total_count
显示�?一时间范围的数�?�总和,如最近30天注册的用户总数。支�?的其它�?�数如下:
| �?�数�?? | �?义 | �?�值 |
|---|---|---|
| update_interval | 数�?�更新间隔,默认为20-40ç§’ | æ•°å—,�?��?为秒 |
amount_total_count支�?�?�时显示多个bucket的数�?�。
(5) realtime_line_chart
显示实时数�?�的折线图,更新频率是1秒。
realtime_line_chart支�?�?�时显示多个bucket的数�?�。
(6) realtime_count
显示实时数�?�的数值,更新频率是实时。
realtime_count支�?�?�时显示多个bucket的数�?�。
(7) datalist_list
显示DataList数�?�列表。由于DataList类型�?�以å˜å‚¨ä»»ä½•数�?�的列表,所以该类型的widget支�?高度自定义。�?�以通过template�?�数指定显示DataList的模�?�,模�?�采用Mustache,渲染的数�?ï¿½æ ¼ï¿½?是{"data": [数�?�列表]}。下�?�的实例ä¸è¿˜ä¼šå¯¹æ¤è¿›è¡Œä»‹ï¿½?。除æ¤ä¹‹å¤–还支�?count_per_page�?�数用�?�指定�?页�?显示的数�?��?�数。
(8) custom_code
该widgetç±»åž‹æ¯”è¾ƒç‰¹æ®Šï¼Œæ— éœ€bucket�?�数,�?�需�?content�?�数。作用是执行自定义的代�?,包括HTML/CSS/JavaScript。如:
- type: custom_code
content: >
<p>hi</p>
综�?�实例
现在�?�设�?统计Facebook网站的数�?�,以使用Ranaly的Node.js客户端为例。首先我们通过node_ranaly建立到Redis的连接(�?�设Redis�?行在本机6380端�?�上):
var ranaly = require('node_ranaly');
var ranalyClient = ranaly.createClient(6380, '127.0.0.1');
首先�?统计的是用户的数�?,�?当用户注册�?功都调用如下代�?令Usersæ¡¶çš„æ•°å€¼åŠ 1:
var rUsers = new ranalyClient.Amount('Users');
rUsers.incr();
然�?�我们�?统计网站的访问�?,�?当访问一个页�?�时,都执行:
var rPageViews = new ranalyClient.Amount('Page views');
rPageViews.incr();
现在�?��?置Ranaly�?�视化部分�?�显示我们的统计数�?�:
app_name: Facebook
redis:
host: 127.0.0.1
port: 6380
users:
- username: admin
password: admin123
pages:
- title: Overview
widgets:
- type: amount_line_chart
bucket: [Users, Page views]
在这个�?ç½®ä¸ï¼Œæˆ‘们使用折线图�?�比对用户数�?和访问�?的关系。将该内容å˜ä¸ºconfig.yaml,然�?�执行:
$ node ./ranaly.js /path/to/config.yaml
Ranaly server listening on port 3000
æ¤æ—¶å°±ï¿½?�以通过http://127.0.0.1:3000�?�访问了。
在Facebookä¸ï¼Œç”¨æˆ·ï¿½?�以�?�布文å—状�?�?照片和视频,若想统计这3�?类型的状�?的比例,�?�以在�?�布时执行:
var bucket = '';
switch (status.type) {
case 'text':
bucket = 'Text';
break;
case 'photo':
bucket = 'Photo';
break;
case 'video':
bucket = 'Video';
break;
}
var rStatus = new ranalyClient.Amount(bucket);
rStatus.incr();
然�?�我们接�?�编辑config.yaml,在widgetsä¸åŠ å…¥ï¼š
- type: amount_pie_chart
bucket: [Text, Photo, Video]
这时�?新�?�动Ranaly�?务器(�?次修改config.yaml都得�?�?�),�?�以看到显示3者比例的饼图,并且�?�以�?�?调整时间范围。
接下�?�显示�?务器的资�?,包括内å˜å’ŒCPU:
var rMemory = new ranalyClient.Realtime('Memory');
var rCPU = new ranalyClient.Realtime('CPU');
setInterval(function () {
rMemory.set(System.getUsedMemory());
rCPU.set(System.getUsedCPU());
}, 100);
å—¯...好�?是没有System.getUsedMemory()å’ŒSystem.getUsedCPU()这两个东西,�?过�?��?知�?�他们都会返回个数å—就好了。
�?ï¿½æ ·æˆ‘ä»¬æŽ¥ï¿½?�编辑config.yaml,在widgetsä¸åŠ å…¥ï¼š
- type: realtime_count
bucket: [Memory, CPU]
�?�?��?务器,就�?�以看到空闲的内å˜å’ŒCPU资�?了。�?次Realtime类型的数�?�更新都会推�?ç»™Ranaly�?务器,所以页�?�上显示的数值�?100毫秒�?�一次。
现在我们还希望能在Ranaly页�?�ä¸çœ‹åˆ°ç”¨æˆ·æœ€æ–°ä¸Šä¼ 的头�?,所以我们在头�?ä¸Šä¼ ï¿½?功�?�执行:
var rAvatar = new ranalyClient.DataList('Avatar');
rAvatar.push(avatarURL, 100);
å…¶ä¸avatarURL是一个å—符串,å˜å‚¨ç”¨æˆ·å¤´ï¿½?çš„URL地�?�。100表示�?�å˜å‚¨æœ€æ–°çš„100�?ï¿½è®°å½•ï¼Œé˜²æ¢æ•°ï¿½?��?�用过多的内å˜ï¼ˆå› 为数�?�是å˜å‚¨åœ¨Redisä¸çš„)。
接�?�我们�?��?置config.yaml:
- type: datalist_list
bucket: [Avatar]
默认会以列表的形�?展示数�?�,�?是很好看,所以我们�?�自定义模�?�。Ranaly使用了BootStrap框架,所以�?�以在模�?�ä¸è‡ªç”±ä½¿ç”¨BootStrapçš„é£Žæ ¼ã€‚æˆ‘ä»¬å°†æ•°ï¿½?�修改�?:
- type: datalist_list
bucket: [Avatar]
template: >
<ul class="thumbnails" style="margin-right: -20px">
{{#data}}
<li class="span2" style="width: 135px">
<a href="{{.}}" class="thumbnail">
<img src="{{.}}" alt="" width="150" height="150" />
</a>
</li>
{{/data}}
</ul>
对于展示图片,Ranaly�??供了一个预置的模�?�,�?ï¿½ä»¥è¿™æ ·å†™ï¼š
- type: datalist_list
bucket: [Avatar]
preset_template: images
接�?�我们想记录最近注册�?功的用户的资料,则在用户注册�?功�?�执行:
var rUsers = new ranalyClient.DataList('Users');
rUsers.push({
id: user.id,
name: user.name,
age: user.age,
description: user.description
}, 100);
然�?�修改�?置文件:
- type: datalist_list
bucket: [Users]
template:
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>ID</th>
<th>name</th>
<th>age</th>
<th>description</th>
</tr>
</thead>
<tbody>
{{#data}}
<tr>
<td>{{id}}</td>
<td>{{name}}</td>
<td>{{age}}</td>
<td>{{description}}</td>
</tr>
{{/data}}
</tbody>
</table>
就�?ï¿½ä»¥çœ‹åˆ°è®°å½•æœ€æ–°æ³¨å†Œç”¨æˆ·èµ„æ–™çš„è¡¨æ ¼äº†ã€‚










