#python #google-cloud-platform #google-kubernetes-engine #google-cloud-logging #google-cloud-trace
#python #google-облачная платформа #google-kubernetes-engine #google-cloud-ведение журнала #google-cloud-trace
Вопрос:
Я столкнулся с проблемой ведения журнала Google Cloud и трассировки Google Cloud с использованием Google cloud kubernetes
У меня есть приложение, которое использует тему gcloud pubsub, и я хочу объединить журналы в трассировке каждого вызова функции обработки сообщений pubsub
Мой код обработчика ведения журнала в Gcloud
class GCLHandler(CloudLoggingHandler):
def emit(self, record):
message = super(GCLHandler, self).format(record)
resource = Resource(
type='k8s_container',
labels={
'cluster_name': os.environ['CLUSTER_NAME'],
'container_name': os.environ['POD_APP_NAME'],
'location': os.environ['CLUSTER_LOCATION'],
'namespace_name': os.environ['POD_NAMESPACE'],
'pod_name': os.environ['POD_NAME'],
'project_id': _settings.PROJECT_NAME
}
)
labels: Dict[str, Any] = {
'k8s-pod/app': os.environ['POD_APP_NAME'],
'k8s-pod/app_kubernetes_io/managed-by': os.environ['POD_MANAGED_BY'],
'k8s-pod/pod-template-hash': os.environ['POD_TEMPLATE_HASH']
}
trace = getattr(record, 'traceId', None)
if trace is not None:
trace = f'projects/{_settings.PROJECT_NAME}/traces/{trace}'
self.transport.send(
record,
message,
resource=resource,
labels=labels,
trace=trace,
span_id=getattr(record, 'spanId', None)
)
Я использую интеграцию opensensus с трассировкой и протоколированием gcloud, поэтому я могу получить traceId и spanId и передать их в gcloud logging transport, он работает нормально, а LogEntry в logs viewer содержит правильные traceId и spanId
Мой код использования трассировки gcloud выглядит следующим образом
config_integration.trace_integrations(['logging'])
logger = logging.getLogger(__name__)
exporter = stackdriver_exporter.StackdriverExporter(
project_id=settings.PROJECT_NAME
)
async def handle_message(message: Message) -> None:
tracer = Tracer(exporter=exporter, sampler=AlwaysOnSampler())
with tracer.span(name=f'Message#{message.message_id}'):
logger.debug(f'debug')
logger.info(f'info')
logger.warning(f'warning')
Итак, я могу использовать эти журналы в Logs Viewer, но они не обрабатываются в одной трассировке, но если я использую gcloud trace viewer и выполняю поиск по traceId, я найду эту трассировку с подключенными журналами.
Вопрос: Есть ли какой-либо способ отобразить трассировку в просмотрщике журналов так, как она отображается в любой службе appengine как appengine.googleapis.com/Frequest_log ?
Комментарии:
1. Как я вижу, вы хотите иметь возможность отображать трассировку в просмотрщике журналов так, как она отображается в любой службе GAE as
appengine.googleapis.com/Frequest_log
, но вы не нашли способа ее настроить, я прав?2. @SerhiiRohoza Да, вы правы. На данный момент я понял, что мне следует создать родительский журнал с именем, отличным от лога дочерних журналов. Я постараюсь это сделать, и если это сработает, я создам ответ
3. Хорошо. Я с нетерпением жду вашего звонка. Если не повезло, у меня есть обходной путь, но это отнимает много времени.
4. @SerhiiRohoza Нет, это не работает, я создал простой текстовый ввод с logName pubsub_message и после этого отправил несколько журналов с logName stdout, и они не объединены в группы. Правда ли, что я могу создавать групповые журналы только с помощью HttpRequest log?
5. Извините, у меня нет на это времени: (Я создал поддельную полезную нагрузку http_request и сгруппировал свои журналы
Ответ №1:
Как это было подтверждено @Nikita Davydov в разделе комментариев, есть обходной путь: вы можете создать поддельную http_request
полезную нагрузку для группирования журналов.
Если у вас это не работает, вы можете отправить запрос на функцию в Google Public Issue Tracker, чтобы изменить текущее поведение.