Извлечь поля из сообщения pubsub / stackdriver - PullRequest
0 голосов
/ 20 июня 2019

Я экспортирую пользовательскую метрику из StackDriver в PubSub, которая, в свою очередь, вызовет функцию.Мне нужно извлечь поля tableId и datasetId, которые, в свою очередь, будут использоваться для удаления таблиц больших запросов, не соответствующих корпоративным стандартам.

До сих пор я пытался изменить имя поля «data» на protoPayload, textPayload, и я получил несколько ошибок.Некоторые из ошибок: «неверный ключ», «использовать байты вместо dict» и, в основном, «переменная не определена».

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' 

1 Ответ

0 голосов
/ 20 июня 2019

Используйте эту основу в качестве отправной точки:

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":
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...