Create and run custom availability tests by using Azure Functions

This article explains how to create an Azure function with TrackAvailability() that will run periodically according to the configuration given in the TimerTrigger function with your own business logic. The results of this test will be sent to your Application Insights resource, where you can query for and alert on the availability results data. Then you can create customized tests similar to what you can do via availability monitoring in the Azure portal. By using customized tests, you can:

  • Write more complex availability tests than is possible by using the portal UI.
  • Monitor an app inside of your Azure virtual network.
  • Change the endpoint address.
  • Create an availability test even if this feature isn't available in your region.

Note

This example is designed solely to show you the mechanics of how the TrackAvailability() API call works within an Azure function. It doesn't show you how to write the underlying HTTP test code or business logic that's required to turn this example into a fully functional availability test. By default, if you walk through this example, you'll be creating a basic availability HTTP GET test.

To follow these instructions, you must use the dedicated plan to allow editing code in App Service Editor.

Create a timer trigger function

  1. Create an Azure Functions resource.

    • If you already have an Application Insights resource:

      • By default, Azure Functions creates an Application Insights resource. But if you want to use a resource you created previously, you must specify that during creation.

      • Follow the instructions on how to create an Azure Functions resource with the following modification:

        On the Monitoring tab, select the Application Insights dropdown box and then enter or select the name of your resource.

        Screenshot that shows selecting your existing Application Insights resource on the Monitoring tab.

    • If you don't have an Application Insights resource created yet for your timer-triggered function:

      • By default, when you're creating your Azure Functions application, it will create an Application Insights resource for you. Follow the instructions on how to create an Azure Functions resource.

    Note

    You can host your functions on a Consumption, Premium, or App Service plan. If you're testing behind a virtual network or testing nonpublic endpoints, you'll need to use the Premium plan in place of the Consumption plan. Select your plan on the Hosting tab. Ensure the latest .NET version is selected when you create the function app.

  2. Create a timer trigger function.

    1. In your function app, select the Functions tab.
    2. Select Add. On the Add function pane, select the following configurations:
      1. Development environment: Develop in portal
      2. Select a template: Timer trigger
    3. Select Add to create the timer trigger function.

    Screenshot that shows how to add a timer trigger function to your function app.

Add and edit code in the App Service Editor

Go to your deployed function app, and under Development Tools, select the App Service Editor tab.

To create a new file, right-click under your timer trigger function (for example, TimerTrigger1) and select New File. Then enter the name of the file and select Enter.

  1. Create a new file called function.proj and paste the following code:

    <Project Sdk="Microsoft.NET.Sdk"> 
        <PropertyGroup> 
            <TargetFramework>netstandard2.0</TargetFramework> 
        </PropertyGroup> 
        <ItemGroup> 
            <PackageReference Include="Microsoft.ApplicationInsights" Version="2.15.0" /> <!-- Ensure you’re using the latest version --> 
        </ItemGroup> 
    </Project> 
    

     Screenshot that shows function.proj in the App Service Editor.

  2. Create a new file called runAvailabilityTest.csx and paste the following code:

    using System.Net.Http; 
    
    public async static Task RunAvailabilityTestAsync(ILogger log) 
    { 
        using (var httpClient = new HttpClient()) 
        { 
            // TODO: Replace with your business logic 
            await httpClient.GetStringAsync("https://www.bing.com/"); 
        } 
    } 
    
  3. Define the REGION_NAME environment variable as a valid Azure availability location.

    Run the following command in the Azure CLI to list available regions.

    az account list-locations -o table
    
  4. Copy the following code into the run.csx file. (You'll replace the preexisting code.)

    #load "runAvailabilityTest.csx" 
    
    using System; 
    
    using System.Diagnostics; 
    
    using Microsoft.ApplicationInsights; 
    
    using Microsoft.ApplicationInsights.Channel; 
    
    using Microsoft.ApplicationInsights.DataContracts; 
    
    using Microsoft.ApplicationInsights.Extensibility; 
    
    private static TelemetryClient telemetryClient; 
    
    // ============================================================= 
    
    // ****************** DO NOT MODIFY THIS FILE ****************** 
    
    // Business logic must be implemented in RunAvailabilityTestAsync function in runAvailabilityTest.csx 
    
    // If this file does not exist, please add it first 
    
    // ============================================================= 
    
    public async static Task Run(TimerInfo myTimer, ILogger log, ExecutionContext executionContext) 
    
    { 
        if (telemetryClient == null) 
        { 
            // Initializing a telemetry configuration for Application Insights based on connection string 
    
            var telemetryConfiguration = new TelemetryConfiguration(); 
            telemetryConfiguration.ConnectionString = Environment.GetEnvironmentVariable("APPLICATIONINSIGHTS_CONNECTION_STRING"); 
            telemetryConfiguration.TelemetryChannel = new InMemoryChannel(); 
            telemetryClient = new TelemetryClient(telemetryConfiguration); 
        } 
    
        string testName = executionContext.FunctionName; 
        string location = Environment.GetEnvironmentVariable("REGION_NAME"); 
        var availability = new AvailabilityTelemetry 
        { 
            Name = testName, 
    
            RunLocation = location, 
    
            Success = false, 
        }; 
    
        availability.Context.Operation.ParentId = Activity.Current.SpanId.ToString(); 
        availability.Context.Operation.Id = Activity.Current.RootId; 
        var stopwatch = new Stopwatch(); 
        stopwatch.Start(); 
    
        try 
        { 
            using (var activity = new Activity("AvailabilityContext")) 
            { 
                activity.Start(); 
                availability.Id = Activity.Current.SpanId.ToString(); 
                // Run business logic 
                await RunAvailabilityTestAsync(log); 
            } 
            availability.Success = true; 
        } 
    
        catch (Exception ex) 
        { 
            availability.Message = ex.Message; 
            throw; 
        } 
    
        finally 
        { 
            stopwatch.Stop(); 
            availability.Duration = stopwatch.Elapsed; 
            availability.Timestamp = DateTimeOffset.UtcNow; 
            telemetryClient.TrackAvailability(availability); 
            telemetryClient.Flush(); 
        } 
    } 
    
    

Check availability

To make sure everything is working, look at the graph on the Availability tab of your Application Insights resource.

Note

Tests created with TrackAvailability() will appear with CUSTOM next to the test name.

Screenshot that shows the Availability tab with successful results.

To see the end-to-end transaction details, under Drill into, select Successful or Failed. Then select a sample. You can also get to the end-to-end transaction details by selecting a data point on the graph.

Screenshot that shows selecting a sample availability test.

Screenshot that shows end-to-end transaction details.

Query in Log Analytics

You can use Log Analytics to view your availability results, dependencies, and more. To learn more about Log Analytics, see Log query overview.

Screenshot that shows availability results.

Screenshot that shows the New Query tab with dependencies limited to 50.

Next steps