terraform-provider-mackerel 的调试方法
这是2021年鲭鱼降临日历的第六天的文章。
你好,我是はてな Mackerel 团队的 SRE hayajo。
昨天是由@tatsuru展示如何使用Mackerel对苹果硅 MacBook 的CPU使用情况进行可视化的文章,这是wtatsuru在技术博客上分享的。我也想要一台 M1 Mac 呢!
今天我将介绍有关 terraform-provider-mackerel 的调试方法。
启用详细的日志输出。
Terraform会输出本体和提供程序的详细日志,有助于进行调试。
要启用日志输出,需要设置环境变量TF_LOG。
TF_LOG=TRACE terraform plan
terraform本身和提供程序的日志输出可以分别进行设置。
在这种情况下,可以设置环境变量TF_LOG_CORE和TF_LOG_PROVIDER。
TF_LOG_CORE=OFF TF_LOG_PROVIDER=TRACE terraform plan
使用调试模式
terraform-provider-mackerel 最近发布的 v0.0.7 版本中新增支持调试模式(-debug)。
这使得使用 delve 等调试器进行调试变得更加容易。
使用delve进行调试的流程
将提供程序的存储库克隆到本地。
git clone git@github.com:mackerelio-labs/terraform-provider-mackerel.git
cd terraform-provider-mackerel
使用 delv(dlv) 命令并附加 -debug 标志来启动提供程序。
TF_LOG=trace dlv debug -- -debug
在适当的位置设置断点。
(dlv) break mackerel.resourceMackerelMonitorRead
如果在终端显示“Provider started, to attach Terraform set the TF_REATTACH_PROVIDERS env var:”,则执行至断点成功。
(dlv) continue
打开一个新的终端,并创建一个用于测试的tf文件。
terraform {
required_providers {
mackerel = {
source = "mackerelio-labs/mackerel"
version = "~> 0.0.7"
}
}
}
resource "mackerel_monitor" "test" {
name = "test"
is_mute = false
notification_interval = 10
memo = "test monitor"
host_metric {
metric = "cpu%"
operator = ">"
critical = 90
warning = 80
duration = 3
scopes = ["test"]
}
}
将正在运行的终端显示的TF_REATTACH_PROVIDERS导出到delv。
export TF_REATTACH_PROVIDERS='...'
初始化terraform的工作目录。
terraform init
确认在执行terraform时,在设置的断点处停止了处理。
terraform apply
使用Delv来显示变量、执行逐步调试并进行调试。
(dlv) print m
打印调试
使用调试器进行调试非常方便,但如果平时不习惯使用调试器,可能会感觉有些麻烦。
也许有时候会想要进行 print 调试,不是吗?
在中国原生语言中,使用以下的一种方式进行释义:
通过提供程序进行打印调试的流程如下:
将提供者的存储库克隆到本地。
git clone git@github.com:mackerelio-labs/terraform-provider-mackerel.git /tmp/terraform-provider-mackerel
cd /tmp/terraform-provider-mackerel
为了能够使用在本地编译的二进制文件,创建一个用于CLI的配置文件。
provider_installation {
dev_overrides {
"mackerelio-labs/mackerel" = "/tmp/terraform-provider-mackerel"
}
direct {}
}
通过设置环境变量来使用terraform命令参考CLI配置文件。
export TF_CLI_CONFIG_FILE="$PWD/dev.tfrc"
创建用于测试的 tf 文件。
terraform {
required_providers {
mackerel = {
source = "mackerelio-labs/mackerel"
version = "~> 0.0.7"
}
}
}
resource "mackerel_monitor" "test" {
name = "test"
is_mute = false
notification_interval = 10
memo = "test monitor"
host_metric {
metric = "cpu%"
operator = ">"
critical = 90
warning = 80
duration = 3
scopes = ["test"]
}
}
修改源代码并添加调试输出,然后构建提供程序。
go build
初始化工作目录。
terraform init -upgrade
执行Terraform命令并确认输出。
TF_LOG=TRACE terraform apply
请参照以下步骤来打印调试提供者。
若进一步修改了提供者的源代码,请重新构建并执行提供者。
打印调试依赖库。
如果要调试供应商依赖的库(如hashicorp/terraform-plugin-sdk等),有以下方法可以打印输出:
我想调试的库复制到本地进行克隆。
git clone git@github.com:hashicorp/terraform-plugin-sdk.git /tmp/terraform-plugin-sdk
克隆源代码后进行更改,添加调试输出,并在 go.mod 文件中定义要调试的库的 replace。replace 的目标将是克隆的目录。
replace github.com/hashicorp/terraform-plugin-sdk/v2 => /tmp/terraform-plugin-sdk
后续步骤与提供程序的打印调试相同。
总结
本文介绍了 terraform-provider-mackerel 的三种调试方法。希望在进行 terraform-provider-mackerel 的功能开发或故障报告时可以作为参考。
期待大家的积极贡献!Mackerel的Terraform提供者:mackerelio-labs/terraform-provider-mackerel。