#grpc #system-info #cpu-memory #grpc-client #grpc-server #cpu-info #system-resources

tonic-sysinfo

A gRPC service for monitoring system resources such as CPU, memory, and disk

4 releases

0.1.4 Oct 13, 2024
0.1.3 Oct 13, 2024
0.1.2 Sep 9, 2024
0.1.1 Sep 9, 2024

#1014 in Network programming

Download history 123/week @ 2024-09-03 126/week @ 2024-09-10 21/week @ 2024-09-17 14/week @ 2024-09-24 20/week @ 2024-10-01 267/week @ 2024-10-08 66/week @ 2024-10-15

182 downloads per month

Apache-2.0

37KB
603 lines

Aquí tienes un archivo README.md que puedes usar para documentar tu servicio gRPC de monitoreo del sistema usando Tonic en Rust:


System Info Service

This project provides a basic gRPC service built using Tonic in Rust to monitor system resources such as memory, CPU, and disk usage. The service offers two endpoints:

  1. get_system_info: Retrieves system information upon request.
  2. watch_system_info: Provides real-time monitoring of system information, streaming updates at regular intervals.

Prerequisites

  • Rust (>=1.80.0)
  • Tonic crate for building gRPC services
  • sysinfo crate to retrieve system information
  • tokio for asynchronous programming
  • async-stream for streaming responses

Dependencies

Ensure you include the following in your Cargo.toml:

[dependencies]
tonic = "0.6"
tokio = { version = "1", features = ["full"] }
futures-util = "0.3"
sysinfo = "0.22"
async-stream = "0.3"

System Info Service

The SysInfoContext struct implements the gRPC service using Tonic. It provides two key endpoints for monitoring system resources.

get_system_info

This endpoint allows a client to request system information (memory, CPU, disk usage). You can specify which information to include through the SystemInfoRequest.

  • Parameters:

    • include_memory_info: Boolean flag to include memory information.
    • include_cpu_info: Boolean flag to include CPU information.
    • include_disk_info: Boolean flag to include disk information.
  • Response: A SystemInfoResponse that contains the requested data.

watch_system_info

This endpoint streams system information at regular intervals, allowing real-time monitoring of system resources. The client can specify the refresh interval in the request.

  • Parameters:

    • include_memory_info: Boolean flag to include memory information.
    • include_cpu_info: Boolean flag to include CPU information.
    • include_disk_info: Boolean flag to include disk information.
    • refresh_interval: Interval in seconds to refresh the information stream.
  • Response: A stream of SystemInfoResponse objects, updated at the specified interval.

Usage

Step 1: Set Up the Server

You can start the gRPC server using the SysInfoContext::service() method. This sets up the service to listen for incoming gRPC requests.

use tonic::transport::Server;
use sysinfo_service::SysInfoContext;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let addr = "[::1]:50051".parse().unwrap();
    let sys_info_service = SysInfoContext::service();

    println!("SystemInfoService listening on {}", addr);

    Server::builder()
        .add_service(sys_info_service)
        .serve(addr)
        .await?;

    Ok(())
}

Step 2: Client Request

To make requests, you can use a gRPC client or any tool that can communicate via gRPC (such as grpcurl or your own Rust client). Below is an example request using a Rust client:

use tonic::transport::Channel;
use sysinfo_service::system_info_service_client::SystemInfoServiceClient;
use sysinfo_service::SystemInfoRequest;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut client = SystemInfoServiceClient::connect("http://[::1]:50051").await?;

    let request = tonic::Request::new(SystemInfoRequest {
        include_memory_info: true,
        include_cpu_info: true,
        include_disk_info: true,
        refresh_interval: 5,  // for watch_system_info
    });

    // For get_system_info
    let response = client.get_system_info(request.clone()).await?;
    println!("System Info: {:?}", response.into_inner());

    // For watch_system_info (Streaming)
    let mut stream = client.watch_system_info(request).await?.into_inner();
    while let Some(system_info) = stream.message().await? {
        println!("System Info Stream: {:?}", system_info);
    }

    Ok(())
}

License

This project is licensed under the APACHE License.


Dependencies

~5–13MB
~155K SLoC