Данные Azure Cost Management в R

Мне было бы интересно получить данные управления затратами Azure (особенно амортизированную стоимость). На первый взгляд набор пакетов AzureR кажется хорошей отправной точкой.

Можно ли как-то использовать AzureAuth, чтобы авторизовать меня, а затем попытаться использовать REST API? На данный момент мне даже не удалось правильно использовать AzureAuth, так как я не понимаю параметры.

Кто-нибудь из вас работает с этими данными в R? Как вы его получаете? Сохранение CSV-файла на портале Azure — это ужасно, потому что установка правильных фильтров занимает много времени, а Microsoft время от времени меняет схему экспорта. Например, сегодня пропали несколько столбцов (например, тип ресурса) при группировке по тегу.

Любая помощь будет очень признательна :)

Изменить: благодаря помощи Хонга Оой (https://github.com/Azure/AzureR/issues/6) Теперь мне удалось подключиться к API управления затратами с помощью AzureRMR:

    library(AzureRMR)
    az <- create_azure_login()
    sub1 <- az$get_subscription(my_sub_guid)
    d1 <- sub1$do_operation("providers/Microsoft.CostManagement/query", api_version = "2019-11-01", http_verb = "POST", encode = "json",
                            body = list(
                              timeframe = "Custom",
                              timePeriod = list(
                                from = "2020-04-01",
                                to = "2020-04-01"
                              ),
                              type = "AmortizedCost",
                              dataset = list(
                                granularity = "daily"
                              )
                            ))

Чего я до сих пор не знаю, так это:

  • Как отправить тело в формате JSON, а не список списков?
  • Как получить ответ в формате JSON?
  • Как получить больше столбцов в ответе? Мне особенно нужно имя ресурса и тип ресурса.

Изменить 2. Пример ответа:

response_example <-
  list(properties = list(
    nextLink = NULL,
    columns = list(
      list(name = "UsageDate",
           type = "Number"),
      list(name = "Currency",
           type = "String")
    ),
    rows = list(
      list(as.integer(20200401),
           "EUR"),
      list(as.integer(20200402),
           "EUR")
    )
  ))

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

d1_ <- do.call(what = "rbind", args = lapply(d1$properties$rows, as_tibble, .name_repair = "unique"))
colnames(d1_) <- do.call(what = "rbind", args = lapply(d1$properties$columns, as_tibble, .name_repair = "unique")) %>% 
  select(name) %>% pull()

Редактировать 3: если кому-то это нужно, я нашел способ запросить определенные столбцы. Тело это:

{
   "type":"AmortizedCost",
   "dataSet":{
      "granularity":"Daily",
      "aggregation":{
         "PreTaxCost":{
            "name":"PreTaxCost",
            "function":"Sum"
         }
      },
      "sorting":[
         {
            "direction":"ascending",
            "name":"UsageDate"
         }
      ],
      "grouping":[
         {
            "type":"TagKey",
            "name":"myTag"
         },
         {
            "type":"Dimension",
            "name":"ResourceType"
         },
         {
            "type":"Dimension",
            "name":"ResourceGroupName"
         }
      ]
   },
   "timeframe":"Custom",
   "timePeriod":{
      "from":"2020-04-01T00:00:00+00:00",
      "to":"2020-04-30T23:59:59+00:00"
   }
}

Допустимые параметры (имена столбцов):

AccountName, BillingAccountId, BillingAccountName, BillingMonth, BillingPeriod, BillingProfileId, BillingProfileName, ChargeType, ConsumedService, CostAllocationRuleId, CostAllocationRuleName, CustomerName, CustomerTenantDomainName, CustomerTenantId, DepartmentName, EnrollmentAccountName, Frequency, InvoiceId, InvoiceNumber, InvoiceSection, InvoiceSectionId, InvoiceSectionName, MarkupRuleId, MarkupRuleName, Meter, MeterCategory, MeterId, MeterSubcategory, PartNumber, PartnerEarnedCreditApplied, PartnerName, PricingModel, Product, ProductOrderId, ProductOrderName, PublisherType, ResellerMPNId, ReservationId, ReservationName, ResourceGroup, ResourceGroupName, ResourceGuid, ResourceId, ResourceLocation, ResourceType, ServiceFamily, ServiceName, ServiceTier, SubscriptionId, SubscriptionName, UnitOfMeasure

Кроме того, вот как я работаю с ответом: Превращение стоимости Azure Ответ Management API на фрейм данных


person Piotr K    schedule 20.04.2020    source источник


Ответы (1)


AzureRMR автоматически преобразует список списков в формат json. Обычно это самый удобный выбор, но вы можете отправить необработанный текст json, установив encode="raw":

sub1$do_operation("providers/Microsoft.CostManagement/query", api_version = "2019-11-01",
    http_verb = "POST",
    encode = "raw",
    body = '{"timeframe":"MonthToDate","type":"actualcost","dataset":{"granularity":"daily"}}')

Если вам нужен необработанный вывод, а не проанализированный вывод, установите http_status_handler="pass". Это возвращает объект ответа httr; см. ?httr::response для более подробной информации. Обратите внимание, что вам придется обрабатывать ошибки самостоятельно, если вы это сделаете.

sub1$do_operation("providers/Microsoft.CostManagement/query", api_version = "2019-11-01",
    http_status_handler = "pass",
    ...)

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


Чтобы превратить результат в фрейм данных:

res <- sub1$do_operation(...)
rows <- do.call(rbind, lapply(res$properties$rows, function(r)
{
    names(r) <- sapply(res$properties$columns, `[[`, 1)
    data.frame(r, stringsAsFactors=FALSE)
}))
person Hong Ooi    schedule 22.04.2020
comment
Спасибо, @Hong, еще раз. Я спросил о получении ответа в формате JSON, потому что в то время я не мог найти, как обрабатывать ответ в виде списка списков (см. Редактировать 2 для моего текущего решения). - person Piotr K; 22.04.2020