Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/luin/ranaly
📈 An easy to use chart system
https://github.com/luin/ranaly
analytics nodejs pie-chart realtime
Last synced: 18 days ago
JSON representation
📈 An easy to use chart system
- Host: GitHub
- URL: https://github.com/luin/ranaly
- Owner: luin
- Created: 2013-02-12T02:53:09.000Z (almost 12 years ago)
- Default Branch: master
- Last Pushed: 2020-08-09T08:11:10.000Z (over 4 years ago)
- Last Synced: 2024-10-11T23:17:49.814Z (about 1 month ago)
- Topics: analytics, nodejs, pie-chart, realtime
- Language: JavaScript
- Homepage:
- Size: 2.48 MB
- Stars: 498
- Watchers: 41
- Forks: 78
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Ranaly
Ranaly是一个基于Redis的数据统计可视化工具。Ranaly的Node.js客户端库[node_ranaly](https://github.com/luin/node_ranaly)已经完成。
![效果图](./assets/preview.png)
特点如下:
1. 使用简单,容易维护
2. 基于Redis,性能优异
3. 支持模块级别的权限控制
4. 长连接实时数据统计
5. 多种图表可以选择,可以自定义模板、模块## 快速入门
在项目中使用Ranaly统计数据十分简单,步骤如下。
### 1. 安装Node.js和Redis
Ranaly使用Node.js开发,所以需要先安装[Node.js](http://nodejs.org/)。同样因为Ranaly的统计数据存储于Redis中,所以需要安装[Redis](http://redis.io/)。
### 2. 安装Ranalygit 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](https://github.com/luin/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秒 | 数字,单位为秒 |![doc_amount_line_chart](./assets/doc_amount_line_chart.png)
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的数据。
![doc_amount_pie_chart](./assets/doc_amount_pie_chart.png)
#### (3) amount_today_count
用来显示当天的数据,并根据昨天同时间的数据预测今天的全天的数据。支持的其它参数如下:| 参数名 | 意义 | 取值 |
|---------------|-----------|---------------------------------------------------------------------------|
| update_interval | 数据更新间隔,默认为20-40秒 | 数字,单位为秒 |![doc_amount_today_count](./assets/doc_amount_today_count.png)
amount_today_count支持同时显示多个bucket的数据。
#### (4) amount_total_count
显示某一时间范围的数据总和,如最近30天注册的用户总数。支持的其它参数如下:| 参数名 | 意义 | 取值 |
|---------------|-----------|---------------------------------------------------------------------------|
| update_interval | 数据更新间隔,默认为20-40秒 | 数字,单位为秒 |![doc_amount_total_count](./assets/doc_amount_total_count.png)
amount_total_count支持同时显示多个bucket的数据。
#### (5) realtime_line_chart
显示实时数据的折线图,更新频率是1秒。![doc_realtime_line_chart](./assets/doc_realtime_line_chart.png)
realtime_line_chart支持同时显示多个bucket的数据。
#### (6) realtime_count
显示实时数据的数值,更新频率是实时。![doc_realtime_count](./assets/doc_realtime_count.png)
realtime_count支持同时显示多个bucket的数据。
#### (7) datalist_list
显示DataList数据列表。由于DataList类型可以存储任何数据的列表,所以该类型的widget支持高度自定义。可以通过template参数指定显示DataList的模板,模板采用[Mustache](http://mustache.github.com/),渲染的数据格式是{"data": [*数据列表*]}。下面的实例中还会对此进行介绍。除此之外还支持count_per_page参数用来指定每页要显示的数据条数。![doc_datalist_list](./assets/doc_datalist_list.png)
#### (8) custom_code
该widget类型比较特殊,无需bucket参数,只需要content参数。作用是执行自定义的代码,包括HTML/CSS/JavaScript。如:- type: custom_code
content: >
hi
## 综合实例
现在假设要统计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: >
对于展示图片,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:
ID
name
age
description
{{#data}}
{{id}}
{{name}}
{{age}}
{{description}}
{{/data}}
就可以看到记录最新注册用户资料的表格了。
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/luin/ranaly/trend.png)](https://bitdeli.com/free "Bitdeli Badge")