Azure blob 服务指标:获取给定 blob 的下载计数
Azure blob service metrics : get download count for a given blob
我正在使用 azure blob 存储来存储一些文件。
我想检索存储在 azure blob 存储中的给定 blob 的下载计数。
我该怎么做?
目前,我正在查看 TotalEgress,但这还不够,因为 TotalEgress 只为您提供 Total 中 blobstorage 服务的下载文件大小。
也许存在每个 blob 的出口,或类似的东西...?
有什么帮助吗?
据我所知,blob存储现在不支持直接获取下载数。
我建议您可以添加 feedback 关于此要求。
这里有两个解决方法:
1.On客户端。
您可以尝试创建一个应用来统计下载次数。
如果用户点击下载按钮或其他东西,获取下载计数(你可以将它存储到 blob 文件 matadata 中)并计算。
注意:天蓝色 blob 具有 public 和私有权限。如果 blob 是 public,我们可以直接从 url 下载 blob。所以我建议你可以尝试将 blob 权限设置为私有。这样下载次数t就对了
2.On服务器端。
据我所知,如果启用 Azure 存储帐户的诊断 blob 日志,它将记录 blob 的每个 read/write/delete 操作。
通过阅读这些操作,我认为您可以获得存储在 azure blob 存储中的给定 blob 的下载(getblob 操作)计数。
这些日志存储在 $log 容器中。
注意:存储日志有大小限制(20TB)和日期限制(MAX 365)。所以我建议你可以尝试 运行 a timertrigger webjob 来搜索日志。
在此 webjobs 中,您可以使用 azure 存储 SDK 的 CloudAnalyticsClient 获取日志并将编号和扫描日期存储在文件元数据中。每次当定时器触发 webjob 运行s 时,您只需要从上次扫描日期开始搜索上下文。(此解决方法可能会有一些延迟。)
更多关于如何使用CloudAnalyticsClient获取日志记录的详细信息,您可以参考下面的代码示例:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("");
CloudAnalyticsClient c1 = storageAccount.CreateCloudAnalyticsClient();
DateTimeOffset starttime = DateTime.Now.AddHours(-6);
DateTimeOffset endtime = DateTime.Now;
var r1 = c1.ListLogRecords(Microsoft.WindowsAzure.Storage.Shared.Protocol.StorageService.Blob, starttime, endtime).ToList();
if (r1 != null)
{
Console.WriteLine("Start");
}
int i = 0;
foreach (var item in r1)
{
if (item.RequestUrl.ToString().Contains("Penjs.png(your file name)"))
{
Console.WriteLine(string.Format("AuthenticationType : {0} , ClientRequestId : {1} , ReferrerHeader : {2} , RequestUrl : {3} , RequestStatus : {4} , HttpStatusCode : {5} , OperationType : {6}", item.AuthenticationType, item.ClientRequestId, item.ReferrerHeader, item.RequestUrl, item.RequestStatus, item.HttpStatusCode, item.OperationType));
Console.WriteLine("----------------------------------");
}
//count the get blob number
if (item.RequestUrl.ToString().Contains("Penjs.png") && item.OperationType == "GetBlob" && item.RequestStatus =="Success")
{
i++;
}
}
Console.WriteLine("Get/Dowanload blob time : " + i);
Console.WriteLine("Complete");
结果:
我正在使用 azure blob 存储来存储一些文件。
我想检索存储在 azure blob 存储中的给定 blob 的下载计数。
我该怎么做?
目前,我正在查看 TotalEgress,但这还不够,因为 TotalEgress 只为您提供 Total 中 blobstorage 服务的下载文件大小。
也许存在每个 blob 的出口,或类似的东西...?
有什么帮助吗?
据我所知,blob存储现在不支持直接获取下载数。
我建议您可以添加 feedback 关于此要求。
这里有两个解决方法:
1.On客户端。
您可以尝试创建一个应用来统计下载次数。
如果用户点击下载按钮或其他东西,获取下载计数(你可以将它存储到 blob 文件 matadata 中)并计算。
注意:天蓝色 blob 具有 public 和私有权限。如果 blob 是 public,我们可以直接从 url 下载 blob。所以我建议你可以尝试将 blob 权限设置为私有。这样下载次数t就对了
2.On服务器端。
据我所知,如果启用 Azure 存储帐户的诊断 blob 日志,它将记录 blob 的每个 read/write/delete 操作。
通过阅读这些操作,我认为您可以获得存储在 azure blob 存储中的给定 blob 的下载(getblob 操作)计数。
这些日志存储在 $log 容器中。
注意:存储日志有大小限制(20TB)和日期限制(MAX 365)。所以我建议你可以尝试 运行 a timertrigger webjob 来搜索日志。 在此 webjobs 中,您可以使用 azure 存储 SDK 的 CloudAnalyticsClient 获取日志并将编号和扫描日期存储在文件元数据中。每次当定时器触发 webjob 运行s 时,您只需要从上次扫描日期开始搜索上下文。(此解决方法可能会有一些延迟。)
更多关于如何使用CloudAnalyticsClient获取日志记录的详细信息,您可以参考下面的代码示例:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("");
CloudAnalyticsClient c1 = storageAccount.CreateCloudAnalyticsClient();
DateTimeOffset starttime = DateTime.Now.AddHours(-6);
DateTimeOffset endtime = DateTime.Now;
var r1 = c1.ListLogRecords(Microsoft.WindowsAzure.Storage.Shared.Protocol.StorageService.Blob, starttime, endtime).ToList();
if (r1 != null)
{
Console.WriteLine("Start");
}
int i = 0;
foreach (var item in r1)
{
if (item.RequestUrl.ToString().Contains("Penjs.png(your file name)"))
{
Console.WriteLine(string.Format("AuthenticationType : {0} , ClientRequestId : {1} , ReferrerHeader : {2} , RequestUrl : {3} , RequestStatus : {4} , HttpStatusCode : {5} , OperationType : {6}", item.AuthenticationType, item.ClientRequestId, item.ReferrerHeader, item.RequestUrl, item.RequestStatus, item.HttpStatusCode, item.OperationType));
Console.WriteLine("----------------------------------");
}
//count the get blob number
if (item.RequestUrl.ToString().Contains("Penjs.png") && item.OperationType == "GetBlob" && item.RequestStatus =="Success")
{
i++;
}
}
Console.WriteLine("Get/Dowanload blob time : " + i);
Console.WriteLine("Complete");
结果: