#statsd #metrics

cadence-macros

Macros for Cadence, an extensible Statsd client for Rust

5 releases (breaking)

0.29.0 Apr 2, 2022
0.28.0 Jan 29, 2022
0.27.0 Dec 26, 2021
0.26.0 Jul 23, 2021
0.24.0 Feb 3, 2021

#77 in Visualization

Download history 220/week @ 2022-10-07 241/week @ 2022-10-14 246/week @ 2022-10-21 268/week @ 2022-10-28 80/week @ 2022-11-04 187/week @ 2022-11-11 162/week @ 2022-11-18 175/week @ 2022-11-25 216/week @ 2022-12-02 173/week @ 2022-12-09 127/week @ 2022-12-16 52/week @ 2022-12-23 154/week @ 2022-12-30 218/week @ 2023-01-06 201/week @ 2023-01-13 416/week @ 2023-01-20

1,013 downloads per month
Used in plerkle

Apache-2.0/MIT

240KB
3K SLoC

cadence-macros

build status docs.rs crates.io Rust 1.36+

Cadence Documentation

Macros Documentation

An extensible Statsd client for Rust!

Cadence is a fast and flexible way to emit Statsd metrics from your application. The cadence-macros crate provides some wrappers to eliminate much of the boilerplate that is often needed to emit metrics along with any tags that are associated with them.

Features

  • Support for emitting counters, timers, histograms, distributions, gauges, meters, and sets to Statsd over UDP (or optionally Unix sockets).
  • Support for alternate backends via the MetricSink trait.
  • Support for Datadog style metrics tags.
  • Macros to simplify common calls to emit metrics
  • A simple yet flexible API for sending metrics.

Install

To make use of cadence-macros in your project, add it as a dependency in your Cargo.toml file.

[dependencies]
cadence-macros = "x.y.z"

Usage

To make use of the macros in this crate, you'll need to set a global default Statsd client. Configure a cadence::StatsdClient as usual and use the set_global_default function to set it as the default. After that, you can make use of the macros in this crate.

use std::net::UdpSocket;
use std::time::Duration;
use cadence::prelude::*;
use cadence::{StatsdClient, QueuingMetricSink, BufferedUdpMetricSink, DEFAULT_PORT};
use cadence_macros::{statsd_count, statsd_time, statsd_gauge, statsd_meter, statsd_histogram, statsd_distribution, statsd_set};

// Normal setup for a high-performance Cadence instance
let socket = UdpSocket::bind("0.0.0.0:0").unwrap();
socket.set_nonblocking(true).unwrap();

let host = ("metrics.example.com", DEFAULT_PORT);
let udp_sink = BufferedUdpMetricSink::from(host, socket).unwrap();
let queuing_sink = QueuingMetricSink::from(udp_sink);
let client = StatsdClient::from_sink("my.prefix", queuing_sink);

// Set the default client to use for macro calls
cadence_macros::set_global_default(client);

// Macros!
statsd_count!("some.counter", 123);
statsd_count!("some.counter", 123, "tag" => "val");
statsd_count!("some.counter", 123, "tag" => "val", "another" => "thing");

statsd_time!("some.timer", 123);
statsd_time!("some.timer", 123, "tag" => "val");
statsd_time!("some.timer", 123, "tag" => "val", "another" => "thing");
statsd_time!("some.timer", Duration::from_millis(123), "tag" => "val", "another" => "thing");

statsd_gauge!("some.gauge", 123);
statsd_gauge!("some.gauge", 123, "tag" => "val");
statsd_gauge!("some.gauge", 123, "tag" => "val", "another" => "thing");
statsd_gauge!("some.gauge", 123.123, "tag" => "val", "another" => "thing");

statsd_meter!("some.meter", 123);
statsd_meter!("some.meter", 123, "tag" => "val");
statsd_meter!("some.meter", 123, "tag" => "val", "another" => "thing");

statsd_histogram!("some.histogram", 123);
statsd_histogram!("some.histogram", 123, "tag" => "val");
statsd_histogram!("some.histogram", 123, "tag" => "val", "another" => "thing");
statsd_histogram!("some.histogram", Duration::from_nanos(123), "tag" => "val", "another" => "thing");
statsd_histogram!("some.histogram", 123.123, "tag" => "val", "another" => "thing");

statsd_distribution!("some.distribution", 123);
statsd_distribution!("some.distribution", 123, "tag" => "val");
statsd_distribution!("some.distribution", 123, "tag" => "val", "another" => "thing");
statsd_distribution!("some.distribution", 123.123, "tag" => "val", "another" => "thing");

statsd_set!("some.set", 123);
statsd_set!("some.set", 123, "tag" => "val");
statsd_set!("some.set", 123, "tag" => "val", "another" => "thing");

Limitations

Some limitations with the current implemenation of Cadence macros are described below

  • Value tags are not supported. For example the following style of tag cannot be set when using macros: client.count_with_tags("some.counter", 123).with_tag_value("beta").send()

Other

For more information about Cadence, see the README in the repository root.

Dependencies

~220KB