clash-tracing icon indicating copy to clipboard operation
clash-tracing copied to clipboard

基于Vector/Loki的最新版有关问题

Open MaurUppi opened this issue 2 years ago • 6 comments

作为半桶水用户,有几个问题希望交流一下。

  1. 这个tracing的配置指导真的不是吃瓜用户 friendly
  • 当前所有配置及操作, 默认考虑的Linux用户是root用户进行操作,且该Host中没有任何container的情况,例如Grafana、Portainer。
  • 因为Vector的默认端口,或者是vector.toml配置文件中端口配置就是9000,这个与Portainer默认端口冲突。
  1. 目录访问权限问题
  • Loki与Grafana的container内部启动用户ID,绝大概率与Host bind 目录的用户ID不一致,因此没有会造成无法写入。
  • 所以,要么得通过id -u的结果,作为对应container的启动用户。
  1. 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 }}"

MaurUppi avatar Feb 13 '22 06:02 MaurUppi

  1. 看了一下你后面的描述,都有一个其他自部署的 grafana 了,已经不能算一个所谓的「吃瓜用户」。 原始的 docker-compose 只需要暴露一个 grafana 的端口,不需要使用者关心其他的问题。 端口冲突问题我不是很理解,docker compose 会为每个不同的 config 创建一个独立的 network,与其他的容器隔离开,不应该存在什么冲突的问题。
  2. 项目内并不存在 grafana 和 loki 的持久化目录,我的理解是 docker compose 会在运行时根据当前的用户的权限进行创建,理论上不应该出现写目录权限的问题
  3. 如果把时间范围拉低,比如 Last 3 hours, 应该就不会出现查不到的问题。这个问题我也遇到过,我也是第一次用 loki,看起来是时间范围长了会查到太多的数据,后面看看怎么修合适

vector 目前不支持 websocket 的 source,这次引入他也是想让他变成唯一的采集器,目前只做到了把写日志的流程搬到了 vector,未来看看怎么在不需要其他 go 代码的情况下直接支持 vector

Dreamacro avatar Feb 13 '22 10:02 Dreamacro

  1. 看了一下你后面的描述,都有一个其他自部署的 grafana 了,已经不能算一个所谓的「吃瓜用户」。

呵呵,真的只能是用户,只是玩的相对久点的用户而已。

原始的 docker-compose 只需要暴露一个 grafana 的端口,不需要使用者关心其他的问题。

对,这就是为啥我说 “默认考虑的Linux用户是root用户进行操作,且该Host中没有任何container的情况,例如Grafana、Portainer。”

端口冲突问题我不是很理解,docker compose 会为每个不同的 config 创建一个独立的 network,与其他的容器隔离开,不应该存在什么冲突的问题。

呃,,,这里我的描述的确不准确,当然,只要不是在Host暴露出来,且建立的是另外一个独立network的情况下,的确不冲突。 但是也是由于另外一个Network,导致现有的Grafana访问起来不好操作。。。

Again,如果是存粹为Clash tracing为目的的一套采集、处理、UI展示,的确没有毛病。

  1. 项目内并不存在 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

  1. 如果把时间范围拉低,比如 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 中的查询语句会清除。。。

image

并且数据出来之后的展示方式,差异太大,Loki数据源的简直就是 raw data

image

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

MaurUppi avatar Feb 13 '22 11:02 MaurUppi

第二点我在WSL2跑docker的时候也遇到了,目前我是直接往docker-compose.yml里直接添加 user: '0' 来解决权限问题的

lifegpc avatar Mar 30 '22 02:03 lifegpc

想把手机clash 的数据传到远程grafana 上 怎么配置

debiansid avatar May 05 '22 16:05 debiansid

loki 是支持直接push数据的,应该可以去掉vector https://github.com/sleleko/devops-kb/blob/master/python/push-to-loki.py

vsxen avatar May 07 '22 04:05 vsxen

可以参照下我这边折腾的记录,真是酸爽 https://bjeager.blogspot.com/2022/05/how-to-set-up-clash-tracing-step-by-step.html

bigjeager avatar May 30 '22 08:05 bigjeager