FnordMetric是一个使用SQL语句来实现数据收集和可视化的框架,它使用chartsql扩展了标准的sql,允许你编写查询语句来返回图表而不是返回表,查询结果作为SVG向量图或者images来呈现出来。这些图表可以很容易嵌入一个web站点中,这样你就可以在短短几分钟内绘制漂亮的图表。
FnordMetric包含两个二进制文件,使用C++编写而成,分别是FnordMetric CLI和FnordMetric Server。
1 fnordmetric-cli类似gnuplot,满足你使用sql语句来生成图表的需求,允许你使用chartsql在命令行对外部的数据(csv文件或者mysql)进行图表绘制。
2 fnordmetric-server是一个标准的HTTP应用服务,它包含了一个web UI和一个HTTP API接口来允许chartsql查询。查询结果可以作为JSON、SVG、PNG类型返回。和fnordmetric-cli一样,server也允许你对外部数据进行查询,不同的是,server还包含了一个以时间序列为基础的数据收集,并把该数据存储到本地磁盘或者内存或者HBase。你可以把fnordmetric-server作为一个数据收集和展示的一站式解决方案。
FnordMetric Client
FnordMetric还提供了一些客户端lib库,例如HTML5 API。
安装FnordMetric
FnordMetric使用C++编写,你可以安装编译好的二进制文件,也可以自己编译安装。安装完成后会在系统中生成两个二进制文件fnordmetric-cli和fnordmetric-server。
1 源码安装
git clone https://github.com/paulasmuth/fnordmetric.git && cd fnordmetric/fnordmetric-core mak make install
2 下载编译好的版本
貌似没有,需要自己编译
1 如果你只是想在命令行使用FnordMetric命令接口配合sql语句来绘制图表,则可以简单的使用以下方案:
http://fnordmetric.io/documentation/getting_started/fnordmetric-cli/
2 如果你想基于时间序列来收集数据并进行UI展示,我们可以使用以下方案:
本文讲解怎样启动FnordMetric Server实例,如何使用chartsql来插入metric数据、查询metric数据。 fnordmetric-server是一个标准的HTTP应用服务,它包含了一个web UI和一个HTTP API接口来允许chartsql查询。你在启动FnordMetric Server时可以设置storage backend,如果你在启动FnordMetric Server时没有设置storage backend,你可以使用web UI接口针对外部数据源进行查询(CSV或者mysql),如果你启动 FnordMetric Server时设置了storage backend,你还可以使用HTTP API接口来收集基于时间序列的数据到storage backend中,并且随后进行查询。
目前支持三者storage backend:inmemory、disk、hbase
启动 FnordMetric Server
mkdir /tmp/fnordmetric-data
fnordmetric-server --http_port 8080 --statsd_port 8125 --storage_backend disk --datadir /tmp/fnordmetric-data
收集基于时间序列的值
fnordmetric server建议记录时间序列值在metrics中,一个metric就像一个SQL database中的table,每个metric包含一个唯一的name和一个被称作samples的收集来的值,该值是基于时间序列的。一个sample就是一个datapoint ,每个sample至少包含了一个timestamp和一个numeric value,如果和database的table进行类比,就像每个metric是一个table,包含了两个默认的列value和time,每个sample都是table中的一行。
例如,我们要监控HTTP应用的响应时间,我们可以创建一个metric叫做http_response_times,它会记录http的响应时间。我们会把每个http请求的响应时间插入这个sample中,有很多client lib允许使用HTTP或者statsd API发送数据到FnordMetric Server。
我们给http_response_time中插入一个value,我们先手动的在命令行给server发送数据,最简单的发送sample就是使用statsd API,这需要在启动server时进行端口设置,我们使用netcat发送sample:
echo "http_response_times:42" | nc -u -w0 127.0.0.1 8125
执行这个命令,每次使用不同的value,server会自动创建不存在的metric。
在WEB UI执行chartsql查询
我们可以从http_respone_times获取最新100次的samples,以sample time作为X轴,以sample value作为Y轴:
DRAW LINECHART AXIS LEFT AXIS BOTTOM ;
SELECT time as x , value as y FROM http_response_times
ORDER BY time DESC LIMIT 100 ;
增加labels
为了让你在任意维度深度的度量你的metric数据,每个sample可以设置一个或者多个lables。每个lable是一个K/V对。在我们的例子中,假如我们的web应用运行在多台机器上,我们则可以给每个sample设置一个hostname lable或者datacenter lable,这样我们就可以查看每台主机的响应时间或者datacenter的响应时间。
让我们给http_response_times中插入更多的示例samples,并且加入lables,如下:
echo "http_response_times[hostname=machine82][datacenter=ams1]:18" | nc -u -w0 127.0.0.1 8125
echo "http_response_times[hostname=machine83][datacenter=ams1]:42" | nc -u -w0 127.0.0.1 8125
echo "http_response_times[hostname=machine84][datacenter=ams1]:23" | nc -u -w0 127.0.0.1 8125
当我们使用chartsql查询时,lable的key作为table的列,因此你可以通过lable来过滤你的值。现在我们的http_response_times包含了四个列:time、value、hostname、datacenter
现在我们可以在WEB UI中执行chartsql来查询最近一个小时内http_response_times的samples,我们以hostname进行rolled up,还是以sample time为X,以sample value为Y。
DRAW LINECHART AXIS LEFT AXIS BOTTOM ;
SELECT hostname as series , time as x , value as y FROM http_response_times
WHERE time > - 1hour ;
ChartSQL Overview
chartsql查询语句支持标准的sql语句,虽然它的一些特性还没完成,但是chartsql支持所有的标准sql语句,group by、having、joins等等。以下是ChartSQL和标准SQL的不同之处:
DRAW声明语句
DRAW语句允许你指定查询的返回结果是作为图表返回还是作为table返回:
DRAW LINECHART
WITH AXIS BOTTOM
SELECT time AS x , value AS y FROM example_data ;
IMPORT声明语句
IMPORT允许你导入外部数据,例如CSV和mysql数据库:
IMPORT TABLE example_data FROM 'csv:examples/data/measurement.csv?headers=true' ;
SELECT * FROM example_data ;
IMPORT TABLE mytable FROM 'mysql://localhost:3306/mydatabase' ;
SELECT * FROM mytable ;
GROUP OVER TIMEWINDOW条款
GROUP OVER TIMEWINDOW当和timeseries data一起工作时,是一个基于时间的简单汇总:
SELECT time , mean ( value ) FROM mymetric GROUP OVER TIMEWINDOW ( 60 );
DRAW Charts
DRAW语句允许你指定查询的返回结果是作为图表返回还是作为table返回,所有跟在DRAW语句后面的SELECT语句都被解释为图表数据,DRAW可以绘制图表的类型有AREACHART、BARCHART、LINECHART、POINTCHART四种。
DRAW LINECHART ; -- first chart
SELECT ...; -- data is added to first chart
SELECT ...; -- data is added to first chart
DRAW BARCHART ; -- second chart
SELECT ...; -- data is added to second chart
Add Series 所有的图表都可以渲染一个或者多个series数据,每个SELECT都必须有X和Y列,你可以通过设置serieslie来设置series名称。
手动设置series
SELECT "myseries" as series , ... as x , ... as y FROM ...;
或者使用series列在一个select语句中返回多个series,city_temperatures表有month、temperature、city三列
DRAW LINECHART ;
SELECT city AS series , month AS x , temperature AS y FROM city_temperatures ;
Adding Legends 在每个DRAW语句添加legend
DRAW LINECHART WITH
LEGEND BOTTOM LEFT OUTSIDE ;
Labels, Colors & more
label 当返回值列表是label列,则在每个point点的label列的值上可以设置tag或者tooltip
SELECT ... as x , ... as y , "value is: " + value as label FROM ...;
color 使用color列控制series的颜色,color列的值可以是color0..color9,或者hex rgb值
SELECT ... as x , ... as y , "color3" as color FROM ...;
SELECT ... as x , ... as y , "#f73e14" as color FROM ...;
point_style pointstyle列控制series的point style,值可以是circle和none
SELECT ... as x , ... as y , "circle" as pointstyle FROM ...;
point_size pointsize列控制series的point size,值可以是0..100
SELECT ... as x , ... as y , 4 as pointsize FROM ...;
line_style linestyle列控制series的line style,值可以是none和solid
SELECT ... as x , ... as y , "solid" as linestyle FROM ...;
line_width linewidth列控制series的line width,值可以是0..100
SELECT ... as x , ... as y , "2" as linewidth FROM ...;
Value Domains 设置XYZ轴的区间
DRAW LINECHART WITH
XDOMAIN 0 , 100
YDOMAIN 0 , 100
AXIS BOTTOM
AXIS LEFT ;
绘制对数log
DRAW LINECHART WITH XDOMAIN LOGARITHMIC
YDOMAIN 0 , 100 LOGARITHMIC
AXIS BOTTOM
AXIS LEFT ;
Add Chart Title/Subtitle 增加标题
DRAW LINECHART WITH
TITLE "mychart" SUBTITLE "mysubtitle" ;
Combining Charts 合并多个图表类型或者画多条Y轴
DRAW LINECHART WITH AXIS LEFT TITLE "y axis 1" ;
SELECT ....;
DRAW LINECHART WITH AXIS RIGHT TITLE "y axis 2" ;
SELECT ....;
Axes 图表默认没有axes,要手动设置
DRAW <charttype> [ WITH ]
[ AXIS { TOP | RIGHT | BOTTOM | LEFT }
[ TITLE 'title' ]
[ TICKS [ { INSIDE | OUTSIDE | OFF } ] [ ROTATE deg ]]
X轴在底部,Y轴在左边,并在每个轴添加title
DRAW LINECHART WITH
AXIS LEFFT TITLE "my y axis"
AXIS BOTTOM TITLE "my x axis" ;
Collecting Data
collecting metrics
我们可以在启动server时配置--storage_backend参数来收集数据,Metrics相当于database中的tables。每个metric都由一个唯一的name和由收集来的数据组成(叫做samples),这些数据以时间序列进行记录。
一个sample就是一个datapoint,每个sample至少包含一个timestamp和一个numeric value。在每个metric中都默认包含两个列value和time,而每个sample是表中的一行。metric的名称可以是由A-Za-z0-或者'.',或者'_',或者'-',或者'/'组成。
storage backends
server的后端存储计划支持以下方式:inmemory、disk、mysql、hbase。目前只实现了inmemory和disk
fnordmetric-cli --storage_backend=disk --datadir=/tmp/fnordmetric-data fnordmetric-cli --storage_backend=inmemory
send data via HTTP
在使用HTTP接口发送数据的时候,需要在启动server是设置--http_port参数
fnordmetric-server --storage_backend inmemory --http_port 8080
FnordMetric Server会监听在HTTP端口,你可以发送POST/metrics请求,有两个主要的参数:metric和value。metric=<metric-name>&value=<value>
curl -X POST -d "metric=test_metric&value=23.5" localhost:8080/metrics
也可以在发送数据时增加metric的labels,通过设置labels参数来实现
metric=<metric-name>&value=<value>&label[<k1>]=<v1>&label[<k2>]=<v2>
send data via statsd
fnordmetric sever允许你通过tastsd协议来发送数据,statsd是一个简单的文本协议。需要在启动server时设置--statsd_port参数,发送数据的格式是metricname:value格式
echo "foo:1" | nc -u -w0 127.0.0.1 8125
也可以使用statsd发送带labels的metric,格式是<metricname>[<label1_key>=<label1_value>][<label2_key>=<label2_value>]:<value>
cpu-utilization[hostname=machine83][datacenter=ams1]:0.642
Customizing Charts
可以绘制Line、Area、Bar、Point等图表,我目前只关注LIne
Line Charts
支持以下参数:
x (mandatory) the x axis value, type can be any of String, DateTime, Numeric y (mandatory) the y axis value, type can be any of String, DateTime, Numeric series (optional) if set, each series will be displayed as a separate line linestyle (optional) the line style, valid values are solid and none. default: solid linewidth (optional) the line width in pixel. default: 2 pointstyle (optional) the point style, valid values are circle and none. default: none. pointsize (optional) the line width in pixel. default: 4 label (optional) a label to be displayed above each point color (optional) the line/point color (hex value, eg. #ff0000)