什么是ClickVisual
ClickVisual 是石墨文档开源的一个轻量级的开源日志查询、分析、报警的可视化平台,是目前是市面上唯一一款支持 ClickHouse 的类 Kibana 的业务日志查询平台。
为什么要用这个
由于大部分公司都把服务日志存储从ES转移到了Clickhouse从而解决存储代价太高等问题,但是迁移后需要面临可视化查询及分析这一问题,对于该问题我最开始的解决方案是使用Grafana来进行查询及指标分析,但是Grafana的模版来查看和检索日志非常的难受😣。
一些大公司是有自己的中间件团队或者基础架构团队来去自研解决,但是对于大部分公司来说这就是个大麻烦,所以ClickVisual很好的解决了大部分开发者的实际问题。
特性
- 支持可视化的查询面板,可查询命中条数直方图和原始日志。
- 支持设置日志索引功能,分析不同索引的占比情况。
- 支持可视化的 VS Code 风格配置中心,能够便捷地将 logagent 配置同步到 Kubernetes 集群 ConfigMap 中。
- 支持 GitHub 和 GitLab 授权登录。
- 支持 Proxy Auth 功能,能被被非常轻松的集成到第三方系统。
- 支持物理机、Docker、Kubernetes 部署。
- 支持基于 ClicHouse 日志的实时报警功能
支持场景
- 日志查询
- 日志报警
- 配置下发
- 快速集成
技术架构
使用效果
日志查询
可视化配置
告警规则
历史告警
基于Docker搭建
clickvisual Docker 镜像地址:hub.docker.com/r/sevennt/c…
配置
先创建挂载目录
mkdir ~/clickvisual && mkdir ~/clickvisual/config
将下面地址中config中的三个(docker.toml、rbac.conf、resource.yaml)配置文件先下载到刚刚创建的config目录中
https://github.com/clickvisual/clickvisual/tree/master/data/all-in-one/clickvisual/config
设置文件权限
chomd -R 777 ~/clickvisual
修改docker.toml文件中的mysql配置
我们发现他是依赖clickvisual这个库,那就去创建一下,命令如下
CREATE DATABASE clickvisual DEFAULT CHARSET utf8mb4;
USE clickvisual;
Docker启动
启动命令如下
docker run -d -p 19001:19001 --name clickvisual -e EGO_CONFIG_PATH=/clickvisual/config/docker.toml -e EGO_LOG_WRITER=stderr -v /root/clickvisual/config:/clickvisual/config sevennt/clickvisual:master
访问
访问地址:localhost:19001
注意:如果你是使用公网IP/内网IP/域名访问时,如175.10.17.1:19001你会发现访问不通,会自动跳转到localhost:19001,如下所示
这是因为docker.toml中的域名配置导致的
只需要编辑docker.toml文件,修改rootURL为你的公网IP/内网IP/域名后重新docker restart即可
最终访问成功
默认账号密码都为:clickvisual
docker.toml配置详解
[app]
# OAuth 签发 hashStatecode 所需的 secretKey
secretKey = "secretKey"
# 如果配置了 clickvisual 域名,需要将 rootURL 配置为 clickvisual 域名
rootURL = "https://dev.clickvisual.com/"
# 登录后默认访问的 URL
baseURL = "/api/admin/login/"
# 日志查询中需要隐藏的元数据字段
hiddenFields = ["_cluster_", "_log_agent_", "_node_ip_", "_node_name_", "_time_second_", "_time_nanosecond_", "_source_"]
# 日志查询中需要显示的元数据字段
defaultFields = ["_namespace_","_container_name_","_pod_name_","_time_second_"]
# 菜单配置文件,酌情调整菜单权限文件路径
permissionFile = "./config/resource.yaml"
# 限制最大查询时间跨度单位小时 0 或不填表示无限制
queryLimitHours = 24
[logger]
# 日志等级,可选 debug|info|warn|error|panic|fatal,建议测试环境选择 debug,生产环境选择 error
level = "debug"
# 日志输出 writer,可选 file|stderr
writer = "stderr"
# 如果 writer 是 file,dir 配置有效,表示输出日志文件目录
dir = "./logs"
# 如果 writer 是 file,name 配置有效,表示日志文件名
name = "default.log"
# clickvisual API Server 配置
[server.http]
# 启动的 HTTP API Server Host
host = "0.0.0.0"
# 启动的 HTTP API Server Port
port = 9001
# clickvisual governor Server 配置,governor 用户提供 metrics 采集、profling 调试、日志级别调整等。
[server.governor]
# 启动的 HTTP Governor Server Host
host = "0.0.0.0"
# 启动的 HTTP Governor Server Port
port = 9003
[mysql]
# 连接的最大存活时间,默认300s
connMaxLifetime = "300s"
# 是否开启 debug 模式,debug 模式下会打印 plain sql
debug = true
# MySQL 实例的 DSN 连接串
dsn = "root:root@tcp(127.0.0.1:3306)/clickvisual?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&loc=Local&readTimeout=1s&timeout=1s&writeTimeout=3s"
# 日志级别
level = "error"
# 最大空闲连接数
maxIdleConns = 5
# 最大活动连接数
maxOpenConns = 50
[auth]
# 使用 redis 存储用户 session
mode = "redis"
# 组件名,默认 clickvisual-session
name = "clickvisual-session"
keypairs = "secret"
redisSize = 10
redisNetwork = "tcp"
# redis 实例地址,默认使用 127.0.0.1:6379,你可以修改为自己的 redis 地址
redisAddr = "127.0.0.1:6379"
# redis 实例密码,默认为空
redisPassword = "
# 匿名访问配置
[auth.anonymous]
# 是否允许匿名访问
enabled = false
# auth 代理配置
[auth.proxy]
# 是否允许开启代理模式
enabled = true
# 代理模式下默认使用 'X-clickvisual-USER' 读取 username
headerName = "X-clickvisual-USER"
# 第三方登录配置
[[auth.tps]]
# 第三方登录类型,此处设置为 'github'
typ = "github"
# 是否启用
enable = true
# 是否静默注册
allowSignUp = true
# 应用 Client ID
clientId = ""
# 应用 Client Secret
clientSecret = ""
# 授权范围
scopes = ["user:email", "read:org"]
# 第三方授权地址
authUrl = "https://github.com/login/oauth/authorize"
# 第三方获取 access_token 地址
tokenUrl = "https://github.com/login/oauth/access_token"
# 第三方 api 地址
apiUrl = "https://api.github.com/user"
allowedDomains = []
teamIds = []
allowedOrganizations = []
# 第三方登录配置
[[auth.tps]]
typ = "gitlab"
enable = true
allowSignUp = true
clientId = ""
clientSecret = ""
scopes = ["api"]
authUrl = "https://mygitlab.com/oauth/authorize"
tokenUrl = "https://mygitlab.com/oauth/token"
apiUrl = "https://mygitlab.com/api/v4"
allowedDomains = []
teamIds = []
allowedOrganizations = []