clash-tracing
clash-tracing copied to clipboard
基于Vector/Loki的最新版有关问题
作为半桶水用户,有几个问题希望交流一下。
- 这个tracing的配置指导真的不是吃瓜用户 friendly
- 当前所有配置及操作, 默认考虑的Linux用户是root用户进行操作,且该Host中没有任何container的情况,例如Grafana、Portainer。
- 因为Vector的默认端口,或者是vector.toml配置文件中端口配置就是9000,这个与Portainer默认端口冲突。
- 目录访问权限问题
- Loki与Grafana的container内部启动用户ID,绝大概率与Host bind 目录的用户ID不一致,因此没有会造成无法写入。
- 所以,要么得通过id -u的结果,作为对应container的启动用户。
- Grafana dashboard的配置
- 其实,即便加入loki的data source,dashboard中的各项配置,貌似不能简单的修改data source这么简单,因为只是修改datasource不能查询出结果。。。实际上是有数据的。
- 至少相对熟悉influxdb的情况,暂时还没搞懂Loki的数据查询方式,“Query inspector”中查不到结果。。。
最后,可否出个相对详细的How-to呢? @Dreamacro
version: '3'
services:
loki:
image: grafana/loki:2.4.2
container_name: loki
user: '1100'
ports:
- "3100:3100" ##将loki的端口暴露出来,可以用现有的Grafana访问
volumes:
- ./loki/data:/loki
- ./loki/config.yaml:/etc/loki/local-config.yaml
# grafana:
# image: grafana/grafana-oss:latest
# user: '0'
# volumes:
# - ./grafana:/var/lib/grafana
# ports:
# - "3001:3000"
# container_name: grafana_OSS
vector:
image: timberio/vector:0.X-alpine
volumes:
- ./vector/vector.toml:/etc/vector/vector.toml
container_name: vector
depends_on:
- loki
reporter:
build: .
environment:
CLASH_HOST: '192.168.1.250:9090'
CLASH_TOKEN: '123456'
VECTOR_ADDR: 'vector:9001' ##对应vector.toml配置端口
container_name: reporter
depends_on:
- vector
vector.toml
[sources.mixed]
type = "socket"
address = "0.0.0.0:9001" ##我自己修改了端口
mode = "tcp"
decoding.codec = "json"
host_key = ""
[transforms.traffic-input]
type = "filter"
inputs = [ "mixed" ]
condition = "exists(.up)"
[transforms.tracing-input]
type = "filter"
inputs = [ "mixed" ]
condition = "!exists(.up)"
[transforms.traffic]
type = "remap"
inputs = [ "traffic-input" ]
source = """
.type = "traffic"
del(.source_type)"""
[transforms.tracing]
type = "remap"
inputs = [ "tracing-input" ]
source = """
.type = downcase!(.type)
del(.source_type)
if exists(.metadata) {
.metadata_dstip = .metadata.destinationIP
.metadata_dstport = .metadata.destinationPort
.metadata_host = .metadata.host
.metadata_network = .metadata.network
.metadata_srcip = .metadata.sourceIP
.metadata_srcport = .metadata.sourcePort
.metadata_type = .metadata.type
.metadata_dnsmode = .metadata.dnsMode
del(.metadata)
}
"""
[sinks.loki]
type = "loki"
inputs = [ "traffic", "tracing" ]
endpoint = "http://192.168.1.5:3100"
encoding.codec = "json"
labels.type = "{{ type }}"
- 看了一下你后面的描述,都有一个其他自部署的 grafana 了,已经不能算一个所谓的「吃瓜用户」。 原始的 docker-compose 只需要暴露一个 grafana 的端口,不需要使用者关心其他的问题。 端口冲突问题我不是很理解,docker compose 会为每个不同的 config 创建一个独立的 network,与其他的容器隔离开,不应该存在什么冲突的问题。
- 项目内并不存在 grafana 和 loki 的持久化目录,我的理解是 docker compose 会在运行时根据当前的用户的权限进行创建,理论上不应该出现写目录权限的问题
- 如果把时间范围拉低,比如 Last 3 hours, 应该就不会出现查不到的问题。这个问题我也遇到过,我也是第一次用 loki,看起来是时间范围长了会查到太多的数据,后面看看怎么修合适
vector 目前不支持 websocket 的 source,这次引入他也是想让他变成唯一的采集器,目前只做到了把写日志的流程搬到了 vector,未来看看怎么在不需要其他 go 代码的情况下直接支持 vector
- 看了一下你后面的描述,都有一个其他自部署的 grafana 了,已经不能算一个所谓的「吃瓜用户」。
呵呵,真的只能是用户,只是玩的相对久点的用户而已。
原始的 docker-compose 只需要暴露一个 grafana 的端口,不需要使用者关心其他的问题。
对,这就是为啥我说 “默认考虑的Linux用户是root用户进行操作,且该Host中没有任何container的情况,例如Grafana、Portainer。”
端口冲突问题我不是很理解,docker compose 会为每个不同的 config 创建一个独立的 network,与其他的容器隔离开,不应该存在什么冲突的问题。
呃,,,这里我的描述的确不准确,当然,只要不是在Host暴露出来,且建立的是另外一个独立network的情况下,的确不冲突。 但是也是由于另外一个Network,导致现有的Grafana访问起来不好操作。。。
Again,如果是存粹为Clash tracing为目的的一套采集、处理、UI展示,的确没有毛病。
- 项目内并不存在 grafana 和 loki 的持久化目录,我的理解是 docker compose 会在运行时根据当前的用户的权限进行创建,理论上不应该出现写目录权限的问题
呃,这个值得再讨论一下。 首先,这两个就是持久化目录:都是在“clash-tracing”目录里边的。
volumes:
- ./loki/data:/loki
- ./loki/config.yaml:/etc/loki/local-config.yaml
volumes:
- ./grafana:/var/lib/grafana
其次,关于当前用户的ID, 貌似各个分支的Linux有些不太一样(除了root)。
如果当前用户没权限使用 git 或者启动 docker-compose,那么大概率就是得有sudo权限的用户,在自己home目录下的 sudo 操作(= root = id 0)。 “grafana/grafana-oss:latest” 大概率就会有读写权限问题,你的默认docker-compose.yaml 不加 user: 参数是不行的,我已经试过了,若有误请纠正。 Run Grafana container using bind mounts
- 如果把时间范围拉低,比如 Last 3 hours, 应该就不会出现查不到的问题。这个问题我也遇到过,我也是第一次用 loki,看起来是时间范围长了会查到太多的数据,后面看看怎么修合适
vector 目前不支持 websocket 的 source,这次引入他也是想让他变成唯一的采集器,目前只做到了把写日志的流程搬到了 vector,未来看看怎么在不需要其他 go 代码的情况下直接支持 vector
看起来 vector 就是取代了 Promtail,,,Loki 在log存储取代了 InfluxDB
你虽提供了dashboard的sample,以 logs 为例,在Grafana v8.3.4 (a551d74b11) import后,打开dashboard,修改Data Source之后,如下图中 Log browser 中的查询语句会清除。。。
并且数据出来之后的展示方式,差异太大,Loki数据源的简直就是 raw data
Loki的数据查询方式,,,还要再学习才行,如下 Loki 如何修改为此前 influxDB的结构化查询,UI如何改,,,还要学。。。呜呜
{type="proxydial"} | json | host=~".*$host.*" and id=~"$request_id.*"
SELECT "address", "chain", "duration", "proxy", "id" as request_id FROM "ProxyDial" WHERE $timeFilter AND ("id" =~ //) AND ("host" =~ //) ORDER BY time DESC LIMIT 500
{type="dnsrequest"} | json | name=~".*$host.*" and id=~"$request_id.*"
SELECT "name", "qType", "duration", "answer", "id" as request_id, "dnsType" FROM "DNSRequest" WHERE ("id" =~ //) AND ("name" =~ //) AND $timeFilter ORDER BY time DESC LIMIT 500
{type="rulematch"} | json | (metadata_host=~".*$host.*" or metadata_dstip=~".*$host.*") and id=~"$request_id.*"
SELECT "host", *, "id" as request_id FROM "RuleMatch" WHERE ("id" =~ //) AND ("host" =~ //) AND $timeFilter ORDER BY time DESC LIMIT 500
第二点我在WSL2跑docker的时候也遇到了,目前我是直接往docker-compose.yml里直接添加 user: '0' 来解决权限问题的
想把手机clash 的数据传到远程grafana 上 怎么配置
loki 是支持直接push数据的,应该可以去掉vector https://github.com/sleleko/devops-kb/blob/master/python/push-to-loki.py
可以参照下我这边折腾的记录,真是酸爽 https://bjeager.blogspot.com/2022/05/how-to-set-up-clash-tracing-step-by-step.html