// 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. // Package counter implements a simple counter system for collecting // totally public telemetry data. // // There are two kinds of counters, basic counters and stack counters. // Basic counters are created by [New]. // Stack counters are created by [NewStack]. // Both are incremented by calling Inc(). // // Basic counters are very cheap. Stack counters are more expensive, as they // require parsing the stack. (Stack counters are implemented as basic counters // whose names are the concatenation of the name and the stack trace. There is // an upper limit on the size of this name, about 4K bytes. If the name is too // long the stack will be truncated and "truncated" appended.) // // When counter files expire they are turned into reports by the upload // package. The first time any counter file is created for a user, a random day // of the week is selected on which counter files will expire. For the first // week, that day is more than 7 days (but not more than two weeks) in the // future. After that the counter files expire weekly on the same day of the // week. // // # Counter Naming // // Counter names passed to [New] and [NewStack] should follow these // conventions: // // - Names cannot contain whitespace or newlines. // // - Names must be valid unicode, with no unprintable characters. // // - Names may contain at most one ':'. In the counter "foo:bar", we refer to // "foo" as the "chart name" and "bar" as the "bucket name". // // - The '/' character should partition counter names into a hierarchy. The // root of this hierarchy should identify the logical entity that "owns" // the counter. This could be an application, such as "gopls" in the case // of "gopls/client:vscode", or a shared library, such as "crash" in the // case of the "crash/crash" counter owned by the crashmonitor library. If // the entity name itself contains a '/', that's ok: "cmd/go/flag" is fine. // // - Words should be '-' separated, as in "gopls/completion/errors-latency" // // - Histograms should use bucket names identifying upper bounds with '<'. // For example given two counters "gopls/completion/latency:<50ms" and // "gopls/completion/latency:<100ms", the "<100ms" bucket counts events // with latency in the half-open interval [50ms, 100ms). // // # Debugging // // The GODEBUG environment variable can enable printing of additional debug // information for counters. Adding GODEBUG=countertrace=1 to the environment // of a process using counters causes the x/telemetry/counter package to log // counter information to stderr. package counter