# Clickvisual Agent 用法
ClickVisual 提供了LogAgent接口,用于直接查询K8S Node节点中的日志数据
# 代码逻辑简述
- 启动方式:
clickvisual agent(对应api/cmd/agent/agent.go),会按server.http配置起一个仅包含/api/v1/search与/api/v1/charts的 HTTP 服务(见router.GetAgentRouter)。 - 节点侧处理:
api/internal/api/agent/agent.go将查询参数绑定为search.Request,并调用api/internal/pkg/agent/search完成日志扫描/聚合。 - 平台侧访问:在 ClickVisual 主服务里把数据源类型设置为
Agent,InstanceManager通过NewFactoryAgent(dsn)解析 DSN(JSON 数组形式的 Agent 地址),并使用resty逐个调用各 Agent 的/api/v1/search、/api/v1/charts聚合结果(api/internal/service/inquiry/agent/agent.go)。
# Clickvisual Agent 接口查询日志流程
- 提供一个Search接口
- 根据Search参数获得需要查询的数据
- 根据namespace,container,获取到要查container的日志目录
- 根据日志条件,扫描日志内容
- 返回数据
# 配置与地址填写(解答 #1134)
- Agent 服务监听端口
- 在 Agent 节点的
server.http.port指定监听端口,避免与主服务的 19001 冲突,常用示例:19002。 - 启动命令示例:
./clickvisual agent --config=/data/config/dev.toml
- 在 Agent 节点的
- 在 ClickVisual 主服务中添加 “数据源 - Agent” 时,
DSN填写 Agent 地址数组(JSON 字符串),每项为host:port或http://host:port,可同时填多个 Agent,平台会并发聚合。- 单实例示例:
["agent-svc.default.svc.cluster.local:19002"] - 多实例示例:
["10.0.0.12:19002","10.0.0.13:19002"] - 要求:主服务能直连这些地址(可用 NodePort、LB 或内网 IP);路径固定为
/api/v1/search、/api/v1/charts,不需要额外前缀。
- 单实例示例:
- 前端查询参数会被透传到 Agent,包括:
startTime/endTime、limit、isK8s、container(逗号分隔)、dir(非 K8s 时指定日志目录)、keyWord(关键词);charts请求会额外带interval、isChartRequest=1。
# 常见问题
- “server 界面 Agent 地址怎么填?” → 在实例新增页的 DSN 里填 JSON 数组形式的 Agent 基础地址,格式如上所示,需确保主服务能访问这些地址。
- 端口冲突 → 将 Agent 的
server.http.port改为非 19001,例如 19002,并在 DSN 中使用该端口。 - 无法返回数据 → 检查 DSN 是否为合法 JSON、网络可达性、Agent 日志是否有报错。
# Clickvisual Agent 部署方式
使用Daemonset部署到K8S Node节点上
# Containerd 权限
需要挂载3个目录,待确认,估计目前只需要containerd权限
- /var/run 读权限
- /var/log 读权限
- /var/lib/containerd 读权限
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
name: clickvisual-agent
name: clickvisual-agent
namespace: default
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: clickvisual-agent
spec:
affinity: {}
containers:
- command:
- /bin/sh
- '-c'
- /clickvisual/bin/clickvisual agent
env:
- name: EGO_LOG_WRITER
value: stderr
- name: EGO_CONFIG_PATH
value: /data/config/dev.toml
image: xxxx/clickvisual:84674b6
imagePullPolicy: Always
name: clickvisual-agent
resources:
limits:
cpu: '1'
memory: 1Gi
requests:
cpu: 100m
memory: 128Mi
volumeMounts:
- mountPath: /var/run
name: run
readOnly: true
- mountPath: /var/log
name: log
readOnly: true
- mountPath: /var/lib/containerd
name: containerd-log
readOnly: true
- mountPath: /data/config
name: config-volume-clickvisual
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true
imagePullSecrets:
- name: ee
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: xx
serviceAccountName: xx
terminationGracePeriodSeconds: 30
tolerations:
- operator: Exists
volumes:
- hostPath:
path: /var/run
type: Directory
name: run
- hostPath:
path: /var/log
type: Directory
name: log
- hostPath:
path: /var/lib/containerd
type: Directory
name: containerd-log
- name: config-volume-clickvisual
projected:
defaultMode: 420
sources:
- configMap:
name: clickvisual
updateStrategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# Get Query参数
- startTime: 开始时间
- endTime: 结束时间
- data: 查询时间: last 6h, yesterday, today
- limit: 查询条数
- namespace: 查询哪个命令空间
- isK8s: 是否k8s,0或1
- container: k8s状态下要查的容器名,数组
- timestampKey: 时间字段名称,默认ts
- timestampFormat: 时间格式,默认unix时间戳
# 使用命令行工具
# 使用命令行查询
./bin/clickvisual command --config=config/dev.toml --k8s=true --key="lv=error" --container=svc-auth
# 使用命令行上传某个服务器上的文本
./bin/clickvisual upload --config=config/dev.toml --pathName="/var/log/pods/xxxx/logtail/9.log"
1
2
3
4
2
3
4