Application Insights-调用TrackException()后获取遥测的ItemId

时间:2018-09-05 02:25:41

标签: c# azure-application-insights

在将用户发送到错误页面的意外错误上,我想显示一个错误ID供用户提供给客户支持以进行进一步调查。

遥测技术具有唯一的(标识)itemId。在跟踪异常遥测之后是否有立即获取此itemId(或任何其他唯一标识符)的信息?

作为一种解决方法,我考虑过要生成自己的唯一标识符并将其添加到遥测的自定义属性中,但是似乎无法通过自定义属性查找遥测。

public class PaginatedList<T> : List<T>
    {
        public int PageIndex { get; private set; }
        public int TotalPages { get; private set; }

        public PaginatedList(List<T> items, int count, int pageIndex, int pageSize)
        {
            PageIndex = pageIndex;
            TotalPages = (int)Math.Ceiling(count / (double)pageSize);

            this.AddRange(items);
        }

        public bool HasPreviousPage
        {
            get
            {
                return (PageIndex > 1);
            }
        }

        public bool HasNextPage
        {
            get
            {
                return (PageIndex < TotalPages);
            }
        }

        public static async Task<PaginatedList<T>> CreateAsync(
            IQueryable<T> source, int pageIndex, int pageSize)
        {
            var count = await source.CountAsync();
            var items = await source.Skip(
                (pageIndex - 1) * pageSize)
                .Take(pageSize).ToListAsync();
            return new PaginatedList<T>(items, count, pageIndex, pageSize);
        }
    }

2 个答案:

答案 0 :(得分:0)

1。ItemId可以通过使用Application Insights REST API来获取,但是它在运行时会有一些时间(大约几分钟)的延迟。代码在下面。

2。在不使用ItemId的情况下,您可以在代码中使用operation_id,只需使用此行代码return System.Diagnostics.Activity.Current.RootId,此处是有关operation_id的参考

3。使用APP Insights REST API的示例:

3.1获取API密钥和应用程序ID,详细信息here: 导航至azure门户->转到您的应用洞察力->在configure部分下,选择API Access->写下应用程序ID,然后单击Create API Key,下面的屏幕截图,记住写下该密钥: enter image description here

3.2构造api url,如下所示:

https://api.applicationinsights.io/v1/apps/your_application_id/query?,

然后构造您的查询字符串:

query=exceptions | where timestamp >= datetime("UTC time") | where operation_Id == "operation_id"

您可以根据需要修改查询。

3.3我的代码如下,它返回json字符串,您可以解析json以获取ItemId:

public string MakeException()

{

    try
    {
        int zipcode = int.Parse("123er");
    }
    catch (Exception ex)
    {

        DateTime dt = DateTime.UtcNow;
        string timeFormat = dt.ToString("s"); 

        telemetry.TrackException(ex);
        telemetry.Flush();
        System.Threading.Thread.Sleep(TimeSpan.FromMinutes(5));  // in runtime, need to wait for the result populated           

        string operation_id = System.Diagnostics.Activity.Current.RootId; //get the operation_id, will use it in the query string

        string api = "https://api.applicationinsights.io/v1/apps/your_application_id/query?";
        string query = @"query=exceptions | where timestamp >= datetime(""" + timeFormat + @""")";
        query += " | where operation_Id == " + "\"" + operation_id + "\"";
        api += query;

        string apikey = "your api key";

        //call the REST API
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Add("x-api-key", apikey);
        var req = string.Format(api);
        HttpResponseMessage response = client.GetAsync(req).Result;

        if (response.IsSuccessStatusCode)
        {
            return response.Content.ReadAsStringAsync().Result; // return a json string, you can parse it to get the ItemId
        }
        else
        {
            return response.ReasonPhrase;
        }


    }

    return "ok";
}

答案 1 :(得分:0)

因此,我针对此问题的解决方案包括两部分:

  1. 在我应用的HttpContext.Current.Items上使用Application_BeginRequest(基于对this SO问题的答案之一)的每个请求添加唯一标识符(Guid)。

  2. 在记录异常时获取请求的唯一标识符,将其分配给TelemetryClient的操作ID(已分配给遥测对象),然后将其返回。

    private string LogTelemetry(Exception ex)
    {
        var telemetryClient = new TelemetryClient();
        var telemetry = new ExceptionTelemetry(ex);
    
        var operationId = HttpContext.Current.Items["RequestIdentity"].ToString();
        telemetryClient.Context.Operation.Id = operationId;
    
        telemetryClient.TrackException(telemetry);
    
        return operationId;
    }
    

请注意,我没有使用System.Diagnostics.Activity.Current.RootId作为遥测的操作ID,因为在我的情况下Current对象为null,这是我现在决定不解决的问题。