微软智慧云Azure有一个非常强大的监视工具, 称为Application Insights。它可以监视我们Web应用程序的各个方面,包括客户端和服务器指标、错误详细信息、性能等。我的博客也在使用Application Insights,但每次我想要查看数据时, 我都必须转到Azure门户,即使是PV或服务器响应时间等基本指标也是如此。我希望我能在自己的应用程序中的获取这些数据,并仅将Azure门户用于高级分析方案。本文将给出解决方案。
Application Insights 提供了一组 REST API,使我们的开发人员可以使用 Azure 中的相同数据。我在 C# 中使用此 API 来检索我需要的数据,您也可以使用 jQuery、JAVA、PHP 或任何您喜欢的方法来完成它。
01
获取应用程序标识及API Key
打开Azure门户,在Application Insights页面下点击 API Access
复制Application ID,之后我们用得着。然后点击 Create API key
输入一个描述,并选择 Read telementry 复选框。然后点击 Generate key
你的Key创建完成后,复制并保存到安全的位置,因为这个key只会在Azure门户里显示这么一次!
02
在 API Explorer 中测试
在浏览器里打开 https://dev.applicationinsights.io/apiexplorer/metrics,用你的 Application ID 及 API Key 测试REST API。
例如,我需要获取过去24小时的PV,测试如下:
我们能够在API Explorer里看到生成的地址及参数信息:
GET /v1/apps/YOUR-APPLICATION-ID/metrics/pageViews/count?timespan=P1D&aggregation=sum HTTP/1.1
Host: api.applicationinsights.io
x-api-key: YOUR-API-KEY
返回内容是Json格式的字符串
HTTP/1.1 200
content-type: application/json; charset=utf-8
{
"value": {
"start": "2018-12-17T11:17:13.443Z",
"end": "2018-12-18T11:17:13.443Z",
"pageViews/count": {
"sum": 709
}
}
}
这意味着API能够正常工作。我们会用相同的终端地址去整合到我们自己的应用里。
03
整合到ASP.NET Core应用中
这一步完全取决于你自己的实现方式,下面的样例代码仅仅是我在自己博客系统里使用的,满足我自己需求的,所以会有很多硬编码的地方。
我的C# MetricsReader
public class MetricsReader
{
private const string AzureAppInsightApiEndpointAddress = "https://api.applicationinsights.io/v1/apps/{0}/{1}/{2}?{3}";
private const string AzureAppInsightAppId = "<YOUR-APPLICATION-ID>";
private const string AzureAppInsightApiKey = "<YOUR-API-KEY>";
public async Task<dynamic> GetP1DIntMetrics(string query, string aggregation)
{
var response = await GetAppInsightDataAsync(query, $"timespan=P1D&aggregation={aggregation}");
if (response.IsSuccess)
{
var obj = JsonConvert.DeserializeObject<dynamic>(response.Item);
return obj;
}
return null;
}
public async Task<Response<string>> GetAppInsightDataAsync
(string queryPath, string parameterString)
{
return await GetAppInsightDataAsync(AzureAppInsightAppId, AzureAppInsightApiKey, "metrics", queryPath, parameterString);
}
private async Task<Response<string>> GetAppInsightDataAsync
(string appid, string apikey, string queryType, string queryPath, string parameterString)
{
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("x-api-key", apikey);
var req = string.Format(AzureAppInsightApiEndpointAddress, appid, queryType, queryPath, parameterString);
var response = client.GetAsync(req).Result;
if (!response.IsSuccessStatusCode)
{
return new FailedResponse<string>(ResponseFailureCode.RemoteApiFailure)
{
Message = response.ReasonPhrase
};
}
var result = await response.Content.ReadAsStringAsync();
return new SuccessResponse<string> { Item = result };
}
}
在我的ASP.NET Controller里,我有一个方法去调用MetricsReader
[HttpGet("getpv")]
public async Task<int> GetPageViewsForLast24Hours()
{
var response = await _metricsReader.GetP1DIntMetrics(MetricId.PageViewsCount, MetricAggregation.Sum);
if (null != response)
{
return (int)response.value[MetricId.PageViewsCount].sum;
}
return -1;
}
最后,在前端页面上,我用jQuery去获取里面的值
var aiMetricReader = {
getMetricsNumber: function(url, funcSuccess) {
$.ajax({
url: url,
datatype: 'json',
success: function (data) {
funcSuccess(data);
},
error: function(e) {
toastr.error(e);
}
});
}
};
aiMetricReader.getMetricsNumber('getpv',
function (data) {
$("#page-views").html(data);
});
现在,我可以在博客的管理后台里构建一个简单的dashboard,仅仅显示我最关心的数据。
对于复杂的场景和完整数据,我依然可以去Azure门户查看。
Application Insights (应用程序洞察服务)
https://docs.microsoft.com/en-us/azure/application-insights/app-insights-overview
REST API 文档
https://dev.applicationinsights.io/quickstart