Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La API de Power Platform se puede utilizar para extraer varios detalles y metadatos de su entorno de Microsoft Power Platform, con o sin una base de datos de Microsoft Dataverse. La API es utilizada internamente por varios clientes disponibles en la actualidad, como PowerShell.
En este tutorial, aprenderá a:
- Crear un script de Power Automate o de flujo de trabajo de Logic Apps (Azure) o PowerShell que se autentique con la API de Power Platform.
- Llame a la lista de entornos punto de conexión para recuperar los detalles del entorno de Microsoft Power Platform.
- Itere a través del objeto de capacidad para recuperar el consumo real.
- Guarde los datos de consumo en una tabla para su visualización.
Como ejemplo de este escenario, un cliente busca controlar su consumo de capacidad para poder comprender mejor la asignación de su capacidad total de inquilinos por departamento. Esto ayuda al cliente a realizar algunas funciones internas de contabilidad de costos y realizar contracargos en función de cuánto consume cada departamento de la capacidad total disponible. Este cliente está utilizando la descripción del entorno para llamar al departamento que posee cada entorno.
Conexión y configuración de variable
Utilice los siguientes detalles para conectarse a Power Platform mediante programación. Puedes elegir entre una experiencia Azure o scripts PowerShell.
Crear el flujo de trabajo y configurar las variables
Para comenzar, en este tutorial utilizamos un flujo de trabajo Logic Apps. Un flujo de Power Automate también es aceptable, y cualquier otro motor de orquestación que su empresa prefiera utilizar para la automatización. Todas las llamadas para recuperar los datos utilizan API RESTful, por lo que cualquier herramienta que admita REST funciona con este tutorial.
Visite Azure Portal y luego cree una nueva aplicación lógica y asígnele un nombre:
Después de que termine el aprovisionamiento, edite el flujo de trabajo con Designer y configure un desencadenador de recurrencia para que se ejecute diariamente:
A continuación, necesitamos inicializar cinco variables:
- SPN-Id : este es el ClientID de su entidad de servicio. Se utiliza más adelante para realizar la autenticación en un contexto de entidad de servicio. Si usa el contexto de nombre de usuario/contraseña, puede omitir esta variable.
- DBCapacity – Esta es una variable flotante para la capacidad de base de datos consumida en megabytes.
- FileCapacity – Esta es una variable flotante para la capacidad de archivo consumida en megabytes.
- LogCapacity : esta es una variable flotante para la capacidad de registro consumida en megabytes.
- SimplifiedEnvironmentArray-Init – Esta es una variable de matriz que completamos con algunas propiedades ambiente. Esto simplifica drásticamente la salida del informe de tabla HTML final.
A continuación, nos autenticamos con Microsoft Entra y recuperamos un token para llamar a la Power Platform API. Si no ha completado su configuración de Microsoft Entra, consulte Autenticación: herencia.
En este tutorial, usamos un almacén de claves para almacenar nuestro valor secreto de entidad de servicio. De esta manera, un Administrador de TI puede hacer que este valor esté disponible de manera segura para su flujo de trabajo. Esto luego se completa en la llamada POST a Microsoft Entra para recuperar el token.
Luego analizamos la respuesta del token de Microsoft Entra en un objeto indicado usando este esquema JSON en la acción 'Analizar JSON':
{
"properties": {
"access_token": {
"type": "string"
},
"expires_in": {
"type": "integer"
},
"ext_expires_in": {
"type": "integer"
},
"token_type": {
"type": "string"
}
},
"type": "object"
}
Capturar entornos
En esta sección, obtenemos la lista ambiente que usted administra. Esto se puede hacer a través de API y PowerShell.
Llamar al punto de conexión de lista de entornos
Ahora es el momento de llamar a la API de Power Platform. Utilice la lista de entornos punto de conexión para recuperar todos nuestros entornos y sus metadatos, específicamente con el parámetro $expand para capacidad. Esto también usa el encabezado de Autorización con el token de portador que recibimos en la sección anterior de Microsoft Entra ID. Si usó el contexto de nombre de usuario / contraseña, también puede ingresar ese token de portador en este paso.
Luego analizamos la API respuesta en un objeto tipificado usando este esquema JSON con la acción 'Analizar 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 a través del objeto Capacidad
Esta es la parte más compleja del tutorial. Aquí usamos un bucle dentro de un bucle para iterar cada ambiente en la Lista ambiente respuesta, y cada ambiente tiene una matriz de detalles de capacidad que también iteramos. Esto nos permite capturar la información necesaria para cada fila ambiente en nuestra tabla de informes de capacidad.
For-each y análisis
Veamos esto paso a paso. Primero, usamos un control For Each usando el 'valor' de la salida Parse-List-Response:
Luego, analizamos este único ambiente en un objeto tipificado utilizando 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"
}
A continuación, utilizamos otro control For Each usando la 'capacidad' de la salida Parse-CurrentItem. Luego lo analizamos en un objeto tipificado usando este esquema JSON:
Ahora podemos usar el control Switch en la propiedad CapacityType de la salida Parse-Capacity. Este es el valor de 'Base de datos', 'Archivo' o 'Registro'. En cada caso de cambio, capture la propiedad 'actualConsumption' relacionada en la variable relacionada. En el siguiente caso, vemos que estamos capturando la capacidad de la base de datos:
Como último paso en el ciclo 'Para cada entorno', ahora podemos capturar los detalles del entorno para esta fila en el informe. Con el control de variable Agregar a matriz, use el siguiente esquema JSON:
{
"properties": {
"actualConsumption": {
"type": "number"
},
"capacityType": {
"type": "string"
},
"capacityUnit": {
"type": "string"
},
"ratedConsumption": {
"type": "number"
},
"updatedOn": {
"type": "string"
}
},
"type": "object"
}
Crear tabla de informes
¡Felicitaciones, ahora ha llegado a la parte fácil! Ahora que tenemos nuestra matriz de capacidad de entorno simplificada y completamente rellenada, podemos mostrarla en formato tabular.
Usar el conector de tabla HTML
Al ejecutar la aplicación lógica, ahora podemos ver el resultado del informe de la tabla HTML:
El informe podría enviarse opcionalmente por correo electrónico a las partes interesadas en este ejemplo para fines de contabilidad de costos, o los datos podrían guardarse en una base de datos para un análisis más detallado y tendencias históricas.