k6 + InfluxDB v1 + Grafana 压测结果可视化:Docker Compose 一键部署实战
k6 InfluxDB v1 Grafana 压测结果可视化Docker Compose 一键部署实战【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6本文基于 k6 仓库中 examples/docker-compose/influxdb-v1/README.md 展开介绍如何用 Docker Compose 一键拉起 InfluxDB v1 与 Grafana将 k6 压测结果实时写入时序数据库并在 Grafana 面板中查看。读完后你可以复现这套完整的压测—存储—可视化链路并深入理解 k6 内置influxdb输出插件的地址解析、批量写入与参数默认值掌握--out influxdb...背后各参数的含义与调优方式。示例的整体架构这套示例由三部分构成数据流为单向链路k6 测试进程宿主机运行执行 script.js 压测脚本通过--out influxdbhttp://localhost:8086/k6将指标批量写入 InfluxDB v1 的k6数据库InfluxDB v1容器监听 8086 端口通过环境变量INFLUXDB_DBk6预建好k6数据库免去手动建库Grafana容器通过自动配置provisioning挂载 InfluxDB 数据源和 k6 performance test 仪表盘匿名 Admin 访问打开浏览器即可看到实时图表。k6 内置输出插件与 InfluxDB v1 官方客户端对接。从源码注释看internal/output/influxdb/output.go 第 1-3 行该插件定位是将结果直接发送到 InfluxDB v1面向 InfluxDB v2 的场景需要另行使用社区扩展插件在内置输出注册表中以influxdb名称注册internal/cmd/outputs.go。前置条件与一键启动前置条件DockerDocker Compose启动命令在 examples/docker-compose/influxdb-v1/ 目录下执行docker-compose up -ddocker-compose.yml 配置详解完整文件见 docker-compose.yml关键点如下version: 3.4 networks: grafana: # 两个服务共用一个内部网络 services: influxdb: image: influxdb:1.12sha256:35e9976120... # 固定到具体镜像摘要保证可复现 networks: [grafana] ports: - 8086:8086 # 暴露到宿主机供 k6 进程写入 environment: - INFLUXDB_DBk6 # 启动时自动创建 k6 数据库 grafana: image: grafana/grafana:9.5.21sha256:ec106c7d... networks: [grafana] ports: - 3000:3000 # 仪表盘访问入口 environment: - GF_AUTH_ANONYMOUS_ORG_ROLEAdmin # 匿名用户直接赋予 Admin 角色 - GF_AUTH_ANONYMOUS_ENABLEDtrue # 开启匿名访问 - GF_AUTH_BASIC_ENABLEDfalse # 关闭 Basic Auth volumes: - ./grafana:/etc/grafana/provisioning/ # 挂载配置目录实现数据源/仪表盘自动装配值得注意的三个细节镜像摘要固定两个镜像都追加了sha256:...摘要锁定不可变的构建版本避免 tag 漂移导致示例失效匿名访问只用于演示GF_AUTH_ANONYMOUS_ENABLEDtrueAdmin角色意味着本机局域网内任何能访问 3000 端口的人都是管理员这只适合本地演示环境生产部署切勿照搬卷挂载路径./grafana挂到/etc/grafana/provisioning/Grafana 启动时会自动读取其中的datasources/与dashboards/子目录完成装配。Grafana 自动配置Provisioning示例把数据源和仪表盘定义放在 grafana/ 目录下随容器启动自动生效无需在界面上手工添加。数据源定义datasource.ymlapiVersion: 1 datasources: - name: myinfluxdb type: influxdb # 使用 InfluxDB v1 数据源类型 access: proxy # 由 Grafana 服务端代理访问后端 database: k6 # 与 compose 中 INFLUXDB_DBk6 对应 orgId: 1 url: http://influxdb:8086 # 服务名解析同一 docker 网络内直接按服务名访问 isDefault: true # 设为默认数据源access: proxy表示查询请求经过 Grafana 服务端转发到http://influxdb:8086因此前端浏览器不需要能直连 InfluxDB 容器。仪表盘定义dashboard.yml 声明了一个file类型的 provider指向/etc/grafana/provisioning/dashboards即加载同目录下的 JSON 仪表盘文件 performance-test-dasboard.json。该文件定义了标题为 k6 performance test 的仪表盘schemaVersion 25uid 为Le2Ku9NMk包含http-req duration、vus等面板正是后续 README 中访问地址里/d/Le2Ku9NMk/...的来源。访问仪表盘启动成功后在浏览器打开http://localhost:3000/d/Le2Ku9NMk/k6-performance-test其中Le2Ku9NMk与仪表盘 JSON 中的uid: Le2Ku9NMk一一对应见 performance-test-dasboard.json 第 299 行。k6 测试脚本与运行命令压测脚本script.js 是一个极简脚本每次迭代请求 Grafana 的示例站点并做两项断言import http from k6/http; import { check } from k6; export default function () { check(http.get(https://quickpizza.grafana.com), { status is 200: (r) r.status 200, protocol is HTTP/2: (r) r.proto HTTP/2.0, }); }check的结果会生成checks指标http.get会生成http_reqs、http_req_duration等指标这些指标连同vu、iter等标签一起被批量写入 InfluxDB正是 Grafana 面板上曲线的数据来源。运行 k6 测试测试将执行20 次迭代使用5 个虚拟用户k6 -i 20 --vus 5 --out influxdbhttp://localhost:8086/k6 run script.js参数解读参数含义-i 20--iterations简写总迭代次数 20--vus 5虚拟用户数 5--out influxdbhttp://localhost:8086/k6启用内置 InfluxDB 输出URL 指向本机映射的 8086 端口路径末段/k6被解析为数据库名run script.js以run子命令方式执行脚本URL 中路径末段即数据库名这一行为并非约定俗成而是插件实现的明确规则internal/output/influxdb/config.go 中的ParseURL调用splitPathPrefixAndDB将 URL 路径拆分为反向代理前缀 数据库名因此http://localhost:8086/k6最终写入k6库——这与 compose 中INFLUXDB_DBk6预建的库精确匹配。深入k6 InfluxDB 输出插件的配置模型--out influxdb...后面的 URL 只是配置入口之一。从 internal/output/influxdb/config.go 的GetConsolidatedConfig看最终配置按默认值 JSON 配置 环境变量 URL 参数的优先级逐层合并这意味着你既可以只传一个 URL也可以用K6_INFLUXDB_*环境变量或 JSON 精细控制。参数与默认值速查表以下字段来自 config.go 中Config结构体与NewConfig函数参数JSON 字段环境变量默认值说明addrK6_INFLUXDB_ADDRhttp://localhost:8086服务地址也支持udp://直写见下文dbK6_INFLUXDB_DBk6目标数据库username/passwordK6_INFLUXDB_USERNAME/K6_INFLUXDB_PASSWORD—认证信息也可写在 URL 中insecureK6_INFLUXDB_INSECURE—跳过 TLS 证书校验proxyK6_INFLUXDB_PROXY—HTTP 代理地址payloadSizeK6_INFLUXDB_PAYLOAD_SIZE—UDP 模式下每包负载大小pushIntervalK6_INFLUXDB_PUSH_INTERVAL1s批量写入的刷新间隔concurrentWritesK6_INFLUXDB_CONCURRENT_WRITES4并发写协程数必须为正数precisionK6_INFLUXDB_PRECISION—时间戳精度retentionK6_INFLUXDB_RETENTION—保留策略consistencyK6_INFLUXDB_CONSISTENCY—写一致性tagsAsFieldsK6_INFLUXDB_TAGS_AS_FIELDSvu、iter、url将高基数标签降级为字段避免 InfluxDB 序列爆炸其中concurrentWrites默认值4在 config.go 第 45-53 行的注释里解释得很清楚按默认 1 秒推送间隔估算4 个并发写足以应对突发尖峰若响应时间持续超过推送间隔说明环境或脚本不可持续应调整脚本或配置而非盲目加大并发。URL 查询参数ParseURL还支持在 URL 上直接携带查询参数例如--out influxdbhttp://localhost:8086/k6?pushInterval2sconcurrentWrites8tagsAsFieldsvu:fieldinsecuretrue受支持的查询键包括insecure、payload_size、precision、retention、consistency、pushInterval、concurrentWrites、tagsAsFields可重复出现出现未知查询键会直接报错unknown query parameter拼写错误不会静默忽略。标签转字段与写入路径两个实现细节直接决定了示例中面板的数据质量高基数标签治理默认TagsAsFields: [vu, iter, url]。vu、iter这类每次迭代都在变化的标签如果作为 InfluxDB tag 存储会导致时序series数量爆炸插件默认将它们按 string 字段存储在 util.go 的MakeFieldKinds中还可写tag:type形式显式指定int/float/bool/string类型双传输模式util.go 的MakeClient中若地址以udp://开头则创建 UDP 客户端配合payloadSize否则创建 HTTP 客户端并以UserAgent: k6发送批量写请求。示例使用的http://localhost:8086走的是 HTTP 批量写路径。常见问题与适用边界版本适用范围示例固定 InfluxDB1.12与 Grafana9.5.21针对 InfluxDBv1的 HTTP 写入 API--out influxdb仅对应 v1InfluxDB v2 需使用 k6 社区扩展仓库中 output.go 头部注释即提示了这一点端口冲突本机 3000/8086 被占用时修改 compose 中宿主机侧端口映射并同步调整--out的 URL 与浏览器访问地址数据库名一致性INFLUXDB_DBk6、Grafana 数据源的database: k6、--out influxdbhttp://localhost:8086/k6三处必须一致任一不匹配都会导致面板无数据此时 k6 侧通常会有写入失败的日志演示环境的认证配置匿名 Admin 仅用于本地演示对外暴露前务必启用认证并移除匿名访问。小结这份示例以最少的文件组合一个 compose 文件、一个脚本、两份 provisioning 配置、一份仪表盘 JSON打通了 k6 压测结果进入 InfluxDB v1 并被 Grafana 实时可视化的完整链路。复现只需三条命令docker-compose up -d起服务、打开http://localhost:3000/d/Le2Ku9NMk/k6-performance-test看面板、k6 -i 20 --vus 5 --out influxdbhttp://localhost:8086/k6 run script.js注入数据而--out influxdbURL 的解析规则、K6_INFLUXDB_*环境变量、推送间隔与并发写默认值等细节都能从 internal/output/influxdb/ 源码中逐条对应验证是理解 k6 输出插件配置模型的一个很好的切入点。【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考