Read Azure Service Health Activity Logs with .NET Core
3 minute read
This week there was a small outage within the Azure Data Lake Store service and as consequence I wondered how could I Read Azure Service Health Activity Logs with .NET Core.
Let’s go for it:
Create a folder for your new project
Open a command promt an run:
mkdir azure.health
Create the project
cd azure.health
dotnet new console
Add the references needed to query Azure Health Events
dotnet add package Microsoft.Azure.Insights -v 0.15.0-preview
dotnet add package Microsoft.Azure.Management.Fluent
dotnet restore
Microsoft.Azure.Insights will let you query the events and Microsoft.Azure.Management.Fluent will let the application authenticate to Azure
Replace the content of Program.cs
Replace the content of Program.cs with the following contents:
/// <summary>
/// Query Azure.Health Events using .NET Core
/// The code was inspired on: How to Retrieve Azure Service Health Event Logs (https://code.msdn.microsoft.com/windowsapps/How-To-Programmatically-49df487d/view/Reviews)
/// by Matt Loflin
/// </summary>
namespace azure.health
{
using System;
using System.Linq;
using Microsoft.Azure.Insights;
using Microsoft.Azure.Insights.Models;
using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Rest.Azure.OData;
class Program
{
static void Main(string[] args)
{
// The file with the Azure Service Principal Credentials.
var authFile = "my.azureauth";
// Parse the credentials from the file.
var credentials = SdkContext.AzureCredentialsFactory.FromFile(authFile);
// Authenticate with Azure
var azure = Azure
.Configure()
.Authenticate(credentials)
.WithDefaultSubscription();
// Create an InsightsClient instance.
var client = new InsightsClient(credentials);
// If we subscription is not set the API call will fail.
client.SubscriptionId = credentials.DefaultSubscriptionId;
// Create the OData filter for a time interval and the Azure.Health Provider.
// Search back one day.
var days = -1;
var endDateTime = DateTime.Now;
var startDateTime = endDateTime.AddDays(days);
string filterString = FilterString.Generate<EventDataForFilter>(eventData =>
(eventData.EventTimestamp >= startDateTime) &&
(eventData.EventTimestamp <= endDateTime) &&
(eventData.ResourceProvider == "Azure.Health"));
// Get the Events from Azure.
var response = client.Events.List(filterString);
while (response != null && response.Any())
{
foreach (var eventData in response)
{
// Set the Console Color according to the Event Status.
if (eventData.Status.Value != "Resolved" &&
eventData.Level <= EventLevel.Warning)
{
Console.ForegroundColor = ConsoleColor.Red;
}
else if (eventData.Status.Value == "Resolved")
{
Console.ForegroundColor = ConsoleColor.Green;
}
else
{
Console.ForegroundColor = ConsoleColor.White;
}
// Write event data to the console
Console.WriteLine($"{eventData.EventTimestamp.ToLocalTime()} - {eventData.ResourceProviderName.Value} - {eventData.OperationName.Value}");
Console.WriteLine($"Status:\t {eventData.Status.Value}");
Console.WriteLine($"Level:\t {eventData.Level.ToString()}");
Console.WriteLine($"CorrelationId:\t {eventData.CorrelationId}");
Console.WriteLine($"Resource Type:\t {eventData.ResourceType.Value}");
Console.WriteLine($"Description:\t {eventData.Description}");
}
// Get more events if available.
if (!string.IsNullOrEmpty(response.NextPageLink))
{
response = client.Events.ListNext(response.NextPageLink);
}
else
{
response = null;
}
}
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("No more events...");
Console.ForegroundColor = ConsoleColor.White;
}
}
// EventData Filter.
public class EventDataForFilter
{
/// <summary>
/// Event Timestamp
/// </summary>
public DateTime EventTimestamp { get; set; }
/// <summary>
/// Resource Provider
/// </summary>
public string ResourceProvider { get; set; }
}
}
Create the my.azureauth file
To authenticate you’ll need a my.azureauth file with the following format:
subscription=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
client=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
tenant=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
key=XXXXXX
managementURI=https\://management.core.windows.net/
baseURL=https\://management.azure.com/
authURL=https\://login.windows.net/
https\://graph.windows.net/
As you can see you’ll be needing your Azure Subscription Id, Tenand Id and a valid Service Principal and Key.
If you check my previous post: Create a Service Principal and write required parameters to a .azureauth file and run the script you’ll get a file with the credentials.
Run the application
Run the following command:
dotnet run
You can get the code here.
Hope it helps!