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。

广告
将在 10 秒后关闭
bannerAds