菜单
开源

Rust

使用我们先进的Rust分析器优化您的Rust应用程序。与Pyroscope合作,它提供实时分析功能,揭示您Rust代码库的复杂性。对于寻求提升性能、减少资源使用并实现Rust应用程序高效执行的开发者,此集成极具价值。

注意

有关Rust支持的分析类型列表,请参阅可用的分析类型

开始之前

要捕获和分析分析数据,您需要一个托管的Pyroscope OSS服务器或一个托管的具有Grafana Cloud Profiles的Pyroscope实例(需要免费Grafana Cloud账户)。

Pyroscope服务器可以是开发用的本地服务器或生产用的远程服务器。

将Rust分析添加到您的应用程序

pyroscopepyroscope_pprofrs包添加到您的Cargo.toml

bash
cargo add pyroscope
cargo add pyroscope_pprofrs

配置Rust客户端

至少需要提供Pyroscope服务器的URL和你的应用程序名称。还需要配置一个分析后端。对于Rust,可以使用pprof-rs

rust
// Configure profiling backend
let pprof_config = PprofConfig::new().sample_rate(100);
let backend_impl = pprof_backend(pprof_config);

// Configure Pyroscope Agent
let agent = PyroscopeAgent::builder("https://127.0.0.1:4040", "myapp")
    .backend(backend_impl)
    .build()?;

使用受保护的后端的用户需要提供认证信息。**Grafana Cloud**使用基本认证。您的用户名是一个数值,您可以从在grafana.com上的堆栈的Pyroscope“详情页面”获取。在同一页面上创建一个令牌,并使用它作为基本认证的密码。配置将类似于以下内容

rust
fn  main() ->  Result<()> {
std::env::set_var("RUST_LOG", "debug");
pretty_env_logger::init_timed();
let user = std::env::var("USER").unwrap();
let password = std::env::var("PASSWORD").unwrap();
let url = std::env::var("PYROSCOPE_URL").unwrap();
let samplerate = std::env::var("SAMPLE_RATE").unwrap().to_string().parse().unwrap();
let application_name = "example.basic";

let agent = PyroscopeAgent::builder(url, application_name.to_string())
    .basic_auth(user, password).backend(pprof_backend(PprofConfig::new().sample_rate(samplerate)))
    .tags([("app", "Rust"), ("TagB", "ValueB")].to_vec())
    .build()?;

您可以通过以下代码开始分析

rust
let agent_running = agent.start().unwrap();

代理可以在任何时刻停止,并向服务器发送最后的报告。之后可以重新启动代理。

rust
let agent_ready = agent.stop().unwrap();

建议在退出应用程序之前关闭代理。如果代理没有正确关闭,可能会错过最后的请求。

rust
agent_ready.shutdown();

为Rust应用程序添加分析标签

在代理启动后可以添加或删除标签。从0.5.0版本开始,Pyroscope代理支持线程内的标签。请查看标签多线程示例以获取详细用法。

代理启动后,将可用tag_wrapper函数。tag_wrapper返回一组函数,用于在线程边界上添加和删除代理的标签。只要代理在运行,此函数就可以多次调用。

rust
// Start Profiling
let agent_running = agent.start().unwrap();

// Generate Tag Wrapper functions
let (add_tag, remove_tag) = agent_running.tag_wrapper();

// Profiled code (with no tags)

// Add tags to the agent
add_tag("key".to_string(), "value".to_string());

// This portion will be profiled with the specified tag.

// Remove tags from the agent
remove_tag("key".to_string(), "value".to_string());

// Stop the agent
let agent_ready = running_agent.stop();

Rust客户端配置选项

代理接受额外的初始参数

  • 后端:分析后端。对于Rust,是pprof-rs
  • 采样率:赫兹采样频率。默认为100。
  • 标签:初始标签。
rust
// Configure Profiling backend
let pprof_config = PprofConfig::new().sample_rate(100);
let pprof_backend = Pprof::new(pprof_config);

// Configure Pyroscope Agent
let agent =
PyroscopeAgent::builder("https://127.0.0.1:4040", "myapp")
// Profiling backend
.backend(pprof_backend)
// Sample rate
.sample_rate(100)
// Tags
.tags(vec![("env", "dev")])
// Create the agent
.build()?;

技术细节

  • 后端:Pyroscope代理使用pprof-rs作为后端。因此,pprof-rs的限制也适用。从0.5.0版本开始,Pyroscope代理支持线程内的标签。请查看标签多线程示例以获取用法。

  • 计时器:需要epoll(Linux)和kqueue(macOS)进行更精确的计时。

  • 关闭:Pyroscope代理可能需要一些时间(通常不到10秒)才能正确关闭并丢弃其线程。为了正确关闭,建议在丢弃代理之前运行shutdown函数。

  • 相关链接

示例

用法示例

  • basic: 最小配置示例。
  • tags: 使用标签的示例。
  • async: 使用Tokio异步代码的示例。
  • multi-thread: 使用多个线程的示例。
  • with-logger: 将日志输出到stdout的示例。
  • error: 使用无效服务器地址的示例。

独立示例

  • basic: 使用Pyroscope库的简单Rust应用程序。
  • rideshare: 在Docker上运行的多实例Web服务。