Reduce log storage: Delete audit logs – Power Platform Admin Center


Recently we had to copy our production environment to one of our sandbox environments for some analysis and testing.

But before we copied we made sure we deleted the data/attachments/ logs that are not required to save some storage space.

Get more information – https://nishantrana.me/2024/10/15/free-up-storage-space-activitypointerbase-and-workflowlogbase-dataverse-dynamics-365/

We had around 950 MB of Log data in it.

Below are the steps for deleting the audit logs –

Go to the Power Platform Admin Center, and sign in with the appropriate credentials.

Select the Environment, and select Manage Audit Logs in the Auditing section.

A screenshot of a computer

Description automatically generated

Click on Delete Audit Logs. We will be prompted to filter the logs to delete. Filter options may include:

  • By Table (e.g., logs related to a specific table or entity).
  • Delete logs, by people and systems.
  • Time (e.g., logs older than a specific date).
A screenshot of a calendar

Description automatically generated

Confirm Deletion.

A screenshot of a computer

Description automatically generated

Review the summary of logs to be deleted. Click Delete to proceed. This action is irreversible.

Once the deletion is complete, the audit logs are permanently removed.

The storage won’t reflect it immediately.

A screen shot of a message

Description automatically generated
A screenshot of a computer

Description automatically generated
A screenshot of a computer

Description automatically generated

In our case, after 2 hours we could see log usage reduced to 460 MB from 954 MB.

And almost after 24 hours, we could see it reduced to 5 MB.

A screenshot of a computer

Description automatically generated

Get all the details

Hope it helps..

Advertisements

Configure OAuth authentication for HTTP Request Triggers (Specific users in my tenant) – Power Automate


Below is our final Power Automate Cloud Flow which uses the HTTP request trigger followed by Response action.

The Allows Users = Specific users in my tenant option ensures that only authorized users in the tenant can trigger the flow while leveraging the security provided by Oauth authentication and Azure AD.

Let us first register an App in the Azure AD.

A screenshot of a computer

Description automatically generated

Go to API Permissions → Add a permission.

A screenshot of a computer

Description automatically generated

Select User permission.

A screenshot of a computer

Description automatically generated

Grant admin consent

A screenshot of a computer

Description automatically generated

Generate and copy the client secret.

A screenshot of a computer

Description automatically generated

Navigate to Enterprise Applications, search for the app, copy the Object ID of the App, and specify the same for the Allowed users property in the HTTP request trigger.

Now let us use the Postman to generate the token and call the flow. Note down the Application (client) ID and we can either use the v1 or v2 Oauth token endpoint.

A screenshot of a computer

Description automatically generated

Specify the following values if using the v2 endpoint to generate the token.

A screenshot of a computer

Description automatically generated

https://login.microsoftonline.com/6b832218-5691-4b15-af03-edbbb67cab56/oauth2/v2.0/token

scope = https://service.flow.microsoft.com//.default

and for v1 token endpoint

https://login.microsoftonline.com/6b832218-5691-4b15-af03-edbbb67cab56/oauth2/token

resource = https://service.flow.microsoft.com/

A screenshot of a computer

Description automatically generated

Now specify the URL generated for the HTTP Request Trigger, copy the Token generated, and for the body specify the following value expected.

A screen shot of a computer

Description automatically generated

We can see the response received successfully from the flow.

A screenshot of a computer

Description automatically generated

Get more details

Also, refer

OAuth Authentication for Power Automate HTTP Request Trigger | Dynamic Bites

https://www.beringer.net/beringerblog/microsoft-power-automate-http-trigger-and-restricting-users/

https://manish-solanki.com/how-to-secure-http-trigger-end-point-for-3rd-party-application/

Hope it helps..

Advertisements

Maximise Storage usage using Allocate Capacity (preview) in Dataverse / Dynamics 365


The new Allocate Capacity feature allows administrators to manage and optimize storage allocation across different environments. It allows administrators to strategically distribute available storage among the Dataverse environments based on each environment’s unique needs ensuring each has the right amount of storage to maintain performance and avoid service interruptions.

Navigate to Resources >> Capacity >> Dataverse inside the Power Platform Admin Center and select an environment to make the Allocate capacity option visible.

A close up of a pen

Description automatically generated

It shows the available storage, and current usage of the environment selected.

A screenshot of a computer

Description automatically generated

We can allocate Database, Log, and File-specific storage and also configure alerts.

A screenshot of a computer

Description automatically generated

If an environment exceeds, it shows up as “Overage” as shown below

A screenshot of a computer

Description automatically generated

Using this new feature, admins can Allocate Capacity effectively by monitoring the storage usage across environments, setting alerts when the environment nears its capacity limit, and allocating the capacity strategically e.g. production environment will get higher allocation compared to the development environment. Admins can also purchase additional storage and allocate it as required to ensure each environment runs smoothly.

Get more details

Hope it helps..

Advertisements

Free up Storage space – ActivityPointerBase and WorkflowLogBase (Dataverse / Dynamics 365)


Had shared the steps we had followed to reduce the storage space for one of our environments which was a copy of production below a few months back –https://nishantrana.me/2023/09/28/free-up-storage-space-dataverse-dynamics-365/

This time we followed more or less the same steps, the main difference was this time we used our favorite XrmToolBox plugin SQL4CDS to perform the delete operations instead of the bulk deletion job.

However, even after deleting all the Activity type records (except one appointment record which was giving some error on deletion), as shown below, the ActivityPointer was still showing 13 GB of space occupied.

select activitytypecodename,activitytypecode, Count(activitytypecode) as Total
from activitypointer
group by activitytypecode, activitytypecodename
order by Total desc

And the same was true for the WorkflowLogBase, we used a bulk deletion job for deleting the system jobs with status as succeeded which deleted around 1200 records, however running the same query in SQL4CDS showed us around 70K records with status as success.

On trying to run the following query it gave us an “Expected non-empty Guid” error and we could not delete the records.

Eventually, we raised the Support Ticket for it, and the team ran the script in the background to delete/reduce the size of the Activity Pointer and Workflow Log table and eventually we were able to reduce the database usage (we also deleted few other table records)

Before –

After –

A close up of a white background

Description automatically generated

Get more details

Hope it helps..

Advertisements

Use Recycle Bin to restore deleted records (Preview)– Dataverse / Dynamics 365


To enable the feature, log in to

Power Platform Admin Center https://admin.powerplatform.microsoft.com/environments

Environment >> Settings >> Features and enable it

We can specify 30 days as the maximum recovery time.

Let us delete some of the contact and lead records.

A screenshot of a computer

Description automatically generated
A screenshot of a computer

Description automatically generated

Navigate to Environment >> Settings >> Data Management >> View Deleted Records to view the deleted records.

A screenshot of a computer

Description automatically generated

We can select the records and click on Restore to get the deleted records back

We can see the records removed from the Deleted Records view.

A screenshot of a computer

Description automatically generated

Below we can see the restored records – we can also see the Modified On updated.

A screenshot of a computer

Description automatically generated

The feature applies at the environment level, we cannot specify it for individual tables currently. Only the main deleted record and related records deleted via the cascaded relationship behavior will be restored. If a related record is deleted as part of custom business logic, it will not be restored.

Below let us delete the Contact record which has a case and an opportunity record associated.

A screenshot of a computer

Description automatically generated

On deleting the Case the child case and lead records also get deleted.

A screenshot of a computer

Description automatically generated

However, we do not see those records in the Deleted records list only the main (parent) Contact record.

A screenshot of a computer
Description automatically generated
On restoring the deleted contact restores the child case and opportunity record also.

A screenshot of a computer

Description automatically generated

More details on – Restore deleted records

Hope it helps..

Advertisements

Fixed – Action Failed: A record with matching key values already exists (DuplicateRecord)– Power Automate / Dataverse


Recently while testing one of our old existing flows, we got the below error

Action ‘Create_Child_Log_Record’ failed: A record with matching key values already exists.

{

“error”: {

“code”: “0x80040237”,

“message”: “A record with matching key values already exists.”,

“@Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionSourceKey”: “Plugin/Microsoft.Crm.ObjectModel.CustomBusinessEntityService”,

“@Microsoft.PowerApps.CDS.ErrorDetails.ApiStepKey”: “38200c13-a28e-ee11-be36-002248933483”,

“@Microsoft.PowerApps.CDS.ErrorDetails.ApiDepthKey”: “1”,

“@Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionMessageName”: “DuplicateRecord”,

“@Microsoft.PowerApps.CDS.ErrorDetails.ApiExceptionHttpStatusCode”: “412”,

“@Microsoft.PowerApps.CDS.ErrorDetails.SqlExceptionMessage”: “Violation of PRIMARY KEY constraint ‘PK_childBase’. Cannot insert duplicate key in object ‘dbo.bew_logBase’. The duplicate key value is .”,

“@Microsoft.PowerApps.CDS.HelpLink”: “http://go.microsoft.com/fwlink/?LinkID=398563&error=Microsoft.Crm.CrmException%3a80040237&client=platform”,

“@Microsoft.PowerApps.CDS.InnerError.Message”: “Cannot insert duplicate key.”

}

}

Basically on Create or Update of the Parent Record it was creating a corresponding child log record, recording changes in the status field of the parent record.

The issue was in the Create Child Log record step, here it was setting the Primary Key Field / GUID field of the Child Log record being created with the GUID of the Parent record.

This worked for the 1st record, but when trying to create any new record with the same parent’s GUID, it was throwing the duplicate exception as it would be the same parent GUID getting specified.

On clearing that field, and letting the system generate the GUID, the flow ran successfully.

Hope it helps..

Advertisements