贡献第三方 Flux 包:Discord 端点 Flux 函数

导航到

您目前正在使用 FluxInfluxDB 吗?您是否编写了一个对社区有用的优秀 Flux 函数?如果这两个问题的答案是“是!”,那么我鼓励您将您出色的作品贡献给 Flux,让其他人可以欣赏您和您的作品。今天,我们要分享如何在一个 自定义 Flux 函数 中贡献到 第三方 Flux 包

Discord 和 InfluxDB

Discord,类似于 Slack 的群组聊天平台,直到最近一直被认为是 PC 游戏玩家的平台。由于付费计划价格较低以及无限的消息历史和存储限制,许多公司转向使用 Discord 而不是 Slack。例如,作为开发者倡导者,我看到了几家公司和开发者在隔离期间使用 Discord 来组织虚拟会议和聚会,原因正是如此。InfluxDB 用户也不例外。

许多 InfluxDB 用户希望将 Discord 放置在其监控管道的末端。InfluxDB 允许您 监控数据和发送警报。InfluxDB 支持多个 通知端点。例如,slack.endpoint() 允许您将关键状态发送到 Slack 端点。这篇博客向您展示了如何贡献一个 Discord 端点函数。此函数允许 InfluxDB 用户向 Discord 发送通知。此函数由 chobbs 贡献。感谢,Craig!

如何使用 InfluxDB v2 Alerts 向 Discord 发送警报

在我们学习如何贡献 Flux 包之前,让我们先学习如何使用 Craig 的 Discord 函数。此 Flux 脚本将最后磁盘使用值发送到 Discord

import "contrib/chobbs/discord"
import "influxdata/influxdb/secrets"

//this value can be stored in the secret-store()
token = secrets.get(key: "DISCORD_TOKEN")

lastReported =
  from(bucket: "example-bucket")
    |> range(start: -1m)
    |> filter(fn: (r) => r._measurement == "statuses")
    |> last()
    |> tableFind(fn: (key) => true)
    |> getRecord(idx: 0)

discord.send(
  webhookToken:token,
  webhookID:"1234567890",
  username:"chobbs",
  content: "Great Scott!- Disk usage is: \"${lastReported.status}\".",
  avatar_url:"https://staff-photos.net/pic.jpg"

该脚本利用 secrets.get() 获取存储在 InfluxDB 中的机密信息。使用 tableFind() 从基于 分组键 值匹配的表流中提取第一个表格,并使用 getRecord() 从该表格中提取值 - 最新的磁盘使用情况。函数 discord.send() 接收 webhookToken、webhookID、username、content 和 avatar_url 参数,通过 HTTP POST 方式构建并发送消息。

如何贡献第三方 Flux 包

现在我们知道了 discord 函数的功能和使用方法,让我们深入了解如何贡献它。这些步骤、包所有权规则和未来计划在 Contributing Third Party Flux Packages READ.md 中进行了描述。请务必查看。

第一步:Fork 并导航

通过 go get github.com/influxdata/fluxFlux 仓库 Fork 并克隆到您的 $GOPATH 中。导航到 stdlib 目录下的 contrib 目录。

第二步:创建 Flux 包目录

使用您的 git 账户名创建一个目录。在该目录中,添加一个包含您的 Flux 包的第二个目录。例如,Craig 创建了以下目录结构:

flux/stdlib/contrib/chobbs/discord

将您的任何 Flux 代码、Go 代码和测试都放在这里。

第三步:编写 Flux 代码

在文件 discord.flux 中添加您的 Flux 代码。discord.send() 函数是该 Flux 代码和包的核心。它是一个 自定义 Flux 函数。自定义 Flux 函数使用以下基本结构

// Basic function definition structure for custom Flux functions
functionName = (functionParameters) => functionOperations

我们的 Flux 代码的第一步是添加样板代码。这包括命名我们的包和导入我们使用的其他 Flux 包。命名约定是包名与第三方自定义包名/目录名匹配。以下是样板代码

package discord

import "http"
import "json"

discord.send() 函数接收四个参数,并将这些数据编码为 json 变量以发送到 Discord webhook。

send = (webhookToken, webhookID, username, content, avatar_url="") => {
  data = {
      username: username,
      content: content,
      avatar_url: avatar_url
    }

  headers = {
      "Content-Type": "application/json"
    }
  encode = json.encode(v:data)

  discordURL = "https://discordapp.com/api/webhooks/"
  return http.post(headers: headers, url: discordURL + webhookID + "/" + webhookToken, data: encode)
}

json.encode() 应用转换以生成 json。该函数返回一个 http.post() 函数,该函数将使用我们 discord.send() 函数指定的标头将 HTTP POST 请求提交到提供的 URL。该 http.post() 函数返回 HTTP 状态码。

最后,让我们看一下完整的 discord.flux 代码。

package discord

import "http"
import "json"

// `webhookToken` - string - the secure token of the webhook.
// `webhookID` - string - the ID of the webhook.
// `username` - string - username posting the message.
// `content` - string - the text to display in discord.
// `avatar_url` -  override the default avatar of the webhook.

send = (webhookToken, webhookID, username, content, avatar_url="") => {
  data = {
      username: username,
      content: content,
      avatar_url: avatar_url
    }

  headers = {
      "Content-Type": "application/json"
    }
  encode = json.encode(v:data)

  discordURL = "https://discordapp.com/api/webhooks/"
  return http.post(headers: headers, url: discordURL + webhookID + "/" + webhookToken, data: encode)
}

第四步:添加 Flux 测试

我们的测试在 discord_test.go 中添加。此测试验证 discord.send() 返回正确的状态码。命名您的测试包。测试包的命名约定如下:`` + `_test`。按照此约定,我们的测试包名为 discord_test。

以下是完整的测试代码

package discord_test

import (
	"context"
	"testing"

	_ "github.com/influxdata/flux/builtin"
	"github.com/influxdata/flux/dependencies/dependenciestest"
	"github.com/influxdata/flux/runtime"
)

func TestDiscord(t *testing.T) {
	ctx := dependenciestest.Default().Inject(context.Background())
	_, scope, err := runtime.Eval(ctx, `
import "contrib/chobbs/discord"
send = discord.send(webhookToken:"ThisIsAFakeToken",webhookID:"123456789",username:"chobbs",content:"this is fake content!",avatar_url:"%s/somefakeurl.com/pic.png")
send == 204
`)

	if err != nil {
		t.Error("evaluation of discord.send failed: ", err)
	}
	_ = scope
}

第五步:编译 Flux

现在只需编译 Flux 并验证在提交 PR 之前我们的函数是否已在本地上注册即可。

编译 Flux

编译 Flux 的文档在此处 https://github.com/influxdata/flux。然而,这些是在 Mac OS X 上编译时我采取的步骤。

安装 pkg-config 工具

brew install pkg-config

安装 pkg-config 包装工具

go get github.com/influxdata/pkg-config

确保 GOBIN 目录在您的 PATH 中

export PATH=${GOPATH}/bin:${PATH}

导航到Flux仓库并运行以下命令来构建Flux

go generate ./libflux/go/libflux
go generate ./stdlib
go build ./cmd/flux

验证Flux已注册您的包

现在您应该可以看到Go已自动生成flux_gen.go。您还可以验证Flux repl是否识别了您的包。使用./flux repl 打开Flux repl。导入discord包,并检查repl是否自动填充discord。如果成功,您可以尝试您的新函数!

Flux package discord

向InfluxData社区致敬

InfluxData一直以拥有一个出色且活跃的社区而自豪。我们感谢您的所有贡献和反馈。无论是Telegraf插件社区模板出色的InfluxDB项目还是第三方Flux包,您的贡献一直让我们印象深刻并谦卑。我希望这篇教程能激发您贡献自己的Flux包并与社区分享您的辛勤工作。一如既往,请在评论区、我们的社区网站或我们的Slack频道中分享您的想法、关注点或问题。我们很高兴得到您的反馈并帮助您解决遇到的问题!再次感谢!