I’ve written before about the telemetry data now available in D365FO, but is there a way to consume this telemetry data within the application itself? Let’s see how we could do this!
Problem Statement
In our case let’s see if we could automatically disable users that have not logged in within the last 90 days. We should be able to query the telemetry data, see which users have logged in within that time range, determine which users have not logged in, and then disable the affected users. To make this automated we could put this logic within a batch job to execute periodically.
Accessing Telemetry Data
As I wrote in my previous blog post there are a couple different ways to gain access to this data, in our case since we want to do this from a batch job the easiest way will be to use the Application Insights API which has an endpoint where we can execute a query we pass in.
For testing purposes I always test my queries in the Azure App Insights portal to ensure the correct results are returned. Here is the query we are using:
Project Setup
The project I came up with would contain two parts, one is a batch job to execute the user disable process on a set basis. The second is a .NET project to actually make the call to the App Insights telemetry data. The reason I did it this way was because the call to Azure’s App Insights is much easier done via C#/.NET because of the nuget packages available.
.NET Project Setup
On the .NET side I first took the query from above and allowed for the dynamic input of the number of days we wanted to execute the query for. I then perform the query and return the user Id and date time of the last usage of that user.
This is the class that is exposed to the X++ side (which is why it is ‘static’). In a real production version I would not store the client Id, client secret, or tenant Id values here but would instead look to use something like Azure Key Vault or some other secure way to store credentials. In this case the class returns a list of user Ids found to have logged in during a specified number of days.
Batch Job Setup
In this case, the batch job I created allows for a parameter input of the number of days we want to execute this process for. By default we are looking to find any user that has accessed the system within the last 90 days.
Once this set of users are found we compare that to all of the users within the UserInfo table, if a user exists in the UserInfo table but does not exist in the user result set from the telemetry data, we disable the user and commit that to the database.
Within D365FO
We can now navigate to the Batch Jobs form within D365FO and setup our batch job there. If we search for the class name from above (FpTelemeteryBatchJob) we can see the system can successfully find it and fills in the class description set in the batch job setup.
Since we allowed for parameters on this batch job, when you click on the ‘Parameters’ menu button you are able to provide a set number of days you would like to execute the batch job for.
Conclusion
While this is a fairly simple example, I hope this shows the overview of how you would be able to consume the Application Insight telemetry from within D365FO itself.
If you have any questions feel free to reach out.
Thank you for the insightful post. I also studied the other one you posted earlier about Application insights, but this one is exactly solving my problem statement. So definitely I’m going to adopt it.
Just a small question, you added the C# class to X++ through library right?
I’m always happy whenever I see your post.
Have a good day.
Correct, I used the same process as this blog post: https://alexdmeyer.com/2022/07/07/how-to-use-a-net-project-within-a-d365fo-solution/
Thank you, very useful
Insightful article Alex. Thank you.
Can you please share the implementation of ‘ListAppInsightsQuery’ that you have used in the .net Project?
Thanks and have a great day
Patrick,
Here are the helper methods you requested:
Thanks Alex 🙂