Google cloud platform 从pubsub/stackdriver消息中提取字段
我正在将一个自定义度量从StackDriver导出到PubSub,这反过来将触发一个函数。我需要提取tableId和datasetId字段,这些字段将用于删除不符合企业标准的bigquery表 到目前为止,我已经尝试将数据字段的名称更改为protoPayload、textPayload,并且收到了多个错误。有些错误是无效键,使用字节而不是dict,主要是变量未定义Google cloud platform 从pubsub/stackdriver消息中提取字段,google-cloud-platform,google-cloud-functions,google-cloud-pubsub,google-cloud-stackdriver,Google Cloud Platform,Google Cloud Functions,Google Cloud Pubsub,Google Cloud Stackdriver,我正在将一个自定义度量从StackDriver导出到PubSub,这反过来将触发一个函数。我需要提取tableId和datasetId字段,这些字段将用于删除不符合企业标准的bigquery表 到目前为止,我已经尝试将数据字段的名称更改为protoPayload、textPayload,并且收到了多个错误。有些错误是无效键,使用字节而不是dict,主要是变量未定义 import base64 def hello_pubsub(event, context): pubsub_messag
import base64
def hello_pubsub(event, context):
pubsub_message = base64.b64decode(event['protoPayload']).decode('utf-8')
print(pubsub_message)
我希望能够提取单个字段tableId和datasetId,并使用BQ客户机中的字段删除有问题的表
更新:已将评论复制到问题:
line 383, in run_background_function
_function_handler.invoke_user_function(event_object)
File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 217, in invoke_user_function return call_user_function(request_or_event)
File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 214, in call_user_function event_context.Context(**request_or_event.context))
File "/user_code/main.py", line 9, in hello_pubsub pubsub_message = base64.b64decode(event['protoPayload']).decode('utf-8') KeyError: 'protoPayload'
使用此框架作为起点:
def hello_pubsub(event, context):
if 'data' in event:
pubsub_message = base64.b64decode(event['data']).decode('utf-8')
print(pubsub_message)
// Your custom data
tableId = pubsub_message['requestMetadata']['serviceData']['tableInsertRequest']['resource']['tableName']['tableId']
datasetId = pubsub_message['requestMetadata']['serviceData']['tableInsertRequest']['resource']['tableName']['datasetId']
从下面的注释中解码JSON缺少底部:
MY-MESSAGE: {
"insertId":"-cr1b1ae1x199",
"logName":" logs/cloudaudit.googleapis.com%2Factivity",
"protoPayload":{
"@type":"type.googleapis.com/google.cloud.audit.AuditLog",
"authenticationInfo":{
"principalEmail":"xxx"
},
"authorizationInfo":[{
"granted":true,
"permission":"bigquery.tables.create",
"resource":"xxx"
}],
"methodName":"tableservice.insert",
"requestMetadata":{
"callerIp":"x",
"callerSuppliedUserAgent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/x Safari/537.36,gzip(gfe)"},
"resourceName":"x",
serviceData"":{
"@type":"type.googleapis.com/google.cloud.bigquery.logging.v1.AuditData",
"tableInsertRequest":{
"resource":{
"info":{},
"schemaJson":"{\n}",
"tableName":{
"datasetId":"citi_dev_gcp",
"projectId":"x",
"tableId":"outputCheck"
},
"view":{}
}
},
"tableInsertResponse":{
"resource":{
"createTime":"2019-06-20T18:42:21.106Z",
"expireTime":"2019-07-20T18:42:21.106Z",
"info":{},
"schemaJson":"{\n}",
"tableName":{
"datasetId":"name",
"projectId":"x",
"tableId":"outputCheck"
},
"updateTime":"2019-06-20T18:42:21.151Z",
"view":{}
}
}
},
"serviceName":"bigquery.googleapis.com","status":{}
},
"receiveTimestamp":
您可以发布您通过pubsub获得的消息吗?第383行,在run_background_function_function_handler.invoke_user_functionevent_object File/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py,第217行,调用用户函数返回调用用户函数请求或事件文件/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py,第214行,调用用户函数事件上下文。上下文**请求或事件上下文文件/user\u code/main.py,第9行,在hello\u pubsub pubsub\u message=base64.b64decodeevent['protoPayload'].decode'utf-8'键错误:'protoPayload'谢谢回复!为了满足字符限制,我不得不将这个问题缩小一点。下次,编辑你的问题并以代码的形式发布。@Jman。。。很抱歉我不清楚。您正在通过发布/订阅接收消息数据,并尝试对其进行解码。是否可以发布此消息/数据的示例?如果很大,可以把它发到互联网上的某个地方并添加一个链接。谢谢,约翰。使用此代码时,我收到以下内容:packages/google/cloud/functions/worker.py,第383行,在run\u background\u function\u handler.invoke\u user\u functionevent\u object File/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py,第217行,在调用用户函数返回调用用户函数请求或事件文件/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py,第214行,在调用用户函数事件上下文.context**request\u或事件.context文件/user\u code/main.py,第6行,在hello\u pubsub mydata=pubsub\u message['message']TypeError:字符串索引必须是整数这一行打印什么printpubsub_消息这一行的输出确实在括号之间打印完整的Stackdriver日志,函数名在前面:table delete test 123456880987{“insertId”:“-98765432123ml”,“logname”:“projects/tf my simple test”,“protoPayload”:{“@type”:“type.googleapis.com”}这里有更多内容,但本质上是一个庞大的字典。我已经用新代码更新了我的答案,这些代码将处理发布的JSON