本文记录clash-tracing的部署使用(踩坑经验),以及windows下clash的trace数据采集方法。

一 前言说明

clash-tracing(https://github.com/Dreamacro/clash-tracing )是clash作者推出的clash数据采集展示工具。
核心是一个docker-compose配置,包含组件有:
loki、grafana、vector、traffic_scraper(websocat)、tracing_scraper(websocat)
其工作流程如下:

  1. 两个websocat将clash数据转发到vector
  2. vector将数据进行路由、转换等操作,然后写入loki
  3. loki存储数据并提供搜索功能
  4. grafana提供面板访问,数据源来自loki

由上面的工作流程可以看出,如果要对接多个clash,只需要提供多个websocat即可。

目前本人有3个地方安装了clash:pc、手机、服务器。 其中服务器是多个服务器共同使用一个clash实例。

因为服务器是长时间运行的,可直接用部署的websocat进行数据采集。
而pc则不是一直使用的,不想为此多部署两个websocat容器,所以使用任务计划在系统启动时自动启动websocat程序即可。

二 部署clash-tracing

主要看官方的:https://github.com/Dreamacro/clash-tracing
以下是个人的修改配置,可参考:

  1. 把grafana/grafana-oss:latest换成grafana/grafana-oss:latest-ubuntu
    grafana/grafana-oss:latest使用镜像不支持no_proxy环境变量,会导致大量不需要代理的连接进入clash影响统计。
    比方说tailscale的连接,因为我的grafana是通过tailscale访问的。
    见:https://linshenkx.github.io/clash_docker/#6-no-proxy%E7%9B%B8%E5%85%B3%E8%AF%B4%E6%98%8E

  2. 在docker-compose.yml里面把loki的端口也放出来。
    再把clash-tracing/grafana/provisioning/datasources/clash.yaml以及clash-tracing/vector/vector.toml中的 loki:3100 换成 域名:3100,因网络代理,loki可能无法解析

  3. 在docker-compose.yml里面把user: root换成 user: "0:0"

  4. loki的版本使用2.4.1避免“too many outstanding requests”报错,见:https://github.com/grafana/loki/issues/4613

  5. 两个websocat合并成一个

然后去执行 docker-compose up -d 就行了

注意默认数据是存储在clash-tracing的各个组件目录下,工具loki的默认配置数据只存储168h,但还是要注意空间占用

docker-compose.yml参考如下:

version: '3'
services:
  loki:
    image: grafana/loki:2.4.1
    container_name: loki
    restart: always
    user: "0:0"
    volumes:
      - ./loki/data:/loki
      - ./loki/config.yaml:/etc/loki/local-config.yaml
    ports:
      - "3100:3100"
  grafana:
    image: grafana/grafana-oss:latest-ubuntu
    container_name: grafana
    restart: always
    user: "0:0"
    volumes:
      - ./grafana/data:/var/lib/grafana
      - ./grafana/panels:/etc/dashboards
      - ./grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards
      - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources
    ports:
      - "3000:3000"
  vector:
    image: timberio/vector:0.X-alpine
    container_name: vector
    restart: always
    volumes:
      - ./vector/vector.toml:/etc/vector/vector.toml
    ports:
      - "39000:9000"
    depends_on:
      - loki
  scraper:
    image: vi0oss/websocat:0.10.0
    container_name: scraper
    restart: always
    entrypoint:
      - /bin/sh
      - -c
      - |
        /usr/local/bin/websocat -v --autoreconnect-delay-millis 15000 autoreconnect:ws://$CLASH_HOST/traffic?token=$CLASH_TOKEN autoreconnect:tcp:vector:9000 &
        /usr/local/bin/websocat -v --autoreconnect-delay-millis 15000 autoreconnect:ws://$CLASH_HOST/profile/tracing?token=$CLASH_TOKEN autoreconnect:tcp:vector:9000
    depends_on:
      - vector


三 windows使用websocat采集clash数据

1 编写脚本

https://github.com/vi/websocat 下载对应的webscocat执行程序。
编写 run.vbs 脚本如下

Dim  clashServer,clashToken,vectorServer,command
clashServer="localhost:29090"
clashToken="myToken"
vectorServer="my.vector:39000"
command= "D:\Program1\websocat\websocat  -v --autoreconnect-delay-millis 15000 autoreconnect:ws://" & clashServer & "/profile/tracing?token=" & clashToken & " autoreconnect:tcp:" & vectorServer
command2= "D:\Program1\websocat\websocat  -v --autoreconnect-delay-millis 15000 autoreconnect:ws://" & clashServer & "/traffic?token=" & clashToken & " autoreconnect:tcp:" & vectorServer

' 输出指令进行调试
' WScript.Echo command
' 把0改成1,使得窗口不自动隐藏进行调试 
WScript.CreateObject("WScript.Shell").run command , 0
WScript.CreateObject("WScript.Shell").run command2 , 0

2 配置开机执行

打开“任务计划程序”,创建任务,重要的配置项如下:

  • 触发器-新建-登陆时
  • 操作-启动程序-“程序或脚本”设置为run.vbs路径

三 效果验证

clash统计界面
clash日志

Q.E.D.