How to check response time with Azure Functions

I am using a program that sends HTTP requests and parameters to Azure Functions’ Durable functions for processing.

I would like to check the time taken for processing and response time in this program, and I would like to check it in the log of Application Insights, but I don’t know how to check it.

How can I find out the response time for each request from the Application Insights logs?

Or, if there is another way to find out the response time for each request other than Application Insights, please let me know.

import azure.functions as func
import azure.durable_functions as df
import logging
import numpy as np
import pandas as pd
import time
import sys

app = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.route(route="orchestrators/client_function")
@app.durable_client_input(client_name="client")
async def client_function(req: func.HttpRequest, client: df.DurableOrchestrationClient) -> func.HttpResponse:
        activity = int(req.params.get('activity') or req.get_json().get('activity'))
        size = int(req.params.get('size') or req.get_json().get('size'))

    instance_id = await client.start_new("orchestrator", None, {"activity": activity, "size": size})
    logging.info(f"Started orchestration with ID = '{instance_id}'.")
    await client.wait_for_completion_or_create_check_status_response(req, instance_id)
    status = await client.get_status(instance_id)
    return f"runtime: {status.runtime_status}\n\noutput: {status.output}" 


@app.orchestration_trigger(context_name="context")
def orchestrator(context: df.DurableOrchestrationContext) -> dict:
    parameter = context.get_input()
    activity = int(parameter.get("activity"))
    size = int(parameter.get("size"))
    data_size_list, byte_list, time_list = [], [], []
    
    if activity == 1: #DataFrame
        for i in range(2):        
            result  =  yield context.call_activity("activity1", size)
            data_frame = pd.DataFrame.from_dict(result["data"])  # deserialize
            transfer_time  =  time.perf_counter() - result["start"] # Transfer time record when deserialization is finished
            dict_size = sys.getsizeof(result["data"]) # After measuring the transfer time, measure the data size
            dict_size += sum(map(sys.getsizeof, result["data"].values())) + sum(map(sys.getsizeof, result["data"].keys()))

            data_size_list.append(size)
            byte_list.append(dict_size)
            time_list.append(transfer_time)

    output = {"data-size": data_size_list, "data-byte": byte_list, "transfer-time": time_list}
    result = yield context.call_activity("write_csv", output)
    return output

# Transfer DataFrame as dictionary type
@app.activity_trigger(input_name="size")
def  activity1(size: int) -> dict:
    data = np.random.rand(size) # Create a Numpy array with one row and one column of size
    data  =  pd.DataFrame(data) # Convert Numpy array to Dataframe
    start = time.perf_counter() # The time to convert a Dataframe to a serializable dictionary type is also measured, so it is indicated here.
    data_ = data.to_dict() # Convert to serializable type
    return {"data": data_, "start": start}

# Function to write to csv
@app.blob_output(arg_name="outputblob", path="newblob/result.csv", connection="BlobStorageConnection")
@app.activity_trigger(input_name="output")
def  write_csv(output: dict, outputblob: func.Out[str]):
    df = pd.DataFrame(output)
    csv_data = df.to_csv(index=False)
    outputblob.set(csv_data)
    return "Insersed"

Read more here: Source link