我遇到了使用谷歌云kubernetes 进行谷歌云日志记录和谷歌云跟踪的问题
我有一个使用gcloud pubsub主题的应用程序,我想在每个pubsub消息句柄func调用的跟踪中统一日志
我的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日志传输中,它运行良好,日志查看器中的LogEntry包含正确的traceId和span Id
我使用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跟踪查看器并按traceId搜索,我会找到这个带有连接日志的跟踪。Q: 有什么方法可以在日志查看器中显示跟踪,就像在任何appengine服务中显示的一样,如appengine.googleapis.com/Frequest_log?
正如@Nikita Davydov在评论部分所证实的那样,有一个解决方法:您可以创建一个伪造的http_request
负载来对日志进行分组。
如果它对你不起作用,你可以在谷歌公共问题跟踪器上提交一个功能请求,以改变当前的行为。