我在 中编写了以下查询GCP BigQuery
,当数量列的阈值超过 1000 时,我使用错误函数弹出错误消息。
SELECT ERROR(CONCAT("Over threshold: ", CAST(quantity AS STRING)))
FROM `proj.dataset.table`
WHERE quantity > 1000
当我在 中安排此查询时,我会收到电子邮件通知BigQuery
。但我想通过 BigQuery 向用户组触发该通知。
如何做到这一点?
我在 中编写了以下查询GCP BigQuery
,当数量列的阈值超过 1000 时,我使用错误函数弹出错误消息。
SELECT ERROR(CONCAT("Over threshold: ", CAST(quantity AS STRING)))
FROM `proj.dataset.table`
WHERE quantity > 1000
当我在 中安排此查询时,我会收到电子邮件通知BigQuery
。但我想通过 BigQuery 向用户组触发该通知。
如何做到这一点?
您可以使用Cloud Workflows无服务器产品和提供 REST Api 的外部电子邮件发送提供商(例如 Sendgrid、Mailchimp、Mailgun)来实现这一目标以及更多其他功能。
您基本上设置了一个将为您处理这些步骤的工作流程:
kind
执行另一个步骤主要的工作流程是这样的:
#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_email_dev_apikey
是秘密标签,我使用Secret Manager来存储 Sendgrid 的 API 密钥。如果你想使用 MailChimp,这个 Github repo中有一些例子。
工作流调用程序可以是Cloud Scheduler条目。因此,您无需从 BigQuery 界面启动计划的查询,而是在计划的工作流中设置它们。您必须授予调用者service account
读取 Secret 的权限,才能运行 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}