Использование Python для запроса журналов GCP Stackdriver - PullRequest
0 голосов
/ 12 мая 2018

Я использую Python3 для запроса Stackdriver для журналов GCP. К сожалению, записи журнала, содержащие важные данные, возвращаются мне как «NoneType», а не как «dict» или «str». В результате «entry.payload» имеет тип «None», а «entry.payload_pb» содержит данные, которые я хочу, но они искажены.

Есть ли способ заставить Stackdriver вернуть эти данные в чистом формате, или есть способ, которым я могу их проанализировать? Если нет, есть ли способ запросить эти данные, который лучше, чем то, что я делаю, и дает чистые данные?

Мой код выглядит примерно так:

#!/usr/bin/python3

from google.cloud.logging import Client, ASCENDING, DESCENDING
from google.oauth2.service_account import Credentials

projectName = 'my_project'
myFilter = 'logName="projects/' + projectName + '/logs/compute.googleapis.com%2Factivity_log"'

client = Client(project = projectName)
entries = client.list_entries(order_by=DESCENDING, page_size = 500, filter_ = myFilter)
for entry in entries:
    if isinstance(entry.payload, dict):
        print(entry.payload)
    if isinstance(entry.payload, str):
        print(entry.payload)
    if isinstance(entry.payload, None):
        print(entry.payload_pb)

Данные "entry.payload_pb" всегда начинаются так:

type_url: "type.googleapis.com/google.cloud.audit.AuditLog"
 value: "\032;\n9gcp-user@my-project.iam.gserviceaccount.com"I\n\r129.105.16.28\0228

Ответы [ 5 ]

0 голосов
/ 06 августа 2019

Я следовал за ответом @ rhinestone-cowguy, но думаю, что пример использования поможет людям, которые найдут этот ответ.Чтобы использовать скомпилированный (прото) код:

from google.cloud import logging
import audit_log_pb2

client = logging.Client()
PROJECT_IDS = ["one-project", "another-project"]

for entry in client.list_entries(projects=PROJECT_IDS):  # API call(s)

    # The proto payload is an Any message.
    audit_log = audit_log_pb2.AuditLog()
    entry.payload.Unpack(audit_log)
    print(audit_log)

Использование сообщения Any задокументировано в Python Generated Code .

0 голосов
/ 28 августа 2018

На самом деле я пропустил это, но вы можете отключить gRPC и заставить API возвращать полезную нагрузку dict (JSON), устанавливая переменную окружения GOOGLE_CLOUD_DISABLE_GRPC в непустую строку, например, GOOGLE_CLOUD_DISABLE_GRPC=true.

Это заполнит payload вместо payload_pb - проще, чем компиляция протобуфера, который может быть устаревшим!

0 голосов
/ 18 мая 2018

LogEntry.proto_payload - это Любое сообщение , которое кодирует некоторое другое сообщение прото буфера.Тип прототипа сообщения указывается type_url, а тело сообщения сериализуется в поле value.После определения типа вы можете десериализовать его с помощью чего-то вроде

from google.cloud.audit import AuditLog
...

audit_log = AuditLog()
audit_log.ParseFromString(entry.payload_pb.value)

. Сообщение AuditLog доступно по адресу https://github.com/googleapis/googleapis/blob/master/google/cloud/audit/audit_log.proto, и соответствующие определения Python могут быть построены с использованиемКомпилятор protoc

Обратите внимание, что некоторые поля сообщения AuditLog могут содержать и другие сообщения Any.Больше подробностей на https://cloud.google.com/logging/docs/audit/api/

0 голосов
/ 25 мая 2018

Если у кого-то возникла та же проблема, что и у меня, вот как я ее решил:

1) Скачайте и установите protobuf. Я сделал это на макинтош с варкой 2) Скачайте и установите grpcio. Я использовал pip install grpcio
3) Загрузите «API Google» в известный каталог. Я использовал / tmp, и эта команда git clone https://github.com/googleapis/googleapis
4) Перейдите в корневой каталог репозитория, который вы только что загрузили на шаге 3
. 5) Используйте protoc для создания репозитория Python. Эта команда работала для меня
protoc -I=/tmp/googleapis/ --python_out=/tmp/ /tmp/googleapis/google/cloud/audit/audit_log.proto
6) Ваш файл audit_log_pb2.py должен существовать в /tmp/audit_log_pb2.py
7) Поместите этот файл по правильному пути ИЛИ в ту же директорию, что и ваш скрипт.
8) Добавьте эту строку к импорту в вашем скрипте:
import audit_log_pb2
9) После того, как я это сделал, часть entry.payload записи Protobuf постоянно заполнялась диктовками.

ОБРАТИТЕ ВНИМАНИЕ: Вы должны проверить, какую версию protoc вы используете, с помощью следующей команды protoc --version. Вы действительно хотите использовать protoc 3.x, потому что файл, из которого мы строим, относится к версии 3 спецификации. Пакет Ubuntu, который я установил на Linux, был версии 2, и это было довольно неприятно. Кроме того, хотя этот файл был создан для Python 2.x, он, кажется, прекрасно работает с Python 3.x.

0 голосов
/ 12 мая 2018

Похоже, что-то не работает в библиотеке python, связанной с синтаксическим анализом protobuf для ведения журнала.Я обнаружил две старые проблемы

  1. https://github.com/GoogleCloudPlatform/google-cloud-python/issues/3218
  2. https://github.com/GoogleCloudPlatform/google-cloud-python/issues/2674

, которые, кажется, были решены некоторое время назад - но я считаю, что проблема была вновь введена.У меня открыт запрос на поддержку Google по этому вопросу, и они изучают его.

В качестве обходного пути - вы можете использовать два варианта:

  1. Вы можете создать экспорт (сток) в BigQuery.- поэтому в этом случае вы легко запрашиваете свой журнал - проблема с этим подходом - он не экспортирует старые данные, которые вы собираете до создания экспорта.
  2. Вы можете использовать команду gcloud.Особенно

    gcloud logging read

Он очень мощный (поддерживает фильтры, временные метки) - но его формат вывода - yaml.Вы можете установить и использовать библиотеку PyYAML для преобразования журналов в словарь.

...