diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..e2a29f4 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,27 @@ +# The Code of Conduct + +This document is based on the [Rust Code of Conduct](https://www.rust-lang.org/conduct.html) and outlines the standard of conduct which is both expected and enforced as part of this project. + +## Conduct + +**Contact**: [toby@nuclearfurnace.com](mailto:toby@nuclearfurnace.com) + +* We are committed to providing a friendly, safe and welcoming environment for all, regardless of level of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other similar characteristic. +* Avoid using overtly sexual nicknames or other nicknames that might detract from a friendly, safe and welcoming environment for all. +* Please be kind and courteous. There's no need to be mean or rude. +* Respect that people have differences of opinion and that every design or implementation choice carries a trade-off and numerous costs. There is seldom a right answer. +* Please keep unstructured critique to a minimum. If you have solid ideas you want to experiment with, make a fork and see how it works. +* We will exclude you from interaction if you insult, demean or harass anyone. That is not welcome behaviour. We interpret the term "harassment" as including the definition in the Citizen Code of Conduct; if you have any lack of clarity about what might be included in that concept, please read their definition. In particular, we don't tolerate behavior that excludes people in socially marginalized groups. +* Private harassment is also unacceptable. No matter who you are, if you feel you have been or are being harassed or made uncomfortable by a community member, please contact one of the repository Owners immediately. Whether you're a regular contributor or a newcomer, we care about making this community a safe place for you and we've got your back. +* Likewise any spamming, trolling, flaming, baiting or other attention-stealing behaviour is not welcome. + +## Moderation + +These are the policies for upholding our community's standards of conduct. If you feel that a thread needs moderation, please use the contact information above, or mention @tobz or @LucioFranco in the thread. + +1. Remarks that violate this Code of Conduct, including hateful, hurtful, oppressive, or exclusionary remarks, are not allowed. (Cursing is allowed, but never targeting another user, and never in a hateful manner.) +2. Remarks that moderators find inappropriate, whether listed in the code of conduct or not, are also not allowed. + +In the Rust community we strive to go the extra step to look out for each other. Don't just aim to be technically unimpeachable, try to be your best self. In particular, avoid flirting with offensive or sensitive issues, particularly if they're off-topic; this all too often leads to unnecessary fights, hurt feelings, and damaged trust; worse, it can drive people away from the community entirely. + +And if someone takes issue with something you said or did, resist the urge to be defensive. Just stop doing what it was they complained about and apologize. Even if you feel you were misinterpreted or unfairly accused, chances are good there was something you could've communicated better — remember that it's your responsibility to make your fellow Rustaceans comfortable. Everyone wants to get along and we are all here first and foremost because we want to talk about cool technology. You will find that people will be eager to assume good intent and forgive as long as you earn their trust. diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000..c1b9ce9 --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1,47 @@ +Short version for non-lawyers: + +metrics is MIT licensed. + +Longer version: + +Copyrights in the metrics project are retained by their contributors. No +copyright assignment is required to contribute to the metrics project. + +Some files include explicit copyright notices and/or license notices. +For full authorship information, see the version control history. + +Except as otherwise noted (below and/or in individual files), metrics +is licensed under the MIT license or +. + + +metrics includes packages written by third parties. +The following third party packages are included, and carry +their own copyright notices and license terms: + +* Portions of the API design are derived from tic + , which carries the following + license: + + Copyright (c) 2016 Brian Martin + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..3237ab2 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = [ + "metrics-core", +] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1cc7cf0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,17 @@ +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8dd8f54 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# metrics + +[![conduct-badge][]][conduct] [![downloads-badge][] ![release-badge][]][crate] [![docs-badge][]][docs] [![license-badge][]](#license) + +[conduct-badge]: https://img.shields.io/badge/%E2%9D%A4-code%20of%20conduct-blue.svg +[downloads-badge]: https://img.shields.io/crates/d/metrics.svg +[release-badge]: https://img.shields.io/crates/v/metrics.svg +[license-badge]: https://img.shields.io/crates/l/metrics.svg +[docs-badge]: https://docs.rs/metrics/badge.svg +[conduct]: https://github.com/metrics-rs/metrics/blob/master/CODE_OF_CONDUCT.md +[crate]: https://crates.io/crates/metrics +[docs]: https://docs.rs/metrics + +__metrics__ is a high-quality, batteries-included metrics library for Rust. + +## code of conduct + +**NOTE**: All conversations and contributions to this project shall adhere to the [Code of Conduct][conduct]. + +# caveat emptor + +This crate is currently materializing! We are in the process of switching over [hotmic](https://github.com/nuclearfurnace/hotmic) to `metrics` after successfully acquiring ownership of the `metrics` crate on crates.io! + +We apologize for the README/documentation that will reference things that don't exist yet until the switchover is complete. Thank you for your understanding! + +## general features +- Provides counter, gauge, and histogram support. +- Access to ultra-high-speed timing facilities out-of-the-box with [quanta](https://github.com/nuclearfurnace/quanta). +- Scoped metrics for effortless nesting. +- Speed and API ergonomics allow for usage in both synchronous and asynchronous contexts. +- Based on `metrics-core` for bring-your-own-collector/bring-your-own-exporter flexibility! + +## performance + +High. Tens of millions of metrics per second with metric ingest times at sub-200ns p99 on modern systems. diff --git a/metrics-core/.gitignore b/metrics-core/.gitignore new file mode 100644 index 0000000..6936990 --- /dev/null +++ b/metrics-core/.gitignore @@ -0,0 +1,3 @@ +/target +**/*.rs.bk +Cargo.lock diff --git a/metrics-core/CODE_OF_CONDUCT.md b/metrics-core/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..e2a29f4 --- /dev/null +++ b/metrics-core/CODE_OF_CONDUCT.md @@ -0,0 +1,27 @@ +# The Code of Conduct + +This document is based on the [Rust Code of Conduct](https://www.rust-lang.org/conduct.html) and outlines the standard of conduct which is both expected and enforced as part of this project. + +## Conduct + +**Contact**: [toby@nuclearfurnace.com](mailto:toby@nuclearfurnace.com) + +* We are committed to providing a friendly, safe and welcoming environment for all, regardless of level of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other similar characteristic. +* Avoid using overtly sexual nicknames or other nicknames that might detract from a friendly, safe and welcoming environment for all. +* Please be kind and courteous. There's no need to be mean or rude. +* Respect that people have differences of opinion and that every design or implementation choice carries a trade-off and numerous costs. There is seldom a right answer. +* Please keep unstructured critique to a minimum. If you have solid ideas you want to experiment with, make a fork and see how it works. +* We will exclude you from interaction if you insult, demean or harass anyone. That is not welcome behaviour. We interpret the term "harassment" as including the definition in the Citizen Code of Conduct; if you have any lack of clarity about what might be included in that concept, please read their definition. In particular, we don't tolerate behavior that excludes people in socially marginalized groups. +* Private harassment is also unacceptable. No matter who you are, if you feel you have been or are being harassed or made uncomfortable by a community member, please contact one of the repository Owners immediately. Whether you're a regular contributor or a newcomer, we care about making this community a safe place for you and we've got your back. +* Likewise any spamming, trolling, flaming, baiting or other attention-stealing behaviour is not welcome. + +## Moderation + +These are the policies for upholding our community's standards of conduct. If you feel that a thread needs moderation, please use the contact information above, or mention @tobz or @LucioFranco in the thread. + +1. Remarks that violate this Code of Conduct, including hateful, hurtful, oppressive, or exclusionary remarks, are not allowed. (Cursing is allowed, but never targeting another user, and never in a hateful manner.) +2. Remarks that moderators find inappropriate, whether listed in the code of conduct or not, are also not allowed. + +In the Rust community we strive to go the extra step to look out for each other. Don't just aim to be technically unimpeachable, try to be your best self. In particular, avoid flirting with offensive or sensitive issues, particularly if they're off-topic; this all too often leads to unnecessary fights, hurt feelings, and damaged trust; worse, it can drive people away from the community entirely. + +And if someone takes issue with something you said or did, resist the urge to be defensive. Just stop doing what it was they complained about and apologize. Even if you feel you were misinterpreted or unfairly accused, chances are good there was something you could've communicated better — remember that it's your responsibility to make your fellow Rustaceans comfortable. Everyone wants to get along and we are all here first and foremost because we want to talk about cool technology. You will find that people will be eager to assume good intent and forgive as long as you earn their trust. diff --git a/metrics-core/Cargo.toml b/metrics-core/Cargo.toml new file mode 100644 index 0000000..fb7a2f5 --- /dev/null +++ b/metrics-core/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "metrics-core" +version = "0.1.2" +authors = ["Toby Lawrence "] +edition = "2018" + +license = "MIT" + +description = "Foundational traits for interoperable metrics libraries in Rust." + +homepage = "https://github.com/metrics-rs/metrics" +repository = "https://github.com/metrics-rs/metrics" +documentation = "https://docs.rs/metrics-core" + +readme = "README.md" + +keywords = ["metrics", "interface", "common"] diff --git a/metrics-core/LICENSE b/metrics-core/LICENSE new file mode 100644 index 0000000..1cc7cf0 --- /dev/null +++ b/metrics-core/LICENSE @@ -0,0 +1,17 @@ +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. diff --git a/metrics-core/README.md b/metrics-core/README.md new file mode 100644 index 0000000..f8f781b --- /dev/null +++ b/metrics-core/README.md @@ -0,0 +1,24 @@ +# metrics-core + +[![conduct-badge][]][conduct] [![downloads-badge][] ![release-badge][]][crate] [![docs-badge][]][docs] [![license-badge][]](#license) + +[conduct-badge]: https://img.shields.io/badge/%E2%9D%A4-code%20of%20conduct-blue.svg +[downloads-badge]: https://img.shields.io/crates/d/metrics-core.svg +[release-badge]: https://img.shields.io/crates/v/metrics-core.svg +[license-badge]: https://img.shields.io/crates/l/metrics-core.svg +[docs-badge]: https://docs.rs/metrics-core/badge.svg +[conduct]: https://github.com/metrics-rs/metrics-core/blob/master/CODE_OF_CONDUCT.md +[crate]: https://crates.io/crates/metrics-core +[docs]: https://docs.rs/metrics-core + +__metrics-core__ defines foundational traits for interoperable metrics libraries in Rust. + +## code of conduct + +**NOTE**: All conversations and contributions to this project shall adhere to the [Code of Conduct][conduct]. + +## mandate / goals + +This crate acts as the minimum viable trait for metrics libraries, and consumers of that data, for interoperating with each other. + +If your library allows users to collect metrics, it should support metrics-core to allow for flexibility in output targets. If your library provides support for a target metrics backend, it should support metrics-core so that it can be easily plugged into applications using a supported metrics library. diff --git a/metrics-core/src/lib.rs b/metrics-core/src/lib.rs new file mode 100644 index 0000000..64234ca --- /dev/null +++ b/metrics-core/src/lib.rs @@ -0,0 +1,61 @@ +//! Foundational traits for interoperable metrics libraries in Rust. +//! +//! # Common Ground +//! Most libraries, under the hood, are all based around a core set of data types: counters, +//! gauges, and histograms. While the API surface may differ, the underlying data is the same. +//! +//! # Metric Types +//! +//! ## Counters +//! Counters represent a single value that can only ever be incremented over time, or reset to +//! zero. +//! +//! Counters are useful for tracking things like operations completed, or errors raised, where +//! the value naturally begins at zero when a process or service is started or restarted. +//! +//! ## Gauges +//! Gauges represent a single value that can go up _or_ down over time. +//! +//! Gauges are useful for tracking things like the current number of connected users, or a stock +//! price, or the temperature outside. +//! +//! ## Histograms +//! Histograms measure the distribution of values for a given set of measurements. +//! +//! Histograms are generally used to derive statistics about a particular measurement from an +//! operation or event that happens over and over, such as the duration of a request, or number of +//! rows returned by a particular database query. +//! +//! Histograms allow you to answer questions of these measurements, such as: +//! - "What were the fastest and slowest requests in this window?" +//! - "What is the slowest request we've seen out of 90% of the requests measured? 99%?" +//! +//! Histograms are a convenient way to measure behavior not only at the median, but at the edges of +//! normal operating behavior. + +/// A value that exports collected metrics. +pub trait MetricsExporter { + /// Exports a counter. + /// + /// From the perspective of an exportr, a counter and gauge are essentially identical, insofar + /// as they are both a single value tied to a key. From the perspective of a collector, + /// counters and gauges usually have slightly different modes of operation. + /// + /// For the sake of flexibility on the exportr side, both are provided. + fn export_counter>(&mut self, key: K, value: u64); + + /// Exports a gauge. + /// + /// From the perspective of a exportr, a counter and gauge are essentially identical, insofar + /// as they are both a single value tied to a key. From the perspective of a collector, + /// counters and gauges usually have slightly different modes of operation. + /// + /// For the sake of flexibility on the exportr side, both are provided. + fn export_gauge>(&mut self, key: K, value: i64); + + /// Exports a histogram. + /// + /// Exporters are expected to tally their own histogram views, which means this method will be + /// called for each observed value in the underlying histogram. + fn export_histogram>(&mut self, key: K, value: u64); +}