Облачные функции Python добавляют журналы, чтобы увидеть, что происходит - PullRequest
0 голосов
/ 11 октября 2019

Я работаю с данными, хранящимися в firestore, с помощью Python. Я создал функцию на своем локальном компьютере для обновления своих данных в firestore, но теперь я хочу добавить облачную функцию для автоматического обновления каждый день, используя Pub / sub и планировщик облака.

это функция, которую я использую:

from google.cloud import firestore
from datetime import datetime, timedelta

db = firestore.Client.from_service_account_json('credentials/gc.json')

def update_collection__persons():   
    persons = db.collection(u'collection__persons')
    #person_docs = persons.stream()
    person_docs = [snapshot for snapshot in persons.stream()]

    for person_doc in person_docs:
        person_dict = person_doc.to_dict()
        #last_updated = person_dict['last_updated']
        #last_processed = person_dict['last_processed']
        #dt_last_updated = datetime(1, 1, 1) + timedelta(microseconds=last_updated/10)
        #dt_last_processed = datetime(1, 1, 1) + timedelta(microseconds=last_processed/10)

        #if dt_last_processed < dt_last_updated:
        orders = db.collection(u'collection__orders').where(u'email', u'==', person_dict['email'])
        orders_docs = [snapshot for snapshot in orders.stream()]

        sum_price = 0
        count = 0
        date_add_list = []

        for order_doc in orders_docs:
            order_dict = order_doc.to_dict() 
            sum_price += order_dict['total_price']
            count +=1
            date_add_list.append(order_dict['dateAdded'])
        if count > 0:
            data = {'metrics': {'LTV': sum_price,
                                'AOV': sum_price/count,
                                'Quantity_orders': count,
                                'first_order_date': min(date_add_list),
                                'last_order_date': max(date_add_list)},
                     'last_processed': int((datetime.utcnow() - datetime(1, 1, 1)).total_seconds() * 10000000),
                      'delta_last_updated_last_processed': 0}

            db.collection(u'collection__persons').document(person_dict['email']).set(data, merge = True)     

Я хочу поместить его в функции Google, у меня есть два вопроса здесь:

  1. Я получаю сообщение об ошибке, потому что когда функция срабатывает - похоже, она что-то передаетк этому, и это вызывает ошибку, потому что def просто ().

Я прочитал, что я должен поместить эти две переменные в мою функцию: https://cloud.google.com/functions/docs/calling/pubsub?hl=en

def My_function (event, context):

Я не понимаю, что мне делать с этими переменными, что я должен изменить в своей функции для работы с этими переменными?

Я хочу писать логи, как только я запустил функцию, чтобы узнать, хорошо ли запустилась функция и когда она закончится, а также знать, как писать, если что-то не так, я прочитал, что могу сделать это с помощью google.cloud. logging: Google Cloud Functions Python Logging проблема

Но я не знаю, как реализовать эти журналы в моей функции, у меня нет большого опыта в этом

1 Ответ

2 голосов
/ 12 октября 2019

Облачная функция pubsub, которая вызывает update_blanklabelcom__persons(), будет выглядеть примерно так:

from google.cloud import firestore
from datetime import datetime, timedelta

# Service account provided by Cloud Function environment
db = firestore.Client()

def update_blanklabelcom__persons():   
    persons = db.collection(u'collection__persons')
    person_docs = [snapshot for snapshot in persons.stream()]

    for person_doc in person_docs:
        person_dict = person_doc.to_dict()
        orders = db.collection(u'collection__orders').where(u'email', u'==', person_dict['email'])
        orders_docs = [snapshot for snapshot in orders.stream()]

        sum_price = 0
        count = 0
        date_add_list = []

        for order_doc in orders_docs:
            order_dict = order_doc.to_dict() 
            sum_price += order_dict['total_price']
            count +=1
            date_add_list.append(order_dict['dateAdded'])
        if count > 0:
            data = {'metrics': {'LTV': sum_price,
                                'AOV': sum_price/count,
                                'Quantity_orders': count,
                                'first_order_date': min(date_add_list),
                                'last_order_date': max(date_add_list)},
                     'last_processed': int((datetime.utcnow() - datetime(1, 1, 1)).total_seconds() * 10000000),
                      'delta_last_updated_last_processed': 0}

            db.collection(u'collection__persons').document(person_dict['email']).set(data, merge = True) 


def persons_pubsub(event, context):

    print("update blanklabel started")
    update_blanklabelcom__persons()
    print("update blanklabel done")

Вам не нужно использовать переменные event и context. Они предоставляют дополнительную информацию о событии pubsub, вызвавшем функцию. Для записи логов вы можете использовать print операторов. Все, что вы печатаете, будет отображаться в журналах облачных функций с отметкой времени:

enter image description here

Я развернул эту облачную функцию с консоли, , как описаноздесь . Вот requirements.txt:

google-cloud-firestore>=1.4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...