页面树结构
转至元数据结尾
转至元数据起始

一、导出原理

使用Puppeteer作为服务端截图方案。即在服务器端启动一个nodejs服务,该服务会通过Puppeteer启动一个headless(无界面)的Chrome浏览器,用于打开仪表盘资源进行截图。

大致流程如下:

  1. 用户点击导出→服务端启动浏览器打开对应资源。

  2. 等待页面加载完成,浏览器元素的class出现db-page__page-loaded→开始截图→返回图片给客户端

二、排查思路

2.1确认系统选项的配置

  • smartbi服务器URL地址:一般是当前地址,需要确保导出引擎服务器能正常访问这个地址,能测试连接通过

  • 导出引擎URL地址:导出引擎服务器所在地址,确保smartbi服务器能访问到这个地址,能测试连接通过

2.2确认导出引擎正常启动

找台能访问导出引擎服务器地址的电脑,对导出引擎进行测试。

windows系统:直接在浏览器上访问以下地址,返回结果一张图片,如下图:

http://导出引擎地址:端口?url=http://导出引擎地址:端口


linux系统:保持返回的图片a.png, 查看图片a.png是否跟下面的图一样,一样则证明导出引擎截图功能是正常的,如果不一样则需要重启导出引擎,或者导出引擎部署有问题,需要重新部署

curl http://10.10.35.178:3003?url=http://10.10.35.178:3003 -o a.png

如图,出现以下报错,这种net:开头的报错一般都是网络问题,后面的链接是export.jsp,是导出引擎用来打开仪表盘的链接,那就是导出引擎访问不了smartbi的地址,要么地址配置不对,要么就是域名没有映射,可以通过curl命令进行验证,最后确认是容器内在hosts配置域名映射,配置后就能正常了。

net:ERR_NAME_NOT_RESOLVED at http://xxxxxx

2.3查看仪表盘是否有加载完成的标志

如果出现仪表盘导出长时间等待后报错,最后报如下图错误。则是由于导出引擎依赖页面加载完成的标志(db-page__page-loaded的class样式)触发截图,若该标志未出现,引擎会持续等待直至超时。

此时需要进行以下操作:

1)模拟导出环境:新窗口单独打开仪表盘(需与导出引擎的页面加载逻辑一致)。

2)检查加载标志:按F12打开开发者工具 → 在“元素”面板中搜索db-page__page-loaded样式(如下图),若不存在则说明部分组件未完成加载,导致引擎等待至超时,此时可以精简资源,通过移出组件的方式,协助定位未加载完成的组件,上报BUG进行修复。

2.4查看是否请求体过大

一般报表比较复杂,组件数量较多,或筛选器的选中值非常多时,会导致pagestate很大。这种情况比较明显的特征是只有部分复杂的仪表盘导出异常,简单的仪表盘是能够成功导出的。

可以新建一个比较简单的仪表盘,比如只有一个组件(富文本 、柱图等)来测试导出功能,如果这个简单的仪表盘可以正常导出,而复杂的仪表盘无法正常导出,则可以判断是pagestate很大导致的,可以通过放开请求体大小的限制解决,具体步骤:在smartbi服务器tomcat的server.xml配置 maxPostSize = '-1' ;如果有用到我们的proxy,也需要在proxy的tomcat服务器上配置 maxPostSize = '-1',同理其他代理如nginx等也是需要同样的操作,这样做的原因是为了放开请求体大小限制

2.5查看导出引擎打开资源后的效果和预期是否一样,是否跳转到其他页面

在浏览器访问

http://smartbi的服务器地址/smartbi/vision/ExportHttpServlet?action=EXPORT_DASHBOARD_DIRECT&pageId=资源id&skipWaitforTime=5000&exportType=PNG&detectFailedSelector=.db-page__page-failed&detectLoadedSelector=.db-page__page-loaded&width=1024&height=768

在这个链接中主要修改对应的smartbi服务器地址,对应的仪表盘资源id,以及skipWaitforTime的值,就可以返回导出引擎在打开仪表盘资源后的第N毫秒的截图,便于观察导出引擎打开仪表盘资源后,是否跳到其他异常页面(比如单点登录页面等),页面状态是否和预期一致。

三、导出引擎日志

导出引擎可以通过运维设置→系统日志获取,在导出的日志压缩文件中,ScreenshotLog开头的zip文件就是导出引擎的日志,解压查看即可

导出日志在能够正常导出的情况下,日志说明如下:

1)working count 执行的线程数+1,准备开始渲染截图的内容,内容由后面的url决定

2)开始执行访问仪表盘的任务,goto url说明正在导出引擎的内置浏览器中打开url

3)等待页面出现加载完成的标志db-page__page-loaded,Request URL都是页面打开过程中所有网络请求,可以关注下这些请求的status是否是200,200说明请求正常,如果遇到500或者404等异常的,需要重点排查

4)出现finish,说明仪表盘已加载完成,将进行截图,接着就是png rendered: 3456ms,说明已经截图完毕,并且从打开仪表盘到截图完毕花了3456毫秒

3.1 常见的异常日志

1)超时导致报错

Session closed. Most likely the page has been closed.

error (Runtime.callFunctionOn): Target closed.

页面一直没有出现加载完成的标志db-page__page-loaded直到5分钟后超时,浏览器关闭,导出引擎日志就会显示以下报错。

2)单个组件导出错误出现

Node is either not visible or not an HTMLElement

这种常见于单个组件的导出,单个组件导出逻辑是先打开整个仪表盘,然后定位到导出的组件元素,再进行截图,如果定位不到该组件,就会报以上错误。

如果是没有宏的情况下报这类问题则大部分是bug,产品的逻辑没有处理好,但如果是宏隐藏了某个组件,某个操作后又显示该组件进行导出时,这类问题导出引擎无法执行那个特定动作,去触发组件显示,所以无法正常导出,需要针对具体场景,通过其他方式规避

四、典型的案例汇总

1)配置域名后导出报错

如图,出现以下报错,net:ERR_NAME_NOT_RESOLVED at http://xxxxxx,这种net:开头的报错一般都是网络问题,后面的链接是export.jsp,是导出引擎用来打开仪表盘的链接,那就是导出引擎访问不了smartbi的地址,要么地址配置不对,要么就是域名没有映射,可以通过排查思路里面的curl命令进行验证,最后确认是容器内在hosts配置域名映射,配置后就能正常了

2)仪表盘导出一直卡在20%不动

从现象看一直卡在20%,超过5分钟后提示导出失败,就是导出引擎在等仪表盘加载完成的标志db-page__page-loaded,从以下导出引擎日志也可以看出来,到最后5分钟(3000000ms)超时了,浏览器关闭了。

根据排查思路,新窗口打开资源,F12搜索db-page__page-loaded,也是找不到,再次验证了有部分异常,导致没有加载完成

产生原因:通过把宏禁用,发现宏隐藏的两个组件是有异常的,这两个组件在自定义属性中加了修改了series的属性,导致echats报错,所以这两个组件被认为一直没加载完,没有生成loaded样式。

解决方案:看隐藏的这两个组件是否有必要,没必要就删掉,或者重新调整自定义设置里面的配置,让这两个图形能正常渲染

3)通过域名无法导出

现场的网络有点特殊,有多层代理,访问链路为客户自有F5代理HTTPS访问域名,然后到NGXIN到TOMCAT,目前通过服务器IP和NGINX代理的地址可以导出,但是走客户的HTTPS域名访问会报NETWORKERROR, 从导出引擎的日志看,是已经截图完毕的,就是返回文件的时候报错,本地模拟重现如下:在公司环境,模拟项目场景,部署两个nginx,第一层nginx配置https,第二层nginx配置http,使用第二层nginx连接smartbi,经测试发现,第一层(https)的nginx,如果配置了 proxy_set_header Host $host; 参数,会出现跟项目一样的现象。

配置如下图:

解决方案:

方案1:第一层的nginx的配置中,去掉proxy_set_header Host $host; 参数,可以正常导出图片。

方案2:由于客户现场第一层的代理不是他们自己管理的,所以动不了,那么需要改第二层的代理,配置 proxy_redirect http://smartbiupstream/smartbi https://$http_host/smartbi;

4)交互式仪表盘报表导出报404错误

排查发现导出日志已经提示截图成功,还是返回文件的时候报错,且请求每次报错的时间都是卡在1分钟,如下图,且用到nginx代理

结论确认是客户nginx设置的超时问题,设置了1分钟超时,但查询比较慢,导出需要1.8分钟,客户已将时间调整至5分钟,验证没问题

5)仪表盘表组件导出 lnvalid row index

用户设置了导出excel的导出行数为1,048,576,excel的最大行数就是1,048,576,由于列头也占一行,所以excel的实际行数超过了1,048,576

6)导出引擎导出20%一直转圈后面超时 (东方通)

跟踪发现,打开仪表盘偶尔会出现请求回来的js乱码,导出引擎也是基于这个原因,无法正常打开仪表盘,所以一直等待,导致超时

东方通8配置问题,需要关闭资源预压缩的设置项


7)导出仪表盘有报错信息Required request paramter 'pageState' for method parameter type String is not present

报错显示pageState没有传参,由于pageState太大,tomcat有限制请求体大小导致,跟报告人确认后,修改maxpostsize=-1后正常了

8)导出仪表盘报错Screenshot error: ScreenshotServer auto login fail!(smartbi集群)

系统选项配置的smartbi地址是集群的地址,然后是偶发性的报错,最后发现是集群的各节点系统时间不统一,比如目前集群访问的实际是A节点,点击导出后,发了token,在导出引擎那边打开集群地址实际访问的是B节点,两个节点的时间又恰好差了5分钟,token一般在还没使用的情况下,有效时间只有5分钟,所以节点相差5分钟,导致在B节点验证登录时失效了,跳到登录界面,统一节点时间后,导出就正常了

9)导出出错:Node is either not visible or not an HTMLElement

由于导出的组件是通过宏控制按钮点击后显示后才导出的,但是目前导出功能,无法处理宏扩展的事件,因为是用户自定义的,不是产品内置的功能,仪表盘只能处理产品功能效果,由于打开时资源时,该组件一直是隐藏,所以找不到该节点,报错,这个问题本事可以通过跳转规则规避,如果遇到不是宏导致的这个报错,则需要转给开发跟进

10)模块集成后在第三方系统中导出仪表盘失败

集成后,导出仪表盘时没有下载到文件,但看请求是正常的,也已经返回截图,查看页面发现,第三方系统是通过iframe集成smartbi的页面,且iframe设置了sandbox属性,这时候就要看他们是否在sandbox中配置了allow-downloads,sandbox没有配置allow-downloads默认是不允许下载的,需要配置allow-downloads后才能正常下载iframe中的文件

11)更新版本后导出引擎更新部署失败报unable to launch browser, error message: Failed to launch the browser process!

用户导出引擎机器是arm架构,更新的node_modules却是了x86架构的,导致导出引擎内置的谷歌浏览器启动失败


  • 无标签