Friday, June 20, 2025
AgentCon Perth - 20-06-2025
Sunday, April 27, 2025
Presentation - Designing AI-Powered APIs on Azure: Best Practices& Considerations
I had the privilege of delivering a session at the Perth Global AI Bootcamp at Microsoft. My topic was Designing AI-Powered APIs on Azure: Best Practices& Considerations
We explored various aspects of the AI solution design, aligning closely with the principles of the Azure Well-Architected Framework.
Following is the presentation I conducted
Following are few snaps from the event
Thursday, March 20, 2025
Optimizing Your Cloud Spending: Planning Resource Group Costs for the Next Year
- Right-Sizing Resources
- Use Reserved Instances
- Leverage Spot Instances
- Auto-scaling
- Optimize storage
- Turn-off unused resources
- Alert 1: Trigger an alert when actual spending reaches 80% of the budget ($48).
- Alert 2: Trigger an alert when Azure predicts that spending will exceed 90% of the budget before the end of the current month.
Tuesday, February 18, 2025
How to Obtain an Access Token for Azure Cost Management API Calls
#URL
https://login.microsoftonline.com/{Tenant ID}/oauth2/v2.0/token
#METHOD
POST
#X-WWW-FORM-URLENCODED
#X-WWW-FORM-URLENCODED
grant_type=client_credentials
&client_id={Client ID}
&client_secret={Client Secret}
&scope=https://management.azure.com/.default
Monday, February 17, 2025
Optimizing Data Retention for Specific Tables in Azure Log Analytics Workspace
Application Insights plays a crucial role in applications hosted on Microsoft Azure. It is important to periodically review the associated Log Analytics Workspace instances to ensure they are properly governed and optimized.
The following areas should be examined for these resources in alignment with the Azure Well-Architected Framework.
- Reliability
- Security
- Cost Optimization
- Operational Excellence
- Performance Efficiency
It is evident that AppTraces have increased recently, which may negatively impact overall query performance.
My Log Analytics Workspace is set to the default 90-day data retention period, which I prefer to keep unchanged to achieve cost optimization.
Since the outlier is only in the AppTraces table, I want to reduce the retention period specifically for that table. The expectation is to maintain a lower data volume in that container while keeping the overall workspace retention unchanged.
Following was the approach I used.
Navigate to Tables in the Log Analytics Workspace and select the AppTraces table.
Click on Manage Table to access the table settings.
Change the retention period to 60 days, which overrides the default retention setting for this table only.
That's it! The AppTraces table will now retain data for 60 days, reducing log volume while keeping the overall workspace retention unchanged.
Let's consider the opposite approach: How can you increase data retention while still optimizing costs?
You can also use this approach to optimize costs. For example, if you need to increase the retention period from 90 to 120 days, instead of applying the change to all tables, you can selectively extend retention only for the tables that truly require it. This helps balance cost efficiency and data availability.
Additional retention will incur costs based on the amount of storage consumed.
Thursday, January 16, 2025
Using Azure Cost Management API to Analyze Resource Group Expenditures by Cost Unit
- Cost Analysis
- Budgets
- Cost Alerts
- Cost Allocation
- Exports
- Recommendations
- Multi-Cloud Support
- Governance and Accountability
- Integration with Power BI
- API
#URL
https://management.azure.com/subscriptions/{Tenant ID}/resourceGroups/{Resource Group}/providers/Microsoft.CostManagement/query?api-version=2024-08-01
#METHOD
POST
#AUTHORIZATION
Bearer Token
#BODY
{
"type": "Usage",
"timeframe": "MonthToDate",
"dataset": {
"granularity": "None",
"aggregation": {
"totalCost": {
"name": "PreTaxCost",
"function": "Sum"
}
},
"grouping": [
{
"type": "Dimension",
"name": "ResourceType"
},
{
"type": "Dimension",
"name": "MeterCategory"
}
]
}
}
You can use this approach to generate an access token{
"id": "subscriptions/{Tenant ID}/resourcegroups/{Resource Group}/providers/Microsoft.CostManagement/query/5c25de9e-06aa-4839-81b4-64273e0bc86f",
"name": "5c25de9e-06aa-4839-81b4-64273e0bc86f",
"type": "Microsoft.CostManagement/query",
"location": null,
"sku": null,
"eTag": null,
"properties": {
"nextLink": null,
"columns": [
{
"name": "PreTaxCost",
"type": "Number"
},
{
"name": "ResourceType",
"type": "String"
},
{
"name": "MeterCategory",
"type": "String"
},
{
"name": "Currency",
"type": "String"
}
],
"rows": [
[
34.957915,
"microsoft.apimanagement/service",
"API Management",
"AUD"
],
[
0.0016342144,
"microsoft.keyvault/vaults",
"Key Vault",
"AUD"
],
[
0.036166705555556,
"microsoft.loadtestservice/loadtests",
"Azure Load Testing",
"AUD"
],
[
0.034666562722667,
"microsoft.operationalinsights/workspaces",
"Log Analytics",
"AUD"
],
[
0.000007542612,
"microsoft.storage/storageaccounts",
"Bandwidth",
"AUD"
],
[
0.0001935796,
"microsoft.storage/storageaccounts",
"Storage",
"AUD"
],
[
0.0,
"microsoft.web/sites",
"Azure App Service",
"AUD"
],
[
0.000000359172,
"microsoft.web/sites",
"Bandwidth",
"AUD"
]
]
}
}
Wednesday, January 15, 2025
Mocking Custom Responses with Azure API Management – Custom Mock Response from External Files
This article is the third part of a multi-part series. In this section, I will explain how to render custom mock responses from JSON files stored in a storage container. Below are the different parts of this article series.
- Mocking Custom Responses with Azure API Management – Simple Mock Response
- Mocking Custom Responses with Azure API Management – Custom Mock Response
- Mocking Custom Responses with Azure API Management – Custom Mock Response from External Files
{
"id": 1,
"name": "Introduction to Azure",
"category": "Cloud Computing",
"description": "A beginner-friendly course covering the fundamentals of Microsoft Azure.",
"duration": "4 weeks",
"instructor": "John Doe"
}
<inbound>
<base />
<choose>
<when condition="@(context.Request.Url.Query.GetValueOrDefault("id") == "1")">
<send-request mode="new" response-variable-name="response" timeout="10" ignore-error="false">
<set-url>@($"https://rgstoragefedora001.blob.core.windows.net/data/Subject/1.json?sp=r&st=2024-03-08T12:01:42Z&se=2024-03-08T20:01:42Z&spr=https&sv=2022-11-02&sr=b&sig=DrqWZJxGP38PNJYFKCoMgIqn6AjNC71nw0x%2FjITu4aM%3D")</set-url>
<set-method>GET</set-method>
</send-request>
<return-response>
<set-status code="200" reason="OK" />
<set-header name="Content-Type" exists-action="override">
<value>application/json</value>
</set-header>
<set-body>@(new JObject(((IResponse)context.Variables["response"]).Body.As<JObject>()).ToString())</set-body>
</return-response>
</when>
<when condition="@(context.Request.Url.Query.GetValueOrDefault("id") == "2")">
<send-request mode="new" response-variable-name="response" timeout="10" ignore-error="false">
<set-url>@($"https://rgstoragefedora001.blob.core.windows.net/data/Subject/2.json?sp=r&st=2024-03-08T12:34:15Z&se=2024-03-08T20:34:15Z&spr=https&sv=2022-11-02&sr=b&sig=OVhf3uGIASMHWHtg8F%2BypQzLatI9DeEzqoFns2iGOUk%3D")</set-url>
<set-method>GET</set-method>
</send-request>
<return-response>
<set-status code="200" reason="OK" />
<set-header name="Content-Type" exists-action="override">
<value>application/json</value>
</set-header>
<set-body>@(new JObject(((IResponse)context.Variables["response"]).Body.As<JObject>()).ToString())</set-body>
</return-response>
</when>
<otherwise>
<return-response>
<set-status code="404" reason="Not Found" />
<set-header name="Content-Type" exists-action="override">
<value>application/json</value>
</set-header>
<set-body>{
"error": "Student ID not found"
}</set-body>
</return-response>
</otherwise>
</choose>
</inbound>