Proxy
代理 Datakit 的请求,将其数据从内网发送到公网。
配置¶
采集器配置¶
挑选网络中的一个能访问外网的 DataKit,作为代理,配置其代理设置。
进入 DataKit 安装目录下的 conf.d/proxy
目录,复制 proxy.conf.sample
并命名为 proxy.conf
。示例如下:
[[inputs.proxy]]
## default bind ip address
bind = "0.0.0.0"
## default bind port
port = 9530
# verbose mode will show more info about during proxying.
verbose = false
# mitm: man-in-the-middle mode
mitm = false
配置好后,重启 DataKit 即可。
目前可以通过 ConfigMap 方式注入采集器配置来开启采集器。
网络拓扑结构¶
如果内网 Datakit 将自己的 Proxy 指向某个已开启 Proxy 采集器的 Datakit:
则内网各个 Datakit 的请求流量将通过 Proxy 代理出来(此处假定 Proxy 绑定端口为 9530):
flowchart LR;
dk_A(Datakit A);
dk_B(Datakit B);
dk_C(Datakit C);
dk_X_proxy("Datakit X's Proxy(0.0.0.0:9530)");
dw(Dataway/Openway);
subgraph "内网"
dk_A --> dk_X_proxy;
dk_B --> dk_X_proxy;
dk_C --> dk_X_proxy;
end
subgraph "公网"
dk_X_proxy ==> |https://openway.guance.com|dw;
end
关于 MITM 模式¶
开启 MITM 模式主要是便于收集 Proxy 更详细的指标信息,其原理是:
- 内网 Datakit 连接 Proxy 时,需信任 Proxy 采集器提供的 HTTPS 证书(该证书肯定是一个非安全的证书,其证书源在此)
- 一旦 Datakit 信任了该 HTTPS 证书,则 Proxy 采集器就能嗅探 HTTPS 包内容,继而可以记录更多请求有关的指标
- Proxy 采集器记录完指标信息后,再将请求转发给 Dataway(用观测云安全的 HTTPS 证书)
此处 Datakit 和 Proxy 之间虽然用了不安全的证书,但仅限于内网流量。Proxy 将流量转发到公网 Dataway 的时候,仍然使用的是安全的 HTTPS 证书。
Attention
开启 MITM 模式后,会大幅度降低 Proxy 的性能,参见下面的性能测试结果。
指标¶
Proxy 采集器自身暴露了如下 Prometheus 指标:
POSITION | TYPE | NAME | LABELS | HELP |
---|---|---|---|---|
internal/plugins/inputs/proxy | COUNTER | datakit_input_proxy_connect |
client_ip |
Proxy connect(method CONNECT) |
internal/plugins/inputs/proxy | COUNTER | datakit_input_proxy_api_total |
api,method |
Proxy API total |
internal/plugins/inputs/proxy | SUMMARY | datakit_input_proxy_api_latency_seconds |
api,method,status |
Proxy API latency |
如果在 Datakit 自身指标上报中开启了上述指标采集,则能在内置视图中看到 Proxy 采集器有关的这几个指标。
Attention
如果不开启 mitm 功能,则不会有 datakit_input_proxy_api_total
和 datakit_input_proxy_api_latency_seconds
两个指标。
性能测试¶
通过编写简单的 HTTP server/client 程序,基本的环境参数:
- 硬件:Apple M1 Pro/16GB
- OS: macOS Ventura 13
- 服务端:一个空跑的 HTTPS 服务,它接收
/v1/write/
的 POST 请求,直接返回 200 - 客户端:POST 一个 170KB 左右的文本文件(metric.data)给服务端
- 代理:本机开启的一个 Datakit Proxy 采集器(
http://localhost:19530
) - 请求量:总共 16 客户端,每个客户端发送 100 个请求
命令如下:
得出如下的性能测试结果:
- 不开启 MITM 的性能如下:
Benchmark metrics:
# HELP api_elapsed_seconds Proxied API elapsed seconds
# TYPE api_elapsed_seconds gauge
api_elapsed_seconds 0.249329709
# HELP api_latency_seconds Proxied API latency
# TYPE api_latency_seconds summary
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.5"} 0.002227916
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.9"} 0.002964042
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.99"} 0.008195959
api_latency_seconds_sum{api="/v1/write/xxx",status="200 OK"} 3.9450724669999992
api_latency_seconds_count{api="/v1/write/xxx",status="200 OK"} 1600
# HELP api_post_bytes_total Proxied API post bytes total
# TYPE api_post_bytes_total counter
api_post_bytes_total{api="/v1/write/xxx",status="200 OK"} 2.764592e+08
- 开启 MITM 后,性能骤降(~100X):
Benchmark metrics:
# HELP api_elapsed_seconds Proxied API elapsed seconds
# TYPE api_elapsed_seconds gauge
api_elapsed_seconds 29.454341333
# HELP api_latency_seconds Proxied API latency
# TYPE api_latency_seconds summary
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.5"} 0.29453425
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.9"} 0.405621917
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.99"} 0.479301875
api_latency_seconds_sum{api="/v1/write/xxx",status="200 OK"} 461.3323555329998
api_latency_seconds_count{api="/v1/write/xxx",status="200 OK"} 1600
# HELP api_post_bytes_total Proxied API post bytes total
# TYPE api_post_bytes_total counter
api_post_bytes_total{api="/v1/write/xxx",status="200 OK"} 2.764592e+08
结论:
- 不开启 MITM 的情况下,TPS 约 1600/0.249329709 = 6417/s
- 开启 MITM 后,TPS 将至 1600/29.454341333 = 54/s
故不建议在生产环境开启 MITM 功能,仅用于调试或测试。