依赖

Web 框架(要求 2.7+)

1
"koa": "^2.13.1"

日志(基于 TCP 协议)

参考:log4js-logstash-tcp

1
2
"log4js": "^3.0.5",
"log4js-logstash-tcp": "^2.0.0"

Zipkin

参考:zipkin-instrumentation-koa

1
2
"zipkin-instrumentation-koa": "^0.22.0",
"zipkin-transport-http": "^0.22.0"

代码(Zipkin 部分)

1
2
3
4
5
6
7
8
9
10
11
12
// 下游(上游略,上游改 localServiceName 即可)
const { Tracer, BatchRecorder, ExplicitContext } = require('zipkin');
const { koaMiddleware } = require('zipkin-instrumentation-koa');
const ctxImpl = new ExplicitContext();
const recorder = new BatchRecorder({
logger: new HttpLogger({
endpoint: 'http://192.168.56.100:9411/api/v1/spans' // zipkin 地址
})
});
const tracer = new Tracer({ recorder, ctxImpl, localServiceName: 'sapi_carmodel' });
const app = new Koa();
app.use(koaMiddleware({ tracer }))

代码(Log 部分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var log4js = require('log4js');
log4js.configure({
"appenders": [
{
"category": "tests",
"type": "log4js-logstash-tcp",
"host": "localhost",
"port": 5050,
"fields": {
"instance": "MyAwsInstance",
"source": "myApp",
"environment": "development"
}
},
{
"category": "tests",
"type": "console"
}
],
"levels": {
"tests": "DEBUG"
}
});

logstash.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
input {
tcp {
host => "0.0.0.0"
codec => json_lines
port => 5050
type => "debug"
}
}

filter {
if [type] == "debug" {
json {
source => "message"
remove_field => ["message"]
}
}
}

output {
elasticsearch {
hosts => ["es:9200"]
action => "index"
codec => json
index => "sopei-%{type}-%{+YYYY.MM.dd}"
template_name => "sopei"
}
}

测试代码(上游服务发送请求)

1
2
3
4
5
6
7
8
// 测试接口并将 _trace_id 以 header 方式传过去,这里用 ExplicitContext(需手动传值 ctx.request._trace_id),CLSContext 不好使而且没找到原因
router.get('/tests', async (ctx) => {
const result = await ctx.rest.get(下游接口);
var log = log4js.getLogger('tests');
log.debug(result);
return ctx.send('success', result)
});
// 下游从 header 获取 ctx.request._trace_id

PS: 这里目前得到的 message 格式不太对,待改

补充 docker-compose 中的 Zipkin 部分

关于 Zipkin,官方提供了三种存储模式:docker-compose 示例zipkin-storage

1
2
3
4
5
6
7
8
9
10
11
zipkin:
image: openzipkin/zipkin:2.22.1
container_name: zipkin
links:
- elasticsearch:es
environment:
- STORAGE_TYPE=elasticsearch
- ES_HOSTS=es:9200
ports:
# Port used for the Zipkin UI and HTTP Api
- 9411:9411