【Google Cloud】账单告警信息推送至第三方
【背景】
Google billing 账单系统登录后可查看到当前项目所关联的账单报告及明细,但是某客户领导由于网络的问题,并不能随时登录BIlling中查看账单,并提出希望在公司常用的办公软件飞书中收到billing的使用情况。
【设计】
根据客户需求,在通过了解Google billing的官方文档及相关的接口情况后 ,我们设计了如下的数据流程图及本次需求开发的架构图:
【实操】
在billing中创建Budget Alert并关联到Pub/Sub主题中,通过Pub/Sub的订阅功能将billing的账单信息通过Cluod function推送至第三方
1.创建Pub/sub主题
2.创建Budget Alert,创建时需注意以下四点:
a.Budget alert名
b.预算额度
c.预算报警的阙值
d.勾选Pub/Sub选项并选择创建的Pub/Sub
创建后可在控制台检查
3.添加Pub/sub触发器,并将开发的代码copy上去,修改入口函数,然后点击部署函数即可
【代码】
// Package p contains a Pub/Sub Cloud Function.
package pimport ("bytes""crypto/hmac""crypto/sha256""encoding/base64""encoding/json""errors""fmt""golang.org/x/net/context""log""net/http""sync""time"
)var msgLocker sync.Mutex
var (contentType = "Content-Type:application/json"webHooker = ""//这里填飞书的地址secret = "" // 这里填签名,可不填
)
//定义接受信息的类型
type PubSubMessage struct {Data []byte `json:"data"`BudgetIdstring `json:"budgetId"`BillingAccountIdstring `json:"billingAccountId"`
}
//定义信息内容
type Message struct {BudgetDisplayName string `json:"budget_display_name"`CostAmount float64 `json:"costAmount"`CostIntervalStart string `json:"costIntervalStart"`BudgetAmountTypestring `json:"budget_amount_type"`BudgetAmount float64 `json:"budgetAmount"`AlertThresholdExceededfloat64`json:"alertThresholdExceeded"`ForecastThresholdExceededfloat64`json:"forecast_threshold_exceeded"`CurrencyCodestring `json:"currency_code"`
}//发送验证并消息的Function
func SendMsg(ctx context.Context, m PubSubMessage) error {fmt.Println(m)msgLocker.Lock()defer msgLocker.Unlock()var messageMessageerrJson:= json.Unmarshal(m.Data, &message)if errJson!= nil {fmt.Println("接收信息错误",errJson,string(m.Data))return errors.New("接收信息错误")}content := fmt.Sprintf("账单ID:%v,"+"\n"+"预算ID:%v,"+"\n"+"使用的费用:%v," +"\n"+"预算开始时间:%v," +"\n"+"预算额度:%v" +"\n",m.BillingAccountId,m.BudgetId,message.CostAmount,message.CostIntervalStart,message.BudgetAmount)var data = make(map[string]interface{})data["msg_type"] = "text"data["content"] = map[string]string{"text":content,}timestamp := time.Now().Unix()if secret!= "" {sign, _ := GenSign(timestamp, secret)data["sign"] =sign}data["timestamp"] =timestampd, _ := json.Marshal(data)_, err := http.Post(webHooker, contentType, bytes.NewBuffer(d))if err != nil {log.Println("消息发送失败,HTTP connection error!")return errors.New("HTTPconnection error!")}returnnil
}
func GenSign(timestamp int64, secret string) (string, error) {stringToSign := fmt.Sprintf("%v", timestamp)+ "\n" + secretvar data []byteh := hmac.New(sha256.New, []byte(stringToSign))_, err :=h.Write(data)if err != nil {return "", err}signature := base64.StdEncoding.EncodeToString(h.Sum(nil))return signature, nil
}
【Google Cloud】账单告警信息推送至第三方相关推荐
- 物联网设备数据流转之告警信息推送:TDengine-alert
背景 前面关于 TDengine 的使用,我们只涉及到 Server 端与 Client 端,除此之外,官方还有一个报警模块,用以根据用户定义的规则实现近实时的报警监测. 从开始到现在,我们一直在喊口 ...
- 微信小程序 调取云函数 信息推送失败response out of time limit or subscription is canceled hint的具体解决方法
微信小程序 调云函数 信息推送失败,提示errcode":45015,"errmsg":"response out of time limit or subsc ...
- php 微信客服信息推送失败 微信重复推送客服消息 40001 45047
1 /*** 2 * 微信客服发送信息 3 * 微信客服信息推送失败 微信重复推送客服消息 40001 45047 4 * 递归提交到微信 直到提交成功 5 * @param $openid 6 * ...
- 钉钉 php 推送,微信模板推送,钉钉信息推送
上午的时候看到有朋友需要微信推送,正好我也需要,之前一直用 Server 酱的,但是最近用不了,想找一个替代品,一开始准备选择钉钉,除了打卡,我很少使用钉钉,邮件提醒是备用方案,其实和 Server ...
- 微信开发3之php模板信息推送
模板信息推送:需要在后台开通了模板消息推送接口 PHP代码如下: <?php $appid="wxxxxxxxxxxxxxxxxxx"; //填写微信后台的appid $ap ...
- 微信公众号信息推送实现业务解耦
序 最近第三方服务需要增加微信模板信息推送能力,要与业务系统解耦.微服务架构的springCloud下第三方服务增加能力. 一.技术选型 看了下微信公众号的信息推送开发文档,发现不难,就是一个个接口对 ...
- bmob云服务器信息推送,FAQ-Bmob后端云
Q: Bmob 平台是做什么的? A: Bmob 是多租户无模式的移动应用云服务,它可以让 android/IOS/WP 等移动开 发者无需掌握任何一门服务器开发语言(如 JAVA/PHP 等),将注 ...
- 【imessage群发苹果推信】[iMessageSuspic](Apple推送服务)使用信息推送服务
Apple信息推送服务(ApplePushNotificationservice), 由Apple根据官方新闻服务提供. 交货包括顶部,声音和Badgenumber比例指南(),应用程序可以在任何条件 ...
- 蓝牙信标Beacon_信息推送,室内定位,室内导航
基于蓝牙信标的室内定位导航,蓝牙信标中的蓝牙模块是工作在从模式下,使用BLE低功耗蓝牙广播的方法,利用其支持的通用属性配置文件在第37.38.39三个信道上连续发送无定向性的广播包.蓝牙信标在广播模式 ...
最新文章
- mysql binlog恢复sql_binlog2sql实现MySQL误操作的恢复
- 记一次php手工注入(mysql)
- 新版本springboot-整合多数据源拆分思路
- python解释器下安装z3_再次:在Windows上安装Z3 Python
- c语言 map转换成字符串数组,JSON数组形式字符串转换为ListMapString,String的几种方法...
- 在windows下挂载nfs文件系统
- Fragmen的onAttach方法
- Kubernetes详解(十七)——Pod存活性探针应用实战
- (转)互联网投顾平台的监管风险:和讯信息
- JAVA垃圾回收机制
- cocos 《成语接龙》---Button(按钮)组件
- C++厘米和英寸的换算
- CEC2018:动态多目标测试函数DF10~DF14的PS及PF(提供Matlab代码)
- python中newline什么意思,\newline转义序列在python中是什么意思?
- java项目遇到难题_Java项目遇到的常见问题
- Java——将汉字转为汉语拼音工具类
- opencv学习笔记9:根据图片颜色分割图像
- 仓库管理系统-新名词(经济订货批量 、订货周期、订货提前期)
- 程序员是怎样的一群人
- 大学计算机AI学习初步规划 202204