在今天的文章中,我将来介绍如何生成报告,并通过电子邮件的方式来进行发送。如果你之前看了我的文章 “Kibana:如何周期性地为 Dashboard 生成 PDF Report”,你就知道如果通过 Watcher 来定时地生成报告,并存放于 Kibana 中的 Reporting 中。本文将介绍通过使用 Watcher 或脚本提交 HTTP POST 请求,自动生成 PDF 和 CSV 报告。

在我们进行下面的工作之前,我们必须了解:

报告请求之间的间隔必须大于生成报告所需的时间-否则,报告队列可以备份。 为避免这种情况,请增加两次报告请求之间的时间。

默认情况下,如果无法在两分钟内生成报告,则报告生成超时。 如果生成的报告包含许多复杂的可视化效果,或者计算机运行缓慢或负载持续恒定,则生成报告可能需要两分钟以上的时间。 你可以通过在 kibana.yml 中设置 xpack.reporting.queue.timeout 来增加超时时间。

由于 Watcher 是一个白金版的功能,在使用 watcher 之前我们必须启动 30 天测试来进行演示。你可以通过如下的方式来进行启动:

es的post请求 elasticsearch post_大数据

es的post请求 elasticsearch post_es的post请求_02

es的post请求 elasticsearch post_elasticsearch_03

点击上面的 Start trial:

es的post请求 elasticsearch post_es的post请求_04

es的post请求 elasticsearch post_elasticsearch_05

这样我们就设置完毕了。

创建一个 POST URL

创建触发报告生成的 POST URL。要为 PDF 报告创建 POST URL:

  • 转到可视化或仪表板,然后打开可视化或仪表板

         - 要指定相对或绝对时间段,请使用时间过滤器。

  • 在 Kibana工具栏中,单击 share,然后选择 PDF 报告
  • 单击 Copy POST URL

es的post请求 elasticsearch post_es的post请求_06

es的post请求 elasticsearch post_elasticsearch_07

我们也可以为 CSV 报告创建一个 POST URL:

  • 将保存的搜索加载到 Discover 中

          - 要指定相对或绝对时间段,请使用时间过滤器。

  • 在 Kibana 工具栏中,单击共享,然后选择 CSV 报告
  • 单击 Copy POST URL

es的post请求 elasticsearch post_CSV_08

es的post请求 elasticsearch post_大数据_09

使用 watcher 发送报告

要使用 Watcher 自动生成报告,你需要将 Watcher 配置为信任 Kibana 服务器的证书。 有关更多信息,请参阅 Securing Reporting。你需要为你的 Elastic Stack 配置安全。你可以参考我之前的文章 “Elasticsearch:设置 Elastic 账户安全”。

要将 Watcher 配置为通过电子邮件发送报告,请在电子邮件操作中使用报告附件类型。 有关更多信息,请参阅配置电子邮件帐户。如果还不知道怎么配置你的电子邮件的话,请参阅我之前的文章 “Elastic:创建你的第一个Elastic alert - 邮件通知”。里面有详细的描述如何设置电子邮件的配置。

例如,以下 Watcher 将生成 CSV 报告,并每小时通过电子邮件发送该报告:

PUT _watcher/watch/my_csv_report
{
  "trigger" : {
    "schedule": {
      "interval": "1h"
    }
  },
  "actions" : {
    "email_admin" : { 
      "email": {
        "to": "'Xiaoguo Liu <liu_xiao_guo@yahoo.com>'",
        "subject": "CSV report",
        "attachments" : {
          "csv_report.csv" : {
            "reporting" : {
              "url": "http://localhost:5601/api/reporting/generate/csv?jobParams=%28browserTimezone%3AAsia%2FShanghai%2CconflictedTypesFields%3A%21%28%29%2Cfields%3A%21%28timestamp%2Cgeo.dest%2Cgeo.src%2Curl%2Cip%29%2CindexPatternId%3A%2790943e30-9a47-11e8-b64d-95841ca0b247%27%2CmetaFields%3A%21%28_source%2C_id%2C_type%2C_index%2C_score%29%2CobjectType%3Asearch%2CsearchRequest%3A%28body%3A%28_source%3A%28includes%3A%21%28timestamp%2Cgeo.dest%2Cgeo.src%2Curl%2Cip%29%29%2Cdocvalue_fields%3A%21%28%28field%3Atimestamp%2Cformat%3Adate_time%29%29%2Cquery%3A%28bool%3A%28filter%3A%21%28%28match_all%3A%28%29%29%2C%28range%3A%28timestamp%3A%28format%3Astrict_date_optional_time%2Cgte%3A%272020-10-26T08%3A39%3A06.925Z%27%2Clte%3A%272020-11-02T08%3A39%3A06.925Z%27%29%29%29%29%2Cmust%3A%21%28%29%2Cmust_not%3A%21%28%29%2Cshould%3A%21%28%29%29%29%2Cscript_fields%3A%28%29%2Csort%3A%21%28%28timestamp%3A%28order%3Adesc%2Cunmapped_type%3Aboolean%29%29%29%2Cstored_fields%3A%21%28timestamp%2Cgeo.dest%2Cgeo.src%2Curl%2Cip%29%2Cversion%3A%21t%29%2Cindex%3Akibana_sample_data_logs%29%2Ctitle%3Aresport%29", 
              "retries":40, 
              "interval":"15s", 
              "auth":{ 
                "basic":{
                  "username":"elastic",
                  "password":"password"
                }
              }
            }
          }
        }
      }
    }
  }
}

在上面请注意几点:

  1. 你需要根据自己的 CSV POST URL 来替换上面的 url
  2. 你需要根据自己的邮箱来配置上面的 to 字段
  3. 你需要根据自己的 Elasticsearch 的配值来修改上面的 username 以及 password。在上面,我们为了方便使用了超级用户 elastic。你可以根据自己的需要使用一个账号。关于这个账号的权限,你需要参考 Securing Reporting。

经过上面的命令执行后,你可以在 Kibana 的 watcher 列表中看到这个 watcher:

es的post请求 elasticsearch post_大数据_10

es的post请求 elasticsearch post_Elastic_11

在上面,我们使用了 1 个小时来发送一次。这在实际的测试中很不方便。我们可以使用如下的方法来进行立即的发送:

PUT _watcher/watch/my_csv_report/_execute

上面的 _execute 命令就是为了方便我们的测试而设计的。我们可以执行我们想要的次数,然后在我们的邮箱中进行等候邮件的到来:

es的post请求 elasticsearch post_Elastic_12

我们可以看到一个叫做 CSV report 的文件发送到我们的邮件了。我们可以打开这个邮件:

es的post请求 elasticsearch post_es的post请求_13

我们可以看到一个叫做 csv_report.csv 的附件在邮件中。我们可以打开这个邮件:

es的post请求 elasticsearch post_CSV_14

显然这个就是我们需要的报告。

使用脚本

要通过脚本自动生成报告,你需要请求POST URL。 该请求的响应将为 JSON,并将包含一个路径属性和一个 URL,该 URL 可用于下载生成的报告。 在 HTTP 请求中使用 GET 方法下载报告。

request 方法必须是 POST,并且必须包含 Kibana 的 kbn-version 标头以允许请求。

以下示例使用带有 cURL 的 POST URL 将 CSV 报告生成队列:

curl -XPOST -u elastic:password -H 'kbn-version: 7.9.1' 'http://localhost:5601/api/reporting/generate/csv?jobParams=%28browserTimezone%3AAsia%2FShanghai%2CconflictedTypesFields%3A%21%28%29%2Cfields%3A%21%28timestamp%2Cgeo.dest%2Cgeo.src%2Curl%2Cip%29%2CindexPatternId%3A%2790943e30-9a47-11e8-b64d-95841ca0b247%27%2CmetaFields%3A%21%28_source%2C_id%2C_type%2C_index%2C_score%29%2CobjectType%3Asearch%2CsearchRequest%3A%28body%3A%28_source%3A%28includes%3A%21%28timestamp%2Cgeo.dest%2Cgeo.src%2Curl%2Cip%29%29%2Cdocvalue_fields%3A%21%28%28field%3Atimestamp%2Cformat%3Adate_time%29%29%2Cquery%3A%28bool%3A%28filter%3A%21%28%28match_all%3A%28%29%29%2C%28range%3A%28timestamp%3A%28format%3Astrict_date_optional_time%2Cgte%3A%272020-10-26T08%3A39%3A06.925Z%27%2Clte%3A%272020-11-02T08%3A39%3A06.925Z%27%29%29%29%29%2Cmust%3A%21%28%29%2Cmust_not%3A%21%28%29%2Cshould%3A%21%28%29%29%29%2Cscript_fields%3A%28%29%2Csort%3A%21%28%28timestamp%3A%28order%3Adesc%2Cunmapped_type%3Aboolean%29%29%29%2Cstored_fields%3A%21%28timestamp%2Cgeo.dest%2Cgeo.src%2Curl%2Cip%29%2Cversion%3A%21t%29%2Cindex%3Akibana_sample_data_logs%29%2Ctitle%3Aresport%29' 
或着你不使用密码的格式:
curl -XPOST -u elastic -H 'kbn-version: 7.9.1' 'http://localhost:5601/api/reporting/generate/csv?jobParams=%28browserTimezone%3AAsia%2FShanghai%2CconflictedTypesFields%3A%21%28%29%2Cfields%3A%21%28timestamp%2Cgeo.dest%2Cgeo.src%2Curl%2Cip%29%2CindexPatternId%3A%2790943e30-9a47-11e8-b64d-95841ca0b247%27%2CmetaFields%3A%21%28_source%2C_id%2C_type%2C_index%2C_score%29%2CobjectType%3Asearch%2CsearchRequest%3A%28body%3A%28_source%3A%28includes%3A%21%28timestamp%2Cgeo.dest%2Cgeo.src%2Curl%2Cip%29%29%2Cdocvalue_fields%3A%21%28%28field%3Atimestamp%2Cformat%3Adate_time%29%29%2Cquery%3A%28bool%3A%28filter%3A%21%28%28match_all%3A%28%29%29%2C%28range%3A%28timestamp%3A%28format%3Astrict_date_optional_time%2Cgte%3A%272020-10-26T08%3A39%3A06.925Z%27%2Clte%3A%272020-11-02T08%3A39%3A06.925Z%27%29%29%29%29%2Cmust%3A%21%28%29%2Cmust_not%3A%21%28%29%2Cshould%3A%21%28%29%29%29%2Cscript_fields%3A%28%29%2Csort%3A%21%28%28timestamp%3A%28order%3Adesc%2Cunmapped_type%3Aboolean%29%29%29%2Cstored_fields%3A%21%28timestamp%2Cgeo.dest%2Cgeo.src%2Curl%2Cip%29%2Cversion%3A%21t%29%2Cindex%3Akibana_sample_data_logs%29%2Ctitle%3Aresport%29'

在上面请注意:

  • 你需要用自己的 POST URL 来替换上面的 http 地址部分

执行完上面的指令后,我们打开 Kibana:

es的post请求 elasticsearch post_Elastic_15

es的post请求 elasticsearch post_CSV_16

我们可以看到每次命令后在 Reporting 里就会生成相应的报告。我们可以点击右边的下载图标来进行下载。

参考:

【1】https://www.elastic.co/guide/en/kibana/current/automating-report-generation.html