基于Clickhouse的轻量级日志管理平台ClickVisual 介绍及搭建

2,667 阅读4分钟

什么是ClickVisual

ClickVisual 是石墨文档开源的一个轻量级的开源日志查询、分析、报警的可视化平台,是目前是市面上唯一一款支持 ClickHouse 的类 Kibana 的业务日志查询平台。

为什么要用这个

由于大部分公司都把服务日志存储从ES转移到了Clickhouse从而解决存储代价太高等问题,但是迁移后需要面临可视化查询及分析这一问题,对于该问题我最开始的解决方案是使用Grafana来进行查询及指标分析,但是Grafana的模版来查看和检索日志非常的难受😣。

一些大公司是有自己的中间件团队或者基础架构团队来去自研解决,但是对于大部分公司来说这就是个大麻烦,所以ClickVisual很好的解决了大部分开发者的实际问题。

特性

  • 支持可视化的查询面板,可查询命中条数直方图和原始日志。
  • 支持设置日志索引功能,分析不同索引的占比情况。
  • 支持可视化的 VS Code 风格配置中心,能够便捷地将 logagent 配置同步到 Kubernetes 集群 ConfigMap 中。
  • 支持 GitHub 和 GitLab 授权登录。
  • 支持 Proxy Auth 功能,能被被非常轻松的集成到第三方系统。
  • 支持物理机、Docker、Kubernetes 部署。
  • 支持基于 ClicHouse 日志的实时报警功能

支持场景

  • 日志查询
  • 日志报警
  • 配置下发
  • 快速集成

技术架构

image.png

使用效果

日志查询

image.png

可视化配置

image.png

告警规则

image.png

历史告警

image.png

基于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

image.png

设置文件权限

chomd -R 777 ~/clickvisual

修改docker.toml文件中的mysql配置

image.png

我们发现他是依赖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,如下所示

image.png

这是因为docker.toml中的域名配置导致的

只需要编辑docker.toml文件,修改rootURL为你的公网IP/内网IP/域名后重新docker restart即可

image.png

最终访问成功 image.png

默认账号密码都为: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 = []