4个版本
0.1.6 | 2024年6月18日 |
---|---|
0.1.5 | 2024年3月5日 |
0.1.4 | 2024年2月28日 |
0.1.1 | 2024年2月20日 |
#47 在 配置
每月 208 次下载
785KB
14K SLoC
Rust Opsview API客户端库
简介
“opsview”包是一个Rust库,用于与Opsview监控软件交互。它全面覆盖了Opsview REST API,允许您处理Opsview对象,如主机、服务检查、主机组等。初始重点是“客户端”和“配置”模块,使用此Rust库可以执行所有类型的对象配置管理。
项目状态
该项目目前正在开发中,可能会随时更改。它尚未完成。
功能
- 全面覆盖Opsview对象:主机、服务检查、主机组等。配置API中的所有对象都可作为原生Rust对象使用。
- 用于创建和配置Opsview对象的Builder模式对象。
- 具有内置错误处理的异步API交互。
- 针对Opsview API兼容性的自定义序列化和反序列化。
为什么你应该使用这个库?
这个库旨在尽可能对尽可能多的字段进行客户端验证。这意味着您可以在向Opsview服务器发出API调用之前,对任何不兼容的字段值进行可靠的错误处理,并且可以捕获和处理API返回的错误。
例如,假设您的程序从一个文件中解析出一个名称,并决定创建一个名为 My New Hashtag
的 Hashtag
。您不需要在您的侧进行所有名称检查,您只需尝试使用关联的 builder
或 minimal
函数之一来构建一个 Hashtag
,然后匹配 Result
。无需连接到Opsview API。
示例
use opsview::config::Hashtag;
use opsview::prelude::*;
#[tokio::main]
async fn main() {
let my_new_hashtag = Hashtag::minimal("My New Hashtag");
match my_new_hashtag {
Err(OpsviewConfigError::DoesNotMatchRegex(_, _)) => { todo!("Do something") }, // <-- This is the matching branch
Err(_) => { todo!("Do something else") }
Ok(_) => (), // Do nothing.
}
}
这允许您编写具有更少错误的健壮解决方案。
添加这些检查是当务之急,但仍处于开发中。所有缺少验证的字段在源代码中均用 TODO 标记。如果您发现任何缺少验证的字段,请告诉我。
基本用法
此库频繁使用Builder模式创建和配置Opsview对象。
所有与配置相关的对象,例如 Hashtag
、Host
、ServiceCheck
等,都表示为具有 ConfigObject
特性的原生 Rust 结构体。这些结构体都具有 Builder
特性,该特性定义了 builder
函数,该函数将启动一个新的构建对象。
创建新对象的标准化模式是使用你想要创建的 ConfigObject
类型的关联 builder
函数来创建一个新的构建器,然后链接构建器的各种方法来配置对象,最后调用 build
函数来创建对象。使用 build
方法将为你提供一些保证,即你试图创建的 ConfigObject
是有效的。
请注意,在构建对象时没有进行在线检查,你仍然需要在某个时刻检查现有名称等。但它将强制你使用有效数据填充所有必需字段。
通常不建议直接创建 ConfigObject
结构体,因为这可能导致无法与 Opsview API 一起使用的无效对象。这些对象主要用于从 Opsview API 反序列化。
以下是一个快速示例,以帮助你开始使用这个库
use opsview::{client::OpsviewClient, prelude::*, config::Hashtag};
async fn new_hashtag(
client: &OpsviewClient,
name: &str
) -> Result<(), OpsviewError> {
let new_hashtag = Hashtag::builder()
.name(name)
.description("This Hashtag was created using Rust")
.enabled(true)
.all_hosts(true)
.build()?;
new_hashtag.create(client).await?;
Ok(())
}
#[tokio::main]
async fn main() {
let client = OpsviewClient::builder()
.url("https://opsview.example.com")
.username("admin")
.password("password")
.build()
.await
.unwrap();
let result = new_hashtag(&client, "foo").await;
match result {
Ok(_) => { println!("Success") },
Err(_) => { println!("Failure") },
}
client.apply_changes().await.expect("Failed to apply changes");
client.logout().await.expect("Failed to log out");
}
一个更复杂的示例
use opsview::client::OpsviewClient;
use opsview::config::{Host,Hashtag,HostGroup, HostTemplate};
use opsview::prelude::*;
#[tokio::main]
async fn main() {
let client = OpsviewClient::builder()
.url("https://opsview.example.com")
.username("admin")
.password("password")
.build()
.await
.unwrap();
let master_monitoring_server = client
.get_monitoringcluster_config("Master Monitoring Server", None)
.await
.expect("Couldn't fetch 'Master Monitoring Server' from the API");
let root_hostgroup = client
.get_hostgroup_config("Opsview", None)
.await
.expect("Couldn't fetch HostGroup with the name 'Opsview' from the API");
let opsview_rs_hostgroup = HostGroup::builder()
.name("OpsviewRS")
.parent(root_hostgroup)
.build()
.expect("Failed to build hostgroup 'opsview_rs_hostgroup'");
// Create the HostGroup before adding is to the Host, since doing so will
// consume the HostGroup and require a clone if the call to create is done
// later.
opsview_rs_hostgroup
.create(&client)
.await
.expect("Failed to create hostgroup 'opsview_rs_hostgroup'");
let network_base_template = client
.get_hosttemplate_config("Network - Base", None)
.await
.expect("Couldn't fetch 'Network - Base' from the API");
let mut templates = ConfigObjectMap::<HostTemplate>::new();
templates.add(network_base_template);
let templates = templates; // Optional shadowing to avoid mutable objects.
let opsview_rs_hashtag = Hashtag::builder()
.name("OpsviewRS")
.description("This Hashtag represents objects created by opsview-rs")
.build()
.expect("Failed to build hashtag 'OpsviewRS'");
// Create the Hashtag before adding it to the ConfigObjectMap<Hashtag>
// since adding it will consume the Hashtag and require a clone if the
// call to create is done later.
opsview_rs_hashtag
.create(&client)
.await
.expect("Failed to create hashtag 'opsview_rs_hashtag'");
let mut hashtags = ConfigObjectMap::<Hashtag>::new();
hashtags.add(opsview_rs_hashtag);
let hashtags = hashtags; // Optional shadowing to avoid mutable objects.
let new_host = Host::builder()
.name("MyNewHost")
.alias("This host was created using opsview-rs")
.ip("127.0.0.1")
.monitored_by(master_monitoring_server)
.hostgroup(opsview_rs_hostgroup)
.hosttemplates(&templates)
.hashtags(&hashtags)
.build()
.expect("Failed to build host 'MyNewHost'");
new_host
.create(&client)
.await
.expect("Failed to create host 'new_host'");
client.apply_changes().await.expect("Failed to apply changes");
client.logout().await.expect("Failed to log out");
}
文档
有关所有可用模块、结构体和函数的详细文档,请参阅使用以下生成的文档:
cargo doc --open
与 ITRS Group 的关系
此项目与 ITRS Group 无关。
支持和错误报告
请将任何问题或错误报告发送到 项目的 GitHub 页面,而不是发送到 ITRS Group 支持团队。
测试
对于与实时 Opsview 服务器的测试,请确保设置以下环境变量:
OV_URL
OV_USERNAME
OV_PASSWORD
在运行 ignored
测试时,请确保使用 --test-threads=1
,并且有关问题的 Opsview 服务器上没有未保存的更改。
许可证
版权所有 © 2024 Johan Thorén [email protected]
本项目根据 ISC 许可证发布。有关更多详细信息,请参阅 LICENSE 文件。
依赖项
~9–21MB
~309K SLoC