贡献第三方 Flux 包:Discord 端点 Flux 函数
作者:Anais Dotis-Georgiou / 产品, 用例, 开发者
2020 年 6 月 9 日
导航至
您目前正在使用 Flux 和 InfluxDB 吗?您是否编写了一个很棒的 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 警报向 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 函数的作用以及如何使用它,让我们深入了解如何贡献它。这些步骤、包所有权规则和未来计划在贡献第三方 Flux 包 READ.md 中进行了描述。请务必查看。
步骤一:Fork 和导航
Fork Flux 存储库,并通过 go get github.com/influxdata/flux
克隆到您的 $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()
函数接受四个参数,并将该数据编码为用于 Discord webhook 的 json 变量。
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() 函数,该函数向提供的 URL 提交 HTTP POST 请求,其标头由我们的 discord.send()
函数指定。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 的文档在此。但是,这些是我在 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。如果成功,您可以自由试用您的新函数了!
向 InfluxData 社区致敬
InfluxData 一直以拥有一个出色且活跃的社区而自豪。我们感谢您的所有贡献和反馈。无论是telegraf 插件、社区模板、出色的 InfluxDB 项目还是第三方 Flux 包,您的贡献都继续给我们留下深刻印象并使我们感到谦卑。我希望本教程能够帮助您贡献自己的 Flux 包,并与社区分享您的辛勤工作。与往常一样,请在评论区、我们的社区网站或我们的Slack 频道中分享您的想法、疑虑或问题。我们很乐意获得您的反馈并帮助您解决遇到的任何问题!再次感谢您!