跳转到主要内容

Microsoft Azure Azure Queue Storage Client Library for Python

项目描述

Azure 存储队列客户端库,用于 Python

Azure 队列存储是一种服务,用于存储大量消息,可以通过使用 HTTP 或 HTTPS 进行身份验证的调用从世界任何地方访问。单个队列消息的大小最多为 64 KiB,一个队列可以包含数百万条消息,最多达到存储帐户的总容量限制。

队列存储的常见用途包括

  • 创建工作队列以异步处理
  • 在分布式应用程序的不同部分之间传递消息

源代码 | 包(PyPI) | 包(Conda) | API参考文档 | 产品文档 | 示例

入门指南

先决条件

安装包

使用pip安装Azure存储队列的Python客户端库

pip install azure-storage-queue

创建存储帐户

如果您想创建新的存储帐户,可以使用Azure门户Azure PowerShellAzure CLI

# Create a new resource group to hold the storage account -
# if using an existing resource group, skip this step
az group create --name my-resource-group --location westus2

# Create the storage account
az storage account create -n my-storage-account-name -g my-resource-group

创建客户端

Python的Azure存储队列客户端库允许您与三种类型的资源进行交互:存储帐户本身、队列和消息。与这些资源的交互从客户端的实例开始。要创建客户端对象,您需要存储帐户的队列服务终结点URL和一个允许您访问存储帐户的凭据

from azure.storage.queue import QueueServiceClient

service = QueueServiceClient(account_url="https://<my-storage-account-name>.queue.core.windows.net/", credential=credential)

查找帐户URL

您可以使用Azure门户Azure PowerShellAzure CLI查找存储帐户的队列服务URL

# Get the queue service URL for the storage account
az storage account show -n my-storage-account-name -g my-resource-group --query "primaryEndpoints.queue"

凭据类型

根据您希望使用的授权类型,credential参数可以以多种形式提供

  1. 要使用共享访问签名(SAS)令牌,将令牌作为字符串提供。如果您的帐户URL包含SAS令牌,则省略凭据参数。您可以从Azure门户中的“共享访问签名”下生成SAS令牌,或使用其中一个generate_sas()函数为存储帐户或队列创建SAS令牌

    from datetime import datetime, timedelta
    from azure.storage.queue import QueueServiceClient, generate_account_sas, ResourceTypes, AccountSasPermissions
    
    sas_token = generate_account_sas(
        account_name="<storage-account-name>",
        account_key="<account-access-key>",
        resource_types=ResourceTypes(service=True),
        permission=AccountSasPermissions(read=True),
        start=datetime.utcnow(),
        expiry=datetime.utcnow() + timedelta(hours=1)
    )
    
    queue_service_client = QueueServiceClient(account_url="https://<my_account_name>.queue.core.windows.net", credential=sas_token)
    
  2. 要使用存储帐户共享密钥(也称为帐户密钥或访问密钥),将密钥作为字符串提供。您可以在Azure门户的“访问密钥”部分下找到它,或者运行以下Azure CLI命令

    az storage account keys list -g MyResourceGroup -n MyStorageAccount

    将密钥作为凭据参数用于验证客户端

    from azure.storage.queue import QueueServiceClient
    service = QueueServiceClient(account_url="https://<my_account_name>.queue.core.windows.net", credential="<account_access_key>")
    
  3. 要使用Azure Active Directory(AAD)令牌凭据,提供从azure-identity库获取的所需凭据类型的实例。例如,可以使用DefaultAzureCredential来验证客户端。

    这需要一些初始设置

    使用返回的令牌凭据进行客户端身份验证

        from azure.identity import DefaultAzureCredential
        from azure.storage.queue import QueueServiceClient
        token_credential = DefaultAzureCredential()
    
        queue_service_client = QueueServiceClient(
            account_url="https://<my_account_name>.queue.core.windows.net",
            credential=token_credential
        )
    

从连接字符串创建客户端

根据您的用例和授权方法,您可能更喜欢使用存储连接字符串初始化客户端实例,而不是单独提供账户 URL 和凭据。为此,将存储连接字符串传递给客户端的 from_connection_string 类方法

from azure.storage.queue import QueueServiceClient

connection_string = "DefaultEndpointsProtocol=https;AccountName=xxxx;AccountKey=xxxx;EndpointSuffix=core.windows.net"
service = QueueServiceClient.from_connection_string(conn_str=connection_string)

您可以在 Azure 门户的“访问密钥”部分或通过运行以下 CLI 命令找到您的存储账户的连接字符串:

az storage account show-connection-string -g MyResourceGroup -n MyStorageAccount

关键概念

以下组件构成了 Azure 队列服务

  • 存储账户本身
  • 存储账户中的一个队列,其中包含一组消息
  • 队列中的消息,可以是任何格式,大小最多为 64 KiB

Azure 存储队列 Python 客户端库允许您通过使用专门的客户端对象与这些组件交互。

异步客户端

此库包括一个完整的异步 API,支持 Python 3.5+。要使用它,您必须首先安装异步传输,例如 aiohttp。有关更多信息,请参阅 azure-core 文档

当不再需要时,应关闭异步客户端和凭据。这些对象是异步上下文管理器,并定义了异步 close 方法。

客户端

提供了两个不同的客户端来与队列服务的不同组件交互

  1. QueueServiceClient - 此客户端表示与 Azure 存储账户的交互,允许您获取预配置的客户端实例来访问队列。它提供了检索和配置账户属性的操作,以及列出、创建和删除账户内的队列的操作。要执行特定队列的操作,请使用 get_queue_client 方法获取客户端。
  2. QueueClient - 此客户端表示与特定队列的交互(该队列可能尚不存在)。它提供了创建、删除或配置队列的操作,并包括发送、接收、查看、删除和更新队列中消息的操作。

消息

  • 发送 - 将消息添加到队列,并可选地为消息设置可见性超时。
  • 接收 - 从队列中检索消息,使其对其他消费者不可见。
  • 查看 - 从队列前面检索消息,而不更改消息可见性。
  • 更新 - 更新消息的可见性超时和/或消息内容。
  • 删除 - 从队列中删除指定的消息。
  • 清除 - 从队列中清除所有消息。

示例

以下部分提供了几个代码片段,涵盖了 Storage 队列的一些常见任务,包括

创建队列

在您的存储账户中创建队列

from azure.storage.queue import QueueClient

queue = QueueClient.from_connection_string(conn_str="<connection_string>", queue_name="myqueue")
queue.create_queue()

使用异步客户端创建队列

from azure.storage.queue.aio import QueueClient

queue = QueueClient.from_connection_string(conn_str="<connection_string>", queue_name="myqueue")
await queue.create_queue()

发送消息

向您的队列发送消息

from azure.storage.queue import QueueClient

queue = QueueClient.from_connection_string(conn_str="<connection_string>", queue_name="myqueue")
queue.send_message("I'm using queues!")
queue.send_message("This is my second message")

异步发送消息

import asyncio
from azure.storage.queue.aio import QueueClient

queue = QueueClient.from_connection_string(conn_str="<connection_string>", queue_name="myqueue")
await asyncio.gather(
    queue.send_message("I'm using queues!"),
    queue.send_message("This is my second message")
)

接收消息

接收和处理队列中的消息

from azure.storage.queue import QueueClient

queue = QueueClient.from_connection_string(conn_str="<connection_string>", queue_name="myqueue")
response = queue.receive_messages()

for message in response:
    print(message.content)
    queue.delete_message(message)

# Printed messages from the front of the queue:
# >> I'm using queues!
# >> This is my second message

批量接收和处理消息

from azure.storage.queue import QueueClient

queue = QueueClient.from_connection_string(conn_str="<connection_string>", queue_name="myqueue")
response = queue.receive_messages(messages_per_page=10)

for message_batch in response.by_page():
    for message in message_batch:
        print(message.content)
        queue.delete_message(message)

异步接收和处理消息

from azure.storage.queue.aio import QueueClient

queue = QueueClient.from_connection_string(conn_str="<connection_string>", queue_name="myqueue")
response = queue.receive_messages()

async for message in response:
    print(message.content)
    await queue.delete_message(message)

可选配置

可以在客户端和每个操作级别传递的可选关键字参数。

重试策略配置

在实例化客户端时,使用以下关键字参数来配置重试策略

  • retry_total (int): 允许的重试总次数。优先于其他计数。如果不想在请求上重试,请传入 retry_total=0。默认为10。
  • retry_connect (int): 在连接相关错误上重试的次数。默认为3。
  • retry_read (int): 在读取错误上重试的次数。默认为3。
  • retry_status (int): 在不良状态码上重试的次数。默认为3。
  • retry_to_secondary (bool): 如果可能,请求是否应该重试到二级。仅当使用RA-GRS账户且可能处理过时数据时才启用。默认为 False

其他客户端/每操作配置

可以在客户端或每操作中指定的其他可选配置关键字参数。

客户端关键字参数

  • connection_timeout (int): 客户端建立与服务器连接将等待的秒数。默认为20秒。
  • read_timeout (int): 客户端在连续读取操作之间等待服务器响应的秒数。这是一个套接字级别超时,不受整体数据大小的影响。客户端端读取超时将自动重试。默认为60秒。
  • transport (Any): 用户提供的用于发送HTTP请求的传输。

每操作关键字参数

  • raw_response_hook (callable): 给定的回调使用服务返回的响应。
  • raw_request_hook (callable): 给定的回调使用在发送到服务之前请求。
  • client_request_id (str): 可选的用户指定的请求标识。
  • user_agent (str): 将自定义值附加到要随请求发送的用户代理头中。
  • logging_enable (bool): 启用DEBUG级别的日志记录。默认为False。也可以在客户端级别传入以启用所有请求。
  • logging_body (bool): 启用记录请求和响应正文。默认为False。也可以在客户端级别传入以启用所有请求。
  • headers (dict): 以键值对的形式传入自定义头。例如:headers={'CustomValue': value}

故障排除

一般

存储队列客户端抛出在Azure Core中定义的异常。

此列表可用于参考以捕获抛出的异常。要获取异常的具体错误代码,请使用error_code属性,即exception.error_code

日志记录

此库使用标准的logging库进行日志记录。HTTP会话(URL、头等)的基本信息以INFO级别记录。

可以通过在客户端使用logging_enable参数启用详细的DEBUG级别日志记录,包括请求/响应正文和未脱敏的头。

import sys
import logging
from azure.storage.queue import QueueServiceClient

# Create a logger for the 'azure.storage.queue' SDK
logger = logging.getLogger('azure.storage.queue')
logger.setLevel(logging.DEBUG)

# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)

# This client will log detailed information about its HTTP sessions, at DEBUG level
service_client = QueueServiceClient.from_connection_string("your_connection_string", logging_enable=True)

同样,logging_enable可以在客户端未启用的情况下为单个操作启用详细日志记录。

service_client.get_service_stats(logging_enable=True)

下一步

更多示例代码

从我们的队列示例开始。

在SDK的GitHub存储库中,有多个存储队列Python SDK示例可供您使用。这些示例提供了在处理存储队列时常见场景的示例代码。

其他文档

有关Azure队列存储的更多文档,请参阅docs.microsoft.com上的Azure队列存储文档

贡献

此项目欢迎贡献和建议。大多数贡献都需要您同意贡献者许可协议(CLA),声明您有权利,并且确实授予我们使用您贡献的权利。有关详细信息,请访问https://cla.microsoft.com

提交拉取请求时,CLA-bot将自动确定您是否需要提供CLA,并相应地装饰PR(例如,标签、注释)。只需遵循机器人提供的说明即可。您在整个使用我们的CLA的仓库中只需要这样做一次。

此项目已采用Microsoft开源行为准则。有关更多信息,请参阅行为准则常见问题解答或联系opencode@microsoft.com,如有任何其他问题或评论。

发布历史

12.12.0 (2024-09-17)

新增功能

  • 12.12.0b1的稳定版功能

12.12.0b1 (2024-08-07)

新增功能

  • 增加了对服务版本2024-11-04的支持。

其他更改

  • 将最低的azure-core依赖项提升到1.30.0。

12.11.0 (2024-07-18)

新增功能

  • 12.11.0b1的稳定版功能

12.11.0b1 (2024-06-11)

新增功能

  • 更新OAuth实现,使用Bearer challenge返回的AAD范围。
  • 修复了一个问题,即客户端指定的服务版本可能会被忽略。

12.10.0 (2024-05-07)

新增功能

  • 12.10.0b1的稳定版功能

12.10.0b1 (2024-04-16)

此版本及所有后续版本将需要Python 3.8+。Python 3.7不再受支持。

新增功能

  • generate_account_sas API中添加了services参数,这使得能够生成用于多个服务的SAS令牌。默认情况下,SAS令牌服务作用域将默认为当前服务。

错误修复

  • typing-extensions的依赖项提升到>=4.6.0,以避免在Python 3.12上使用typing.TypeVar时潜在的TypeError
  • 修复了使用异步OAuth凭据时,认证错误可能会引发AttributeError而不是ClientAuthenticationError的问题。

12.9.0 (2023-12-05)

其他更改

  • 在整个包中更新了类型提示,并使MyPy在CI期间运行。如果某些公共类型之前错误或不完整,可能已对其进行调整。

12.8.0 (2023-11-07)

新增功能

  • 12.18.0b1的稳定版功能

12.8.0b1 (2023-10-17)

新增功能

  • audience添加为一个可选关键字,可以在具有credential参数的API上指定。此关键字仅在提供的凭据类型为TokenCredential时才有效。

12.7.3 (2023-10-10)

错误修复

  • 修复了在客户端构造过程中提供无效类型给credential时的问题,对象的__str__会出现在异常消息中,因此可能会被记录。

12.7.2 (2023-09-25)

错误修复

  • 修复了在客户端配置加密时忽略user_agent的问题,在send_messagereceive_messagereceive_messagesupdate_messagepeek_messages中。

12.7.1 (2023-09-13)

错误修复

  • 修复了create_configuration中的破坏性错误KeyError: 'sdk_moniker'。注意:这不是一个导出方法,因此不应该直接导入或调用。

12.7.0 (2023-09-12)

新增功能

  • 12.7.0b1的稳定版本功能。

12.7.0b1(2023-08-08)

其他更改

  • azure-core最低依赖性提升到1.28.0,并将typing-extensions提升到4.3.0。

12.6.0 (2023-02-22)

新增功能

  • 12.6.0b1的稳定版本功能。

12.6.0b1(2023-02-02)

其他更改

  • 移除了msrest依赖。
  • typing-extensions>=4.0.1添加为依赖项。
  • isodate>=0.6.1添加为依赖项。
  • 添加了额外的依赖项aio来安装可选的异步依赖项。使用pip install azure-storage-queue[aio]进行安装。

12.5.0 (2022-10-11)

新增功能

  • 12.5.0b1的稳定版本功能。

其他更改

  • 将所有客户端的默认read_timeout值更改为60秒。

12.5.0b1(2022-08-23)

此版本和所有未来版本将需要Python 3.7+。Python 3.6不再受支持。

新增功能

  • 添加了对AzureNamedKeyCredential作为有效credential类型的支持。

12.4.0 (2022-07-07)

新增功能

  • 12.4.0b1的稳定版本功能。

12.4.0b1(2022-06-15)

新增功能

  • 引入了队列消息客户端端加密的2.0版本,该版本使用AES-GCM-256加密。1.0版本已弃用,不再被认为是安全的。如果您正在使用客户端端加密,强烈建议您升级到2.0版本。可以通过任何客户端构造函数上的encryption_version关键字(例如encryption_version='2.0')指定加密版本。

12.3.0 (2022-05-09)

新增功能

  • 12.3.0b1的稳定版本功能。

错误修复

  • 修复了上一个beta版本中引入的错误,该错误在使用某些服务级别操作尝试使用Account SAS时导致身份验证错误。

12.3.0b1(2022-04-14)

新增功能

  • receive_messages()中添加了对max_messages的支持,以指定从队列中接收的消息的最大数量。

其他更改

  • 更新了SAS令牌生成,默认使用最新支持的服务版本。切换到最新版本还包括了如何生成账户SAS的改变,以反映服务在SAS生成方面对2020-12-06服务版本的更改。
  • 更新了receive_messages()的文档,解释迭代器行为和生命周期。
  • queue_samples_message.py(以及异步等效版本)中添加了一个示例,展示了在receive_messages()中使用max_messages

12.2.0 (2022-03-08)

此版本和所有未来版本将需要Python 3.6+。Python 2.7不再受支持。

错误修复

  • 更新azure-core依赖项以避免安装不一致的依赖项。

12.1.6 (2021-04-20)

修复

  • 使conn_str中的AccountNameAccountKey等参数不区分大小写
  • 修复了未关闭的ThreadPoolExecutor(#8955)

12.1.5 (2021-01-13)

新功能

  • 添加了对AzureSasCredential的支持,允许在长期存在的客户端中轮换SAS。

12.1.4 (2020-11-10)

新功能

  • 在QueueClient上添加了receive_message以支持从队列中接收一条消息(#14844,#14762)

注释

  • 更新了依赖项azure-core,从azure-core<2.0.0,>=1.6.0到azure-core<2.0.0,>=1.9.0,以获取AzureError上的continuation_token属性。

12.1.3 (2020-09-10)

修复

  • 修复了QueueClient类型声明(#11392)。

12.1.2

注释

  • 将依赖项从azure-core<2.0.0,>=1.2.2更新到azure-core<2.0.0,>=1.6.0。

12.1.1 (2020-03-10)

修复

  • 响应始终以UTF8解码

注释

  • StorageUserAgentPolicy现在被UserAgentPolicy从azure-core替换。因此,自定义用户代理现在作为前缀添加,而不是追加。

12.1.0 (2019-12-04)

新功能

  • 所有客户端现在都有一个 close() 方法,用于在没有使用上下文管理器的情况下关闭客户端打开的套接字。

12.0.0 (2019-10-31)

破坏性变更

  • QueueClient 现在只接受必需的字符串参数 queue_nameaccount_url。要使用 queue_url,必须使用 from_queue_url 方法。
  • set_queue_access_policy 必须包含参数 signed_identifiers
  • NoRetry 策略已被移除。使用关键字参数 retry_total=0 表示不重试。
  • NoEncodePolicyNoDecodePolicy 已被移除。使用 message_encode_policy=Nonemessage_decode_policy=None
  • 已移除从两个模块意外暴露的类型。应该仅从 azure.storage.queue.aio 导入 QueueServiceClientQueueClient
  • 一些参数现在只能是关键字参数,而不是位置参数。以下是一些例子:
    • loop
    • max_concurrency
    • validate_content
    • timeout 等。
  • QueueMessage 的参数已从 insertion_timetime_next_visibleexpiration_time 重命名为 inserted_onnext_visible_onexpires_on
  • Logging 已重命名为 QueueAnalyticsLogging
  • enqueue_message 现在称为 send_message
  • 客户端和模型文件已变为内部使用。用户应仅从顶级模块 azure.storage.queueazure.storage.queue.aio 导入。
  • QueueServiceClientQueueClient 上的 generate_shared_access_signature 方法已被模块级函数 generate_account_sasgenerate_queue_sas 替换。
  • get_service_stats 现在返回一个字典。
  • get_service_properties 现在返回一个字典,其键与 set_service_properties 中的键一致。

新功能

  • ResourceTypesServices 现在有方法 from_string,它接受字符串参数。

修复和改进

  • 修复了 XML 被双重编码和双重解码的问题。

12.0.0b4 (2019-10-08)

破坏性变更

  • 权限模型。
    • AccountPermissionsQueuePermissions 已分别重命名为 AccountSasPermissionsQueueSasPermissions
    • 从它们两个中移除了枚举样式的列表参数。
    • __add____or__ 方法已被移除。
  • max_connections 现在重命名为 max_concurrency

新功能

  • AccountSasPermissionsQueueSasPermissions 现在有方法 from_string,它接受字符串参数。

12.0.0b3 (2019-09-10)

依赖项更新

  • 已采用 azure-core 1.0.0b3

    • 如果您以后想回滚到 azure-storage-queue 的先前版本,或需要 azure-core 1.0.0b1 或 azure-core 1.0.0b2 的其他 Azure SDK 库,您必须显式安装 azure-core 的特定版本。例如

    pip install azure-core==1.0.0b2 azure-storage-queue==12.0.0b2

12.0.0b2 (2019-08-06)

破坏性变更

  • 列出操作的行为已被修改
    • 之前的 marker 参数已被移除。
    • 可迭代的响应对象现在支持一个 by_page 函数,该函数将返回一个包含结果批次的二级迭代器。此函数支持一个 continuation_token 参数,以替换之前的 marker 参数。
  • 新的列出行为也适用于 receive_messages 操作。
    • 接收操作返回一个与之前相同的消息迭代器。
    • 返回的迭代器支持一个 by_page 操作,以批量接收消息。

新功能

  • 已向子命名空间 azure.storage.queue.aio 添加了异步 API。
  • 现在支持分布式跟踪框架 OpenCensus。

依赖项更新

  • 已采用 azure-core 1.0.0b2

    • 如果您以后想回滚到 azure-storage-queue 12.0.0b1,或需要 azure-core 1.0.0b1 的其他 Azure SDK 库,您必须显式安装 azure-core 1.0.0b1。例如

    pip install azure-core==1.0.0b1 azure-storage-queue==12.0.0b1

修复和改进

  • 对重复和共享代码进行了通用重构。

12.0.0b1 (2019-07-02)

12.0.0b1 版本是我们创建一个用户友好且符合 Python 语言的 Azure 存储队列客户端库的第一版预览。有关此版本和其他 Azure SDK 库的预览发布信息,请访问 https://aka.ms/azure-sdk-preview1-python

重大变更:新的 API 设计

  • 操作现在限定在特定的客户端范围内

    • QueueServiceClient:此客户端处理账户级别的操作。包括管理服务属性和列出账户内的队列。
    • QueueClient:此客户端处理特定队列内的操作。包括创建或删除该队列,以及入队和出队消息。

    可以通过导航客户端层次结构或直接使用资源(账户或队列)的 URL 来访问这些客户端。有关新 API 的完整详情,请参阅 参考文档

  • 新的消息迭代器,用于连续流式传输从队列接收消息。

  • 基于新的 azure-core 库的新底层 REST 管道实现。

  • 客户端和管道配置现在可以通过客户端级别和操作级别的关键字参数进行访问。有关所有可选配置参数的完整列表,请参阅参考文档。

  • 使用 azure-identity 凭据进行身份验证

  • 新的错误层次结构

    • 所有服务错误现在将使用基本类型:azure.core.exceptions.HttpResponseError
    • 从该基本类型派生出几个特定异常类型,用于常见的错误场景
      • ResourceNotFoundError:资源(例如队列、消息)未找到。通常是 404 状态码。
      • ResourceExistsError:资源冲突 - 通常是在尝试创建已存在的资源时发生。
      • ResourceModifiedError:资源已被修改(例如覆盖),因此当前操作冲突。或者,如果操作的条件未满足,也可能抛出此异常。
      • ClientAuthenticationError:身份验证失败。
  • 不再有针对 get_metadata 的特定操作 - 使用 get_properties 代替。

  • 不再有针对 exists 的特定操作 - 使用 get_properties 代替。

  • 操作 get_queue_aclset_queue_acl 已重命名为 get_queue_access_policyset_queue_access_policy

  • 操作 put_message 已重命名为 enqueue_message

  • 操作 get_messages 已重命名为 receive_messages

2.0.1

  • 已更新对 azure-storage-common 的依赖。

2.0.0

  • 支持 2018-11-09 REST 版本。

1.4.0

  • 在 Python 3 中不再安装 azure-storage-nspkg(基于 PEP420 的命名空间包)

1.3.0

  • 支持 2018-03-28 REST 版本。请参阅我们的 REST API 文档和博客,了解相关新增功能。

1.2.0rc1

  • 支持 2017-11-09 REST 版本。请参阅我们的 REST API 文档和博客,了解相关新增功能。
  • 增加了对 HTTPS 请求 OAuth 身份验证的支持(请注意,此功能处于预览状态)。

1.1.0

  • 支持 2017-07-29 REST 版本。请参阅我们的 REST API 文档和博客,了解相关新增功能。
  • 队列消息现在可以有任意大的或无限的生命周期。
  • 错误消息现在包含来自 x-ms-error-code 报头值的 ErrorCode。

1.0.0

  • 该软件包已从 Apache 2.0 许可证切换到 MIT 许可证。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

azure_storage_queue-12.12.0.tar.gz (189.9 kB 查看哈希)

上传 源代码

构建分发

azure_storage_queue-12.12.0-py3-none-any.whl (182.4 kB 查看哈希)

上传 Python 3

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面