首页 > 解决方案 > 使用 Application Insights 跟踪非 HTTP 请求

问题描述

如本链接所述,在 .net core2.1 web.api 应用程序上使用 Application Insights 实现了以下代码来跟踪非 HTTP 请求(即 redis 调用)

 private ReviewModel<T> GetCachedData<T>(string id)
    {
        try
        {
            var obj = default(RedisValue);
            _retryPolicy.Execute(() =>
            {
                using (var getReviewsOperation = _telemetryClient.StartOperation<DependencyTelemetry>("RedisCall"))
                {
                    obj = _database.StringGet(id); // external call to redis server
                }
            });

            var review = string.IsNullOrEmpty(obj) || !obj.HasValue ?
                    default(ReviewModel<T>) : _serializer.Deserialize<ReviewModel<T>>(obj );
            return review;
        }
        catch (Exception ex)
            when (ex is RedisException)
        {
            //how to log the exception cases in dependency table of application insights log?
            _log.LogError($"Redis exception occurred : ", {ex.Message});
            return null;
        }
    }

上述代码成功地在应用洞察日志的“依赖”表中记录了 redis 调用详细信息。但是如何在应用程序洞察的“依赖”表上记录redis调用详细信息,记录成功属性值为“false”的异常场景?

标签: azureazure-application-insightsazure-monitoring

解决方案


你可以用TrackDependency这个。 TrackDependency用于跟踪调用外部代码的响应时间和成功率。结果显示在门户的依赖关系图中。在进行依赖调用的任何地方都需要添加以下代码片段:

var success = false;
var startTime = DateTime.UtcNow;
var timer = System.Diagnostics.Stopwatch.StartNew();
try
{
    success = dependency.Call();
}
catch(Exception ex) 
{
    success = false;
    telemetry.TrackException(ex);
    throw new Exception("Operation went wrong", ex);
}
finally
{
    timer.Stop();
    telemetry.TrackDependency("DependencyType", "myDependency", "myCall", startTime, timer.Elapsed, success);
}

推荐阅读