尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Helicone ClickHouse 迁移实战:用 ch_hcone.py 管理 schema 演进与角色授权

Helicone ClickHouse 迁移实战:用 ch_hcone.py 管理 schema 演进与角色授权 Helicone ClickHouse 迁移实战用 ch_hcone.py 管理 schema 演进与角色授权【免费下载链接】helicone Open source LLM observability platform. One line of code to monitor, evaluate, and experiment. YC W23 项目地址: https://gitcode.com/GitHub_Trending/he/helicone本篇技术指南围绕 Helicone 开源 LLM 可观测性平台中的 ClickHouse 数据层展开核心讲解仓库 clickhouse/ 目录下迁移体系的组织方式、命令行工具ch_hcone.py的完整能力迁移应用、状态追踪、角色种子、Docker 服务启停以及从零执行迁移、查看表结构的实操步骤。读完本文你将掌握 Helicone 在 ClickHouse 上维护 schema 版本的标准工作流并理解其以helicone_migrations表追踪已应用迁移的设计原理。clickhouse 目录整体结构Helicone 使用 ClickHouse 作为请求日志、缓存指标、会话等核心分析数据的存储引擎。仓库中与该数据库相关的一切都集中在 clickhouse/ 目录下主要包含路径作用clickhouse/migrations/全部 ClickHouse schema 变更的 SQL 迁移文件按schema_#.sql顺序编号clickhouse/ch_hcone.py管理 Helicone ClickHouse schema 与角色的 CLI 工具通过 HTTP 接口执行 SQLclickhouse/seeds/角色创建与授权种子 SQL--seed-roles使用clickhouse/ch_local_hcone.sh、clickhouse/manage_databases.sh本地/数据库管理的辅助脚本clickhouse/requirements.txtPython 依赖tabulate、yarlclickhouse/backfill_clickhouse.py、clickhouse/backfill_postgres.py数据回填脚本migrations/顺序编号的 schema 变更体系命名与排序规范migrations/目录存放 ClickHouse schema 变更的 SQL 迁移文件命名规则为schema_#.sql#是连续递增的序号。工具通过正则schema_(\d)提取编号并按数值排序执行见 ch_hcone.py 中的schema_sort_key从schema_0.sql一路演进到当前仓库中的schema_79_property_value_index.sql。这种纯顺序编号的设计保证每个迁移文件只在一次升级批次中执行一次编号即全局顺序任何环境本地 Docker、生产、EU 集群的 schema 都能收敛到同一状态。迁移文件的演进示例早期的迁移定义了最基础的表。例如 schema_0.sql 创建请求-响应对照表response_copy_v1使用 MergeTree 引擎、PRIMARY KEY (request_id)CREATE TABLE IF NOT EXISTS default.response_copy_v1 ( response_id Nullable(UUID), response_created_at Nullable(DateTime64), latency Nullable(Int64), status Nullable(Int64), completion_tokens Nullable(Int64), prompt_tokens Nullable(Int64), model Nullable(String), request_id UUID, request_created_at DateTime64, auth_hash String, user_id Nullable(String), ) ENGINE MergeTree PRIMARY KEY (request_id) ORDER BY (request_id, request_created_at);随着版本演进迁移文件逐步引入更复杂的设计。例如 schema_41_request_response_replacing_merge_tree.sql 创建当前核心表default.request_response_rmt使用ReplacingMergeTree(updated_at)支持按更新时间去重覆盖按月分区PARTITION BY toYYYYMM(request_created_at)对 properties/scores 的 key 与 value 建 bloom_filter 索引对请求/响应体建ngrambf_v1索引并对 body 设置 3 个月的 TTL 自动过期CREATE TABLE default.request_response_rmt ( response_id Nullable(UUID), response_created_at Nullable(DateTime64(3)), latency Nullable(Int64), status Int64, completion_tokens Nullable(Int64), prompt_tokens Nullable(Int64), model LowCardinality(String) CODEC(ZSTD(1)), request_id UUID, request_created_at DateTime64(3), user_id LowCardinality(String) CODEC(ZSTD(1)), organization_id UUID, proxy_key_id Nullable(UUID), threat Nullable(Bool), time_to_first_token Nullable(Int64), provider LowCardinality(String) CODEC(ZSTD(1)), target_url Nullable(String), country_code Nullable(String), properties Map(LowCardinality(String), String) CODEC(ZSTD(1)), scores Map(LowCardinality(String), Int64) CODEC(ZSTD(1)), request_body String DEFAULT TTL toDateTime(request_created_at) toIntervalMonth(3), response_body String DEFAULT TTL toDateTime(request_created_at) toIntervalMonth(3), assets Array(String) CODEC(ZSTD(1)), updated_at DateTime64(3, UTC) DEFAULT now(), INDEX idx_properties_key mapKeys(properties) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_properties_value mapValues(properties) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_scores_key mapKeys(scores) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_scores_value mapValues(scores) TYPE bloom_filter(0.01) GRANULARITY 1, INDEX idx_request_body_bloom request_body TYPE ngrambf_v1(4, 1024, 1, 0) GRANULARITY 1, INDEX idx_response_body_bloom response_body TYPE ngrambf_v1(4, 1024, 1, 0) GRANULARITY 1 ) ENGINE ReplacingMergeTree(updated_at) PARTITION BY toYYYYMM(request_created_at) PRIMARY KEY (organization_id, provider, model, user_id, request_created_at, request_id) ORDER BY (organization_id, provider, model, user_id, request_created_at, request_id);从目录中的 80 个迁移文件schema_0.sql至schema_79_property_value_index.sql可以看出 Helicone 分析层的演进脉络基础响应/属性表 → 版本化 MergeTree → 替换型 MergeTreermt→ 缓存命中指标schema_47~schema_48→ 会话表与物化视图schema_49~schema_55→ 组织属性schema_56~schema_58→ PTB 计费支出schema_67~schema_72→ 推理 token、统计页物化视图、属性值索引schema_77~schema_79等每一步都以独立迁移文件沉淀。ch_hcone.pyClickHouse schema 与角色管理 CLIclickhouse/ch_hcone.py 是 Helicone 用于管理 ClickHouse schema 与角色的命令行工具其核心设计是不依赖 ClickHouse 客户端二进制而是通过curl 访问 ClickHouse HTTP 接口--data-binary -方式提交 SQL因此对运行环境要求极低。连接与认证参数工具支持多种方式指定目标 ClickHouse 服务优先级与默认值如下参数说明默认值/来源--urlClickHouse 服务完整地址如http://localhost:18123若设置了CLICKHOUSE_HOST且为合法 URL则取其 host 与 port--host/--port与--url二选一host 自动补全http://前缀CLICKHOUSE_HOST/CLICKHOUSE_PORT否则localhost/18123--userClickHouse 用户CLICKHOUSE_USER否则default--password显式传入密码CLICKHOUSE_PASSWORD--no-password不提示输入密码无密码场景关闭--test测试模式改用测试容器名与端口关闭认证逻辑见 ch_hcone.py密码优先级为--passwordCLICKHOUSE_PASSWORD环境变量 交互式getpass提示只有显式传入--no-password时才跳过密码提示。环境变量CLICKHOUSE_HOST、CLICKHOUSE_PORT、CLICKHOUSE_USER、CLICKHOUSE_PASSWORD均可作为无参配置方式。迁移执行原理helicone_migrations 状态表整个迁移体系的核心是 ClickHouse 内的helicone_migrations状态表在 ch_hcone.py 中由create_migration_table创建CREATE TABLE IF NOT EXISTS helicone_migrations ( migration_name String, applied_date DateTime DEFAULT now() ) ENGINE MergeTree() ORDER BY migration_name;迁移流程run_migrations见 ch_hcone.py为一次性查询system.tables判断状态表是否存在再全量拉取helicone_migrations中的已应用迁移集合用于 O(1) 去重判断遍历migrations/下按编号排序的迁移文件筛出未应用的文件形成待执行清单并打印预览除非指定--skip-confirmation否则交互式询问是否应用逐文件执行成功后通过INSERT INTO helicone_migrations (migration_name) VALUES (...)记录失败时支持交互式重试retries2与是否继续剩余迁移的选择结束时输出迁移汇总成功/失败数量、失败文件列表。针对单个文件包含多条 SQL 的情况split_sql_statementsch_hcone.py会按分号切分语句、剔除注释行并对多语句文件逐条执行、定位失败的具体语句序号同时通过检测响应中的DB::Exception/Error关键字捕获 ClickHouse 侧错误run_curl_command连接失败或语法错误都会给出带 URL、命令与响应内容的诊断信息。常用命令一览命令作用python3 clickhouse/ch_hcone.py --upgrade --skip-confirmation --no-password应用所有待执行迁移无交互python3 clickhouse/ch_hcone.py --start --no-password启动本地 ClickHouse Docker 容器并自动建表、迁移python3 clickhouse/ch_hcone.py --stop停止并删除本地容器helicone-clickhouse-serverpython3 clickhouse/ch_hcone.py --restart --no-password重启容器并重新迁移python3 clickhouse/ch_hcone.py --list-migrations --no-password以表格列出已应用迁移按 schema 编号排序python3 clickhouse/ch_hcone.py --seed-roles --no-password仅执行 seeds 目录中的角色创建与授权 SQLpython3 clickhouse/ch_hcone.py --test ...测试模式容器名/端口切换--list-migrations使用tabulate输出网格表格列为Migration Name与Applied Date并按 schema 编号而非字典序排序list_migrations。Docker 服务控制--start/--restart会执行ch_hcone.pydocker run -d -p {--port}:8123 -p 19000:9000 --name helicone-clickhouse-server \ --ulimit nofile262144:262144 clickhouse/clickhouse-server:24.10镜像固定为clickhouse/clickhouse-server:24.10容器名默认为helicone-clickhouse-server--test模式下切换为helicone-clickhouse-server-test原生 TCP 端口9000默认映射为19000测试模式为19001HTTP 端口8123映射为--port指定的值启动后会自动创建helicone_migrations表并执行迁移最后打印一条可直接运行的验证命令echo SELECT 1 | curl http://localhost:18123/ --data-binary -种子 SQL角色与授权的分层设计--seed-roles会依次执行 clickhouse/seeds/ 目录下的 4 个 SQL 文件构建一套只读角色 → 用户授权的最小权限模型种子文件SQL 内容作用create_hql_user.sqlCREATE USER IF NOT EXISTS hql_user NOT IDENTIFIED;创建 HQL 查询用户生产环境密码另行设置create_read_only_role.sqlCREATE ROLE IF NOT EXISTS read_only_to_request_response_rmt;创建只读角色grant_read_role_to_ror.sqlGRANT SELECT ON default.request_response_rmt TO read_only_to_request_response_rmt;授予该角色对核心表request_response_rmt的 SELECT 权限grant_rorr_to_hql_user.sqlGRANT read_only_to_request_response_rmt TO hql_user;把只读角色授予hql_user该链路与 schema_62_hql_row_policies.sql、schema_64_hql_revoke_all_except_rmt.sql 等迁移配合体现了 Helicone 通过 ClickHouse 原生 RBAC角色/授权来隔离 HQL 查询读写权限的做法。完整上手从零运行迁移按 clickhouse/README.md 的步骤在本地从零执行全部迁移python3 -m venv venv source venv/bin/activate # 若使用 fish改为 source venv/bin/activate.fish python3 -m pip install tabulate yarl python3 clickhouse/ch_hcone.py --upgrade --skip-confirmation --no-password要点说明依赖仅两个 Python 包tabulate--list-migrations表格输出与yarlURL 解析--upgrade会先确保helicone_migrations表存在再应用全部待执行迁移--skip-confirmation跳过交互确认适合 CI/CD 等无人值守场景--no-password用于无密码的本地default用户避免卡在密码提示若已通过 Docker 启动过容器可直接使用--start一步完成启动 建表 迁移。查看表结构迁移完成后可通过 ClickHouse 自带的 Play Web 界面浏览表。前提是本地 ClickHouse 容器通过 docker 启动处于运行状态然后在浏览器打开对应端口号的play界面默认地址为http://localhost:8123/play若使用ch_hcone.py --start且指定了其他--port则访问http://localhost:{--port}/play在查询区执行SHOW TABLES查看全部表可进一步执行DESCRIBE TABLE default.request_response_rmt或SELECT count(*) FROM default.request_response_rmt验证迁移结果。小结Helicone 的 ClickHouse 迁移体系由 clickhouse/migrations/ 的顺序编号 SQL 与 clickhouse/ch_hcone.py 的 HTTP 驱动执行器构成helicone_migrationsMergeTree表记录已应用状态保证幂等--upgrade/--start/--list-migrations/--seed-roles覆盖了 schema 演进、本地环境编排、状态审计与角色授权的完整生命周期。对于任何需要维护 ClickHouse schema 版本的开发者这套纯 curl 状态表 交互确认/无人值守双模式的方案都值得直接参考复用。【免费下载链接】helicone Open source LLM observability platform. One line of code to monitor, evaluate, and experiment. YC W23 项目地址: https://gitcode.com/GitHub_Trending/he/helicone创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表