blob: c67adda06588565233ed11f724789629aa9ae8db [file] [log] [blame]
// 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
}