控制对 APM 数据的访问
Elastic Stack
从 8.2.0 版本开始,Applications UI 具有 Kibana 空间感知能力。 这允许您按团队、用例、服务环境或您选择的任何其他过滤器来分离您的数据以及对该数据的访问。
要利用此功能,您的 APM 数据需要写入不同的数据流。 一种实现方法是使用不同的命名空间。 例如,您可以将生产数据发送到具有 production
命名空间的 APM 集成,同时将暂存数据发送到具有 staging
命名空间的不同 APM 集成。
但不需要多个 APM 集成实例。 利用此功能的最简单方法是创建过滤别名。 有关更多信息,请参见下面的指南。
本指南将解释如何分离您的暂存和生产数据。 这有助于在排查生产问题时消除干扰,或者为某些数据创建更精细的访问控制。
本指南假定您
- 正在将暂存和生产 APM 数据都发送到 Elasticsearch 集群。
- 已在 APM 代理配置中配置了
environment
变量。 此变量在 APM 文档中设置service.environment
字段。 您应该具有service.environment: production
和service.environment: staging
的文档。 如果此字段为空,请参见 服务环境过滤器,以了解如何设置此值。
Applications UI 使用索引模式来查询您的 APM 数据。 索引模式可以匹配数据流、索引和/或别名。 默认值为
索引设置 | 默认索引模式 |
---|---|
错误 | logs-apm* |
Span/事务 | traces-apm* |
指标 | metrics-apm* |
默认索引设置还会查询 apm-*
数据视图。 此数据视图匹配 APM 早期版本(v8.0 之前)中传送的 APM 数据。
我们可以创建过滤别名供 Applications UI 查询,而不是查询默认 APM 数据视图。 过滤别名是一组数据流的辅助名称,它具有用户定义的过滤器,用于限制别名可以访问的文档。
要分离 staging
和 production
APM 数据,我们需要创建六个过滤别名——每个服务环境三个别名
索引设置 | production 环境 |
staging 环境 |
---|---|---|
错误 | production-logs-apm |
staging-logs-apm |
Span/事务 | production-traces-apm |
staging-traces-apm |
指标 | production-metrics-apm |
staging-metrics-apm |
production-<event>-apm
别名将包含一个过滤器,该过滤器仅提供对 service.environment
为 production
的文档的访问权限。 类似地,staging-<event>-apm
别名将包含一个过滤器,该过滤器仅提供对 service.environment
为 staging
的文档的访问权限。
要创建这六个过滤别名,请使用 Elasticsearch Aliases API。 在 Kibana 中,打开 Dev Tools 并运行以下 POST 请求。
traces-apm* production 别名示例
POST /_aliases?pretty
{
"actions": [
{
"add": {
"index": "traces-apm*",
"alias": "production-traces-apm",
"filter": {
"term": {
"service.environment": {
"value": "production"
}
}
}
}
}
]
}
- 此示例匹配 APM 跟踪数据流
- 别名不得匹配默认 APM 索引 (
traces-apm*,apm-*
) - 仅匹配
service.environment: production
的文档
logs-apm* production 别名示例
POST /_aliases?pretty
{
"actions": [
{
"add": {
"index": "logs-apm*",
"alias": "production-logs-apm",
"filter": {
"term": {
"service.environment": {
"value": "production"
}
}
}
}
}
]
}
- 此示例匹配 APM 日志数据流
- 别名不得匹配默认 APM 索引 (
logs-apm*,apm-*
) - 仅匹配
service.environment: production
的文档
metrics-apm* production 别名示例
POST /_aliases?pretty
{
"actions": [
{
"add": {
"index": "metrics-apm*",
"alias": "production-metrics-apm",
"filter": {
"term": {
"service.environment": {
"value": "production"
}
}
}
}
}
]
}
- 此示例匹配 APM 指标数据流
- 别名不得匹配默认 APM 索引 (
metrics-apm*,apm-*
) - 仅匹配
service.environment: production
的文档
traces-apm* staging 别名示例
POST /_aliases?pretty
{
"actions": [
{
"add": {
"index": "traces-apm*",
"alias": "staging-traces-apm",
"filter": {
"term": {
"service.environment": {
"value": "staging"
}
}
}
}
}
]
}
- 此示例匹配 APM 跟踪数据流
- 别名不得匹配默认 APM 索引 (
traces-apm*,apm-*
) - 仅匹配
service.environment: staging
的文档
logs-apm* staging 别名示例
POST /_aliases?pretty
{
"actions": [
{
"add": {
"index": "logs-apm*",
"alias": "staging-logs-apm",
"filter": {
"term": {
"service.environment": {
"value": "staging"
}
}
}
}
}
]
}
- 此示例匹配 APM 日志数据流
- 别名不得匹配默认 APM 索引 (
logs-apm*,apm-*
) - 仅匹配
service.environment: staging
的文档
metrics-apm* staging 别名示例
POST /_aliases?pretty
{
"actions": [
{
"add": {
"index": "metrics-apm*",
"alias": "staging-metrics-apm",
"filter": {
"term": {
"service.environment": {
"value": "staging"
}
}
}
}
}
]
}
- 此示例匹配 APM 指标数据流
- 别名不得匹配默认 APM 索引 (
metrics-apm*,apm-*
) - 仅匹配
service.environment: staging
的文档
接下来,您需要为每个服务环境创建一个 Kibana 空间。 要打开 Spaces,请在主菜单中找到 Stack Management,或使用 全局搜索字段。 要创建新空间,请单击 Create a space。 在本指南中,我们创建了两个 Kibana 空间,一个名为 production
,一个名为 staging
。
有关创建空间的更多信息,请参见 Kibana 空间。
现在,我们可以更改每个空间中 Applications UI 查询的默认数据视图。
打开 Applications UI 并导航到 Settings → Indices。 使用下表更新每个空间的设置。 每列中的值与我们在第一步中创建的过滤别名的名称匹配。
索引设置 | production 空间 |
staging 空间 |
---|---|---|
错误索引 | production-logs-apm |
staging-logs-apm |
Span 索引 | production-traces-apm |
staging-traces-apm |
事务索引 | production-traces-apm |
staging-traces-apm |
指标索引 | production-metrics-apm |
staging-metrics-apm |
要打开 Roles,请在主菜单中找到 Stack Management,或使用 全局搜索字段。 单击 Create role。
您需要创建两个角色:一个用于 staging
用户(我们将其称为 staging_apm_viewer
),一个用于 production
用户(我们将其称为 production_apm_viewer
)。
使用下表,为每个角色分配以下权限
权限 | production_apm_viewer |
staging_apm_viewer |
---|---|---|
索引权限 | index: production-*-apm , privilege: read |
index: staging-*-apm , privilege: read |
Kibana 权限 | space: production , feature privileges: APM and User Experience: read |
space: staging , feature privileges: APM and User Experience: read |

或者,您可以使用 Elasticsearch Create or update roles API
创建 production_apm_viewer 角色
此请求创建一个 production_apm_viewer
角色
POST /_security/role/production_apm_viewer
{
"cluster": [ ],
"indices": [
{
"names": ["production-*-apm"],
"privileges": ["read"]
}
],
"applications": [
{
"application" : "kibana-.kibana",
"privileges" : [
"feature_apm.read"
],
"resources" : [
"space:production"
]
}
]
}
- 此数据视图匹配在第一步中创建的所有生产别名。
- 为 Applications 和 User Experience UI 分配
read
权限。 - 提供对名为
production
的空间的访问权限。
创建 staging_apm_viewer 角色
此请求创建一个 staging_apm_viewer
角色
POST /_security/role/staging_apm_viewer
{
"cluster": [ ],
"indices": [
{
"names": ["staging-*-apm"],
"privileges": ["read"]
}
],
"applications": [
{
"application" : "kibana-.kibana",
"privileges" : [
"feature_apm.read"
],
"resources" : [
"space:staging"
]
}
]
}
- 此数据视图匹配在第一步中创建的所有暂存别名。
- 为 Applications 和 User Experience UI 分配
read
权限。 - 提供对名为
staging
的空间的访问权限。
最后要做的是将用户分配给上面新创建的角色。 用户将只能访问他们被授予权限的空间内的数据。
有关如何使用 Kibana UI 创建用户并为其分配角色的信息,请参见 保护对 Kibana 的访问。
或者,您可以使用 Elasticsearch Create or update users API。
此示例创建一个新用户并为其分配在上一步中创建的 production_apm_viewer
角色。 该用户将只能访问 service.environment
为 production
的生产空间和数据。 请记住更改 password
、full_name
和 email
字段。
POST /_security/user/production-apm-user
{
"password" : "l0ng-r4nd0m-p@ssw0rd",
"roles" : [ "production_apm_viewer" ],
"full_name" : "Jane Production Smith",
"email" : "janesmith@example.com"
}
- 分配先前创建的
production_apm_viewer
角色。
此示例创建一个新用户并为其分配在上一步中创建的 staging_apm_viewer
角色。 该用户将只能访问 service.environment
为 staging
的暂存空间和数据。 请记住更改 password
、full_name
和 email
字段。
POST /_security/user/staging-apm-user
{
"password" : "l0ng-r4nd0m-p@ssw0rd",
"roles" : [ "staging_apm_viewer" ],
"full_name" : "John Staging Doe",
"email" : "johndoe@example.com"
}
- 分配先前创建的
staging_apm_viewer
角色。
完成! 返回到 Applications UI,惊叹于您特定空间的数据吧。