如何配置zipkin使用mysql数据库
最近因为项目需要在看zipkin(关于应用程序性能监控的话题本文不展开讨论,只是介绍zipkin的数据存储配置)。
zipkin默认使用内存模式存储数据,一旦系统重启或者关闭就再也找不到数据库,这对于学习和演示系统比较方便,但是对生产环境显然是不可接受的,zipkin提供了多种数据持久存储方式,例如cassandra、cassandra3、elasticsearch、mysql。由于本人比较了解mysql同时项目中大多使用mysql数据库,就选择使用mysql数据库。
参考https://github.com/openzipkin/zipkin/tree/master/zipkin-storage/mysql 和https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml 以及https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/java/zipkin/server/ZipkinServerConfiguration.java
第一步,
我们需要在数据创建zipkin使用的数据库, zipkin默认连接数据库zipkin, 所以我们可以直接创建name为zipkin的数据库。然后在该数据库创建表https://github.com/openzipkin/zipkin/tree/master/zipkin-storage/mysql 中有详细内容,最主要的是到导入https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql/src/main/resources/mysql.sql 文件 (mysql中如何使用sql文件创建表格,不在本文介绍中,可百度或者谷歌).
第二步,
根据https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml 以及https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/java/zipkin/server/ZipkinServerConfiguration.java
创建对应的环境变量,例如根据ZipkinServerConfiguration.java, 我们可以知道环境变量zipkin.storage.type是获取存储类型的, 因此我们可以在启动zipkin的shell或者windows中设置环境变量zipkin.storage.type=mysql, 实际设置环境变量STORAGE_TYPE=mysql也是可以的
static final class StorageTypeMemAbsentOrEmpty implements Condition {
@Override public boolean matches(ConditionContext condition, AnnotatedTypeMetadata ignored) {
String storageType = condition.getEnvironment().getProperty("zipkin.storage.type");
if (storageType == null) return true;
storageType = storageType.trim();
if (storageType.isEmpty()) return true;
return storageType.equals("mem");
}
}
根据zipkin.storage.type我们知道mysql host和port都有默认值,user和pass需要设置,根据实际情况我们设置了MYSQL_USER=yang MYSQL_PASS=xxxx(密码设置为自己的实际密码,此处用xxx代替)
mysql:
host: ${MYSQL_HOST:localhost}
port: ${MYSQL_TCP_PORT:3306}
username: ${MYSQL_USER:}
password: ${MYSQL_PASS:}
db: ${MYSQL_DB:zipkin}
max-active: ${MYSQL_MAX_CONNECTIONS:10}
use-ssl: ${MYSQL_USE_SSL:false}
第三步,
在设置了第二部环境变量的shell中或者windows的cmd中启动zipkin。
java -jar zipkin-server-2.4.3-exec.jar > out.txt
因为zipkin是springboot程序也可以通过启动命令行设置环境变量
java -jar zipkin-server-2.4.3-exec.jar –STORAGE_TYPE=mysql –MYSQL_DB=zipkin –MYSQL_USER=yang –MYSQL_PASS=xxx
日志中可以发现
2018-01-24 10:53:42.511 INFO 4360 — [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-01-24 10:53:42.521 INFO 4360 — [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name ‘mysqlDataSource’ has been autodetected for JMX exposure
2018-01-24 10:53:42.521 INFO 4360 — [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean ‘mysqlDataSource’: registering with JMX server as MBean [com.zaxxer.hikari:name=mysqlDataSource,type=HikariDataSource]
2018-01-24 10:53:42.531 INFO 4360 — [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0
2018-01-24 10:53:42.701 INFO 4360 — [ main] b.c.e.u.UndertowEmbeddedServletContainer : Undertow started on port(s) 9411 (http)
2018-01-24 10:53:42.711 INFO 4360 — [ main] zipkin.server.ZipkinServer : Started ZipkinServer in 10.232 seconds (JVM running for 11.114)
2018-01-24 10:54:22.104 INFO 4360 — [ XNIO-2 I/O-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting…
2018-01-24 10:54:22.296 INFO 4360 — [ XNIO-2 I/O-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
检查数据库和 zipkin web ui http://localhost:9411/zipkin/
web UI
简要说明一下服务调用背景:有四个服务server1,到service4, 其中service1一方面直接调用了service4,同时又调用了service2, service2调用了service3和server4. 所以就如截图所示的,service1直接到service4, service1直接到service2, service2直接到service3和service4.
关于这个例子可以参考zipkin官方的https://github.com/openzipkin/brave-webmvc-example 以及https://github.com/liaokailin/zipkin