本项目的目的在于简化grafana的使用,根据数据格式自动生成grafana图表.
数据格式要求json,要求只有一层,对key如下规范:
- service,必须字段,标识服务
- model:必须字段,区分不同类型metric
- @timestamp:必须字段,时间戳,格式"2019-01-01T01:00:00+08:00"
- TAG_xxx:自定义字段,用于筛选,xxx可以自定义,要求多余一个
- AVG-GRAPH_xxx/SUM-GRAPH_xxx/HEATMAP_xxx:用于计数,可以多余一个
示例:
{"service":"mysql", "model":"user-stats", "@timestamp":"", "TAG_region":"hb", "TAG_user":"tom", "AVG-GRAPH_bill_current":100, "SUM-GRAPH_bill_total":6000, "HEATMAP_qps_current":100, "HEATMAP_qps_total":250}
{"service":"mysql", "model":"resouce-stats", "@timestamp":"", "TAG_region":"hb", "TAG_user":"jerry", "AVG-GRAPH_cpu":10}
index名字,xxxx为年月,按照年月进行切分
- grafana--{service}-{model}-xxxx
index mapping
- TAG_xxx自动创建为keyword
- AVG-GRAPH_xxx/SUM-GRAPH_xxx/HEATMAP_xxx自动创建为long
index template:创建index时的schema
- service: folder,用于组织管理dashboard
- model: dashboard,一个model会生成在service下的一个dashboard
- @timestamp作为横轴。
- TAG_xxx: 绘制成下拉框,用于选择, 支持TAG_xxx排序和搜索级联.
- AVG-GRAPH_xxx/SUM-GRAPH_xxx/HEATMAP_xxx: 会变成纵轴的值
- AVG-GRAPH_xxx:表示该metric放置在graph类型的panel,并且metric的聚合方式为avg
- SUM-GRAPH_xxx:表示该metric放置在graph类型的panel,并且metric的聚合方式为sum
- HEATMAP_xxx:表示该metric放置在heatpmap类型的panel,默认metric的聚合方式为max
- 若xxx部分定义了相同前缀的多个metric,则默认会将这些metric放置在同一个panel中
- AVG-GRAPH_bill_current和AVG-GRAPH_bill_total会放置在title为bill,类型为graph的同一个panel里
- HEATMAP_qps_current和HEATMAP_qps_total会放置在title为qps,类型为heatmap的同一个panel里
- 如果想定制panel中的metric, 需要指定Es2Grafana中的myPanels参数
filebeat es-store es2grafana
local disk------------->kafka------------->es----------------->grafana
自己部署好es和grafana后
go build main/es-store.go
go build main/es2grafana.go
#create template
export ESDOMAIN=localhost:9200
./template.sh
#index document
./es-store -es='http://localhost:9200' -doc='{"service":"mysql", "model":"user-stats", "@timestamp":"", "TAG_region":"hb", "TAG_user":"tom", "AVG-GRAPH_bill_current":100, "SUM-GRAPH_bill_total":6000, "HEATMAP_qps_current":100, "HEATMAP_qps_total":250}
#generate grafana graph
./es2grafana -es='http://localhost:9200' -service='mysql' -model='user-stats' -grafana='http://localhost:3000' -key='admin:biliucheng'
在开发过程中,grafana的文档很不友好,也不全面。另外也没有一个很好用的library。
这里使用并fork了golang的库https://github.com/grafana-tools/sdk, 新代码https://github.com/bilc/grafana-sdk, 其中增加了一些功能。
一个有用的json转golang struct的网站:https://mholt.github.io/json-to-go/。
由于文档不够全面,很难正向开发拼接参数请求grafana。
我的方法是先在grafana上配置好dashboard,生成对应的json,在代码中对这段json反序列化,生成一个基本的dashboard结构,然后用代码去修改需要动态生成的变量。