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

资讯详情

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

Grafana对接Easysearch搭建数据可视化大屏全流程实战

Grafana对接Easysearch搭建数据可视化大屏全流程实战 做运维和数据的同学应该都有这种感觉日志和指标都堆在那边业务方天天问“现在系统到底什么状态”“订单量涨了还是跌了”你光靠命令行敲几个curl看结果解释半天也讲不清楚。后面我把内部日志和业务索引统一收到 Easysearch 里再用 Grafana 把数据画成大屏问题一下就解决了投到办公室电视上谁路过都能看懂。这篇就聊聊我实际把 Grafana 对接 Easysearch、再从零搭出一块可视化大屏的完整过程。覆盖数据源接入、索引与时间字段设置、常用图表的查询写法、大屏布局与自动刷新最后把常见报错和排坑经验一起整理出来。如果你也想给公司做一个“数据可视化大屏”或者只是想把 Easysearch 里的数据用更直观的方式展示出来这篇可以直接照着抄。1. 项目思路与方案选型1.1 为什么是 Grafana 配 Easysearch先说说选型。Easysearch 是国内团队维护的开源分布式搜索引擎兼容 Elasticsearch 的 7.10 API也就是说你原来跑在 ES 上的代码、索引、查询语法切换过去基本不用改。我当时选它是因为它对中文分词和国产化环境支持更友好部署也轻量一个 Java 服务就起来了。那可视化端为什么用 Grafana最直接的原因就是它不需要像 Kibana 那样“绑定”某一套搜索引擎。Grafana 本身是一个数据可视化平台支持几十种数据源Prometheus、MySQL、ClickHouse、Elasticsearch、Easysearch 这类 ES 兼容 API 的引擎也能直接接。这样以后就算底层换存储大屏和告警规则可以复用不会被一家技术栈锁死。另外 Grafana 做大屏确实方便。面板类型丰富、布局自由、支持模板变量还可以通过 URL 参数一键进入 kiosk 全屏模式刷新频率能调到秒级。这些特性特别适合做业务监控大屏、日志实时监控屏甚至数据运营展示屏。1.2 接入路径对比原生数据源还是中间网关Easysearch 这套系统接 Grafana主流有三条路我挨个试过给你对比下方案实现方式优点缺点Grafana Elasticsearch 数据源直连在 Grafana 里添加 ES 数据源URL 指向 Easysearch 的 HTTP 端口零额外组件配置简单查询语法通用不支持 ES SQL必须用 Lucene 和 DSL 聚合通过代理或网关转换用 INFINI Console 或自研网关把查询请求转成 Easysearch 能识别的格式可以实现更复杂的权限控制和查询改写多一层组件维护成本高导入外部 Dashboard JSON直接复用社区做好的 ES Dashboard 模板速度快图表演示效果直接容易出现数据源版本或字段不匹配需要二次修改我的建议是如果你只是想做可视化展示第一套方案就够了。ES 数据源对 Easysearch 的兼容性做得很好我用的版本是 Grafana 10.x数据源版本选 7.10实测查询、聚合、日志面板都没问题。只有当你需要把多个 Easysearch 集群统一到一个大屏、或者要做字段级权限隔离的时候才值得考虑引入网关。1.3 整体链路与前置准备整套系统的链路是这样的Easysearch 集群负责存储日志、业务指标和订单数据Grafana 通过 Elasticsearch 数据源插件把 HTTP 请求发到 Easysearch 的 REST API。Grafana 收到查询结果后在前端渲染成折线图、柱状图、饼图、表格或日志流。实际操作前需要确认几件事Easysearch 已经启动能通过浏览器访问http://IP:9200并且能看到集群健康状态。索引里有明确的日期字段比如timestamp或timestampGrafana 做时间过滤和趋势图依赖这个字段。你知道索引名称或通配符比如app-log-*、order-info-*。Grafana 服务器到 Easysearch 的 9200 端口网络通如果 Easysearch 开启了认证提前准备好账号密码。准备工作完成后就可以开始接数据源了。2. Grafana 数据源接入实操2.1 Grafana 安装与初始配置Grafana 安装很简单我这边是 Linux 环境直接下载 RPM 包装上sudo yum install -y grafana-enterprise-10.4.0-1.x86_64.rpm sudo systemctl start grafana-server sudo systemctl enable grafana-server装好后浏览器打开http://IP:3000默认账号密码都是 admin首次登录会强制改密码。如果你的服务器上有 Nginx可以反代一个域名把大屏地址暴露给内网其他同学观看。这一步没什么坑但有一点值得注意如果 Grafana 和 Easysearch 部署在不同机器记得检查防火墙和 SELinux我在测试环境就遇到过明明curl9200 通但 Grafana 里测试数据源一直失败的情况最后发现是 Grafana 所在机器有代理环境变量http_proxy导致请求走了代理。排查时先看 Grafana 服务日志里面会直白地告诉你连接失败原因。2.2 添加 Easysearch 数据源在 Grafana 左侧菜单找到 Connections → Data sources点 Add data source搜索 Elasticsearch进入配置页面。注意别搜 Easysearch因为 Grafana 官方没有单独的 Easysearch 插件直接用 ES 数据源加上就行。配置项我按下表填配置项推荐值说明NameEasysearch自定义最终会显示在大屏的数据源标签里URLhttp://127.0.0.1:9200Easysearch 的 HTTP 接口地址AccessServer默认浏览器访问 Grafana 时由 Grafana 转发请求到 ESIndex nameapp-log-*支持通配符多个索引用逗号分隔Time field nametimestamp必填指定时间字段Version7.10兼容 Easysearch 的 ES API 版本Min time interval30s限制最小查询粒度防止误操作把 ES 打挂Max concurrent shard requests3限制并发集群压力大时可以调小填完点 Save test看到绿色的 “Data source is working” 提示数据源就算接上了。如果报错多半是 URL 填错、端口不通、索引时间字段名不对或者认证信息缺失逐个排查很快。2.3 索引模式、时间字段与版本兼容性这里单独说下怎么避免后边查不到数据。Grafana 每次发起查询都会自动拼一个过滤条件把时间范围加到时间字段上比如{ query: { bool: { must: [ {range: {timestamp: {gte: now-6h, lte: now}}} ] } } }所以时间字段必须存在而且类型必须是date。如果你的索引里时间字段叫timestamp但 mapping 里是keyword类型Grafana 会直接报 “No date field named timestamp found”或者干脆数据是零。版本兼容性这块Easysearch 兼容的是 ES 7.10 API所以 Grafana 数据源里的 Version 我强烈建议选 7.10不要选 8.0 或 2.x因为不同版本的查询 DSL 有些细小的差异选错了可能在部分聚合函数上出现兼容报错。我实测选 7.10 时Terms 聚合、Date Histogram、Filters 聚合都能正常工作。2.4 初次验证查询数据源保存之后打开 Grafana 左侧的 Explore 页面顶部选择刚建好的 Easysearch 数据源然后输入查询。最简单的验证方法可以先切到 Query Builder 模式直接选 Count 聚合再选 Date Histogram字段选 timestamp点击 Run query如果能看到直方图说明链路已经通了。如果是比较习惯 Lucene 语法也可以直接在 Query Builder 的 Lucene Query 框里写level: ERROR然后 Run query就能看到筛选后的计数趋势。Explore 模式的优势是所见即所得查出来的结果让你对索引里到底有哪些字段、哪些数据量级一目了然为后边建大屏打底。3. 面板搭建与查询语法详解3.1 经典折线图日期直方图与计数/均值先做一个最常用的系统每分钟产生多少条 ERROR 日志。这个面板是大屏的标配能直观反映系统异常出现的频率。选择 Time series 面板编辑查询数据源选 EasysearchQuery 类型切到 Query BuilderMetricCount默认就是 doc_count统计匹配文档数BucketDate HistogramFieldtimestampIntervalauto也可以手动选 1m、5m、10m看数据量决定Min Doc Count0保证中间没数据的时段也补 0折线不断裂如果想看某个业务接口的平均耗时Metric 换成 AverageField 选duration字段其他不变。这里有一个小技巧如果你的索引里有多个业务类型想在同一张图里对比它们的错误数变化可以用 Terms 聚合做分组然后在 Labels 里设置{{key}}作为图例名称。Grafana 会自动为每个 Terms 分桶生成一条线对比效果非常直观。3.2 分组对比Terms 聚合与饼图/柱状图接着做一个“TOP 10 报错服务”的柱状图。新建面板选 Bar chart查询配置MetricCountBucketTermsFieldservice.keyword注意如果字段是 text 类型并开启了 fielddata才可以聚合一般建议使用 keyword 子字段Size10Order ByCountOrder DirectionDescMin Doc Count1执行后横轴会显示服务名纵轴显示错误条数。如果字段后面带.keyword是因为 ES 默认对 text 类型字段做全文索引同时生成一个service.keyword做精确匹配和聚合Grafana 里聚合时一定选 keyword 子字段否则要么报错要么结果不对。饼图同理Buckets 选 Terms字段选你要分类的维度比如level.keyword、region.keyword然后切换到 Pie chart 面板类型。饼图适合一眼看清占比但不太适合展示太多分类超过 10 个类别建议还是用柱状图或者横向条形图。3.3 表格与明细数据展示大屏上光有趋势图还不够经常要放一张“最近 20 条异常订单”的明细表让值班的同学直接看到单号、金额、状态、报错原因。Grafana 新版本9.x 之后的 ES 数据源已经支持 Table 查询类型操作方式如下在 Panel 编辑页面Query 类型选择 TableGrafana 会要求你指定返回字段可以通过 “Add field” 选择需要展示的字段也可以通过设置Fields数组的 JSON 方式直接声明要取的字段名。同时要保留一个时间范围过滤条件否则默认查询时间跨度内所有数据容易超时。如果你用的 Grafana 版本较老或者 Table 类型不可用备选方案是用 Logs 面板展示日志原文或者用 Raw Data 类型输出原始 JSON。日志面板对运维大屏够用但如果你要展示订单金额、状态这类结构化字段最好还是升级 Grafana 版本用 Table 类型一步到位。3.4 日志面板与全文检索场景当大屏需要滚动显示实时日志时用 Logs 面板最合适。它会把每条日志按行显示支持关键词高亮效果类似于 Kibana 的 Discover 页面。配置上很简单查询类型保持默认的 Lucene 查询查询语句写level: ERROR AND service: order-service面板选 LogsGrafana 会自动把 ES 返回的_source内容按 JSON 字段展示出来。我习惯把time和message字段设置为显示列设置路径Panel options → Logs → Visible fields把需要显示的字段加进来其他字段折叠。这样大屏上的日志面板看起来非常干净只留时间、服务名、日志内容。3.5 变量与模板化一台设备一个屏大屏做到后面你会发现不同服务、不同环境要反复做重复面板。这时千万别一个个复制粘贴用 Grafana 的变量机制能做到“一份面板全业务复用”。方法是在 Dashboard Settings → Variables 里定义一个变量比如service查询方式选 Query数据源选 EasysearchQuery 填{find: terms, field: service.keyword, size: 100}这样 Grafana 会自动从 Easysearch 里读取所有服务名生成一个下拉框。然后在每个面板的查询里用$service替代具体的服务名关键字。Lucene 查询写法变成service: $service AND level: ERRORTerm 聚合的 Field 也可以写死为service.keyword这样不影响。变量定义好后你可以把一份面板 Duplicate 多次或者配合 Grafana 的 Repeat 功能实现一行面板自动按变量值重复展示。大屏上放一个服务选择器开会时切换服务名所有图表一起联动变化效果非常酷。4. 大屏编排与落地技巧4.1 大屏布局、栅格与适配面板都做好了接下来就是拼大屏。Grafana 的 Dashboard 是网格布局拖拽面板时会有辅助线方便对齐。不过我建议不要一个个手拖直接在 Dashboard Settings 里调整 Grid Layout 参数或者用 Row 面板把不同类型的图表分区。常见的监控大屏分区方式是顶部一行放核心 KPI 数字总请求量、错误数、平均耗时、活跃用户。中间区域放趋势图按时间的错误趋势、调用量趋势。下方左侧放明细表格右侧放日志流。右下角放饼图或占比图。大屏分辨率一般是 1920x1080 或者更大Grafana 面板在浏览器里会自动缩放。如果投放的屏幕分辨率固定可以在大屏地址后加kiosk参数它会隐藏左侧菜单和顶部栏只保留面板内容视觉上就是一个真正的大屏。另外用浏览器自带的全屏快捷键F11效果会更好。4.2 自动刷新与时间范围锁定大屏不能一直停留在刚打开的数据上必须定时刷新。我在 Dashboard Settings → Time options 里把“Auto refresh”设为 10s然后右上角时间范围设置为now-1h。这里有个操作细节为了让大屏不被人手动拖动时间范围改乱我一般把 Run button 勾选上并且设置Override relative time为now-1h这样无论用户怎么切时间范围面板刷新都会自动回到最近 1 小时窗口。对于实时监控大屏来说“最近 30 分钟”或“最近 1 小时”是最常用的窗口既能看清近期趋势又不至于因为数据量太大导致查询变慢。4.3 kiosk 模式大屏播放Grafana 原生支持 kiosk 模式进入方式很简单http://IP:3000/d/你的DashboardUID?fromnow-1htonowrefresh10skiosk其中from和to锁定时间范围refresh控制刷新频率kiosk让页面自动进入全屏播放我实际用过一段时间kiosk 模式的体验已经足够好。如果你还需要多个大屏自动轮播可以用浏览器插件设置定时切换标签页或者用支持 URL 切换的流媒体服务把 Grafana 大屏页面作为信号源推送到电视上。4.4 整屏复用Dashboard JSON 迁移与拷贝做好的大屏想复制一份到另一个 Grafana 环境或者想在同一环境里快速复制一个模板操作路径是Dashboard Settings → JSON Model复制全部 JSON 内容。到目标环境后Dashboards → New → Import把 JSON 粘贴进去导入时选择对应的数据源即可。这里就是热搜词里 “grafana 拷贝整个面板” 和 “grafana failed to upgrade legacy queries datasource” 这两个问题的高发场景。导入旧版 Dashboard JSON 时如果 JSON 里的datasource引用的是一个老 uid而当前环境没有这个数据源Grafana 就会报failed to upgrade legacy queries datasource im7_otuvz was not found这类错误。解决办法有两个一是导入时在界面上手动选择当前易用的 Easysearch 数据源。Grafana 导入流程会弹出数据源映射选择框把旧的 ES 数据源映射到新的 Easysearch 数据源上。二是直接改 JSON。找到 JSON 里所有的datasource: {type: elasticsearch, uid: im7_otuvz}字段把uid替换成当前环境 Easysearch 数据源的 uid。数据源 uid 可以在 Data sources 设置页面的 URL 里看到或者通过 Grafana API 查询curl -s http://admin:密码IP:3000/api/datasources | jq .替换完成后重新导入问题就解决了。5. 实战问题排查与避坑清单5.1 failed to upgrade legacy queries datasource 错误处理这个报错在导入老面板时非常常见我单独拎出来说。报错原因主要是面板 JSON 中保存的是旧版 Elasticsearch 数据源的引用方式而 Grafana 新版要求数据源按uid识别旧 JSON 里可能写的是 number 或name导致新版本无法完成查询格式升级。排查步骤建议按下面的顺序来打开 Dashboard JSON搜索datasource看引用是uid还是type/name字符串。如果引用的uid不存在去数据源列表里找到当前 Easysearch 数据源的uid。批量替换 JSON 中的uid注意不要改错位置只替换datasource块中的。如果面板里的查询还是旧版结构bucketAggs、metrics是老字段建议不要强行升级直接在编辑面板里重新选择 Query 类型或者新建一个面板替换。我遇到过一个更隐蔽的情况面板 JSON 里的某个 Panel 数据源引用是nullGrafana 默认继承 Dashboard 全局数据源但全局数据源在导入后并没有被正确关联。这种情况直接把面板的datasource改成明确的数据源引用就行。5.2 图表不出数据的常见原因图表不出数据排在前三位的原因我整理成了表格现象原因排查方向刷新后图表全空时间字段类型不对或不存在去 Easysearch 查看索引 mapping确认时间字段是 date 类型部分字段聚合报错text 类型字段不能直接聚合改用.keyword子字段查询超时索引数据量太大通配符匹配过多索引缩小索引模式限制时间范围降低并发分片数结果显示 0Lucene 查询语法写错或者字段名大小写不对在 Explore 里先用简单的*查询验证时区显示偏差Grafana 默认 UTCEasysearch 存的是本地时间在 Dashboard Settings 里把时区改为东八区或统一存储 UTC其中时区问题特别坑。我第一个大屏做完发现曲线的峰值总比业务方说的接口报错时间晚 8 个小时后来确认是 Grafana 默认用 UTC 显示Easysearch 里存的是带时区的时间戳。解决方法是 Dashboard Settings → General → Timezone 改成(UTC08:00) Asia/Shanghai或者干脆在时间范围参数里追加tzAsia%2FShanghai所有图表就一致了。5.3 性能优化查询时长、并发与字段类型大屏一般会同时加载十几个面板如果每个面板都触发一次重量级聚合Easysearch 集群压力会很大。我调优的思路有几个一是合理设置 Min interval。数据源里我设置Min time interval为 30s这样即使大屏每 5 秒刷新Grafana 也会自动把查询的最小桶间隔扩大到 30s减少不必要的聚合次数。二是通配符尽量精确。索引模式写成order-service-*比写成*好得多索引数量少查询自然快。三是限制面板数据量。Terms 聚合的 Size 不要设太大默认 10 足够表格面板加一个size限制通常取最近 500 条就够屏幕展示了。日志面板如果数据量很大可以用 Lucene 语法先过滤掉非关键级别再显示。四是把低频数据做大时间窗口。比如“昨日报警总量”这种汇总型面板不需要跟随大屏每 10 秒刷新可以在面板编辑的 Query options 里设置Interval为1h这样既保证数据准确性又减少集群负担。5.4 告警扩展从大屏到及时通知大屏只能看真出了问题还得有人知道。Grafana 自带的 Alerting 功能可以直接对 ES 数据源做阈值告警。我给 ERROR 日志数加了一条告警规则查询条件level: ERROR时间范围最近 5 分钟聚合方式Count阈值大于 100 触发 Warning通知渠道钉钉机器人 webhook配置路径是 Alerting → Alert rules → New rule查询和数据源选择 Easysearch表达式类型选择 Threshold然后把告警规则绑定到一个 Notification policy并添加联系点Contact point。实测下来Grafana 新版告警引擎很稳定告警状态能从 Pending 自动升级到 Firing配合钉钉/企微的 webhook 能第一时间把消息推给值班群。如果你已经有一套 Prometheus Alertmanager 在跑Grafana 也能把告警推给 Alertmanager具体在 Contact point 里选 Prometheus Alertmanager 类型配置好 Alertmanager 地址即可。不过注意这种模式只负责把 Grafana 的告警事件转发出去规则本身还是在 Grafana 里配置。6. 最后再分享一点个人经验整套系统跑到现在最大体会是工具链的选择不需要追求“高大上”关键是能贴合自己手头的数据和场景。Easysearch 这两年我在生产环境用得比较顺手它兼容 ES 又更懂国内业务的语言习惯Grafana 的价值则在于用一套标准把“数据接入 → 可视化 → 告警”全打通。如果你也是第一次做数据可视化大屏我建议不要一上来就想搞一个很复杂的监控大盘先把数据源接通做一个日志趋势图跑顺整个链路再逐步加表格、加日志面板、加变量、加告警。等上手了你会发现 Grafana 的可扩展性远比你想象中强每多接一种数据源大屏能讲的故事就多一层。这个项目后续如果要扩展我计划把 Easysearch 集群本身的指标也接进来再结合业务索引做关联分析。可视化只是开始让数据真正辅助决策才是目的。
返回列表