时间序列数据可视化 Timelion
# Timelion主要用于在可视化中组合完全独立的数据源,检索时间序列数据、通过计算挑选复杂问题的答案展示可视化结果
# 如:
# 1.每个唯一的用户在一段时间内查看了多少次页面
# 2.本周与上周流量的区别
# 3.今天日本有多少百分比的人口访问本网站
# 4.标准普尔500指数的10天移动均线是什么
# 5.过去年内收到的所有搜索请求的和
https://www.elastic.co/guide/en/kibana/current/timelion.html
# Example ( 下例中.es函数的timefield属性用于指定哪个字段作为X轴的时间参考 )
.es(index=INDEX,timefield=@timestamp,q="not name : xxx AND level : err").label('当前').lines(width=1,fill=5).color('#de773f'),
.es(index=INDEX,timefield=@timestamp,q="not name : xxx AND level : err",offset=-168h).label('上周').lines(width=1,fill=1).color(#9d9087).legend(columns=2),
.es(index=INDEX,timefield=@timestamp,q="not name : xxx AND level : err").label('速率').lines(width=0.1,fill=2).color('red').derivative().legend(columns=3),
.es(index=INDEX,timefield=@timestamp,q="not name : xxx AND level : err").label('趋势').lines(width=5,fill=0).color('#ed1941').mvavg(20).legend(columns=4)
功能:可视化效果类
.bars($width): # 用柱状图展示数组
.lines($width, $fill, $show, $steps): # 用折线图展示数组
.points(): # 用散点图展示数组
.color("#c6c6c6"): # 颜色值
.hide(): # 隐藏该数组
.title(title="qps"): # 图表标题
.label("change from %s"): # 标签名
.legend($position, $column): # 图例位置
.static(value=1024, label="1k", offset="-1d", fit="scale"): # 绘制一个固定的值
.value(): # .static() 简写
.trend(mode="linear", start=0, end=-10): # 采用 linear 或 log 回归算法绘制趋势图形
.yaxis($yaxis_number, $min, $max, $position): # 设置Y轴属性,.yaxis(2) 表示第二根 Y 轴
功能:数据运算类
.abs(): # 对整个数组元素求绝对值
.precision($number): # 浮点数精度
.cusum($base): # 数组元素之和,再加上 $base
.derivative(): # 对数组求导数
.divide($divisor): # 数组元素除法
.multiply($multiplier): # 数组元素乘法
.subtract($term): # 数组元素减法
.sum($term): # 数组元素加法
.add(): # 同 .sum()
.plus(): # 同 .sum()
.first(): # 返回第一个元素
.movingaverage($window): # 用指定的窗口大小计算移动平均值,对于分析有很多噪音数据的时序图非常有帮助
.mvavg(): # .movingaverage() 的简写
.movingstd($window): # 用指定的窗口大小计算移动标准差
.mvstd(): # .movingstd() 的简写
.fit($mode): # 使用指定的 fit 函数填充空值。可选项有:average, carry, nearest, none, scale
.holt(alpha=0.5, beta=0.5, gamma=0.5, season="1w", sample=2): # 即ES的 pipeline aggregation 所支持的 holt-winters 算法
.log(base=10): # 对数
.max(): # 最大值
.min(): # 最小值
.props(): # 附加额外属性,比如 .props(label=bears!)
.range(max=10, min=1): # 保持形状的前提下修改最大值最小值
.scale_interval(interval="1s"): # 在新间隔下再次统计,比如把一个原本 5min 间隔的 date_histogram 改为每秒的结果
.trim(start=1, end=-1): # 裁剪序列值
.metric() # 聚类,如metric=sum:bytes 则y轴即为bytes的和
.split() # 表示按某字段分隔,如 split=source:4 即按source字段进行划分,取数量前四的展现
功能:逻辑运算类
.condition(operator="eq", if=100, then=200): # 支持 eq/ne/lt/gt/lte/gte 等操作符,以及 if/else/then 赋值
.if(): # .condition() 的简写
功能:数据源设定类
.elasticsearch(): # 从 ES 读取数据
.es(q="querystring", metric="cardinality:uid", index="logstash-*", offset="-1d"): # 同上
.graphite(metric="path.to.*.data", offset="-1d"): # 从 graphite 读取数据
.quandl(): # 从 quandl.com 读取 quandl 码
.worldbank_indicators(): # 从 worldbank.org 读取国家数据
.wbi(): # .worldbank_indicators() 的简写
.worldbank(): # 从 worldbank.org 读取数据
.wb(): # .worldbanck() 的简写
基于 Timelion 的可视化
# 参考:https://segmentfault.com/a/1190000016679290
# 将创建的第一个可视化将比较在用户空间中花费的CPU时间与一小时的结果偏移量的实时百分比
# 为了创建这个可视化,需创建两个Timelion表达式,一个是system.cpu.user.pct的实时平均数,另一个是1小时的平均偏移量
.es(index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct')
# 现在再添加另一个具有前一小时数据的系列,以便进行比较,为此必须向.es()函数添加一个offset参数 (用日期表达式偏移序列检索)
# 对于本例,使用日期表达式-1h将数据偏移一小时,使用逗号分隔这两个系列,在Timelion查询栏中新增以下表达式
.es(offset=-1h,index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct').label('last hour')
# 最终如下
.es(index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct').label('current hour'),
.es(offset=-1h,index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct').label('last hour').title('CPU usage over time')
# 也可以在.es()函数后添加.lines()后缀来定义线条的类型,如:
.es(index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct').label('current hour').lines(fill=1,width=0.5),.......
# 也可以对图表设置颜色:
.es(index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct').label('current hour').title('CPU usage over time').color(#1E90FF)
# 也可以设置其可视化展示的位置:
.es(................).legend(columns=2, position=nw)
****.bars("args...") # 设置为条形
****.libes(width=2) # 线条宽度
# ----------------------------------------------------------------------
.es(index=shop_index,timefield=shopRegistDate,split=source.keyword:10)
# index: 索引名字
# timestamp: timestamp字段,必须有,用于timeline时间序列图中的x-时间轴数据。
# split: 要group by的字段,数字10表示最多显示多少个分类的线条
.es().label("Current"),
.es(offset=-15m).label("Last 15min"),
.es().subtract(.es(offset=-15m)).label("Diff").lines(steps=1,fill=2,width=0)