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配置

Download history 148/week @ 2024-06-17

每月 208 次下载

ISC 许可证

785KB
14K SLoC

Rust Opsview API客户端库

crates.io Documentation ISC licensed

简介

“opsview”包是一个Rust库,用于与Opsview监控软件交互。它全面覆盖了Opsview REST API,允许您处理Opsview对象,如主机、服务检查、主机组等。初始重点是“客户端”和“配置”模块,使用此Rust库可以执行所有类型的对象配置管理。

项目状态

该项目目前正在开发中,可能会随时更改。它尚未完成。

功能

  • 全面覆盖Opsview对象:主机、服务检查、主机组等。配置API中的所有对象都可作为原生Rust对象使用。
  • 用于创建和配置Opsview对象的Builder模式对象。
  • 具有内置错误处理的异步API交互。
  • 针对Opsview API兼容性的自定义序列化和反序列化。

为什么你应该使用这个库?

这个库旨在尽可能对尽可能多的字段进行客户端验证。这意味着您可以在向Opsview服务器发出API调用之前,对任何不兼容的字段值进行可靠的错误处理,并且可以捕获和处理API返回的错误。

例如,假设您的程序从一个文件中解析出一个名称,并决定创建一个名为 My New HashtagHashtag。您不需要在您的侧进行所有名称检查,您只需尝试使用关联的 builderminimal 函数之一来构建一个 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对象。

所有与配置相关的对象,例如 HashtagHostServiceCheck 等,都表示为具有 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