我正在部署一个 Python 服务作为服务总线队列触发的 Azure 函数,用 Python 3.11.7 编写。主要服务有效,但我在将服务总线消息中的信息包含到日志中时遇到困难。具体来说,我希望将此信息存储在日志的 Properties 属性下。
按照 Microsoft 的文档,我尝试将上下文添加到字典中,然后将该字典作为日志的额外参数中的“custom_dimensions”值传递。这是我的代码:
import azure.functions as func
import logging
from opencensus.ext.azure.log_exporter import AzureLogHandler
logger = logging.getLogger(__name__)
logger.addHandler(AzureLogHandler())
app = func.FunctionApp()
@app.service_bus_queue_trigger(
arg_name="azservicebus",
queue_name="%INPUT_QUEUE%",
connection="CONNECTION",
)
def servicebus_queue_trigger(azservicebus: func.ServiceBusMessage):
servicebusmessage = azservicebus.get_body().decode("utf-8")
identifiers = {'prop__requestId': servicebusmessage['batchId'],
'prop__userId': servicebusmessage['userId']}
properties = {"custom_dimensions": identifiers}
logger.info("Message received", extra=properties)
我希望这会为每个服务总线消息创建一个日志,并在日志的属性中包含“prop_requestId”和“prop__userId”。但是,当我运行该函数时,它实际上最终会在 Azure 的 Log Analytics 工作区中创建 2 个日志:
创建的第一个日志具有预期的消息“已收到消息”,并且在日志的属性下包含所需的“prop__requestId”和“prop__userId”信息。但是,其他日志字段(例如,OperationName、OperationId、ParentId”)要么为空,要么全部填充为“0”。
创建的第二个日志具有预期消息“Message returned”,并且填充了其他日志字段(例如,OperationName =“servicebus_queue_trigger”)。但是,它不包含我试图提供的任何上下文。
但是,当我运行该函数时,它实际上最终会在 Azure 的 Log Analytics 工作区中创建 2 个日志。
是的,因为如果您在创建实例和后一个实例时将应用程序洞察链接到函数应用程序,则初始日志会自动从函数应用程序发送,通过您在代码中显式配置的
opencensus
。如果您的函数是从函数应用程序调用的,这是可行的。
当我的函数在本地运行时,我只能看到一个日志。
opencensus
生成的日志将具有以下sdk类型。
根据最新的更新,到 2024 年 9 月 30 日将不再支持OpenCensus。
您可以使用
azure-monitor-opentelemetry
库向 customDimensions 添加属性。