菜单
开源

Grafana Mimirtool

Mimirtool 是一个命令行工具,运维人员和租户可以使用它来执行涉及 Grafana Mimir 或 Grafana Cloud Metrics 的一些常见任务。

  • alertmanager 命令使您能够在 Grafana Mimir Alertmanager 或 Grafana Cloud Metrics 中创建、更新和删除租户配置。

    有关 alertmanager 命令的更多信息,请参阅Alertmanager

  • rules 命令使您能够验证和 Lint Prometheus 规则文件,并将它们转换为 Grafana Mimir 中使用。您还可以在 Grafana Mimir 或 Grafana Cloud Metrics 中创建、更新和删除规则组。

    有关 rules 命令的更多信息,请参阅Rules

  • remote-read 子命令使您能够从 remote-read API 获取统计信息和系列。您可以将 remote-read API 的系列数据写入本地 TSDB 文件,然后将其加载到 Prometheus 中。

    有关 remote-read 命令的更多信息,请参阅Remote-read

  • analyze 命令从 Grafana 或 Hosted Grafana 实例提取指标使用情况的统计信息。您还可以从 Grafana dashboard JSON 文件或 Prometheus 规则 YAML 文件中提取相同的指标。

    有关 analyze 命令的更多信息,请参阅Analyze

  • bucket-validation 命令验证对象存储 bucket 是否适合作为 Grafana Mimir 的后端存储。

    有关 bucket-validation 命令的更多信息,请参阅Bucket validation

  • acl 命令生成在 Grafana Enterprise Metrics 和 Grafana Cloud Metrics 中使用的基于标签的访问控制头部。

    有关 acl 命令的更多信息,请参阅ACL

  • config 命令帮助将配置文从 Cortex 转换为 Grafana Mimir。

    有关 config 命令的更多信息,请参阅Config

  • backfill 命令将现有 Prometheus TSDB blocks 上传到 Grafana Mimir。

    有关 backfill 命令的更多信息,请参阅Backfill

Mimirtool 与以下项交互

  • Grafana Mimir 提供的面向用户的 API。
  • 包含 Grafana Mimir 数据的后端存储组件。

安装

要在 macOS 上使用 Homebrew 安装 Mimirtool,请运行 brew install mimirtool

要在其他环境中安装 Mimirtool,请从最新发布页下载适用于您的操作系统和架构的相应二进制文件,并使其可执行。

或者,使用命令行工具(如 curl)下载 mimirtool。例如,对于 AMD64 架构的 Linux,使用以下命令:

bash
curl -fLo mimirtool https://github.com/grafana/mimir/releases/latest/download/mimirtool-linux-amd64
chmod +x mimirtool

配置选项

为了让 Mimirtool 与 Grafana Mimir、Grafana Enterprise Metrics、Prometheus 或 Grafana 交互,请设置以下环境变量或 CLI 标志。

环境变量标志描述
MIMIR_ADDRESS--address设置 Grafana Mimir 集群 API 的地址。
MIMIR_API_USER--user设置基本认证用户名。如果此变量为空且 MIMIR_API_KEY 已设置,系统将改为使用 MIMIR_TENANT_ID。如果您使用的是 Grafana Cloud,此变量是您的实例 ID。
MIMIR_API_KEY--key设置基本认证密码。如果您使用的是 Grafana Cloud,此变量是您的 API 密钥。
MIMIR_TENANT_ID--id设置 Mimirtool 交互的 Grafana Mimir 实例的租户 ID。
MIMIR_EXTRA_HEADERS--extra-headers以 header=value 格式添加到请求中的额外头部。您可以多次指定此标志。环境变量值必须使用换行符分隔。

还可以使用以下环境变量或 CLI 标志设置 TLS 相关选项

环境变量标志描述
MIMIR_TLS_CA_PATH--tls-ca-path设置用于验证与 Grafana Mimir 集群连接的 CA 证书路径。
MIMIR_TLS_CERT_PATH--tls-cert-path设置用于向 Grafana Mimir 集群进行认证的客户端证书路径。
MIMIR_TLS_KEY_PATH--tls-key-path设置用于向 Grafana Mimir 集群进行认证的私钥路径。
MIMIR_TLS_INSECURE_SKIP_VERIFY--tls-insecure-skip-verify如果为 true,则禁用对 Grafana Mimir 集群 TLS 证书的验证。这是不安全的,不建议使用。

命令

以下部分概述了可以针对 Grafana Mimir 和 Grafana Cloud Metrics 运行的命令。

Alertmanager

以下命令与 Grafana Mimir Alertmanager 配置和告警模板文件交互。

注意

Mimir Alertmanager 基于您通过 -server.path-prefix 标志设置的路径公开配置 API;它不使用 -http.alertmanager-http-prefix 标志的路径。

如果您使用默认配置(即 -server.path-prefix 默认值为 /)运行 Mimir,则只需为 mimirtool 命令的 --address 标志设置主机名即可;不要设置特定路径的地址。

例如,/ 是正确的,而 /alertmanager 是不正确的。

获取 Alertmanager 配置

以下命令显示当前的 Alertmanager 配置。

bash
mimirtool alertmanager get

或者,您可以将配置和模板文件输出到一个文件夹中,以便稍后将其重新加载到 Alertmanager 中。例如,以下命令将文件输出到名为 am 的文件夹中:

bash
mimirtool alertmanager get --output-dir="am"

配置文件命名为 config.yaml,模板文件以 .tpl 结尾,每个模板都写入到单独的文件中。请注意,使用 --output-dir 标志只会将输出写入文件,而不再将配置打印到控制台。

加载 Alertmanager 配置

以下命令将 Alertmanager 配置加载到 Alertmanager 实例中。

bash
mimirtool alertmanager load <config_file>
mimirtool alertmanager load <config_file> <template_files>...
示例
bash
mimirtool alertmanager load ./example_alertmanager_config.yaml ./example_alertmanager_template.tpl

./example_alertmanager_config.yaml:

yaml
route:
  receiver: "example_receiver"
  group_by: ["example_groupby"]
receivers:
  - name: "example_receiver"
templates:
  - example_template.tpl

./example_alertmanager_template.tpl:

gotemplate
{{ define "alert_customer_env_message" }}
  [{{ .CommonLabels.alertname }} | {{ .CommonLabels.customer }} | {{ .CommonLabels.environment }}]
{{ end }}

[<template_files>...] 的输入接受通配符,例如 *.tpl 将包含所有以 .tpl 结尾的模板文件。如果我们已经使用先前的命令将配置和模板导出到目录,则可以加载它们:

bash
# assuming we have written the files out to the folder am
# mimirtool alertmanager get --output-dir="am"
mimirtool alertmanager load  am/config.yaml am/*.tpl

删除 Alertmanager 配置

以下命令删除 Grafana Mimir Alertmanager 中的 Alertmanager 配置。

bash
mimirtool alertmanager delete

为 Mimir 2.12 及更高版本迁移 Alertmanager 配置以支持 UTF-8

这需要 mimirtool 2.12 或更高版本。要检查您的 mimirtool 版本,请运行 mimirtool version

根据 prometheus/prometheus#13095prometheus/alertmanager#3486 的规定,Mimir 正在添加对 UTF-8 的支持。为了在告警、路由、静默和抑制规则中支持 UTF-8,Alertmanager 添加了一个新的匹配器解析器,其中包含许多向后不兼容的更改。有关这些更改的更多信息,请参阅此处

migrate-utf8 命令迁移现有 Alertmanager 配置,为在 Mimir 安装中启用 UTF-8 做准备。为此,它将与 UTF-8 不兼容的匹配器转换为兼容的等效匹配器。此转换是向后兼容的,不会更改现有匹配器的行为,并且即使在未启用 UTF-8 的 Mimir 安装中也能工作。

是否需要迁移 Alertmanager 配置取决于它是否包含与 UTF-8 不兼容的匹配器。您可以通过运行 verify 命令来验证现有 Alertmanager 配置是否需要为 UTF-8 进行迁移:

bash
mimirtool alertmanager verify <config_file> [template_files...]

如果命令成功且没有任何警告,则配置与 UTF-8 兼容,您无需进行迁移。

但是,如果命令打印以下警告,则需要使用 migrate-utf8 命令迁移 Alertmanager 配置。

Alertmanager is moving to a new parser for labels and matchers, and this input is incompatible. Alertmanager has instead parsed the input using the classic matchers parser as a fallback. To make this input compatible with the UTF-8 matchers parser please make sure all regular expressions and values are double-quoted. If you are still seeing this message please open an issue.

该命令接受现有配置和模板文件作为输入,并输出迁移后的配置和模板文件:

bash
mimirtool alertmanager migrate-utf8 <config_file> [template_files...]

您还可以将迁移后的配置和模板文件输出到一个文件夹中,以便稍后将其重新加载到 Alertmanager 中之前进行审查。建议您将迁移后的文件输出到与原始文件不同的文件夹中,以便您始终保留原始文件作为备份。例如,以下命令将迁移后的配置和模板文件输出到名为 migrated 的文件夹中:

bash
mimirtool alertmanager migrate-utf8 <config_file> [template_files...] --output-dir="migrated"

在输出目录中,配置文件命名为 config.yaml,模板文件以 .tpl 结尾,每个模板都写入到单独的文件中。

注意

当您使用 --output-dir 标志时,命令只将输出写入文件,而不会将配置打印到控制台。

迁移 Alertmanager 配置后,使用 verify 命令进行验证:

bash
mimirtool alertmanager verify <config_file> [template_files...]

它应该成功且没有警告。

您还可以使用 --utf8-strict-mode 标志运行 verify 命令,以验证 Alertmanager 配置是否与 UTF-8 兼容:

bash
mimirtool alertmanager verify <config_file> [template_files...] --utf8-strict-mode

使用此标志时,verify 命令会打印一个带有文本 UTF-8 mode enabled 的警告,以告知您该命令正在使用 UTF-8 严格模式验证 Alertmanager 配置。与省略该标志不同,如果配置与 UTF-8 不兼容,它不会打印警告。相反,命令将以错误退出。例如:

bash
level=warn msg="UTF-8 strict mode enabled"
mimirtool: error: end of input: expected label value, try --help

如果命令成功退出且没有错误,并且您对迁移后的配置和模板文件所做的更改感到满意,则可以使用 load 命令重新加载它。

验证 Alertmanager 配置

以下命令验证 Alertmanager 配置文件。它不会将配置加载到 Alertmanager 实例中。

bash
mimirtool alertmanager verify <config_file> [template_files...]

告警验证

以下命令验证 Alertmanager 集群中的告警是否去重。此命令对于在从 Prometheus 迁移到 Grafana Mimir 告警评估时验证正确配置非常有用。

bash
mimirtool alerts verify

渲染模板

您可以使用 render 命令渲染您的 Alertmanager 模板。

--template.glob 选项的参数是一个 glob 模式,它展开到告警模板路径。

--template.data 选项的参数是一个包含 Alertmanager 模板数据的 JSON 文件。

--template.text 选项的参数是一个 Go 模板。命令将使用通过展开 --template-glob 找到的模板来渲染此模板。

以下命令渲染模板并将其打印到终端。它假设您已将模板写入 templates 目录。

bash
mimirtool alertmanager render --template.glob 'templates/*' --template.data alert_data1.json --template.text '{{ template "my_message" . }}'

规则

rules 命令包含用于处理 Prometheus 规则文件以及 Grafana Mimir ruler 中 API 的子命令。

本节中的命令使您能够执行以下操作:

  • 加载和显示 Prometheus 规则文件
  • 与 Mimir ruler 中的单个规则组交互
  • 操作本地规则文件

mimirtool rules 提供的一些功能也可以作为 GitHub Action 使用。有关更多信息,请参阅 Mimirtool Github Action 的文档

与 rules 命令相关的配置选项

标志描述
--auth-tokenBearer token 或 JWT 认证的认证 token。

列出规则

以下命令检索 Grafana Mimir 实例中所有规则组的名称并将其打印到终端。

bash
mimirtool rules list

以下命令检索 Grafana Mimir 实例中的所有规则组并将其打印到终端。

bash
mimirtool rules print

要保存所有规则以便编辑和重新上传到 Mimir,请使用 --output-dir 选项。默认输出目录是当前目录。输出文件的格式符合 mimirtool rules loadmimirtool rules sync 的要求。

例如,要将文件保存在 rules 子目录中:

bash
mimirtool rules print --output-dir=rules

获取规则组

以下命令检索单个规则组并将其打印到终端。

bash
mimirtool rules get <namespace> <rule_group_name>

要保存规则组以便编辑和重新上传到 Mimir,请使用 --output-dir 选项。默认输出目录是当前目录。输出文件的格式符合 mimirtool rules loadmimirtool rules sync 的要求。

例如,要将文件保存在 rules 子目录中:

bash
mimirtool rules get <namespace> <rule_group_name> --output-dir=rules

删除规则组

以下命令删除一个规则组。

bash
mimirtool rules delete <namespace> <rule_group_name>

加载规则组

以下命令将文件中的每个规则组加载到 Grafana Mimir 中。此命令会覆盖所有同名规则组。

bash
mimirtool rules load <file_path>...
示例
bash
mimirtool rules load ./example_rules_one.yaml

./example_rules_one.yaml:

yaml
namespace: my_namespace
groups:
  - name: example
    interval: 5m
    rules:
      - record: job:http_inprogress_requests:sum
        expr: sum by (job) (http_inprogress_requests)

此命令与其它 rules 子命令一样,可以一次加载多个规则组:

bash
mimirtool rules load ./example_rules_one.yaml ./example_rules_two.yaml

删除命名空间

以下命令删除命名空间中的所有规则组,包括命名空间本身:

bash
mimirtool rules delete-namespace <namespace>

Lint

lint 命令在规则文件中提供 YAML 和 PromQL 表达式格式化。

此命令会原地编辑规则文件。要执行不进行更改的试运行,可以使用 dry run 标志 (-n)。

注意

此命令不验证查询是否正确,也不与您的 Grafana Mimir 集群交互。

bash
mimirtool rules lint <file_path>...

文件的格式与rules load中所示的格式相同。

准备

prepare 命令准备要上传到 Grafana Mimir 的规则文件。它会 Lint 所有 PromQL 表达式,并在文件中的 PromQL 查询聚合中添加一个标签。文件的格式与rules load中所示的格式相同。

注意

此命令不与您的 Grafana Mimir 集群交互。

bash
mimirtool rules prepare <file_path>...
配置
标志描述
-i, --in-place原地编辑文件。如果未设置,系统将生成一个带有扩展名 .result 的新文件,其中包含结果。
-l, --label="cluster"指定聚合的标签。默认情况下,标签设置为 cluster
--label-excluded-rule-groups逗号分隔的规则组名称列表,用于在聚合中包含配置的标签时排除。
--rule-dirs逗号分隔的包含规则 yaml 文件的目录路径列表。将解析目录中所有带有 .yml 或 .yaml 后缀的文件。
示例
bash
mimirtool rules prepare ./example_rules_one.yaml

./example_rules_one.yaml:

yaml
namespace: my_namespace
groups:
  - name: example
    interval: 5m
    rules:
      - record: job:http_inprogress_requests:sum
        expr: sum by (job) (http_inprogress_requests)

./example_rules_one.yaml.result:

yaml
namespace: my_namespace
groups:
  - name: example
    interval: 5m
    rules:
      - record: job:http_inprogress_requests:sum
        # note the added cluster label
        expr: sum by(job, cluster) (http_inprogress_requests)

命令运行后,输出消息会指示操作是否成功:

console
INFO[0000] SUCCESS: 1 rules found, 0 modified expressions

检查

check 命令根据 最佳实践 检查规则。此命令不与您的 Grafana Mimir 集群交互。

bash
mimirtool rules check <file_path>...
示例
bash
mimirtool rules check rules.yaml

rules.yaml

yaml
namespace: my_namespace
groups:
  - name: example
    interval: 5m
    rules:
      - record: job_http_inprogress_requests_sum
        expr: sum by (job) (http_inprogress_requests)
console
ERRO[0000] bad recording rule name error="recording rule name does not match level:metric:operation format, must contain at least one colon" file=rules.yaml rule=job_http_inprogress_requests_sum ruleGroup=example

文件的格式与rules load中所示的格式相同。

差异对比

以下命令将本地规则与 Grafana Mimir 集群中的规则进行比较。

bash
mimirtool rules diff <file_path>...

文件的格式与rules load中所示的格式相同。

要限制受影响的命名空间,请使用 --namespaces--ignore-namespaces 参数,以及它们的 RegEx 变体 --namespaces-regex--ignore-namespaces-regex

配置
标志描述
--namespaces差异对比期间要检查的命名空间逗号分隔列表
--ignored-namespaces差异对比期间要忽略的命名空间逗号分隔列表
--namespaces-regex差异对比期间匹配命名空间的正则表达式
--ignored-namespaces-regex差异对比期间忽略的命名空间正则表达式

只能指定一个命名空间选择标志。

同步

sync 命令将本地规则与 Grafana Mimir 集群中的规则进行比较。该命令将任何差异应用到您的 Grafana Mimir 集群。

bash
mimirtool rules sync <file_path>...

文件的格式与rules load中所示的格式相同。

配置
标志描述
--namespaces同步期间要检查的命名空间逗号分隔列表
--ignored-namespaces同步期间要忽略的命名空间逗号分隔列表
--namespaces-regex同步期间匹配命名空间的正则表达式
--ignored-namespaces-regex同步期间忽略的命名空间正则表达式

只能指定一个命名空间选择标志。

Remote-read

Grafana Mimir 公开了一个 remote read API,它允许系统访问存储的系列。mimirtoolremote-read 子命令使您能够与该 API 交互,并确定存储了哪些系列。

Stats

remote-read stats 命令总结了匹配选择器的存储系列的统计信息。

示例
bash
mimirtool remote-read stats --selector '{job="node"}' --address http://demo.robustperception.io:9090 --remote-read-path /api/v1/read

运行命令会产生以下输出:

console
INFO[0000] Create remote read client using endpoint 'http://demo.robustperception.io:9090/api/v1/read'
INFO[0000] Querying time from=2020-12-30T14:00:00Z to=2020-12-30T15:00:00Z with selector={job="node"}
INFO[0000] MIN TIME                           MAX TIME                           DURATION     NUM SAMPLES  NUM SERIES   NUM STALE NAN VALUES  NUM NAN VALUES
INFO[0000] 2020-12-30 14:00:00.629 +0000 UTC  2020-12-30 14:59:59.629 +0000 UTC  59m59s       159480       425          0                     0

Dump

remote-read dump 命令打印所有匹配选择器的系列和样本。

示例
bash
mimirtool remote-read dump --selector 'up{job="node"}' --address http://demo.robustperception.io:9090 --remote-read-path /api/v1/read

运行命令会产生以下输出:

console
{__name__="up", instance="demo.robustperception.io:9100", job="node"} 1 1609336914711
{__name__="up", instance="demo.robustperception.io:9100", job="node"} NaN 1609336924709 # StaleNaN
...

Export

remote-read export 命令将所有匹配选择器的系列和样本导出到本地 TSDB。您可以使用本地工具(如 prometheuspromtool)进一步分析 TSDB。

bash
# Use Remote Read API to download all metrics with label job=name into local tsdb
mimirtool remote-read export --selector '{job="node"}' --address http://demo.robustperception.io:9090 --remote-read-path /api/v1/read --tsdb-path ./local-tsdb

运行命令会产生以下输出:

console
INFO[0000] Create remote read client using endpoint 'http://demo.robustperception.io:9090/api/v1/read'
INFO[0000] Created TSDB in path './local-tsdb'
INFO[0000] Using existing TSDB in path './local-tsdb'
INFO[0000] Querying time from=2020-12-30T13:53:59Z to=2020-12-30T14:53:59Z with selector={job="node"}
INFO[0001] Store TSDB blocks in './local-tsdb'
INFO[0001] BLOCK ULID                  MIN TIME                       MAX TIME                       DURATION     NUM SAMPLES  NUM CHUNKS   NUM SERIES   SIZE
INFO[0001] 01ETT28D6B8948J87NZXY8VYD9  2020-12-30 13:53:59 +0000 UTC  2020-12-30 13:59:59 +0000 UTC  6m0.001s     15950        429          425          105KiB867B
INFO[0001] 01ETT28D91Z9SVRYF3DY0KNV41  2020-12-30 14:00:00 +0000 UTC  2020-12-30 14:53:58 +0000 UTC  53m58.001s   143530       1325         425          509KiB679B
本地 TSDB 示例

以下命令使用 promtool 分析文件内容。

bash
promtool tsdb analyze ./local-tsdb

以下命令转储 TSDB 的所有值。

bash
promtool tsdb dump ./local-tsdb

以下命令使用本地 TSDB 运行本地 Prometheus。

bash
prometheus --storage.tsdb.path ./local-tsdb --config.file=<(echo "")

ACL

acl 命令生成在 Grafana Enterprise Metrics 和 Grafana Cloud Metrics 中使用的基于标签的访问控制头部。

生成头部

以下命令使您能够生成一个头部,您可以使用它在 Grafana Enterprise Metrics 或 Grafana Cloud 中实施访问控制规则。

注意

Grafana Mimir 不支持 ACL。

bash
mimirtool acl generate-header --id=<tenant_id> --rule=<promql_selector>
示例
bash
mimirtool acl generate-header --id=1234 --rule='{namespace="A"}'

示例输出

console
The header to set:
X-Prom-Label-Policy: 1234:%7Bnamespace=%22A%22%7D

分析

您可以分析您的 Grafana 或 Hosted Grafana 实例,以确定使用了哪些指标以及导出了哪些指标。您还可以从仪表盘 JSON 文件和规则 YAML 文件中提取指标。

Grafana

以下命令针对您的 Grafana 实例运行,下载其仪表盘,并提取其中查询中使用的 Prometheus 指标。输出是一个 JSON 文件。您可以将此文件与 analyze prometheus --grafana-metrics-file 一起使用。

bash
mimirtool analyze grafana --address=<url>
配置
环境变量标志描述
GRAFANA_ADDRESS--address设置 Grafana 实例的地址。.
GRAFANA_API_KEY--key设置 Grafana 实例的 API Key。要创建密钥,请参阅Authentication API
---output设置输出文件路径,默认值为 metrics-in-grafana.json
---folder-title设置文件夹过滤器,以根据确切的文件夹标题限制对仪表盘的分析,用于查找未使用的指标。当重复出现时,将分析任何匹配的文件夹。
示例输出文件
json
{
  "metricsUsed": [
    "apiserver_request:availability30d",
    "workqueue_depth",
    "workqueue_queue_duration_seconds_bucket"
  ],
  "dashboards": [
    {
      "slug": "",
      "uid": "09ec8aa1e996d6ffcd6817bbaff4db1b",
      "title": "Kubernetes / API server",
      "metrics": [
        "apiserver_request:availability30d",
        "apiserver_request_total",
        "cluster_quantile:apiserver_request_duration_seconds:histogram_quantile",
        "workqueue_depth",
        "workqueue_queue_duration_seconds_bucket"
      ],
      "parse_errors": ["unsupported panel type: \"news\""]
    }
  ]
}

Ruler

以下命令针对您的 Grafana Mimir、Grafana Enterprise Metrics 或 Grafana Cloud Prometheus 实例运行。该命令获取规则组并提取规则查询中使用的 Prometheus 指标。输出是一个 JSON 文件。您可以将此文件与 analyze prometheus --ruler-metrics-file 一起使用。

bash
mimirtool analyze ruler --address=<url> --id=<tenant_id>
配置
环境变量标志描述
MIMIR_ADDRESS--address设置 Prometheus 实例的地址。
MIMIR_TENANT_ID--id设置基本认证用户名。如果您使用的是 Grafana Cloud,此变量是您的实例 ID,也设置为租户 ID。
MIMIR_API_KEY--key设置基本认证密码。如果您使用的是 Grafana Cloud,此变量是您的 API 密钥。
MIMIR_AUTH_TOKEN--auth-token设置 Mimir 集群使用此方法认证所需的 bearer 或 JWT token。
---output设置输出文件路径,默认值为 metrics-in-ruler.json
示例输出文件
json
{
  "metricsUsed": [
    "apiserver_request_duration_seconds_bucket",
    "container_cpu_usage_seconds_total",
    "scheduler_scheduling_algorithm_duration_seconds_bucket"
  ],
  "ruleGroups": [
    {
      "namspace": "prometheus_rules",
      "name": "kube-apiserver.rules",
      "metrics": [
        "apiserver_request_duration_seconds_bucket",
        "apiserver_request_duration_seconds_count",
        "apiserver_request_total"
      ],
      "parse_errors": null
    }
  ]
}

仪表盘

以下命令接受 Grafana dashboard JSON 文件作为输入,并提取查询中使用的 Prometheus 指标。输出是一个 JSON 文件。您可以将输出文件与 analyze prometheus --grafana-metrics-file 一起使用。

bash
mimirtool analyze dashboard <file>...
配置
环境变量标志描述
---output设置输出文件路径,默认值为 metrics-in-grafana.json

规则文件

以下命令接受 Prometheus 规则 YAML 文件作为输入,并提取查询中使用的 Prometheus 指标。输出是一个 JSON 文件。您可以将输出文件与 analyze prometheus --ruler-metrics-file 一起使用。

bash
mimirtool analyze rule-file <file>
配置
环境变量标志描述
---output设置输出文件路径,默认值为 metrics-in-ruler.json

Prometheus

以下命令针对您的 Grafana Mimir、Grafana Metrics Enterprise、Prometheus 或 Cloud Prometheus 实例运行。该命令使用之前运行 analyze grafanaanalyze dashboardanalyze ruleranalyze rule-file 的输出,显示 Prometheus 实例中在仪表盘或规则中(或两者中)使用的系列数量。此命令还显示 Grafana Cloud 中存在但在仪表盘或规则中使用的指标。输出是一个 JSON 文件。

注意

该命令会为 Prometheus 实例中的每个活动系列发送一个请求。对于具有大量活动系列的 Prometheus 实例,此命令可能需要一些时间才能完成。

bash
mimirtool analyze prometheus --address=<url> --id=<tenant_id>
配置
环境变量标志描述
MIMIR_ADDRESS--address设置 Prometheus 实例的地址。
MIMIR_TENANT_ID--id设置基本认证用户名。如果您使用的是 Grafana Cloud,此变量是您的实例 ID,也设置为租户 ID。
MIMIR_API_KEY--key设置基本认证密码。如果您使用的是 Grafana Cloud,此变量是您的 API 密钥。
MIMIR_AUTH_TOKEN--auth-token设置 Mimir 集群使用此方法认证所需的 bearer 或 JWT token。
---grafana-metrics-filemimirtool analyze grafanamimirtool analyze dashboard 输出文件,默认值为 metrics-in-grafana.json
---ruler-metrics-filemimirtool analyze rulermimirtool analyze rule-file 输出文件,默认值为 metrics-in-ruler.json
---output设置输出文件路径,默认值为 prometheus-metrics.json
---prometheus-http-prefix设置 Prometheus API 将在其下提供的 HTTP URL 路径。
示例输出
json
{
  "total_active_series": 38184,
  "in_use_active_series": 14047,
  "additional_active_series": 24137,
  "in_use_metric_counts": [
    {
      "metric": "apiserver_request_duration_seconds_bucket",
      "count": 11400,
      "job_counts": [
        {
          "job": "apiserver",
          "count": 11400
        }
      ]
    },
    {
      "metric": "apiserver_request_total",
      "count": 684,
      "job_counts": [
        {
          "job": "apiserver",
          "count": 684
        }
      ]
    }
  ],
  "additional_metric_counts": [
    {
      "metric": "etcd_request_duration_seconds_bucket",
      "count": 2688,
      "job_counts": [
        {
          "job": "apiserver",
          "count": 2688
        }
      ]
    }
  ]
}

Bucket 验证

以下命令验证对象存储 bucket 是否工作正常。

bash
mimirtool bucket-validation
标志描述
--object-count设置创建和删除对象的数量。默认值为 2000。
--report-every设置打印操作进度报告的操作数量。默认值为 100。
--test-runs设置测试运行的次数。默认值为 1。
--prefix设置在对象存储中用于测试对象的路径前缀。
--retries-on-error设置在对象存储返回错误时重试的次数。
--bucket-config设置用于配置存储 bucket 的 CLI 参数。
--bucket-config-help显示解释如何使用 -bucket-config 参数的帮助文本。

Config

转换

config convert 命令将适用于 Cortex v1.10.0 及更高版本的配置参数转换为适用于 Grafana Mimir v2.0.0 的参数。它支持转换 CLI 标志和YAML 配置文件

配置
标志描述
--yaml-file要转换的 YAML 配置文件。
--flags-file一个包含换行符分隔的 CLI 标志列表的文件,用于转换。
--yaml-out用于转换后的 YAML 配置的文件。如果未设置,则输出到 stdout
--flags-out用于转换后的 CLI 标志列表的文件。如果未设置,则输出到 stdout
--update-defaults如果您设置了此标志,并且将配置参数设置为 Mimir 2.0 中已更改的默认值,则该参数将更新为新的默认值。
--include-defaults如果您设置了此标志,所有默认值都将包含在输出 YAML 中,无论您是否在输入文件中显式设置了这些值。
-v, --verbose如果您设置了此标志,则旧配置中存在但新配置中不存在的 CLI 标志和 YAML 路径将打印到 stderr。此标志还会打印旧配置和新配置之间已更改的默认值。
--gem如果您设置此标志,该工具将从 Grafana Metrics Enterprise (GEM) v1.7.x 转换为 v2.0.0。
默认值的变化

mimirtool config convert 帮助您从 Cortex 迁移到 Grafana Mimir。Mimir v2.0.0 中一些配置参数的默认值发生了变化,您可能不希望在迁移过程中使用这些变化:

参数Cortex/GEM 1.7 默认值Mimir/GEM 2.0 默认值
blocks_storage.backends3filesystem
ruler_storage.backends3filesystem
alertmanager_storage.backends3filesystem
server.http_listen_port808080
activity_tracker.filepath./active-query-tracker./metrics-activity.log
alertmanager.data_dirdata/./data-alertmanager/
blocks_storage.filesystem.dir<空>blocks
compactor.data_dir./data./data-compactor/
ruler.rule_path/rules./data-ruler/
ruler_storage.filesystem.dir<空>ruler
(仅 GEM) auth.typetrustenterprise
(仅 GEM) graphite.querier.schemas.backends3filesystem

对于这些参数,即使在输入配置中未显式设置配置参数,mimirtool config convert 也会输出 Cortex 的默认值。如果在输入配置中显式设置了 Cortex 的默认值,并且提供了 --update-defaults 标志,则 mimirtool config convert 不会将值更新为 Mimir 的默认值。

示例

以下示例显示了将 Cortex query-frontend YAML 配置文件和 CLI 标志转换为 Mimir 兼容的 YAML 和 CLI 标志的命令。

bash
mimirtool config convert --yaml-file=cortex.yaml --flags-file=cortex.flags --yaml-out=mimir.yaml --flags-out=mimir.flags

cortex.yaml 输入文件

yaml
query_range:
  results_cache:
    cache:
      memcached:
        expiration: 10s # Expiration was removed in Grafana Mimir, so this parameter will be missing from the output YAML
        batch_size: 2048
        parallelism: 10
      memcached_client:
        max_idle_conns: 32

cortex.flags 输入文件

-frontend.background.write-back-concurrency=45

运行命令后,转换后的输出应为:

mimir.yaml 转换后的输出文件

yaml
frontend:
  results_cache:
    memcached:
      max_get_multi_batch_size: 2048
      max_get_multi_concurrency: 10
      max_idle_connections: 32

server:
  http_listen_port: 80

注意

作为预防措施,输出文件包含 server.http_listen_port。Grafana Mimir 中的默认值从 80 更改为 8080。

除非您在输入配置中明确设置了端口,否则该工具会输出原始默认值。

mimir.flags 转换后的输出文件

-query-frontend.results-cache.memcached.max-async-concurrency=45
详细输出

当您设置 --verbose 标志时,输出会解释哪些配置参数已被移除,以及哪些默认值已更改。详细输出会打印到 stderr

输出包含以下条目:

  • field is no longer supported: <yaml_path>

    此参数在输入的 Cortex YAML 文件中使用过,但已从输出配置中移除。

  • flag is no longer supported: <flag_name>

    此参数在输入的 Cortex CLI 标志文件中使用过,但该参数已在 Grafana Mimir 中移除。该工具已从输出配置中移除此 CLI 标志。

  • using a new default for <yaml_path>: <new_value> (used to be <old_value>)

    Grafana Mimir 中配置参数的默认值发生了更改。输入配置文件中未明确设置此参数。当您使用 mimirtool config convert 的输出配置运行 Grafana Mimir 时,Grafana Mimir 将使用新的默认值。

  • <yaml_path> 的默认值已更改:<new_value>(以前是 <old_value>);未更新

    Grafana Mimir 中,输入配置文件中设置的配置参数的默认值已更改。该工具未将旧的默认值转换为新的默认值。要将默认值自动更新为新的默认值,请传递 --update-defaults 标志。

从 Jsonnet 中提取标志

使用 Grafana Mimir Jsonnet 库时,所有配置都使用设置为对象成员键值对的标志。要使用 mimirtool 执行转换,您首先需要从 Jsonnet 评估产生的 JSON 中提取标志。

使用以下 bash 脚本从特定组件中提取参数

bash
 #!/usr/bin/env bash

 set -euf -o pipefail

 function usage {
   cat <<EOF
 Extract the CLI flags from individual components.

 Usage:
   $0 <resources JSON> <component>

 Examples:
   $0 resources.json ingester
   $0 <(tk eval environments/default) distributor
   $0 <(jsonnet environments/default/main.jsonnet) query-frontend
 EOF
 }

 if ! command -v jq &>/dev/null; then
   echo "jq command not found in PATH"
   echo "To download jq, refer to https://stedolan.github.io/jq/download/."
 fi

 if [[ $# -ne 2 ]]; then
   usage
   exit 1
 fi

 jq -rf /dev/stdin -- "$1" <<EOF
 ..
 | if type == "object" and .metadata.name == "$2" then .spec.template.spec.containers[]?.args[] else null end
 | select(. != null)
 EOF

脚本的第一个参数是包含 Kubernetes 资源的 JSON 文件。脚本的第二个参数是容器的名称。

要从 Tanka 环境的分发器中检索参数

bash
<PATH TO SCRIPT> <(tk eval environments/default) distributor

脚本输出的结果类似于以下内容

console
-consul.hostname=consul.cortex-to-mimir.svc.cluster.local:8500
-distributor.ha-tracker.enable=false
-distributor.ha-tracker.enable-for-all-users=true
-distributor.ha-tracker.etcd.endpoints=etcd-client.cortex-to-mimir.svc.cluster.local.:2379
-distributor.ha-tracker.prefix=prom_ha/
-distributor.ha-tracker.store=etcd
-distributor.health-check-ingesters=true
-distributor.ingestion-burst-size=200000
-distributor.ingestion-rate-limit=10000
-distributor.ingestion-rate-limit-strategy=global
-distributor.remote-timeout=20s
-distributor.replication-factor=3
-distributor.ring.consul.hostname=consul.cortex-to-mimir.svc.cluster.local:8500
-distributor.ring.prefix=
-distributor.shard-by-all-labels=true
-mem-ballast-size-bytes=1073741824
-ring.heartbeat-timeout=10m
-ring.prefix=
-runtime-config.file=/etc/cortex/overrides.yaml
-server.grpc.keepalive.max-connection-age=2m
-server.grpc.keepalive.max-connection-age-grace=5m
-server.grpc.keepalive.max-connection-idle=1m
-server.grpc.keepalive.min-time-between-pings=10s
-server.grpc.keepalive.ping-without-stream-allowed=true
-target=distributor
-validation.reject-old-samples=true
-validation.reject-old-samples.max-age=12h

使用脚本的输出作为输入来运行 mimirtool 配置转换。

转换后,您可以使用以下脚本将转换后的标志转换回 JSON

bash
#!/usr/bin/env bash

set -euf -o pipefail

function usage {
 cat <<EOF
Transform Go flags into JSON key value pairs

Usage:
 $0 <flags file>

Examples:
 $0 flags.flags
EOF
}

if [[ $# -ne 1 ]]; then
 usage
 exit 1
fi

key_values=$(sed -E -e 's/^-*(.*)=(.*)$/  "\1": "\2",/' "$1")
printf "{\n%s\n}" "${key_values::-1}"

脚本的唯一参数是一个包含标志的文件,每个标志占一行。

回填

backfill 命令通过使用 压缩器组件公开的块上传 API 将 Prometheus TSDB 块上传到 Grafana Mimir 中。

如果命令被中断,您可以重新启动它。Mimirtool 会检测哪些块已上传,并只上传未完成或新的块。

块上传功能默认禁用。要为用户或整个系统启用块上传功能,请参阅配置 TSDB 块上传。如果用户未启用块上传,则 mimirtool backfill 将失败。

示例
bash
mimirtool backfill --address=http://mimir-compactor/ --id=anonymous /var/prometheus/{01G803NFXZ0MVKN71GT91HMV3Z,01G8BQ8PRR4TAP7EXZVBNTRBZ4,01G8CB7GTTC5ZXY23WTXHSYQXQ}

backfill 命令的结果如下

console
INFO[0000] Backfilling                              blocks="/var/prometheus/01G803NFXZ0MVKN71GT91HMV3Z,/var/prometheus/01G8BQ8PRR4TAP7EXZVBNTRBZ4,/var/prometheus/01G8CB7GTTC5ZXY23WTXHSYQXQ" user=anonymous
INFO[0000] making request to start block upload     block=01G803NFXZ0MVKN71GT91HMV3Z file=meta.json path=/var/prometheus/01G803NFXZ0MVKN71GT91HMV3Z
WARN[0000] block already exists on the server       path=/var/prometheus/01G803NFXZ0MVKN71GT91HMV3Z
INFO[0000] making request to start block upload     block=01G8BQ8PRR4TAP7EXZVBNTRBZ4 file=meta.json path=/var/prometheus/01G8BQ8PRR4TAP7EXZVBNTRBZ4
INFO[0000] uploading block file                     block=01G8BQ8PRR4TAP7EXZVBNTRBZ4 file=index path=/var/prometheus/01G8BQ8PRR4TAP7EXZVBNTRBZ4 size=259867
INFO[0000] uploading block file                     block=01G8BQ8PRR4TAP7EXZVBNTRBZ4 file=chunks/000001 path=/var/prometheus/01G8BQ8PRR4TAP7EXZVBNTRBZ4 size=5024391
INFO[0000] block uploaded successfully              block=01G8BQ8PRR4TAP7EXZVBNTRBZ4 path=/var/prometheus/01G8BQ8PRR4TAP7EXZVBNTRBZ4
INFO[0000] making request to start block upload     block=01G8CB7GTTC5ZXY23WTXHSYQXQ file=meta.json path=/var/prometheus/01G8CB7GTTC5ZXY23WTXHSYQXQ
INFO[0000] uploading block file                     block=01G8CB7GTTC5ZXY23WTXHSYQXQ file=index path=/var/prometheus/01G8CB7GTTC5ZXY23WTXHSYQXQ size=151181
INFO[0000] uploading block file                     block=01G8CB7GTTC5ZXY23WTXHSYQXQ file=chunks/000001 path=/var/prometheus/01G8CB7GTTC5ZXY23WTXHSYQXQ size=1986792
INFO[0000] block uploaded successfully              block=01G8CB7GTTC5ZXY23WTXHSYQXQ path=/var/prometheus/01G8CB7GTTC5ZXY23WTXHSYQXQ
INFO[0001] finished uploading blocks                already_exists=1 failed=0 succeeded=2

许可

本软件根据 AGPLv3 许可。有关更多信息,请参见 LICENSE