Google cloud platform 如何在阈值上触发BigQuery向用户组发送电子邮件通知?

Google cloud platform 如何在阈值上触发BigQuery向用户组发送电子邮件通知?,google-cloud-platform,google-bigquery,google-workflows,Google Cloud Platform,Google Bigquery,Google Workflows,我在GCP BigQuery中编写了下面的查询,当数量列的阈值超过1000时,我使用error函数弹出错误消息 SELECT ERROR(CONCAT("Over threshold: ", CAST(quantity AS STRING))) FROM `proj.dataset.table` WHERE quantity > 1000 当我在BigQuery中计划此查询时,我收到电子邮件通知。但是我想通过BigQuery触发对用户组的通知 如何实现这一点?由于您

我在
GCP BigQuery
中编写了下面的查询,当数量列的阈值超过1000时,我使用error函数弹出错误消息

SELECT ERROR(CONCAT("Over threshold: ", CAST(quantity AS STRING)))
FROM `proj.dataset.table` 
WHERE quantity > 1000
当我在
BigQuery
中计划此查询时,我收到电子邮件通知。但是我想通过BigQuery触发对用户组的通知


如何实现这一点?

由于您收到邮件通知,我猜您正在使用BigQuery数据传输服务

据了解,只有设置转账的人员才会收到邮件通知。但是,如果您使用的是Gmail,您可以自动将这些消息转发给用户列表


应该会引导您完成它。

由于您收到邮件通知,我猜您正在使用BigQuery数据传输服务

据了解,只有设置转账的人员才会收到邮件通知。但是,如果您使用的是Gmail,您可以自动将这些消息转发给用户列表


您可以通过无服务器产品和提供REST Api的外部电子邮件发送提供商(如Sendgrid、Mailchimp、Mailgun)来实现这一点和更多

您基本上设置了一个工作流,该工作流将为您处理以下步骤:

  • 运行BigQuery查询
  • 错误时触发电子邮件步骤
  • 如果返回的结果属于
    类型,您甚至可以组合执行另一个步骤
主要工作流程如下所示:

#workflow entrypoint
main:
  steps:
    - getList:
        try:
          call: BQ_Query
          args:
            query: SELECT ERROR('demo') from (select 1) where 1>0
          result: result
        except:
          as: e
          steps:
            - sendEmail:
                call: sendGridSend
                args:
                  secret: sendgrid_email_dev_apikey
                  from: from@domain.com
                  to: 
                     - email: email1@domain.com
                     - email: email2@domain.com 
                  subject: "This is a test"
                  content: ${"Error message from BigQuery" + e.body.error.message}
                  contentType: "text/plain"
                result: callResult
    - final:
        return: ${callResult}
sendgrid\u email\u dev\u apikey
是一个秘密标签,我用来存储sendgrid的API密钥。如果您想使用MailChimp,中有一些示例

工作流调用程序可以是一个条目。因此,您不用从BigQuery接口启动计划查询,而是在计划工作流中设置它们。您必须授予调用方
服务帐户
读取机密、运行BigQuery作业的权限

工作流的其余部分如下所示:

BQ_Query:
  params: [query]
  steps:
    - runBQquery:
        call: googleapis.bigquery.v2.jobs.query
        args:
          projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
          body:
            useLegacySql: false
            query: ${query}
        result: queryResult
    - documentFound:
        return: ${queryResult}
sendGridSend:
  params: [secret, from, to, subject, content, contentType]
  steps:
    - getSecret:
        call: http.get
        args:
          url: ${"https://secretmanager.googleapis.com/v1/projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER") + "/secrets/" + secret + "/versions/latest:access"}
          auth:
            type: OAuth2
        result: sendGridKey
    - decodeSecrets:
        assign:
          - decodedKey: ${text.decode(base64.decode(sendGridKey.body.payload.data))}
    - sendMessage:
        call: http.post
        args:
          url: https://api.sendgrid.com/v3/mail/send
          headers:
            Content-Type: "application/json"
            Authorization: ${"Bearer " + decodedKey }
          body:
            personalizations:
              - to: ${to}
            from:
              email: ${from}
            subject: ${subject}
            content:
              - type: ${contentType}
                value: ${content}
        result: sendGridResult
    - returnValue:
        return: ${sendGridResult}

使用无服务器产品和外部电子邮件发送提供商(如Sendgrid、Mailchimp、Mailgun)可以实现这一点,甚至可以实现更多

您基本上设置了一个工作流,该工作流将为您处理以下步骤:

  • 运行BigQuery查询
  • 错误时触发电子邮件步骤
  • 如果返回的结果属于
    类型,您甚至可以组合执行另一个步骤
主要工作流程如下所示:

#workflow entrypoint
main:
  steps:
    - getList:
        try:
          call: BQ_Query
          args:
            query: SELECT ERROR('demo') from (select 1) where 1>0
          result: result
        except:
          as: e
          steps:
            - sendEmail:
                call: sendGridSend
                args:
                  secret: sendgrid_email_dev_apikey
                  from: from@domain.com
                  to: 
                     - email: email1@domain.com
                     - email: email2@domain.com 
                  subject: "This is a test"
                  content: ${"Error message from BigQuery" + e.body.error.message}
                  contentType: "text/plain"
                result: callResult
    - final:
        return: ${callResult}
sendgrid\u email\u dev\u apikey
是一个秘密标签,我用来存储sendgrid的API密钥。如果您想使用MailChimp,中有一些示例

工作流调用程序可以是一个条目。因此,您不用从BigQuery接口启动计划查询,而是在计划工作流中设置它们。您必须授予调用方
服务帐户
读取机密、运行BigQuery作业的权限

工作流的其余部分如下所示:

BQ_Query:
  params: [query]
  steps:
    - runBQquery:
        call: googleapis.bigquery.v2.jobs.query
        args:
          projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
          body:
            useLegacySql: false
            query: ${query}
        result: queryResult
    - documentFound:
        return: ${queryResult}
sendGridSend:
  params: [secret, from, to, subject, content, contentType]
  steps:
    - getSecret:
        call: http.get
        args:
          url: ${"https://secretmanager.googleapis.com/v1/projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER") + "/secrets/" + secret + "/versions/latest:access"}
          auth:
            type: OAuth2
        result: sendGridKey
    - decodeSecrets:
        assign:
          - decodedKey: ${text.decode(base64.decode(sendGridKey.body.payload.data))}
    - sendMessage:
        call: http.post
        args:
          url: https://api.sendgrid.com/v3/mail/send
          headers:
            Content-Type: "application/json"
            Authorization: ${"Bearer " + decodedKey }
          body:
            personalizations:
              - to: ${to}
            from:
              email: ${from}
            subject: ${subject}
            content:
              - type: ${contentType}
                value: ${content}
        result: sendGridResult
    - returnValue:
        return: ${sendGridResult}

非常有趣的用例,今天我学到了一些新东西。该错误是否记录在云日志中?如果是这样的话,您可以在这个日志条目上设置云警报。非常有趣的用例,今天我学到了一些新东西。该错误是否记录在云日志中?如果是这样,您可以在此日志条目上设置带有云警报的警报。