1 // Copyright 2023 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package counter implements a simple counter system for collecting 6 // totally public telemetry data. 7 // 8 // There are two kinds of counters, basic counters and stack counters. 9 // Basic counters are created by [New]. 10 // Stack counters are created by [NewStack]. 11 // Both are incremented by calling Inc(). 12 // 13 // Basic counters are very cheap. Stack counters are more expensive, as they 14 // require parsing the stack. (Stack counters are implemented as basic counters 15 // whose names are the concatenation of the name and the stack trace. There is 16 // an upper limit on the size of this name, about 4K bytes. If the name is too 17 // long the stack will be truncated and "truncated" appended.) 18 // 19 // When counter files expire they are turned into reports by the upload 20 // package. The first time any counter file is created for a user, a random day 21 // of the week is selected on which counter files will expire. For the first 22 // week, that day is more than 7 days (but not more than two weeks) in the 23 // future. After that the counter files expire weekly on the same day of the 24 // week. 25 // 26 // # Counter Naming 27 // 28 // Counter names passed to [New] and [NewStack] should follow these 29 // conventions: 30 // 31 // - Names cannot contain whitespace or newlines. 32 // 33 // - Names must be valid unicode, with no unprintable characters. 34 // 35 // - Names may contain at most one ':'. In the counter "foo:bar", we refer to 36 // "foo" as the "chart name" and "bar" as the "bucket name". 37 // 38 // - The '/' character should partition counter names into a hierarchy. The 39 // root of this hierarchy should identify the logical entity that "owns" 40 // the counter. This could be an application, such as "gopls" in the case 41 // of "gopls/client:vscode", or a shared library, such as "crash" in the 42 // case of the "crash/crash" counter owned by the crashmonitor library. If 43 // the entity name itself contains a '/', that's ok: "cmd/go/flag" is fine. 44 // 45 // - Words should be '-' separated, as in "gopls/completion/errors-latency" 46 // 47 // - Histograms should use bucket names identifying upper bounds with '<'. 48 // For example given two counters "gopls/completion/latency:<50ms" and 49 // "gopls/completion/latency:<100ms", the "<100ms" bucket counts events 50 // with latency in the half-open interval [50ms, 100ms). 51 // 52 // # Debugging 53 // 54 // The GODEBUG environment variable can enable printing of additional debug 55 // information for counters. Adding GODEBUG=countertrace=1 to the environment 56 // of a process using counters causes the x/telemetry/counter package to log 57 // counter information to stderr. 58 package counter 59