页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

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

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

Image Modified

二、排查思路

2.1确认系统选项的配置

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

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

Image Modified

2.2确认导出引擎正常启动

...

代码块
linenumberstrue
http://导出引擎地址:端口?url=http://导出引擎地址:端口

Image Modified


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

代码块
linenumberstrue
curl http://10.10.35.178:3003?url=http://10.10.35.178:3003 -o a.png

Image Modified

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

代码块
net:ERR_NAME_NOT_RESOLVED at http://xxxxxx

Image Modified

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

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

Image Modified

此时需要进行以下操作:

...

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

Image Modified

2.4查看是否请求体过大

...

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

Image Modified

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

...

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

Image Modified

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

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

Image Modified

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

Image Modified

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

Image Modified

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

Image Modified

3.1 常见的异常日志

...

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

Image Modified

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

代码块
Node is either not visible or not an HTMLElement

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

...

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

Image Modified

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

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

Image Modified

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

...

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

Image Modified

3)通过域名无法导出

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

配置如下图:

Image Modified

解决方案:

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

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

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

Image Modified

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

Image Modified

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

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

Image RemovedImage Added

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

...

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

Image RemovedImage Added

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

Image Modified


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

Image Modified

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

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

Image Modified

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

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

Image Modified

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

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

Image Modified

集成后,导出仪表盘时没有下载到文件,但看请求是正常的,也已经返回截图,查看页面发现,第三方系统是通过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!

Image Modified

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

...