|
1 | 1 | # metrics-exporter-opentelemetry
|
2 | 2 |
|
3 |
| -[](https://docs.rs/metrics-exporter-opentelemetry) |
| 3 | +[![docs-badge][docs-badge]][docs] [![crates-badge][crates-badge]][crates] [![license-badge][license-badge]][license] |
4 | 4 |
|
5 |
| -A [`metrics`][metrics] exporter for [OpenTelemetry]. |
| 5 | +[docs-badge]: https://docs.rs/metrics-exporter-opentelemetry/badge.svg |
| 6 | +[docs]: https://docs.rs/metrics-exporter-opentelemetry |
| 7 | +[crates-badge]: https://img.shields.io/crates/v/metrics-exporter-opentelemetry.svg |
| 8 | +[crates]: https://crates.io/crates/metrics-exporter-opentelemetry |
| 9 | +[license-badge]: https://img.shields.io/crates/l/metrics-exporter-opentelemetry.svg |
| 10 | +[license]: #license |
| 11 | + |
| 12 | +A [`metrics`]-compatible exporter for sending metrics to OpenTelemetry collectors. |
| 13 | + |
| 14 | +[`metrics`]: https://docs.rs/metrics/ |
| 15 | + |
| 16 | +## Overview |
| 17 | + |
| 18 | +A [`metrics`]-compatible exporter for OpenTelemetry collectors and OTLP endpoints. |
6 | 19 |
|
7 | 20 | ## Features
|
8 | 21 |
|
9 |
| -- Export metrics to OpenTelemetry collectors using OTLP |
10 |
| -- Support for counters, gauges, and histograms |
11 |
| -- Integration with the OpenTelemetry SDK |
12 |
| -- Configurable export intervals and endpoints |
| 22 | +- Counters, gauges, and histograms |
| 23 | +- Custom histogram bucket boundaries |
| 24 | +- Metric descriptions and units |
| 25 | +- Lock-free concurrent data structures |
| 26 | +- Works with any OpenTelemetry [`Meter`] |
| 27 | + |
| 28 | +[`Meter`]: https://docs.rs/opentelemetry/latest/opentelemetry/metrics/trait.Meter.html |
| 29 | + |
| 30 | +## Quick Start |
13 | 31 |
|
14 |
| -## Usage |
| 32 | +Add this to your `Cargo.toml`: |
| 33 | + |
| 34 | +```toml |
| 35 | +[dependencies] |
| 36 | +metrics = "0.24" |
| 37 | +metrics-exporter-opentelemetry = "0.1" |
| 38 | +opentelemetry = "0.30" |
| 39 | +opentelemetry_sdk = "0.30" |
| 40 | +``` |
| 41 | + |
| 42 | +Basic usage: |
15 | 43 |
|
16 | 44 | ```rust
|
17 |
| -use metrics::{counter, gauge, histogram}; |
18 |
| -use metrics_exporter_opentelemetry::OpenTelemetryBuilder; |
19 |
| -use opentelemetry_otlp::WithExportConfig; |
20 |
| -use opentelemetry_sdk::{ |
21 |
| - metrics::{PeriodicReader, SdkMeterProvider}, |
22 |
| - runtime, |
23 |
| -}; |
24 |
| - |
25 |
| -// Configure OpenTelemetry exporter |
26 |
| -let exporter = opentelemetry_otlp::MetricExporter::builder() |
27 |
| - .with_tonic() |
28 |
| - .with_endpoint("http://localhost:4317") |
29 |
| - .build()?; |
30 |
| - |
31 |
| -// Create a periodic reader |
32 |
| -let reader = PeriodicReader::builder(exporter, runtime::Tokio) |
33 |
| - .with_interval(Duration::from_secs(10)) |
34 |
| - .build(); |
35 |
| - |
36 |
| -// Build the meter provider |
37 |
| -let provider = SdkMeterProvider::builder() |
38 |
| - .with_reader(reader) |
39 |
| - .build(); |
40 |
| - |
41 |
| -// Install the metrics exporter |
42 |
| -OpenTelemetryBuilder::new() |
43 |
| - .with_meter_provider(provider) |
44 |
| - .install()?; |
45 |
| - |
46 |
| -// Now you can use the metrics macros |
47 |
| -counter!("requests_total").increment(1); |
48 |
| -gauge!("cpu_usage").set(0.75); |
49 |
| -histogram!("request_duration").record(0.234); |
| 45 | +use metrics_exporter_opentelemetry::OpenTelemetryRecorder; |
| 46 | +use opentelemetry::metrics::MeterProvider; |
| 47 | +use opentelemetry_sdk::metrics::SdkMeterProvider; |
| 48 | + |
| 49 | +// Create an OpenTelemetry meter |
| 50 | +let provider = SdkMeterProvider::default(); |
| 51 | +let meter = provider.meter("my_application"); |
| 52 | + |
| 53 | +// Create and install the recorder |
| 54 | +let recorder = OpenTelemetryRecorder::new(meter); |
| 55 | +metrics::set_global_recorder(recorder).expect("failed to install recorder"); |
| 56 | + |
| 57 | +// Use metrics as normal |
| 58 | +metrics::counter!("requests_total", "method" => "GET").increment(1); |
| 59 | +metrics::gauge!("cpu_usage", "core" => "0").set(45.2); |
| 60 | +metrics::histogram!("response_time", "endpoint" => "/api/users").record(0.123); |
50 | 61 | ```
|
51 | 62 |
|
52 |
| -## Examples |
| 63 | +## Custom Histogram Boundaries |
| 64 | + |
| 65 | +```rust |
| 66 | +let recorder = OpenTelemetryRecorder::new(meter); |
53 | 67 |
|
54 |
| -- [`opentelemetry_push`](examples/opentelemetry_push.rs): Demonstrates exporting metrics to an OpenTelemetry collector |
55 |
| -- [`opentelemetry_stdout`](examples/opentelemetry_stdout.rs): Shows metrics export to stdout for debugging |
| 68 | +recorder.set_histogram_bounds( |
| 69 | + &metrics::KeyName::from("response_time"), |
| 70 | + vec![0.001, 0.005, 0.01, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0] |
| 71 | +); |
| 72 | + |
| 73 | +metrics::set_global_recorder(recorder).expect("failed to install recorder"); |
| 74 | +``` |
| 75 | + |
| 76 | +## Metric Descriptions and Units |
| 77 | + |
| 78 | +You can provide descriptions and units for your metrics using the `describe_*` macros. |
| 79 | + |
| 80 | +CAUTION: These macros must be called before the metrics are recorded. The instruments created before calling these macros will not have descriptions or units. |
| 81 | + |
| 82 | +```rust |
| 83 | +use metrics::{describe_counter, describe_histogram, Unit}; |
| 84 | + |
| 85 | +describe_counter!("requests_total", Unit::Count, "Total HTTP requests"); |
| 86 | +describe_histogram!("response_time", Unit::Seconds, "Response time distribution"); |
| 87 | + |
| 88 | +metrics::counter!("requests_total").increment(1); |
| 89 | +metrics::histogram!("response_time").record(0.045); |
| 90 | +``` |
56 | 91 |
|
57 |
| -## License |
| 92 | +## Compatibility |
58 | 93 |
|
59 |
| -This project is licensed under the MIT license. |
| 94 | +### Metric Type Mapping |
60 | 95 |
|
61 |
| -[metrics]: https://github.com/metrics-rs/metrics |
62 |
| -[OpenTelemetry]: https://opentelemetry.io/ |
| 96 | +| `metrics` Type | OpenTelemetry Instrument | |
| 97 | +|----------------|-------------------------| |
| 98 | +| `Counter` | `ObservableCounter` (u64) | |
| 99 | +| `Gauge` | `ObservableGauge` (f64) | |
| 100 | +| `Histogram` | `Histogram` (f64) | |
0 commit comments