Azure Functions
编辑Azure Functions
编辑Azure Functions 集成允许你监视 Azure Functions。Azure Functions 是一个事件驱动的无服务器计算平台,可帮助你使用你选择的编程语言更高效地进行开发。触发器会导致函数运行。触发器定义如何调用函数,并且一个函数必须恰好有一个触发器。
使用 Azure Functions 构建 Web API、响应数据库更改、处理 IoT 流、管理消息队列等等。有关详细信息,请参阅常见的 Azure Functions 场景。
托管计划和指标
编辑每个 Azure Functions 应用都需要一个托管计划:消耗计划、弹性消耗计划、高级计划、专用计划或容器应用。有关各种计划的更多详细信息,请查看 Azure Functions 托管选项。
这些计划在生成的指标数量上互不相同,然后这些指标会导出到 Azure 之外,供其他监视解决方案(如 Elastic Observability)使用。例如,特定于 Azure Function Apps 的指标(如 FunctionExecutionCount 和 FunctionExecutionUnits)仅适用于在消耗(无服务器)计划上运行的函数应用,并且在其他计划中不可见。另一方面,所有其他指标都专门为高级计划和专用计划生成,并且不适用于消耗计划。
数据流
编辑Azure Functions 集成包含两个数据流:函数应用日志 和 指标
日志
编辑支持的日志类别
日志类别 | 描述 |
---|---|
Functionapplogs |
函数应用日志。 |
要求和设置
编辑有关设置和使用此集成的更多信息,请参阅 Azure 日志页面。
配置选项
编辑eventhub
: 字符串 事件中心是一项完全托管的实时数据引入服务。Elastic 建议仅使用字母、数字和连字符 (-) 作为事件中心名称,以最大化兼容性。你可以使用事件中心名称中带有下划线 (_) 的现有事件中心;在这种情况下,当集成使用事件中心名称在后台创建依赖的 Azure 资源时(例如,用于存储事件中心使用者偏移量的存储帐户容器),会将下划线替换为连字符 (-)。Elastic 还建议为每种日志类型使用单独的事件中心,因为每种日志类型的字段映射不同。默认值为 insights-operational-logs
。
consumer_group
: 字符串 事件中心的发布/订阅机制通过使用者组启用。使用者组是整个事件中心的视图(状态、位置或偏移量)。使用者组使多个使用者应用程序可以各自拥有事件流的单独视图,并以自己的速度和自己的偏移量独立读取该流。默认值:$Default
connection_string
: 字符串 需要连接字符串才能与事件中心通信,请参阅此处的步骤。
为了存储/检索/更新事件中心消息的偏移量或状态,需要一个 Blob 存储帐户。这意味着在停止 Azure 日志包后,它可以从停止处理消息的位置重新启动。
storage_account
: 字符串 将存储和更新状态/偏移量的存储帐户的名称。
storage_account_key
: 字符串 存储帐户密钥,此密钥将用于授权访问存储帐户中的数据。
storage_account_container
: 字符串 集成存储使用者组的检查点数据的存储帐户容器。这是一个高级选项,请谨慎使用。你必须为每种 Azure 日志类型(活动、登录、审核日志等)使用专用的存储帐户容器。请勿将同一容器名称重复用于多个 Azure 日志类型。有关 Microsoft 的命名规则的详细信息,请参阅 容器名称。如果未指定,集成将生成一个默认容器名称。
resource_manager_endpoint
: 字符串 可选,默认情况下我们使用的是 Azure 公共环境,要覆盖,用户可以提供特定的资源管理器终结点以使用不同的 Azure 环境。
资源管理器终结点
# Azure ChinaCloud https://management.chinacloudapi.cn/ # Azure GermanCloud https://management.microsoftazure.de/ # Azure PublicCloud https://management.azure.com/ # Azure USGovernmentCloud https://management.usgovcloudapi.net/
示例
以下是 functionapplogs
的示例事件
{ "@timestamp": "2023-05-23T20:11:59.000Z", "azure": { "category": "FunctionAppLogs", "function": { "app_name": "test-function", "category": "Function.hello", "event_name": "FunctionStarted", "host_instance_id": "bb84c437-4c26-4d0b-a06d-7fc2f16976e3", "host_version": "4.19.2.2", "invocation_id": "d878e365-b3d6-4796-9292-7500acd0c677", "level": "Information", "level_id": 2, "message": "Executing Functions.hello (Reason=This function was programmatically called via the host APIs., Id=d878e365-b3d6-4796-9292-7500acd0c677)", "name": "Functions.hello", "process_id": 67, "role_instance": "54108609-638204200593759681" }, "operation_name": "Microsoft.Web/sites/functions/log", "resource": { "group": "TEST-RG", "id": "/SUBSCRIPTIONS/12CABCB4-86E8-404F-A3D2-1DC9982F45CA/RESOURCEGROUPS/TEST-RG/PROVIDERS/MICROSOFT.WEB/SITES/TEST-FUNCTION", "name": "TEST-FUNCTION", "provider": "MICROSOFT.WEB/SITES" }, "subscription_id": "12CABCB4-86E8-404F-A3D2-1DC9982F45CA" }, "cloud": { "account": { "id": "12CABCB4-86E8-404F-A3D2-1DC9982F45CA" }, "provider": "azure" }, "ecs": { "version": "8.11.0" }, "event": { "original": "{\"time\":\"2023-05-23T20:11:59Z\",\"resourceId\":\"/SUBSCRIPTIONS/12CABCB4-86E8-404F-A3D2-1DC9982F45CA/RESOURCEGROUPS/TEST-RG/PROVIDERS/MICROSOFT.WEB/SITES/TEST-FUNCTION\",\"category\":\"FunctionAppLogs\",\"operationName\":\"Microsoft.Web/sites/functions/log\",\"level\":\"Informational\",\"location\":\"East US\",\"properties\":{\"appName\":\"test-function\",\"roleInstance\":\"54108609-638204200593759681\",\"message\":\"Executing Functions.hello (Reason=This function was programmatically called via the host APIs., Id=d878e365-b3d6-4796-9292-7500acd0c677)\",\"category\":\"Function.hello\",\"hostVersion\":\"4.19.2.2\",\"functionInvocationId\":\"d878e365-b3d6-4796-9292-7500acd0c677\",\"functionName\":\"Functions.hello\",\"hostInstanceId\":\"bb84c437-4c26-4d0b-a06d-7fc2f16976e3\",\"level\":\"Information\",\"levelId\":2,\"processId\":67,\"eventId\":1,\"eventName\":\"FunctionStarted\"}}" }, "observer": { "product": "Azure Functions", "type": "functions", "vendor": "Azure" }, "tags": [ "preserve_original_event" ] }
ECS 字段参考
有关 ECS 字段的详细信息,请参阅以下 文档。
导出的字段
字段 | 描述 | 类型 |
---|---|---|
@timestamp |
事件时间戳。 |
日期 |
azure.category |
日志类别名称。 |
关键词 |
azure.function.app_name |
函数应用程序名称。 |
关键词 |
azure.function.category |
操作类别。 |
关键词 |
azure.function.event_id |
事件 ID。 |
长整型 |
azure.function.event_name |
事件名称。 |
关键词 |
azure.function.exception_details |
异常详细信息。包括异常类型、消息和堆栈跟踪。 |
match_only_text |
azure.function.exception_message |
异常消息。 |
match_only_text |
azure.function.exception_type |
异常类型。 |
关键词 |
azure.function.host_instance_id |
主机实例 ID。 |
关键词 |
azure.function.host_version |
Functions 主机版本。 |
关键词 |
azure.function.invocation_id |
记录消息的调用 ID。 |
关键词 |
azure.function.level |
日志级别。有效值为 Trace、Debug、Information、Warning、Error 或 Critical。 |
关键词 |
azure.function.level_id |
日志级别的整数值。有效值为 0(跟踪)、1(调试)、2(信息)、3(警告)、4(错误)或 5(严重)。 |
长整型 |
azure.function.message |
日志消息。 |
关键词 |
azure.function.name |
记录消息的函数的名称。 |
关键词 |
azure.function.process_id |
进程 ID。 |
长整型 |
azure.function.role_instance |
角色实例 ID。 |
关键词 |
azure.operation_name |
操作名称。 |
关键词 |
azure.resource.group |
Azure 资源组 |
关键词 |
azure.resource.id |
资源 ID |
关键词 |
azure.resource.name |
名称 |
关键词 |
azure.resource.provider |
资源类型/命名空间 |
关键词 |
azure.subscription_id |
Azure 订阅 ID |
关键词 |
azure.tenant_id |
租户 ID |
关键词 |
data_stream.dataset |
数据流数据集名称。 |
常量_关键词 |
data_stream.namespace |
数据流命名空间。 |
常量_关键词 |
data_stream.type |
数据流类型。 |
常量_关键词 |
dataset.name |
数据集名称。 |
常量_关键词 |
dataset.namespace |
数据集命名空间。 |
常量_关键词 |
dataset.type |
数据集类型。 |
常量_关键词 |
指标
编辑指标可让你深入了解 Azure 函数应用的性能。集成包括一个开箱即用的仪表板,用于可视化 Azure Functions 中托管的应用生成的监视数据。
要求
编辑要使用此集成,你需要
- Azure 应用程序注册:你需要设置一个 Azure 应用程序注册,以允许代理访问 Azure API。应用程序注册需要具有“监视读取者”角色才能访问,以便能够从函数应用收集指标。请参阅“设置”部分中的更多详细信息。
- Elasticsearch 和 Kibana:你需要 Elasticsearch 来存储和搜索数据,并需要 Kibana 来可视化和管理数据。你可以使用我们在 Elastic Cloud 上的托管 Elasticsearch 服务(推荐)、本机 Azure 集成或在你的硬件上自行管理 Elastic Stack。
设置
编辑┌────────────────────┐ ┌─────────┐ ┌─-─────────────────────┐ │ │ │ │ │ azure.functions │ │ Azure APIs │──────▶│ Agent │──────▶│ <<data stream>> │ │ │ │ │ │ │ └────────────────────┘ └─────────┘ └───-───────────────────┘
Elastic Agent 需要应用程序注册才能代表你访问 Azure,以使用 Azure REST API 收集数据。需要应用程序注册才能以编程方式访问 Azure API。
要开始使用此集成收集数据,你需要
- 通过注册应用程序、添加凭据和分配适当的角色来设置新的 Azure 应用程序注册。
- 在 Kibana 中指定集成 设置,这将确定集成如何访问 Azure API。
注册新应用
编辑要创建新的应用程序注册,请
- 登录 Azure 门户。
- 搜索并选择 Microsoft Entra ID。
- 在 管理 下,选择 应用注册 > 新建注册。
- 为你的应用程序输入一个显示名称(例如,“elastic-agent”)。
- 指定谁可以使用该应用程序。
- 重定向 URI 不要输入任何内容。这是可选的,代理不使用它。
- 选择 注册 完成初始应用注册。
记下 应用程序(客户端)ID,稍后在集成设置中指定 客户端 ID 时会用到。
添加凭据
编辑凭据允许你的应用程序访问 Azure API 并进行身份验证,无需在运行时与用户交互。
此集成使用客户端密钥来证明其身份。
- 在 Azure 门户中,选择你在上一节中创建的应用程序。
- 选择 证书 & 机密 > 客户端机密 > 新建客户端机密。
- 添加描述(例如,“Elastic Agent 客户端机密”)。
- 选择机密的过期时间或指定自定义生命周期。
- 选择 添加。
记下 客户端机密 表中 值 列中的内容,稍后在集成设置中指定 客户端机密 时会用到。离开此页面后,此机密值将不再显示。 将机密值记录在安全的地方。
分配角色
编辑- 在 Azure 门户中,搜索并选择 订阅。
- 选择要为其分配应用程序的订阅。
- 选择 访问控制 (IAM)。
- 选择 添加 > 添加角色分配 以打开添加角色分配页。
- 在 角色 选项卡中,搜索并选择角色 监控读取者。
- 选择 下一步 按钮,移动到 成员 选项卡。
- 选择 为以下对象分配访问权限 > 用户、组或服务主体,然后选择 选择成员。默认情况下,此页不显示可用选项中的 Azure AD 应用程序。
- 要查找你的应用程序,请按名称搜索(例如,“elastic-agent”),然后从列表中选择它。
- 单击 选择 按钮。
- 然后单击 查看 + 分配 按钮。
记下以下值,稍后在指定设置时会用到。
-
订阅 ID
:使用你选择的“订阅 ID”的内容。 -
租户 ID
:使用你使用的 Azure Active Directory 中的“租户 ID”。
你的应用注册现在可以与 Elastic Agent 一起使用了。
其他资源
编辑如果你想了解有关此过程的更多信息,可以阅读 Microsoft 提供的以下两个通用指南
主要选项
编辑设置的主要部分包含访问 Azure API 和收集 Azure Functions 指标数据所需的所有选项。现在你将使用应用注册中的所有值,包括
客户端 ID
字符串:应用注册的唯一标识符(有时称为应用程序 ID)。
客户端机密
字符串:用于身份验证的客户端机密。
订阅 ID
字符串:Azure 订阅的唯一标识符。你只能提供一个订阅 ID。代理使用此 ID 来访问 Azure API。
租户 ID
字符串:Azure Active Directory 的租户 ID 的唯一标识符。
高级选项
编辑还有两个额外的高级选项
资源管理器终结点
字符串:可选。默认情况下,集成使用 Azure 公共环境。要覆盖,用户可以提供特定的资源管理器终结点以使用不同的 Azure 环境。
示例
-
https://management.chinacloudapi.cn
用于 Azure 中国云 -
https://management.microsoftazure.de
用于 Azure 德国云 -
https://management.azure.com
用于 Azure 公共云 -
https://management.usgovcloudapi.net
用于 Azure 美国政府云
Active Directory 终结点
字符串:可选。默认情况下,集成使用关联的 Active Directory 终结点。要覆盖,用户可以提供特定的 Active Directory 终结点以使用不同的 Azure 环境。
示例
-
https://login.chinacloudapi.cn
用于 Azure 中国云 -
https://login.microsoftonline.de
用于 Azure 德国云 -
https://login.microsoftonline.com
用于 Azure 公共云 -
https://login.microsoftonline.us
用于 Azure 美国政府云
指标参考
编辑示例
指标
的示例事件如下所示
{ "@timestamp": "2023-08-23T12:20:00.000Z", "agent": { "ephemeral_id": "7511408f-f109-4e34-a405-98ad479fc097", "id": "ae16c4cf-2550-452a-860d-cef5e5182e94", "name": "docker-fleet-agent", "type": "metricbeat", "version": "8.7.1" }, "azure": { "functions": { "app_connections": { "avg": 0 }, "average_memory_working_set": { "avg": 328533059.5 }, "bytes_received": { "total": 28804 }, "bytes_sent": { "total": 8192 }, "function_execution_count": { "total": 0 }, "function_execution_units": { "total": 0 }, "handles": { "avg": 0 }, "http2xx": { "total": 16 }, "http3xx": { "total": 0 }, "http4xx": { "total": 0 }, "http5xx": { "total": 16 }, "http_response_time": { "avg": 0.02796875 }, "io_other_bytes_per_second": { "total": 0 }, "io_other_operations_per_second": { "total": 0 }, "io_read_bytes_per_second": { "total": 31879 }, "io_read_operations_per_second": { "total": 0 }, "io_write_bytes_per_second": { "total": 0 }, "io_write_operations_per_second": { "total": 0 }, "memory_working_set": { "avg": 328533059.5 }, "requests": { "total": 32 }, "requests_inapplication_queue": { "avg": 0 }, "total_app_domains": { "avg": 0 }, "total_app_domains_unloaded": { "avg": 0 } }, "namespace": "Microsoft.Web/sites", "resource": { "group": "test-rg", "id": "/subscriptions/12hjkls-78tyu-404f-a3d2-1dc9982f45ds/resourceGroups/test-rg/providers/Microsoft.Web/sites/return-of-the-jedi", "name": "return-of-the-jedi", "tags": { "hidden-link: /app-insights-resource-id": "/subscriptions/12hjkls-78tyu-404f-a3d2-1dc9982f45ds/resourceGroups/test-rg/providers/Microsoft.Insights/components/return-of-the-jedi" }, "type": "Microsoft.Web/sites" }, "subscription_id": "12hjkls-78tyu-404f-a3d2-1dc9982f45ds", "timegrain": "PT5M" }, "data_stream": { "dataset": "azure.function", "namespace": "default", "type": "metrics" }, "ecs": { "version": "8.11.0" }, "elastic_agent": { "id": "ae16c4cf-2550-452a-860d-cef5e5182e94", "snapshot": false, "version": "8.7.1" }, "event": { "agent_id_status": "verified", "dataset": "azure.function", "duration": 42827917228, "ingested": "2023-08-23T12:25:34Z", "module": "azure" }, "host": { "architecture": "x86_64", "containerized": false, "hostname": "docker-fleet-agent", "id": "fd2c4b0943e444508c12855a04d117c7", "ip": [ "172.19.0.9" ], "mac": [ "02-42-AC-13-00-09" ], "name": "docker-fleet-agent", "os": { "codename": "focal", "family": "debian", "kernel": "5.15.49-linuxkit", "name": "Ubuntu", "platform": "ubuntu", "type": "linux", "version": "20.04.6 LTS (Focal Fossa)" } }, "metricset": { "name": "monitor", "period": 300000 }, "service": { "type": "azure" } }
ECS 字段参考
有关 ECS 字段的详细信息,请参阅以下 文档。
导出的字段
字段 | 描述 | 类型 | 单位 | 指标类型 |
---|---|---|---|---|
@timestamp |
事件时间戳。 |
日期 |
||
azure.application_id |
应用程序 ID |
关键词 |
||
azure.dimensions.* |
Azure 指标维度。 |
对象 |
||
azure.functions.app_connections.avg |
沙盒中存在的绑定套接字数(w3wp.exe 及其子进程)。绑定套接字通过调用 bind()/connect() API 创建,并保持到使用 CloseHandle()/closesocket() 关闭该套接字为止。适用于 WebApps 和 FunctionApps。 |
长整型 |
计数器 |
|
azure.functions.average_memory_working_set.avg |
应用程序使用的平均内存量,单位为 MiB。适用于 WebApps 和 FunctionApps。 |
长整型 |
字节 |
计量器 |
azure.functions.bytes_received.total |
应用程序消耗的传入带宽量,单位为 MiB。 |
长整型 |
字节 |
计量器 |
azure.functions.bytes_sent.total |
应用程序消耗的传出带宽量,单位为 MiB。 |
长整型 |
字节 |
计量器 |
azure.functions.current_assemblies.avg |
此应用程序中所有 AppDomain 中加载的当前程序集数。 |
长整型 |
计量器 |
|
azure.functions.file_system_usage.avg |
应用程序消耗的文件系统配额百分比。 |
长整型 |
字节 |
计量器 |
azure.functions.function_execution_count.total |
函数执行计数。仅适用于 FunctionApps。 |
长整型 |
计数器 |
|
azure.functions.function_execution_units.total |
函数执行单元。仅适用于 FunctionApps。 |
长整型 |
计数器 |
|
azure.functions.gen_0_collections.total |
自应用程序进程启动以来,第 0 代对象被垃圾回收的次数。较高代的 GC 包括所有较低代的 GC。 |
长整型 |
计数器 |
|
azure.functions.gen_1_collections.total |
自应用程序进程启动以来,第 1 代对象被垃圾回收的次数。较高代的 GC 包括所有较低代的 GC。 |
长整型 |
计数器 |
|
azure.functions.gen_2_collections.total |
自应用程序进程启动以来,第 2 代对象被垃圾回收的次数。较高代的 GC 包括所有较低代的 GC。 |
长整型 |
计数器 |
|
azure.functions.handles.avg |
应用程序进程当前打开的总句柄数。 |
长整型 |
计数器 |
|
azure.functions.health_check_status.avg |
运行状况检查状态。 |
长整型 |
计量器 |
|
azure.functions.http2xx.total |
导致 HTTP 状态代码 >= 200 但 < 300 的请求计数。 |
长整型 |
计数器 |
|
azure.functions.http3xx.total |
导致 HTTP 状态代码 >= 300 但 < 400 的请求计数。 |
长整型 |
计数器 |
|
azure.functions.http4xx.total |
导致 HTTP 状态代码 >= 400 但 < 500 的请求计数。 |
长整型 |
计数器 |
|
azure.functions.http5xx.total |
导致 HTTP 状态代码 >= 500 但 < 600 的请求计数。 |
长整型 |
计数器 |
|
azure.functions.http_response_time.avg |
应用程序服务请求所花费的时间,单位为秒。 |
长整型 |
秒 |
计量器 |
azure.functions.io_other_bytes_per_second.total |
应用程序进程向不涉及数据的 I/O 操作(例如,控制操作)发出的字节速率。显示为字节/秒。 |
长整型 |
计量器 |
|
azure.functions.io_other_operations_per_second.total |
应用程序进程发出的不是读取或写入操作的 I/O 操作的速率。显示为字节/秒。 |
长整型 |
计量器 |
|
azure.functions.io_read_bytes_per_second.total |
应用程序进程从 I/O 操作中读取字节的速率。显示为字节/秒。 |
长整型 |
计量器 |
|
azure.functions.io_read_operations_per_second.total |
应用程序进程发出读取 I/O 操作的速率。显示为字节/秒。 |
长整型 |
计量器 |
|
azure.functions.io_write_bytes_per_second.total |
应用程序进程向 I/O 操作写入字节的速率。显示为字节/秒。 |
长整型 |
计量器 |
|
azure.functions.io_write_operations_per_second.total |
应用程序进程发出写入 I/O 操作的速率。显示为字节/秒。 |
长整型 |
计量器 |
|
azure.functions.memory_working_set.avg |
应用程序当前使用的内存量,单位为 MiB。 |
长整型 |
字节 |
计量器 |
azure.functions.private_bytes.avg |
专用字节是应用程序进程已分配的无法与其他进程共享的内存的当前大小(以字节为单位)。 |
长整型 |
字节 |
计量器 |
azure.functions.requests.total |
不考虑其结果 HTTP 状态代码的请求总数。 |
长整型 |
计数器 |
|
azure.functions.requests_inapplication_queue.avg |
应用程序请求队列中的请求数。 |
长整型 |
计数器 |
|
azure.functions.threads.avg |
应用程序进程中当前活动的线程数。 |
长整型 |
计量器 |
|
azure.functions.total_app_domains.avg |
此应用程序中加载的当前 AppDomain 数。 |
长整型 |
计量器 |
|
azure.functions.total_app_domains_unloaded.avg |
自应用程序启动以来卸载的 AppDomain 总数。 |
长整型 |
计量器 |
|
azure.namespace |
所选的命名空间 |
关键词 |
||
azure.resource.group |
资源组 |
关键词 |
||
azure.resource.id |
资源的 ID |
关键词 |
||
azure.resource.name |
资源的名称 |
关键词 |
||
azure.resource.tags.* |
Azure 资源标记。 |
对象 |
||
azure.resource.type |
资源的类型 |
关键词 |
||
azure.subscription_id |
订阅 ID |
关键词 |
||
azure.timegrain |
Azure 指标时间粒度 |
关键词 |
||
cloud.image.id |
云实例的映像 ID。 |
关键词 |
||
data_stream.dataset |
数据流数据集名称。 |
常量_关键词 |
||
data_stream.namespace |
数据流命名空间。 |
常量_关键词 |
||
data_stream.type |
数据流类型。 |
常量_关键词 |
||
dataset.name |
数据集名称。 |
常量_关键词 |
||
dataset.namespace |
数据集命名空间。 |
常量_关键词 |
||
dataset.type |
数据集类型。 |
常量_关键词 |
||
host.containerized |
如果主机是一个容器。 |
布尔值 |
||
host.os.build |
操作系统版本信息。 |
关键词 |
||
host.os.codename |
操作系统代号(如果有)。 |
关键词 |
变更日志
编辑变更日志
版本 | 详细信息 | Kibana 版本 |
---|---|---|
0.8.0 |
增强 (查看拉取请求) |
— |
0.7.0 |
增强 (查看拉取请求) |
— |
0.6.0 |
增强 (查看拉取请求) |
— |
0.5.0 |
增强 (查看拉取请求) |
— |
0.4.2 |
增强 (查看拉取请求) |
— |
0.4.1 |
错误修复 (查看拉取请求) |
— |
0.4.0 |
增强 (查看拉取请求) |
— |
0.3.1 |
错误修复 (查看拉取请求) |
— |
0.3.0 |
增强 (查看拉取请求) |
— |
0.2.1 |
增强 (查看拉取请求) |
— |
0.2.0 |
增强 (查看拉取请求) |
— |
0.1.0 |
增强 (查看拉取请求) |
— |
0.0.1 |
增强 (查看拉取请求) |
— |