Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A API do Power Platform pode ser usada para extrair vários detalhes e metadados dos seus ambientes do Microsoft Power Platform com ou sem uma banco de dados do Microsoft Dataverse. A API é usada internamente por vários clientes disponíveis atualmente, como o PowerShell.
Neste tutorial, você aprenderá a:
- Criar um fluxo de trabalho do Power Automate ou de Aplicativos Lógicos (Azure) ou um script do PowerShell que autentica com a API do Power Platform.
- Chame o ponto de extremidade Listar Ambientes para recuperar os detalhes do seu ambiente do Microsoft Power Platform.
- Faça a iteração pelo objeto de capacidade para recuperar o consumo real.
- Salve os dados de consumo em uma tabela para exibição.
Como um exemplo desse cenário, um cliente está procurando controlar seu consumo de capacidade para que possa entender melhor a alocação de sua capacidade total de locatário por departamento. Isso ajuda o cliente a executar algumas funções internas de contabilidade de custos e estornos com base em quanto cada departamento está consumindo da capacidade total disponível. Este cliente está usando a Descrição do ambiente para chamar o departamento proprietário de cada ambiente.
Configuração de conector e variável
Use os seguintes detalhes para se conectar ao Power Platform programaticamente. Você pode escolher entre uma experiência Azure ou scripts PowerShell.
Criar o fluxo de trabalho e configurar as variáveis
Para começar, neste tutorial usamos um fluxo de trabalho Aplicativos Lógicos. Um fluxo do Power Automate também é aceitável, e qualquer outro mecanismo de orquestração que sua empresa prefira usar para automação. Todas as chamadas para recuperar os dados usam APIs RESTful, portanto, qualquer ferramenta que suporte REST funciona com este tutorial.
Visite o portal do Azure, crie um novo aplicativo lógico e dê um nome a ele:
Depois de terminar o provisionamento, edite o fluxo de trabalho usando o Designer e configure um gatilho de recorrência para ser executado diariamente:
Em seguida, precisamos inicializar cinco variáveis:
- SPN-Id – Este é o ClientID do seu principal serviço. Ele é usado posteriormente para executar a autenticação em um contexto de entidade de serviço. Se estiver usando contexto de nome de usuário/senha, você poderá ignorar esta variável.
- DBCapacity – Esta é uma variável Float para a capacidade consumida do banco de dados em megabytes.
- FileCapacity – Esta é uma variável Float para a capacidade de arquivo consumida em megabytes.
- LogCapacity – Esta é uma variável Float para a capacidade de log consumida em megabytes.
- SimplifiedEnvironmentArray-Init – Esta é uma variável de matriz que preenchemos com algumas propriedades de ambiente. Isso simplifica significativamente a saída final do relatório da tabela HTML.
Em seguida, autenticamos com Microsoft Entra e recuperamos um token para chamar a Power Platform API. Se você não concluiu a configuração do Microsoft Entra, consulte Autenticação – herdada.
Neste tutorial, estamos usando um cofre de chaves para armazenar nosso valor secreto da entidade de serviço. Dessa forma, um administrador de TI pode disponibilizar esse valor com segurança para o seu fluxo de trabalho. Isso é então preenchido na chamada POST para Microsoft Entra recuperar o token.
Em seguida, analisamos a resposta do token do Microsoft Entra em um objeto tipado usando este esquema JSON na ação 'Analisar JSON':
{
"properties": {
"access_token": {
"type": "string"
},
"expires_in": {
"type": "integer"
},
"ext_expires_in": {
"type": "integer"
},
"token_type": {
"type": "string"
}
},
"type": "object"
}
Buscar ambientes
Nesta seção, buscamos a lista de ambientes que você administra. Isso pode ser feito por meio da API e pelo PowerShell.
Chamar o ponto de extremidade Listar Ambientes
Agora é a hora de chamar a API do Power Platform. Use o endpoint List Environments para recuperar todos os nossos ambientes e seus metadados, especificamente com o parâmetro $expand para capacidade. Isso também usa o cabeçalho de Autorização com o Token do Portador que recebemos na seção anterior do Microsoft Entra ID. Se tiver usado o contexto de nome de usuário/senha, você também poderá inserir o token do portador nesta etapa.
Em seguida, analisamos a API resposta em um objeto tipado usando este esquema JSON com a ação 'Analisar JSON': Power Platform
{
"properties": {
"value": {
"items": {
"properties": {
"description": {
"type": "string"
},
"id": {
"type": "string"
},
"location": {
"type": "string"
},
"name": {
"type": "string"
},
"properties": {
"properties": {
"addons": {
"type": "array"
},
"azureRegion": {
"type": "string"
},
"capacity": {
"items": {
"properties": {
"actualConsumption": {
"type": "number"
},
"capacityType": {
"type": "string"
},
"capacityUnit": {
"type": "string"
},
"ratedConsumption": {
"type": "number"
},
"updatedOn": {
"type": "string"
}
},
"required": [
"capacityType",
"actualConsumption",
"ratedConsumption",
"capacityUnit",
"updatedOn"
],
"type": "object"
},
"type": "array"
},
"clientUris": {
"properties": {
"admin": {
"type": "string"
},
"maker": {
"type": "string"
}
},
"type": "object"
},
"cluster": {
"properties": {
"category": {
"type": "string"
},
"number": {
"type": "string"
}
},
"type": "object"
},
"connectedGroups": {
"type": "array"
},
"createdBy": {
"properties": {
"displayName": {
"type": "string"
},
"id": {
"type": "string"
},
"type": {
"type": "string"
}
},
"type": "object"
},
"createdTime": {
"type": "string"
},
"creationType": {
"type": "string"
},
"databaseType": {
"type": "string"
},
"displayName": {
"type": "string"
},
"environmentSku": {
"type": "string"
},
"isDefault": {
"type": "boolean"
},
"linkedEnvironmentMetadata": {
"properties": {
"backgroundOperationsState": {
"type": "string"
},
"baseLanguage": {
"type": "number"
},
"createdTime": {
"type": "string"
},
"domainName": {
"type": "string"
},
"friendlyName": {
"type": "string"
},
"instanceApiUrl": {
"type": "string"
},
"instanceState": {
"type": "string"
},
"instanceUrl": {
"type": "string"
},
"platformSku": {
"type": "string"
},
"resourceId": {
"type": "string"
},
"scaleGroup": {
"type": "string"
},
"uniqueName": {
"type": "string"
},
"version": {
"type": "string"
}
},
"type": "object"
},
"protectionStatus": {
"properties": {
"keyManagedBy": {
"type": "string"
}
},
"type": "object"
},
"provisioningState": {
"type": "string"
},
"retentionDetails": {
"properties": {
"backupsAvailableFromDateTime": {
"type": "string"
},
"retentionPeriod": {
"type": "string"
}
},
"type": "object"
},
"retentionPeriod": {
"type": "string"
},
"runtimeEndpoints": {
"properties": {
"microsoft.ApiManagement": {
"type": "string"
},
"microsoft.BusinessAppPlatform": {
"type": "string"
},
"microsoft.CommonDataModel": {
"type": "string"
},
"microsoft.Flow": {
"type": "string"
},
"microsoft.PowerApps": {
"type": "string"
},
"microsoft.PowerAppsAdvisor": {
"type": "string"
}
},
"type": "object"
},
"states": {
"properties": {
"management": {
"properties": {
"id": {
"type": "string"
}
},
"type": "object"
},
"runtime": {
"properties": {
"id": {
"type": "string"
}
},
"type": "object"
}
},
"type": "object"
},
"updateCadence": {
"properties": {
"id": {
"type": "string"
}
},
"type": "object"
}
},
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"id",
"type",
"location",
"name",
"properties"
],
"type": "object"
},
"type": "array"
}
},
"type": "object"
}
Iterar por meio do objeto Capacidade
Esta é a parte mais complexa do tutorial. Here usamos um loop dentro de um loop para iterar cada ambiente no Ambiente de Lista resposta, e cada ambiente tem uma matriz de detalhes de capacidade que também iteramos. Isso nos permite capturar as informações necessárias para cada linha de ambiente em nossa tabela de relatório de capacidade.
For-each e análise
Vamos fazer isso passo a passo. Primeiro, usamos um controle For Each usando o 'valor' da saída Parse-List-Response:
Em seguida, analisamos esse ambiente único em um objeto tipado usando este esquema JSON:
{
"properties": {
"description": {
"type": "string"
},
"id": {
"type": "string"
},
"location": {
"type": "string"
},
"name": {
"type": "string"
},
"properties": {
"properties": {
"addons": {
"type": "array"
},
"azureRegion": {
"type": "string"
},
"capacity": {
"items": {
"properties": {
"actualConsumption": {
"type": "number"
},
"capacityType": {
"type": "string"
},
"capacityUnit": {
"type": "string"
},
"ratedConsumption": {
"type": "number"
},
"updatedOn": {
"type": "string"
}
},
"required": [
"capacityType",
"actualConsumption",
"ratedConsumption",
"capacityUnit",
"updatedOn"
],
"type": "object"
},
"type": "array"
},
"clientUris": {
"properties": {
"admin": {
"type": "string"
},
"maker": {
"type": "string"
}
},
"type": "object"
},
"cluster": {
"properties": {
"number": {
"type": "string"
}
},
"type": "object"
},
"connectedGroups": {
"type": "array"
},
"createdBy": {
"properties": {
"displayName": {
"type": "string"
},
"id": {
"type": "string"
},
"type": {
"type": "string"
}
},
"type": "object"
},
"createdTime": {
"type": "string"
},
"creationType": {
"type": "string"
},
"databaseType": {
"type": "string"
},
"displayName": {
"type": "string"
},
"environmentSku": {
"type": "string"
},
"isDefault": {
"type": "boolean"
},
"linkedEnvironmentMetadata": {
"properties": {
"backgroundOperationsState": {
"type": "string"
},
"baseLanguage": {
"type": "integer"
},
"createdTime": {
"type": "string"
},
"domainName": {
"type": "string"
},
"friendlyName": {
"type": "string"
},
"instanceApiUrl": {
"type": "string"
},
"instanceState": {
"type": "string"
},
"instanceUrl": {
"type": "string"
},
"resourceId": {
"type": "string"
},
"scaleGroup": {
"type": "string"
},
"uniqueName": {
"type": "string"
},
"version": {
"type": "string"
}
},
"type": "object"
},
"protectionStatus": {
"properties": {
"keyManagedBy": {
"type": "string"
}
},
"type": "object"
},
"provisioningState": {
"type": "string"
},
"retentionDetails": {
"properties": {
"backupsAvailableFromDateTime": {
"type": "string"
},
"retentionPeriod": {
"type": "string"
}
},
"type": "object"
},
"retentionPeriod": {
"type": "string"
},
"runtimeEndpoints": {
"properties": {
"microsoft.ApiManagement": {
"type": "string"
},
"microsoft.BusinessAppPlatform": {
"type": "string"
},
"microsoft.CommonDataModel": {
"type": "string"
},
"microsoft.Flow": {
"type": "string"
},
"microsoft.PowerApps": {
"type": "string"
},
"microsoft.PowerAppsAdvisor": {
"type": "string"
}
},
"type": "object"
},
"states": {
"properties": {
"management": {
"properties": {
"id": {
"type": "string"
}
},
"type": "object"
},
"runtime": {
"properties": {
"id": {
"type": "string"
}
},
"type": "object"
}
},
"type": "object"
},
"updateCadence": {
"properties": {
"id": {
"type": "string"
}
},
"type": "object"
}
},
"type": "object"
},
"type": {
"type": "string"
}
},
"type": "object"
}
Em seguida, usamos outro controle For Each usando a 'capacidade' da saída Parse-CurrentItem. Em seguida, analisamos isso em um objeto digitado usando este esquema JSON:
Agora podemos usar o controle Switch na propriedade CapacityType da saída de Parse-Capacity. Este é o valor de 'Banco de Dados', 'Arquivo' ou 'Log'. Em cada caso de switch, capture a propriedade 'actualConsumption' relacionada na variável relacionada. No caso a seguir, você vê que estamos capturando a capacidade do banco de dados:
Como a última etapa do loop "ambiente For each", agora podemos capturar os detalhes do ambiente para esta linha no relatório. Usando o controle Acrescentar à variável de matriz, use o seguinte esquema JSON:
{
"properties": {
"actualConsumption": {
"type": "number"
},
"capacityType": {
"type": "string"
},
"capacityUnit": {
"type": "string"
},
"ratedConsumption": {
"type": "number"
},
"updatedOn": {
"type": "string"
}
},
"type": "object"
}
Criar tabela de relatório
Parabéns, agora você chegou à parte fácil! Agora que temos nossa matriz de capacidade de ambiente totalmente preenchida e simplificada, podemos exibi-la em formato tabular.
Usar o conector de tabela HTML
Executando o aplicativo lógico, agora podemos ver a saída do relatório da tabela HTML:
O relatório pode ser opcionalmente enviado por email para as partes interessadas neste exemplo para fins de contabilidade de custos ou os dados podem ser salvos em um banco de dados para análise posterior e tendências históricas.