Доступ к метрикам Microsoft.Storage/storageAccounts/blobServices из кода

Я хочу получить метрики, связанные с пространством имен метрик BLOB-объектов, из учетной записи хранения Azure. Мне нужно прочитать значение BlobCount.

Изначально пробовал так:

                  var usedCapacityResults = await metricsClient.QueryResourceAsync(resourceId, new[] { "BlobCount1" },
                new MetricsQueryOptions
                {
                    MetricNamespace = "Blob",
                    Aggregations =
                    {
                        MetricAggregationType.Average
                    },
                    Granularity = TimeSpan.FromMinutes(5),
                    TimeRange = new QueryTimeRange(TimeSpan.FromMinutes(10))
                });

            if (usedCapacityResults.GetRawResponse().Status == StatusCodes.Status200OK)
            {
                var usedCapacityMetric = usedCapacityResults.Value.Metrics.FirstOrDefault(m => m.Name == "BlobCount" && m.Error == null);
                var metricValue = usedCapacityMetric?.TimeSeries.FirstOrDefault();
                if (metricValue != null && !metricValue.Values.IsNullOrEmpty())
                {
                    var average = metricValue.Values[0].Average;
                    if (average != null) blobCount = (decimal)average;
                }
            }

Но ничего не возвращается.

Затем я попытался получить поддерживаемое пространство имен метрик, используя этот вызов:

      GET https://management.azure.com/{resourceUri}/providers/microsoft.insights/metricNamespaces?api-version=2017-12-01-preview

и кажется, что единственной допустимой метрикой является Microsoft.Storage/storageAccounts, которая не имеет метрики количества больших двоичных объектов.

Любая идея, как прочитать из кода значение BlobCount?

Также будет возможность получить список контейнеров и повторить его для подсчета больших двоичных объектов, но этого я хочу избежать.

1 ответ

Рабочее решение с помощью поддержки MS:

      This is the solution that was provided to me by MS Support team:

        private async Task<decimal> GetStorageAccountBlobCount(MetricsQueryClient metricsClient, string resourceId)
        {
            var blobCount = (decimal)0.0;
            try
            {
                resourceId = $"{resourceId}/blobServices/default";
                var blobCountResult = await metricsClient.QueryResourceAsync(resourceId, new[] { "BlobCount" },
                    new MetricsQueryOptions
                    {
                        MetricNamespace = "Microsoft.Storage/storageAccounts/blobServices",
                        Aggregations =
                        {
                            MetricAggregationType.Average
                        },
                        Granularity = TimeSpan.FromHours(1),
                        TimeRange = new QueryTimeRange(TimeSpan.FromMinutes(60))
                    });

                if (blobCountResult.GetRawResponse().Status == StatusCodes.Status200OK)
                {
                    var blobCountMetric = blobCountResult.Value.Metrics.FirstOrDefault(m => m.Name == "BlobCount" && m.Error == null);
                    var metricValue = blobCountMetric?.TimeSeries.FirstOrDefault();
                    if (metricValue != null && !metricValue.Values.IsNullOrEmpty())
                    {
                        var average = metricValue.Values[0].Average;
                        if (average != null) blobCount = (decimal)average;
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError($"Error on calculate blob count for {resourceId}", ex);
            }

            return blobCount;
        }
Другие вопросы по тегам