#canister #internet-computer #dfinity #request-url #smart-contracts

ic-canister-serve

一个库,用于在运行在互联网计算机上的智能合同的 http_endpoint 上提供资产

1 个不稳定版本

0.1.0 2023年5月24日

#9 in #request-url

Apache-2.0

30KB
479

IC Canister Serve

此软件包提供了一些有用的方法,通过在互联网计算机(也称为 canisters)中运行的智能合同的 http_request 端点提供日志和指标。

使用方法

此 crate 基于 ic-canister-logic-metrics-encoder,使得从 canister 的 http_request 方法提供指标和日志变得简单。

use ic_canister_log::{declare_log_buffer, log};
use ic_canister_serve::{serve_logs, serve_metrics};
use ic_cdk::api::management_canister::http_request::{CanisterHttpRequestArgument, HttpResponse};
use ic_metrics_encoder::MetricsEncoder;

// Keep up to 100 last messages.
declare_log_buffer!(name = INFO, capacity = 100);
declare_log_buffer!(name = ERROR, capacity = 100);

fn encode_metrics(w: &mut MetricsEncoder<Vec<u8>>) -> std::io::Result<()> { 
    w.encode_gauge("example_metric_name", 0 as f64, "Example metric description")?;
    Ok(())
}

#[ic_cdk::query]
fn http_request(request: CanisterHttpRequestArgument) -> HttpResponse {
    log!(INFO, "This is an INFO log");
    log!(ERROR, "This is an ERROR log");
    
    let path = match request.url.find('?') {
        None => &request.url[..],
        Some(index) => &request.url[..index],
    };
    
    match path {
        "/metrics" => serve_metrics(encode_metrics),
        "/logs" => serve_logs(request, &INFO, &ERROR),
        _ => HttpResponse {
                status: 404.into(),
                body: "not_found".into(),
                ..Default::default()
            }
   }
}

示例请求

要请求指标,执行以下 curl 请求

$ curl https://example-canister.raw.ic0.app/metrics

要请求所有日志,执行以下 curl 请求

$ curl https://example-canister.raw.ic0.app/logs

要请求仅 INFO 日志,执行以下 curl 请求

$ curl https://example-canister.raw.ic0.app/logs?severity=Info

要请求仅 ERROR 日志,执行以下 curl 请求

$ curl https://example-canister.raw.ic0.app/logs?severity=Error

要请求在某个时间戳之前的日志,执行以下 curl 请求

$ curl https://example-canister.raw.ic0.app/logs?time=1683837947035

依赖项

~5–15MB
~159K SLoC