| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // The chartconfig package defines configuration that specifies both the data |
| // that is uploaded to telemetry.go.dev, and the resulting charts that are |
| // rendered. Each record in [config.txt] defines the collection and aggregation |
| // of a group of related counters, in the custom format specified below. We |
| // refer to these records as "chart configs" (and represent them with the |
| // [ChartConfig] type), based on the principle that telemetry collection should |
| // be derived from views of the data that we want to see. For basic counters, |
| // this is indeed the case: chart configs correspond 1:1 with charts on |
| // telemetry.go.dev. For stack counters, we use the same format, but have no |
| // way to render them graphically. |
| // |
| // The format itself is based on the original telemetry blog post, though it |
| // has been modified slightly and may be subject to further change: |
| // |
| // https://research.swtch.com/telemetry-design#configuration |
| // |
| // # Chart records |
| // |
| // Chart config records consist of fields, comments, and whitespace. A field is |
| // defined by a line starting with a valid key, followed immediately by ":", |
| // and then a textual value, which cannot include the comment separator '#'. |
| // |
| // Comments start with '#', and extend to the end of the line. |
| // |
| // The following keys are supported. Any entry not marked as (optional) must be |
| // provided for the record to pass validation. |
| // |
| // - counter: an expression for the group of counters this chart aggregates. |
| // More detail on the syntax of this expression is provided below. |
| // - title: the chart title. |
| // - description: (optional) a longer description of the chart. |
| // - issue: a Go issue tracker URL proposing the chart configuration. |
| // Multiple issues may be provided by including additional 'issue:' lines. |
| // - type: the chart type. Currently only partition and stack are supported. |
| // - program: the package path of the program for which this chart applies. |
| // - module: the module path of the program for version lookup. |
| // - version: (optional) the first program version for which this chart |
| // applies. Must be a valid semver value. If not provided, the chart |
| // applies to all versions. |
| // - depth: (optional) stack counters only; the maximum stack depth to collect |
| // - error: (optional) the desired error rate for this chart, which |
| // determines collection rate |
| // |
| // Multiple records are separated by "---" lines. |
| // |
| // # Counter expressions |
| // |
| // Each record must specify in its 'counter' field either a single counter, or |
| // a group of related counters. |
| // |
| // As described in the [counter documentation], we decompose counter names into |
| // two parts, separated by a ':'. The part before the ':' is referred to as the |
| // 'chart name', and the part after the ':' is the 'bucket'. So in the example |
| // gopls/gotoolchain:auto, gopls/gotoolchain is the chart name, and auto is the |
| // bucket name. |
| // |
| // In order to be grouped into a single chart, counters must share a common |
| // chart name, and so we specify the group of counters using the following |
| // compact syntax: |
| // |
| // chartname:{bucket1,bucket2,bucket3} |
| // |
| // Which expands to the following group of counters: |
| // |
| // chartname:bucket1 |
| // chartname:bucket2 |
| // chartname:bucket3 |
| // |
| // # Chart types |
| // |
| // There are two supported chart types for the 'type' field: |
| // |
| // - A 'partition' chart is a bar chart with one bar for each related counter. |
| // The value of the bar is the aggregation of all counts for the program |
| // over the applicable time period. |
| // - A 'stack' chart is not a real chart. It just means that we want to |
| // collect the given stack counter or group of stack counters. |
| // |
| // # Example |
| // |
| // Here is a fully worked example, including both partition and stack records: |
| // |
| // # This config defines an ordinary counter. |
| // counter: gopls/editor:{emacs,vim,vscode,other} # TODO(golang/go#34567): add more editors |
| // title: Editor Distribution |
| // description: measure editor distribution for gopls users. |
| // type: partition |
| // issue: https://go.dev/issue/12345 |
| // program: golang.org/x/tools/gopls |
| // module: golang.org/x/tools/gopls |
| // version: v1.0.0 |
| // |
| // --- |
| // |
| // # This config defines a stack counter. |
| // counter: gopls/bug |
| // title: Gopls bug reports. |
| // description: Stacks of bugs encountered on the gopls server. |
| // issue: https://go.dev/12345 |
| // issue: https://go.dev/23456 # increase stack depth |
| // type: stack |
| // program: golang.org/x/tools/gopls |
| // module: golang.org/x/tools/gopls |
| // depth: 10 |
| // |
| // [config.txt]: https://go.googlesource.com/telemetry/+/refs/heads/master/internal/chartconfig/config.txt |
| // [counter documentation]: https://go.dev/doc/telemetry#counters |
| package chartconfig |
| |
| // A ChartConfig defines the configuration for a single chart/collection on the |
| // telemetry server. |
| // |
| // See the package documentation for field definitions. |
| type ChartConfig struct { |
| Title string |
| Description string |
| Issue []string |
| Type string |
| Program string |
| Module string |
| Counter string |
| Depth int |
| Error float64 // TODO(rfindley) is Error still useful? |
| Version string |
| } |