本文是Azure Application Insights REST API的简单介绍,并会包含一个通过Python消费API的示例/小工具。

新加入的team中的一项工作是制作日常的运维报表,制作方式是手工前往portal.azure.com,在网页中多次执行不同的查询语句、导出excel,之后再人工进行合并、分组、汇总、分析等等。这是一个繁琐的过程,其中大部分步骤其实不值得花费人工,应该交给程序。为了自动化这一过程,降低报表的制作成本,我尝试使用了Azure Application Insights REST API查询数据,使用python客户端进行处理、输出。下面把相关的一些知识和经验写在这里。

本文链接:https://www.cnblogs.com/hhelibeb/p/11543295.html

原创内容,转载请注明

Application Insights

Application Insights是Azure平台的监控功能的一部分,用于收集、分析和处理来自Azure或其它本地环境的遥测数据。它包含强有力的分析工具,可以帮助你发现问题、诊断问题、理解用户在app上的行为,可以支持你持续地改进应用的性能和可用性。它可以和DevOps过程集成,和很多开发工具有连接点。

它支持多种语言和框架,比如.NET, Java, 和Node.js等。

更多信息,参考:What is Application Insights?

Application Insights REST API

除了在Azure中使用外,Application Insights收集的数据也可以通过REST API获取,这使得你可以用自己的其它应用来使用相关数据。API可以分为3种:

  1. Metrics: 用于查询聚合结果,比如一定时间范围内的系统异常总数量。

  2. Events: 使用OData语法访问event数据,支持$filter, $orderBy, $search, $apply, $top, $skip and $format,可以返回单独的event数据或者event集的聚合数据。

  3. Query: 允许用户发送和在Application Insights Analytics中一样的Query查询数据,返回数据的同时也会返回数据的schema。这是我用到的类型。

格式

API的格式如下,

    https://{hostname}/{api-version}/apps/{resource}/{area}/[path]?[parameters]

其中,

  1. hostname: api.applicationinsights.io
  2. resource: Application ID ,也就是你的Application Insights app的唯一标识符,可以在app的API Access选项中看到,见下图。(注意:这不是Instrumentation Key,不要用错)
  3. api-version: 路径中需要包含API versions,Beta或v1。
  4. area: 3中查询类型之一metrics, events或query。
  5. path: 查询的详细信息,比如要查询哪个metric。
  6. parameters: 和path相关的具体参数。

(这里是有关Public API format的部分,此外还有Azure API format

认证

需要使用上文提到的Application ID和下面提到的API Key来访问API,否则调用接口会失败,返回认证错误的消息,比如,

AuthorizationRequiredError:"Valid authentication was not provided"。
 

在API Access选项下选择Create API key,填写描述并勾选"Read telemetry"。

点击Generate key,会得到一个key字符串。注意,在这里必须保存key,因为关闭页面之后,无法通过任何方式再查询到生成的key。如果key丢失,只能重建另一个key。

访问

有了Application ID和API key,就可以访问API了。

这个页面有一个很好的例子,可以参考:

GET/Query

可以用postman之类的工具测试http请求。

限制

注意,query中使用的Kusto查询引擎是一个即席查询引擎(ad-hoc query engine),它会尝试在内存中保存全部相关数据来满足查询,这导致查询可能会无限制地占用服务资源,带来风险。因此,Kusto提供了一些内置的查询限制以避免风险。比如,单次查询的结果大小不可以超过64MB。

更多限制,请参考:Query limits

自己写的query工具

因为程序可能需要对不同的Application Insight的不同的API执行不同的Query,因此,基本的处理思路是在配置文件中配置相关信息,程序从配置文件中读取需要执行的全部query,逐一查询后,返回结果列表。

下面是json格式的配置文件(profile.json)和python代码。

配置文件

{
"application_insight": {
"host": "api.applicationinsights.io",
"apps": {
"my-app-insights": {
"id": "d1e9f429-c437-6034b32df878",
"description": "it is an example",
"apis": {
"exception_monitor": {
"description": "daily report",
"key": "01234qwerrttyypolmknbshjdfggu",
"version": "v1"
}
}
}
},
"queries": [
{
"name": "query1",
"app": "my-app-insights",
"api": "exception_monitor",
"statement": "exceptions | where operation_Name == \"\"",
"time_field_name": "timestamp"
},
{
"name": "query2",
"app": "my-app-insights",
"api": "exception_monitor",
"statement": "exceptions | where operation_Name contains \"AdapterV1\"",
"time_field_name": "timestamp"
}
],
"default_filter": {
"time_range": "between( endofday( now(), -8) .. endofday( now(), -1) )"
}
}
}

说明,

  • host:固定值http://api.applicationinsights.io
  • apps:Application Insight相关数据。
  • apis:Api相关数据。
  • queries:需要执行的query。
  • default_filter:默认的查询条件,目前只有默认时间功能,例子里的条件是最近7个整天。

查询

查询代码如下:

import requests
import json
import asyncio async def request_get(url, headers, name):
return {name: json.loads(requests.get(url, headers=headers).text)} async def __execute_query(config): default_filter = config["default_filter"]
http_requests = []
for query in config["queries"]:
app = config["apps"][query["app"]]
api = app["apis"][query["api"]]
query_url = f'''https://{config["host"]}/{api["version"]}/apps/{app["id"]}/query?query={query["statement"]}'''
if query["time_field_name"] and default_filter["time_range"]:
query_url = query_url + f''' and {query["time_field_name"]} {default_filter["time_range"]} '''
headers = {'X-Api-Key': api["key"]}
http_requests.append(request_get(query_url, headers, query["name"])) return await asyncio.gather(*http_requests) def execute_query(): with open('profile.json', 'r') as config_file:
query_config = json.load(config_file)["application_insight"] return asyncio.run(__execute_query(query_config))

基本思路是从配置文件加载queries,逐个放入任务列表中,最后统一并发执行、获取结果。

其中使用了request发送http请求、asyncio实现并发。

总结

本文是我关于Azure Application Insights REST API的知识和实践的总结。这不是Azure Application Insights REST API的全部,可以参考微软文档以获取更多信息。

Azure Application Insights REST API使用教程的更多相关文章

  1. 【Azure Application Insights】在Azure Function中启用Application Insights后,如何配置不输出某些日志到AI 的Trace中

    问题描述 基于.NET Core的Function App如果配置了Application Insights之后,每有一个函数被执行,则在Application Insights中的Logs中的tra ...

  2. 【应用程序见解 Application Insights】使用Azure Monitor Application Insights Agent获取Azure VM中监控数据及IIS请求指标等信息

    问题情形 为了使用Application Insights也可以监控Azure VM中的相关性能数据,如CPU, Memory,IIS Reuqest等信息,可以在VM中开始一个一个扩展插件: Azu ...

  3. Azure Monitor(一)Application Insights

    一,引言 Azure Monitor 是 Azure 中的一项完整堆栈监视服务,是一种收集和分析遥测数据的服务.它提供了一组完整的功能来监视 Azure 资源以及其他云中和本地的资源.Azure Mo ...

  4. 【Azure 应用程序见解】 Application Insights 对App Service的支持问题

    问题描述 Web App 发布后, Application Insights 收集不到数据了 问题分析 在应用服务(App Service)中收集应用的监控数据(如Request,Exception, ...

  5. 【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集

    问题描述 近日好消息,如果是一个Java Spring Cloud的项目,想使用Azure Applicaiton Insights来收集日志及一些应用程序见解.但是有不愿意集成SDK来修改代码或者配 ...

  6. Azure 应用服务中的 API 应用、ASP.NET 和 Swagger 入门

    学习内容: 如何通过 Visual Studio 2015 中的内置工具在 Azure 应用服务中创建和部署 API 应用. 如何使用 Swashbuckle NuGet 包动态生成 Swagger ...

  7. 【应用程序见解 Application Insights】Application Insights 使用 Application Maps 构建请求链路视图

    Applicaotn  Insigths 使用 Application Maps 构建请求链路视图 构建系统时,请求的逻辑操作大多数情况下都需要在不同的服务,或接口中完成整个请求链路.一个请求可以经历 ...

  8. 使用Application Insights 做分析

    Application Insights on Windows Desktop apps, services and worker roles : https://azure.microsoft.co ...

  9. 关于Application Insights遥测功能使用【遇到问题】

    简介:Application Insights是微软发布的一个在线服务,可以监测自己的网站应用,进行性能管理以及使用分析. Application Insights功能一开始是出现在Visualstu ...

随机推荐

  1. C# 一个计算器功能实现引发的思考

    一.需求 计算器功能需求,这个众所周知,很明确了. 二.步骤分析 1)初级实现计算器 static int Calculator(int a,int b,string str) { switch(st ...

  2. MongoDB Day 1

    创建数据库 db.createCollection("user"); 插入字段 //----insert------- db.user.insert({uid:1, user_co ...

  3. python+appium自动化测试(一)-----环境搭建

    基础背景: windows7系统 +python3.4版本 环境搭建目标: 使用python编写app自动化测试脚本并成功执行. 搭建步骤:   1.安装python3,安装步骤详见:https:// ...

  4. Nacos(三):Nacos与OpenFeign的对接使用

    前言 上篇文章中,简单介绍了如何在SpringCloud项目中接入Nacos作为注册中心,其中服务消费者是通过RestTemplate+Ribbon的方式来进行服务调用的. 实际上在日常项目中服务间调 ...

  5. 记:使用vue全家桶 + vux组件库 打包成 dcloud 5+ app 开发过程中遇到的问题

    vue-cli 版本:2.9.6   webpack 版本:3.6.0 1. vue-cli 安装好之后,不是自动打开默认浏览器 在 config文件夹 ---> dev选项中,有个 autoO ...

  6. Linux命令行中好用的快捷键

    Ctrl + L:清屏,与clear同效: Ctrl + D:终结当前程序,向终端传递EOF(End Of File): Ctrl + A:光标移至一行命令开头: Ctrl + E:光标移至一行命令结 ...

  7. 为了完成这个功能,我竟然用5行代码制作了一个EXE可执行程序

    由于用户访问我们某个网址的路径比较长,最后我们确定了在桌面添加快捷入口的方案,让用户点击快捷入口直接进入直接的网址,而且这个快捷入口要带有指定的logo(排除了新建url快捷方式的方案),所以我决定写 ...

  8. 随笔编号-06 MYSQL数据库相关知识合集

    1  MYSQL取得某一范围随机数: 关键词:RAND() [产生0~1之间的随机数] mysql> SELECT RAND( ), RAND( ), RAND( ); +----------- ...

  9. 大转盘(CocosCreator)

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 1.在场景中搭建大转盘场景,假设 奖项有n项,对应的每项旋转角度如下: 第几项 需要旋转的角度 0 360/n/2 1 360/ ...

  10. ZOJ3435

    题意略. 思路: 将每一个点的坐标 (x,y,z) 与 (1,1,1) 相减,得到向量 (x - 1,y - 1,z - 1) 我们实际上就是要求出 这样互质的三元组有多少对就行了. 我们把这个长方体 ...