ONS于2018年12月发布,详见这里。
ONS基于发布订阅机制,ONS的使用分两步:
如何发布消息到Topic呢?手工方式如下:
自动方式可以使用Oracle Event Service (OES)与ONS对接,OES Rule的Action中有一项是ONS。
ONS的邮件订阅示例可参见 Quick Start guide。
PagerDuty的通知和邮件非常类似,首先需要在PagerDuty网站注册,可以免费14天。
然后创建服务,参见这里。
Events FAQ,integration type选Custom Event Transformer
。
完成后,你得到一个Integration Key
,这时在ONS中与PagerDuty集成唯一需要输入的变量,其它部分都是固定的,格式如下:
https://events.pagerduty.com/integration//enqueue
和邮件类似,配置完成后初始状态为Pending,需要在PagerDuty中点击SHOW DETAIL
确认:
展开,在上部看到的href即在ONS中填入的URL,底部是确认URL,确认后订阅的状态变为Active:
确认后的页面如下:
然后就可以发送测试消息了。
如果订阅类型为HTTPS(Custom URL),可参见此文。
可参照这篇文档:Complete Developers Guide To The Oracle Notification Service
胡子哥其它几篇Blog让人心碎,这篇文章还算全面和靠谱。
这篇文章的第一部分涵盖了ONS的基础知识。
前面提到,可以通过ONS服务界面发送测试通知,本文给出了用Java SDK发送通知的示例。
首先在ONS中创建Topic及邮件订阅。记录Topic OCID。
剩下的过程如下:
# 克隆作者的示例项目
$ git clone https://github.com/recursivecodes/ons-demo.git
$ cd ons-demo
# 设置JAVA_HOME路径,可以通过rpm -ql找到路径
$ export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64
$ export TOPIC_ID=ocid1.onstopic.oc1.eu-frankfurt-1.aaaa...qnia
作者把Region写死在应用中,因此需要将代码中的us-phoenix-1
替换为你创建Topic的区域,例如我的Topic是在eu-frankfurt-1
区域创建的,因此将其替换为eu-frankfurt-1
。
完整的代码如下:
package codes.recursive;
import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider;
import com.oracle.bmc.ons.NotificationDataPlaneClient;
import com.oracle.bmc.ons.model.MessageDetails;
import com.oracle.bmc.ons.requests.PublishMessageRequest;
public class Ons {
public void sendNotification(String title, String message) throws Exception {
String topicId = System.getenv("TOPIC_ID");
if( topicId == null ) {
throw new Exception("Please set a TOPIC_ID environment variable!");
}
ConfigFileAuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider("DEFAULT");
NotificationDataPlaneClient client = NotificationDataPlaneClient.builder().region("eu-frankfurt-1")
.build(provider);
MessageDetails messageDetails = MessageDetails.builder().title(title).body(message).build();
PublishMessageRequest publishMessageRequest = PublishMessageRequest.builder()
.messageDetails( messageDetails )
.topicId(topicId)
.build();
client.publishMessage( publishMessageRequest );
}
}
主程序如下,没有修改:
package codes.recursive;
import java.util.Date;
public class OnsSendExample {
public static void main(String... args) throws Exception {
Ons ons = new Ons();
ons.sendNotification(
"Test from Java",
"This is a test notification sent by the Java SDK at " + new Date().toString()
);
}
}
运行Java程序,发送通知:
$ ./gradlew run
> Task :ons-demo-send:run
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
BUILD SUCCESSFUL in 4s
2 actionable tasks: 2 executed
实际就是与OES(Oracle Event Service)的集成,OCI中的计算,存储,网络, 数据库等服务均支持事件与通知服务的集成。此不赘述。
实际就是在Monitoring服务中集成了ONS。
文中给出的示例是监控对指定bucket的List次数在1分钟内超过1次数,发送通知。
在Monitoring服务中配置Alarm略。
最后接受到的邮件通知如下:
测试完邮件,PagerDuty,就剩下HTTPS没试过了。
这个例子使用Zaiper来生成我们需要的Custom URL。
首先需要注册账号,14天免费使用高级功能。
然后在Zaiper中新建一个Zap,包含两个部分的定义:
第1部分创建Webhook,会生成相应的URL,例如:
https://hooks.zapier.com/hooks/catch/648.../oh6.../
第2部分在Github中新建一个Issue(需要提供Github账号)。
注意右上角的On必须打开。
然后在OCI中创建Topic的Subscription,填入URL:
注意,订阅也需要确认,但确认的地方不再Zaper,而是在Github中的issue里:
确认完,再发送测试消息,在Github中就新建的issue就可以包含来自ONS中的Raw Message了: