[PATCH] D78429: [clangd] Metric tracking through Tracer
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 30 02:25:34 PDT 2020
kadircet marked 8 inline comments as done.
kadircet added inline comments.
================
Comment at: clang-tools-extra/clangd/Trace.h:35
+/// itself to active tracer on destruction.
+struct Metric {
+ enum Type {
----------------
sammccall wrote:
> Conceptually there's a difference between a metric (the thing being measured, such as "latency distribution by method") and the measurement (such as "code completion took 90ms this time").
> The attributes such as name, type, permitted labels are associated with the metric - these are schema. Whereas the measurement is a tuple `(metric, actual label, value)` - it doesn't make sense to have measurements for the same metric with different types. And the metric is immutable while the measurement is transient.
>
> For the API (to emit data) it seems natural to model this split using constexpr objects for the metrics, and methods for the measurement:
> ```
> constexpr Metric IncomingLatencyMS("/clangd/latency", Distribution);
> ...
> void handleCodeCompletion() {
> ...
> IncomingLatencyMS.record(90);
> }
> ```
> (IOW I think our favorite metrics framework got this right)
>
>
> For the SPI (to consume data), things are a bit muddier. For I think we want to avoid having a protocol to explicitly register metrics, so there's an attraction to just reporting the flat `(name, type, label, value)` tuple. I also quite like the idea of reusing the type above and reporting this as `(const Metric&, label, value)` which makes extending Metric more natural.
this looks a lot better, thanks! Changing the order of label and value to make it nicer for non-labeled metrics.
================
Comment at: clang-tools-extra/clangd/Trace.h:36
+struct Metric {
+ enum Type {
+ /// Occurence of an event, e.g. cache access.
----------------
sammccall wrote:
> sammccall wrote:
> > I think we're missing an important type: a value directly provided by the measurement, such as memory usage.
> This enum is about defining the relationship between the metric and the measurements, but also about the (related) nature of the metric itself.
>
> The current names are measurement-centric, which is good for the former but not so much for the latter, and a bit confusing if we set this enum when initializing the *metric*. I'd consider having this be metric-centric and documenting the measurements instead. e.g.
>
> ```
> enum MetricType {
> /// A number whose value is meaningful, and may vary over time.
> /// Each measurement replaces the current value.
> Value,
>
> /// An aggregate number whose rate of change over time is meaningful.
> /// Each measurement is an increment for the counter.
> Counter,
>
> /// A distribution of values with a meaningful mean and count.
> /// Each measured value is a sample for the distribution.
> /// The distribution is assumed not to vary, samples are aggregated over time.
> Distribution,
> };
> ```
> I think we're missing an important type: a value directly provided by the measurement, such as memory usage.
I was planning to extend with this later on when we added memory tracking metrics.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D78429/new/
https://reviews.llvm.org/D78429
More information about the cfe-commits
mailing list