/**
* Copyright 2015-2017 The OpenZipkin Authors
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package zipkin;
/**
* Well-known {@link BinaryAnnotation#key binary annotation keys}.
*
* <h3>Overhead of adding Trace Data</h3>
*
* Overhead is directly related to the size of trace data exported out of process. Accordingly, it
* is better to tag what's important for latency troubleshooting, i.e. a whitelist vs. collecting
* everything and filtering downstream. The keys listed here are very common in tracing tools, and
* are considerate to the issue of overhead.
*
* <p> When evaluating new keys, consider how much additional data it implies, and if that data is
* critical to classifying, filtering or displaying traces. More data often means larger systems,
* less retention, or a lower sample rate.
*
* <p> For example, in zipkin, a thrift-encoded span with an "sr" annotation is 82 bytes plus the
* size of its name and associated service. The maximum size of an HTTP cookie is 4096 bytes,
* roughly 50x that. Even if compression helps, if you aren't analyzing based on cookies, storing
* them displaces resources that could be used for more traces. Meanwhile, you have another system
* storing private data! The takeaway isn't never store cookies, as there are valid cases for this.
* The takeaway is to be conscious about what's you are storing.
*/
public final class TraceKeys {
/**
* The domain portion of the URL or host header. Ex. "mybucket.s3.amazonaws.com"
*
* <p>Used to filter by host as opposed to ip address.
*/
public static final String HTTP_HOST = "http.host";
/**
* The HTTP method, or verb, such as "GET" or "POST".
*
* <p>Used to filter against an http route.
*/
public static final String HTTP_METHOD = "http.method";
/**
* The absolute http path, without any query parameters. Ex. "/objects/abcd-ff"
*
* Used to filter against an http route, portably with zipkin v1.
*
* <p>In zipkin v1, only equals filters are supported. Dropping query parameters makes the number
* of distinct URIs less. For example, one can query for the same resource, regardless of signing
* parameters encoded in the query line. This does not reduce cardinality to a HTTP single route.
* For example, it is common to express a route as an http URI template like
* /resource/{resource_id}. In systems where only equals queries are available, searching for
* http/path=/resource won't match if the actual request was /resource/abcd-ff.
*
* <p>Historical note: This was commonly expressed as "http.uri" in zipkin, eventhough it was most
* often just a path.
*/
public static final String HTTP_PATH = "http.path";
/**
* The entire URL, including the scheme, host and query parameters if available. Ex.
* "https://mybucket.s3.amazonaws.com/objects/abcd-ff?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Algorithm=AWS4-HMAC-SHA256..."
*
* <p>Combined with {@linkplain #HTTP_METHOD}, you can understand the fully-qualified request
* line.
*
* <p>This is optional as it may include private data or be of considerable length.
*/
public static final String HTTP_URL = "http.url";
/**
* The HTTP status code, when not in 2xx range. Ex. "503"
*
* <p>Used to filter for error status.
*/
public static final String HTTP_STATUS_CODE = "http.status_code";
/**
* The size of the non-empty HTTP request body, in bytes. Ex. "16384"
*
* <p>Large uploads can exceed limits or contribute directly to latency.
*/
public static final String HTTP_REQUEST_SIZE = "http.request.size";
/**
* The size of the non-empty HTTP response body, in bytes. Ex. "16384"
*
* <p>Large downloads can exceed limits or contribute directly to latency.
*/
public static final String HTTP_RESPONSE_SIZE = "http.response.size";
/**
* The query executed for SQL call. Ex. "select * from customers where id = ?"
*
* <p>Used to understand the complexity of a request
*/
public static final String SQL_QUERY = "sql.query";
private TraceKeys() {
}
}