首先原本的需求是通过Grafana展示Jenkins构建信息,正好Jenkins插件中又InluxDB数据库的插件可以直接使用,所以刚开始就用这个时间序列数据库来展示,但是后边在Grafana页面调整展示数据时,发现虽然InluxDB的操作跟SQL相似,但有些字符串的截取做不到,比如我想要某个字段内数据的最后一位,sql就可以通过函数:substring_index(字段,' ',-1)来做,但在Influxdb就会报错,并且Influxdb数据库的函数大多都是对应时间,实用范围局限性,但Jenkins又没有这样的MySQL数据库插件,所以只能先通过脚本把Inluxdb数据库的信息导入到MySQL数据库,再通过Grafana来展示,来吧,展示~
先说环境,Influxdb、MySQL是在一个服务器上,Grafana、jenkins是在一个服务器,两个网络是同一网段是互通的。其中Grafana、Influxdb和Jenkins都是容器部署的,MySQL直接用的Zabbix的本地库。
再说过程,Jenkins下载插件InfluxDB Plugin,然后在全局配置里设置InfluxDB Targets,如下图
配置好之后进到Job里在构建后操作步骤里会有下图选项:
Grafana Jenkins不用管,这个是在Grafana上创建的数据源的名字
然后现在Job的构建信息就可以写入Influxdb数据库了,每次构建后都会写入相应的信息,可以去Influxdb数据库看一下:
ps:装完Influxdb数据库需要先创建一个库,表不用
操作类似SQL,这里的表是measurements来表示
接下来写脚本把Influxdb数据库的信息导入MySQL数据库里:如下
第一次需要把注释掉的命令行打开,创建一张表,之后再次运行可以注释
import MySQLdb
import sys
import io
config = {'host':'localhost', //因为都是在同一台服务器所以就是本地//
'port':3306, //MySQL端口//
'user':'', //MySQL用户名和密码//
'passwd':'',
'charset':'utf8mb4',
'local_infile':1
}
conn = MySQLdb.connect(**config)
cur = conn.cursor()
def load_csv(filename,table,database='XXXXX'): //数据库名称//
file = io.open(filename, 'r',encoding='utf-8')
reader = file.readline()
b = reader.split(',')
colum = ''
for a in b:
colum = colum + a + ' varchar(255),'
colum = colum[:-1]
create_sql = 'create table if not exists ' + table + ' ' + '(' + colum + ')' + ' DEFAULT CHARSET=utf8'
data_sql = "LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\n' IGNORE 1 LINES" % (filename,table)
print data_sql
cur.execute('use %s' % database)
cur.execute('SET NAMES utf8;')
cur.execute('SET character_set_connection=utf8;')
#cur.execute(create_sql)
n=cur.execute(data_sql)
print n
conn.commit()
conn.close()
cur.close()
if __name__ == '__main__':
filename = sys.argv[1]
table = sys.argv[2]
load_csv(filename,table)
关于执行这个脚本是在jenkins上新建一个job,然后通过command命令来执行,并且这个关联其他项目成为子项目来触发,如下:
COMMAND:
//先进容器,然后把所有信息全部导入test1.csv
sudo docker exec influxdb influx -host 0.0.0.0 -port 8086 -database Influx数据库名 -execute 'SELECT * FROM jenkins_data ' -format csv >> test1.csv
//对比文件内容如有更新导入新的testnew.csv
sudo diff test.csv test1.csv > testnew.csv
//覆盖用于比对的test.csv,也等于直接删除test1
sudo mv test1.csv test.csv
//执行脚本把testnew.csv的内容写入MySQL数据库的sql_jenkins表
sudo python test.py testnew.csv sql_jenkins
如果没什么错误到这里就完成了,每一次Job的构建都会触发其下级那个带command的job构建,然后执行命令触发脚本写入新的构建信息。
关于Grafana通过MySQL的展示在这里: