操做系统: CentOS 7.2 64位java
Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来。其主要功能是汇集来自各个异构系统的实时监控数据。node
故障快速定位 经过分析调用链,能够将一次请求的逻辑轨迹完整清晰的展现出来,经过在开发中在业务日志中添加调用链ID,能够经过调用链结合业务日志快速定位错误信息。mysql
服务可用性 经过分析各个环节的平均时延,QPS等信息,能够找到系统的薄弱环节,对一些模块作调整,例如数据冗余、链路可用等。sql
性能分析 在调用链的各个环节分别添加调用时延,能够分析系统的性能瓶颈,进行有针对性的优化。shell
安装数据追踪软件Zipkin所须要的JDK环境数据库
执行如下命令安装JDKexpress
yum install java-1.8.0-openjdk* -y
复制代码
安装完成以后,检查是否安装成功npm
java -version
复制代码
新建存放ZIPkin的目录并进入此目录json
mkdir -p /data/release/zipkin && cd "$_"
复制代码
下载Zipkinapi
wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'
复制代码
启动Zipkin
java -jar zipkin.jar
复制代码
==Zipkin 默认监听 9411 端口, 使用浏览器访问 http://IP:9411 便可看到 Zipkin 自带的图形化界面。若是没有看到Zipkin的图形化界面,请确保外网的9411端口是否已开==
Zipkin支持的持久化方案比较多,如: MySQL、 Elasticsearch。咱们使用MySQL 5.7来做为持久化方案。
在执行如下操做以前,可使用 Ctrl + C 退出上个步骤的 Java 进程并下载rmp包。
wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
复制代码
安装rpm包
rpm -Uvh mysql57-community-release-el7-9.noarch.rpm
复制代码
安装MySQL
yum install mysql-community-server -y
复制代码
启动MySQL
systemctl start mysqld.service
复制代码
获取 root 临时密码
grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}'
复制代码
使用上一步的得到的临时密码登入 MySQL
mysql -uroot -p
复制代码
更改MySQL的root密码为dettRoot$123
ALTER USER 'root'@'localhost' IDENTIFIED BY 'dettRoot$123';
复制代码
退出MySQL,回到Bash shell
exit;
复制代码
编写初始化脚本
在目录/data/release/zipkin下建立脚本文件zipkin_init.sql
touch zipkin_init.sql
复制代码
而后添加以下脚本代码:
CREATE TABLE IF NOT EXISTS zipkin_spans (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL,
`id` BIGINT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`parent_id` BIGINT,
`debug` BIT(1),
`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
CREATE TABLE IF NOT EXISTS zipkin_annotations (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
CREATE TABLE IF NOT EXISTS zipkin_dependencies (
`day` DATE NOT NULL,
`parent` VARCHAR(255) NOT NULL,
`child` VARCHAR(255) NOT NULL,
`call_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);
复制代码
登陆MySQL
mysql -u root --password='dettRoot$123'
复制代码
建立Zipkin数据库
create database zipkin
复制代码
切换数据库
use zipkin
复制代码
初始化表及索引
source /data/release/zipkin/zipkin_init.sql
复制代码
检查是否有生成zipkin_annotations, zipkin_dependencies, zipkin_spans 三张数据表
show tables;
复制代码
退出 MySQL, 回到 Bash shell
exit;
复制代码
cd /data/release/zipkin
STORAGE_TYPE=mysql MYSQL_HOST=localhost MYSQL_TCP_PORT=3306 MYSQL_DB=zipkin MYSQL_USER=root MYSQL_PASS='dettRoot$123'
nohup java -jar zipkin.jar &
复制代码
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
yum install nodejs -y
复制代码
建立/data/release/service_a目录
mkdir -p /data/release/service_a && cd "$_"
复制代码
使用NPM安装相关依赖,在 /data/release/service_a 目录下建立并编辑 package.json,参考下面的内容。
touch package.json
复制代码
package.json
{
"name": "service_a",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.15.3",
"zipkin": "^0.7.2",
"zipkin-instrumentation-express": "^0.7.2",
"zipkin-transport-http": "^0.7.2"
}
}
复制代码
安装相关依赖
npm install
复制代码
建立并编辑 app.js
在 /data/release/service_a 目录下建立 app.js,参考下面的内容。
touch app.js
复制代码
APP.js
const express = require('express');
const {Tracer, ExplicitContext, BatchRecorder} = require('zipkin');
const {HttpLogger} = require('zipkin-transport-http');
const zipkinMiddleware = require('zipkin-instrumentation-express').expressMiddleware;
const ctxImpl = new ExplicitContext();
const recorder = new BatchRecorder({
logger: new HttpLogger( {
endpoint: 'http://127.0.0.1:9411/api/v1/spans'
})
});
const tracer = new Tracer({ctxImpl, recorder});
const app = express();
app.use(zipkinMiddleware({
tracer,
serviceName: 'service-a'
}));
app.use('/', (req, res, next) => {
res.send('hello world');
});
app.listen(3000, () => {
console.log('service-a listening on port 3000!')
});
复制代码
启动服务
node app.js
复制代码
查看采集到的追踪数据
使用浏览器访问 http://IP:9411,便可看到刚才访问产生的追踪数据。
微信公众号ID:jsj201501
微信公众号名称:瞎说开发那些事
感谢您的关注和阅读,但愿这篇文章能为您带来帮助。
欢迎转载与分享,也请注明出处。
若是您有须要了解的关于Java开发、RPA的等内容,也能够给我留言或发邮件 (shexd1001@gmail.com)。
本文做者:折(she) 向东
微信号:wxxdong2102
识别如下二维码,能够与做者进行更为深刻的交流。