telemetry/v1alpha1/telemetry.proto (650 lines of code) (raw):
// Copyright Istio 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.
syntax = "proto3";
import "type/v1beta1/selector.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/wrappers.proto";
// $schema: istio.telemetry.v1alpha1.Telemetry
// $title: Telemetry
// $description: Telemetry configuration for workloads.
// $location: https://istio.io/docs/reference/config/telemetry.html
// $aliases: [/docs/reference/config/telemetry/v1alpha1/telemetry]
// Telemetry defines how the telemetry is generated for workloads within a mesh.
//
// For mesh level configuration, put the resource in root configuration
// namespace for your Istio installation *without* a workload selector.
//
// For any namespace, including the root configuration namespace, it is only
// valid to have a single workload selector-less Telemetry resource.
//
// For resources with a workload selector, it is only valid to have one resource
// selecting any given workload.
//
// The hierarchy of Telemetry configuration is as follows:
//
// 1. Workload-specific configuration
// 2. Namespace-specific configuration
// 3. Root namespace configuration
//
// ## Examples
// Policy to enable random sampling for 10% of traffic:
// ```yaml
// apiVersion: telemetry.istio.io/v1
// kind: Telemetry
// metadata:
// name: mesh-default
// namespace: istio-system
// spec:
// # no selector specified, applies to all workloads
// tracing:
// - randomSamplingPercentage: 10.00
// ```
//
// Policy to disable trace reporting for the `foo` workload (note: tracing
// context will still be propagated):
// ```yaml
// apiVersion: telemetry.istio.io/v1
// kind: Telemetry
// metadata:
// name: foo-tracing
// namespace: bar
// spec:
// selector:
// matchLabels:
// service.istio.io/canonical-name: foo
// tracing:
// - disableSpanReporting: true
// ```
//
// Policy to select the alternate zipkin provider for trace reporting:
// ```yaml
// apiVersion: telemetry.istio.io/v1
// kind: Telemetry
// metadata:
// name: foo-tracing-alternate
// namespace: baz
// spec:
// selector:
// matchLabels:
// service.istio.io/canonical-name: foo
// tracing:
// - providers:
// - name: "zipkin-alternate"
// randomSamplingPercentage: 10.00
// ```
//
// Policy to tailor the zipkin provider to sample traces from Client workloads only:
// ```yaml
// apiVersion: telemetry.istio.io/v1
// kind: Telemetry
// metadata:
// name: mesh-default
// namespace: istio-system
// spec:
// # no selector specified, applies to all workloads
// tracing:
// - match: CLIENT
// - providers:
// - name: "zipkin"
// ```
//
// Policy to add a custom tag from a literal value:
// ```yaml
// apiVersion: telemetry.istio.io/v1
// kind: Telemetry
// metadata:
// name: mesh-default
// namespace: istio-system
// spec:
// # no selector specified, applies to all workloads
// tracing:
// - randomSamplingPercentage: 10.00
// customTags:
// my_new_foo_tag:
// literal:
// value: "foo"
// ```
//
// Policy to disable server-side metrics for Prometheus for an entire mesh:
// ```yaml
// apiVersion: telemetry.istio.io/v1
// kind: Telemetry
// metadata:
// name: mesh-default
// namespace: istio-system
// spec:
// # no selector specified, applies to all workloads
// metrics:
// - providers:
// - name: prometheus
// overrides:
// - match:
// metric: ALL_METRICS
// mode: SERVER
// disabled: true
// ```
//
// Policy to add dimensions to all Prometheus metrics for the `foo` namespace:
// ```yaml
// apiVersion: telemetry.istio.io/v1
// kind: Telemetry
// metadata:
// name: namespace-metrics
// namespace: foo
// spec:
// # no selector specified, applies to all workloads in the namespace
// metrics:
// - providers:
// - name: prometheus
// overrides:
// # match clause left off matches all istio metrics, client and server
// - tagOverrides:
// request_method:
// value: "request.method"
// request_host:
// value: "request.host"
// ```
//
// Policy to remove the `response_code` dimension on some Prometheus metrics for
// the `bar.foo` workload:
// ```yaml
// apiVersion: telemetry.istio.io/v1
// kind: Telemetry
// metadata:
// name: remove-response-code
// namespace: foo
// spec:
// selector:
// matchLabels:
// service.istio.io/canonical-name: bar
// metrics:
// - providers:
// - name: prometheus
// overrides:
// - match:
// metric: REQUEST_COUNT
// tagOverrides:
// response_code:
// operation: REMOVE
// - match:
// metric: REQUEST_DURATION
// tagOverrides:
// response_code:
// operation: REMOVE
// - match:
// metric: REQUEST_SIZE
// tagOverrides:
// response_code:
// operation: REMOVE
// - match:
// metric: RESPONSE_SIZE
// tagOverrides:
// response_code:
// operation: REMOVE
// ```
//
// Policy to enable access logging for the entire mesh:
// ```yaml
// apiVersion: telemetry.istio.io/v1
// kind: Telemetry
// metadata:
// name: mesh-default
// namespace: istio-system
// spec:
// # no selector specified, applies to all workloads
// accessLogging:
// - providers:
// - name: envoy
// # By default, this turns on access logging (no need to set `disabled: false`).
// # Unspecified `disabled` will be treated as `disabled: false`, except in
// # cases where a parent configuration has marked as `disabled: true`. In
// # those cases, `disabled: false` must be set explicitly to override.
// ```
//
// Policy to disable access logging for the `foo` namespace:
// ```yaml
// apiVersion: telemetry.istio.io/v1
// kind: Telemetry
// metadata:
// name: namespace-no-log
// namespace: foo
// spec:
// # no selector specified, applies to all workloads in the namespace
// accessLogging:
// - disabled: true
// ```
//
package istio.telemetry.v1alpha1;
option go_package = "istio.io/api/telemetry/v1alpha1";
// <!-- crd generation tags
// +cue-gen:Telemetry:groupName:telemetry.istio.io
// +cue-gen:Telemetry:versions:v1alpha1,v1
// +cue-gen:Telemetry:storageVersion
// +cue-gen:Telemetry:annotations:helm.sh/resource-policy=keep
// +cue-gen:Telemetry:labels:app=istio-pilot,chart=istio,istio=telemetry,heritage=Tiller,release=istio
// +cue-gen:Telemetry:subresource:status
// +cue-gen:Telemetry:scope:Namespaced
// +cue-gen:Telemetry:resource:categories=istio-io,telemetry-istio-io,shortNames=telemetry,plural=telemetries
// +cue-gen:Telemetry:preserveUnknownFields:false
// +cue-gen:Telemetry:printerColumn:name=Age,type=date,JSONPath=.metadata.creationTimestamp,description="CreationTimestamp
// is a timestamp representing the server time when this object was created. It
// is not guaranteed to be set in happens-before order across separate
// operations. Clients may not set this value. It is represented in RFC3339 form
// and is in UTC. Populated by the system. Read-only. Null for lists. More info:
// https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata"
// -->
//
// <!-- go code generation tags
// +kubetype-gen
// +kubetype-gen:groupVersion=telemetry.istio.io/v1alpha1
// +genclient
// +k8s:deepcopy-gen=true
// -->
// +kubebuilder:validation:XValidation:message="only one of targetRefs or selector can be set",rule="(has(self.selector)?1:0)+(has(self.targetRef)?1:0)+(has(self.targetRefs)?1:0)<=1"
message Telemetry {
// Optional. The selector decides where to apply the policy.
// If not set, the policy will be applied to all workloads in the
// same namespace as the policy.
//
// At most one of `selector` or `targetRefs` can be set for a given policy.
istio.type.v1beta1.WorkloadSelector selector = 1;
// $hide_from_docs
istio.type.v1beta1.PolicyTargetReference targetRef = 5;
// Optional. The targetRefs specifies a list of resources the policy should be
// applied to. The targeted resources specified will determine which workloads
// the policy applies to.
//
// Currently, the following resource attachment types are supported:
// * `kind: Gateway` with `group: gateway.networking.k8s.io` in the same namespace.
// * `kind: Service` with `group: ""` or `group: "core"` in the same namespace. This type is only supported for waypoints.
//
// If not set, the policy is applied as defined by the selector.
// At most one of the selector and targetRefs can be set.
//
// NOTE: If you are using the `targetRefs` field in a multi-revision environment with Istio versions prior to 1.22,
// it is highly recommended that you pin the policy to a revision running 1.22+ via the `istio.io/rev` label.
// This is to prevent proxies connected to older control planes (that don't know about the `targetRefs` field)
// from misinterpreting the policy as namespace-wide during the upgrade process.
//
// NOTE: Waypoint proxies are required to use this field for policies to apply; `selector` policies will be ignored.
// +kubebuilder:validation:MaxItems=16
repeated istio.type.v1beta1.PolicyTargetReference targetRefs = 6;
// Optional. Tracing configures the tracing behavior for all
// selected workloads.
repeated Tracing tracing = 2;
// Optional. Metrics configures the metrics behavior for all
// selected workloads.
repeated Metrics metrics = 3;
// Optional. Access logging configures the access logging behavior for all
// selected workloads.
repeated AccessLogging access_logging = 4;
}
// Tracing configures tracing behavior for workloads within a mesh.
// It can be used to enable/disable tracing, as well as to set sampling
// rates and custom tag extraction.
//
// Tracing configuration support overrides of the fields `providers`,
// `random_sampling_percentage`, `disable_span_reporting`, and `custom_tags` at
// each level in the configuration hierarchy, with missing values filled in
// from parent resources. However, when specified, `custom_tags` will
// fully replace any values provided by parent configuration.
message Tracing {
// TracingSelector provides a coarse-grained ability to configure tracing
// behavior based on certain traffic metadata (such as traffic direction).
message TracingSelector {
// This determines whether or not to apply the tracing configuration
// based on the direction of traffic relative to the proxied workload.
WorkloadMode mode = 1;
}
// Allows tailoring of behavior to specific conditions.
TracingSelector match = 7;
// Optional. Name of provider(s) to use for span reporting. If a provider is
// not specified, the [default tracing
// provider](https://istio.io/docs/reference/config/istio.mesh.v1alpha1/#MeshConfig-DefaultProviders) will be
// used. NOTE: At the moment, only a single provider can be specified in a
// given Tracing rule.
repeated ProviderRef providers = 2;
// Controls the rate at which traffic will be selected for tracing if no
// prior sampling decision has been made. If a prior sampling decision has
// been made, that decision will be respected. However, if no sampling
// decision has been made (example: no `x-b3-sampled` tracing header was
// present in the requests), the traffic will be selected for telemetry
// generation at the percentage specified.
//
// Defaults to 0%. Valid values [0.00-100.00]. Can be specified in 0.01%
// increments.
// +kubebuilder:validation:Minimum=0
// +kubebuilder:validation:Maximum=100
google.protobuf.DoubleValue random_sampling_percentage = 3;
// Controls span reporting. If set to true, no spans will be reported for
// impacted workloads. This does NOT impact context propagation or trace
// sampling behavior.
google.protobuf.BoolValue disable_span_reporting = 4;
// CustomTag defines a tag to be added to a trace span that is based on
// an operator-supplied value. This value can either be a hard-coded value,
// a value taken from an environment variable known to the sidecar proxy, or
// from a request header.
//
// NOTE: when specified, `custom_tags` will fully replace any values provided
// by parent configuration.
message CustomTag {
oneof type {
// Literal adds the same, hard-coded value to each span.
Literal literal = 1;
// Environment adds the value of an environment variable to each span.
Environment environment = 2;
// RequestHeader adds the value of an header from the request to each
// span.
RequestHeader header = 3;
// TODO: add support for Metadata tags
}
}
message Literal {
// The tag value to use.
// +kubebuilder:validation:MinLength=1
string value = 1 [(google.api.field_behavior) = REQUIRED];
}
message Environment {
// Name of the environment variable from which to extract the tag value.
// +kubebuilder:validation:MinLength=1
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. If the environment variable is not found, this value will be
// used instead.
string default_value = 2;
}
message RequestHeader {
// Name of the header from which to extract the tag value.
// +kubebuilder:validation:MinLength=1
string name = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. If the header is not found, this value will be
// used instead.
string default_value = 2;
}
// Optional. Configures additional custom tags to the generated trace spans.
map<string, CustomTag> custom_tags = 5;
// This value is true by default; Envoy decides whether or not to sample based
// on the value of the Request ID generated by Ingress in distributed tracing.
// The format of this Request ID is specific to Envoy, and if the Request ID
// generated by the proxy that receives user traffic first is not specific to
// Envoy, Envoy will break the trace because it cannot interpret the Request
// ID. By setting this value to false, we can prevent Envoy from sampling
// based on the Request ID. As a result, the trace will not be broken even if
// the Request ID is not in the Envoy format. [Trace Context
// Propagation](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/observability/tracing#trace-context-propagation)
// provides more information on Request ID handling.
// $hide_from_docs
// +cue-gen:Telemetry:releaseChannel:extended
google.protobuf.BoolValue use_request_id_for_trace_sampling = 6;
}
// Used to bind Telemetry configuration to specific providers for
// targeted customization.
message ProviderRef {
// Required. Name of Telemetry provider in [MeshConfig](https://istio.io/latest/docs/reference/config/istio.mesh.v1alpha1/#MeshConfig-ExtensionProvider).
// +kubebuilder:validation:MinLength=1
string name = 1 [(google.api.field_behavior) = REQUIRED];
}
// Metrics defines the workload-level overrides for metrics generation behavior
// within a mesh. It can be used to enable/disable metrics generation, as well
// as to customize the dimensions of the generated metrics.
message Metrics {
// Optional. Name of providers to which this configuration should apply.
// If a provider is not specified, the [default metrics
// provider](https://istio.io/docs/reference/config/istio.mesh.v1alpha1/#MeshConfig-DefaultProviders) will be
// used.
repeated ProviderRef providers = 1;
// Optional. Ordered list of overrides to metrics generation behavior.
//
// Specified overrides will be applied in order. They will be applied on
// top of inherited overrides from other resources in the hierarchy in the
// following order:
// 1. Mesh-scoped overrides
// 2. Namespace-scoped overrides
// 3. Workload-scoped overrides
//
// Because overrides are applied in order, users are advised to order their
// overrides from least specific to most specific matches. That is, it is
// a best practice to list any universal overrides first, with tailored
// overrides following them.
repeated MetricsOverrides overrides = 2;
// Optional. Reporting interval allows configuration of the time between calls out to for metrics reporting.
// This currently only supports TCP metrics but we may use this for long duration HTTP streams in the future.
// The default duration is `5s`.
// +cue-gen:Telemetry:releaseChannel:extended
google.protobuf.Duration reporting_interval = 3;
}
// WorkloadMode allows selection of the role of the underlying workload in
// network traffic. A workload is considered as acting as a `SERVER` if it is
// the destination of the traffic (that is, traffic direction, from the
// perspective of the workload is *inbound*). If the workload is the source of
// the network traffic, it is considered to be in `CLIENT` mode (traffic is
// *outbound* from the workload).
enum WorkloadMode {
// Selects for scenarios when the workload is either the
// source or destination of the network traffic.
CLIENT_AND_SERVER = 0;
// Selects for scenarios when the workload is the
// source of the network traffic.
CLIENT = 1;
// Selects for scenarios when the workload is the
// destination of the network traffic.
SERVER = 2;
}
// Provides a mechanism for matching metrics for the application of override
// behaviors.
message MetricSelector {
// Curated list of known metric types that is supported by Istio metric
// providers. See also:
// https://istio.io/latest/docs/reference/config/metrics/#metrics
enum IstioMetric {
// Use of this enum indicates that the override should apply to all Istio
// default metrics.
ALL_METRICS = 0;
// Counter of requests to/from an application, generated for HTTP, HTTP/2,
// and GRPC traffic.
//
// The Prometheus provider exports this metric as: `istio_requests_total`.
//
// The Stackdriver provider exports this metric as:
//
// - `istio.io/service/server/request_count` (SERVER mode)
// - `istio.io/service/client/request_count` (CLIENT mode)
REQUEST_COUNT = 1;
// Histogram of request durations, generated for HTTP, HTTP/2, and GRPC
// traffic.
//
// The Prometheus provider exports this metric as:
// `istio_request_duration_milliseconds`.
//
// The Stackdriver provider exports this metric as:
//
// - `istio.io/service/server/response_latencies` (SERVER mode)
// - `istio.io/service/client/roundtrip_latencies` (CLIENT mode)
REQUEST_DURATION = 2;
// Histogram of request body sizes, generated for HTTP, HTTP/2, and GRPC
// traffic.
//
// The Prometheus provider exports this metric as: `istio_request_bytes`.
//
// The Stackdriver provider exports this metric as:
//
// - `istio.io/service/server/request_bytes` (SERVER mode)
// - `istio.io/service/client/request_bytes` (CLIENT mode)
REQUEST_SIZE = 3;
// Histogram of response body sizes, generated for HTTP, HTTP/2, and GRPC
// traffic.
//
// The Prometheus provider exports this metric as: `istio_response_bytes`.
//
// The Stackdriver provider exports this metric as:
//
// - `istio.io/service/server/response_bytes` (SERVER mode)
// - `istio.io/service/client/response_bytes` (CLIENT mode)
RESPONSE_SIZE = 4;
// Counter of TCP connections opened over lifetime of workload.
//
// The Prometheus provider exports this metric as:
// `istio_tcp_connections_opened_total`.
//
// The Stackdriver provider exports this metric as:
//
// - `istio.io/service/server/connection_open_count` (SERVER mode)
// - `istio.io/service/client/connection_open_count` (CLIENT mode)
TCP_OPENED_CONNECTIONS = 5;
// Counter of TCP connections closed over lifetime of workload.
//
// The Prometheus provider exports this metric as:
// `istio_tcp_connections_closed_total`.
//
// The Stackdriver provider exports this metric as:
//
// - `istio.io/service/server/connection_close_count` (SERVER mode)
// - `istio.io/service/client/connection_close_count` (CLIENT mode)
TCP_CLOSED_CONNECTIONS = 6;
// Counter of bytes sent during a response over a TCP connection.
//
// The Prometheus provider exports this metric as:
// `istio_tcp_sent_bytes_total`.
//
// The Stackdriver provider exports this metric as:
//
// - `istio.io/service/server/sent_bytes_count` (SERVER mode)
// - `istio.io/service/client/sent_bytes_count` (CLIENT mode)
TCP_SENT_BYTES = 7;
// Counter of bytes received during a request over a TCP connection.
//
// The Prometheus provider exports this metric as:
// `istio_tcp_received_bytes_total`.
//
// The Stackdriver provider exports this metric as:
//
// - `istio.io/service/server/received_bytes_count` (SERVER mode)
// - `istio.io/service/client/received_bytes_count` (CLIENT mode)
TCP_RECEIVED_BYTES = 8;
// Counter incremented for every gRPC messages sent from a client.
//
// The Prometheus provider exports this metric as:
// `istio_request_messages_total`
GRPC_REQUEST_MESSAGES = 9;
// Counter incremented for every gRPC messages sent from a server.
//
// The Prometheus provider exports this metric as:
// `istio_response_messages_total`
GRPC_RESPONSE_MESSAGES = 10;
}
// Controls which metric(s) are selected by the selector.
oneof metric_match {
// One of the well-known [Istio Standard Metrics](https://istio.io/latest/docs/reference/config/metrics/).
IstioMetric metric = 1;
// Allows free-form specification of a metric. No validation of custom
// metrics is provided.
// +kubebuilder:validation:MinLength=1
string custom_metric = 2;
}
// Controls which mode of metrics generation is selected: `CLIENT`, `SERVER`,
// or `CLIENT_AND_SERVER`.
WorkloadMode mode = 3;
}
// MetricsOverrides defines custom metric generation behavior for an individual
// metric or the set of all standard metrics.
message MetricsOverrides {
// Match allows providing the scope of the override. It can be used to select
// individual metrics, as well as the workload modes (server, client, or both)
// in which the metrics will be generated.
//
// If match is not specified, the overrides will apply to *all* metrics for
// *both* modes of operation (client and server).
MetricSelector match = 1;
// Optional. Must explicitly set this to `true` to turn off metrics reporting
// for the listed metrics. If disabled has been set to `true` in a parent
// configuration, it must explicitly be set to `false` to turn metrics
// reporting on in the workloads selected by the Telemetry resource.
google.protobuf.BoolValue disabled = 2;
// TagOverride specifies an operation to perform on a metric dimension (also
// known as a `label`). Tags may be added, removed, or have their default
// values overridden.
// +kubebuilder:validation:XValidation:message="value must be set when operation is UPSERT",rule="((has(self.operation) ? self.operation : '') == 'UPSERT') ? self.value != '' : true"
// +kubebuilder:validation:XValidation:message="value must not be set when operation is REMOVE",rule="((has(self.operation) ? self.operation : '') == 'REMOVE') ? !has(self.value) : true"
message TagOverride {
enum Operation {
// Insert or Update the tag with the provided value expression. The
// `value` field MUST be specified if `UPSERT` is used as the operation.
UPSERT = 0;
// Specifies that the tag should not be included in the metric when
// generated.
REMOVE = 1;
}
// Operation controls whether or not to update/add a tag, or to remove it.
Operation operation = 1;
// Value is only considered if the operation is `UPSERT`.
// Values are [CEL expressions](https://opensource.google/projects/cel) over
// attributes. Examples include: `string(destination.port)` and
// `request.host`. Istio exposes all standard [Envoy
// attributes](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/advanced/attributes).
// Additionally, Istio exposes node metadata as attributes.
// More information is provided in the [customization
// docs](https://istio.io/latest/docs/tasks/observability/metrics/customize-metrics/#use-expressions-for-values).
string value = 2;
}
// Optional. Collection of tag names and tag expressions to override in the
// selected metric(s).
// The key in the map is the name of the tag.
// The value in the map is the operation to perform on the the tag.
// WARNING: some providers may not support adding/removing tags.
// See also: https://istio.io/latest/docs/reference/config/metrics/#labels
map<string, TagOverride> tag_overrides = 3;
}
// Access logging defines the workload-level overrides for access log
// generation. It can be used to select provider or enable/disable access log
// generation for a workload.
message AccessLogging {
// LogSelector provides a coarse-grained ability to configure logging behavior
// based on certain traffic metadata (such as traffic direction). LogSelector
// applies to traffic metadata which is not represented in the attribute set
// currently supported by [filters](https://istio.io/latest/docs/reference/config/telemetry/#AccessLogging-Filter).
// It allows control planes to limit the configuration sent to individual workloads.
// Finer-grained logging behavior can be further configured via `filter`.
message LogSelector {
// This determines whether or not to apply the access logging configuration
// based on the direction of traffic relative to the proxied workload.
WorkloadMode mode = 1;
}
// Allows tailoring of logging behavior to specific conditions.
LogSelector match = 4;
// Optional. Name of providers to which this configuration should apply.
// If a provider is not specified, the [default logging
// provider](https://istio.io/docs/reference/config/istio.mesh.v1alpha1/#MeshConfig-DefaultProviders) will be used.
repeated ProviderRef providers = 1;
// Controls logging. If set to true, no access logs will be generated for
// impacted workloads (for the specified providers).
// NOTE: currently default behavior will be controlled by the provider(s)
// selected above. Customization controls will be added to this API in
// future releases.
google.protobuf.BoolValue disabled = 2;
// Allows specification of an access log filter.
message Filter {
// CEL expression for selecting when requests/connections should be logged.
//
// Examples:
//
// - `response.code >= 400`
// - `connection.mtls && request.url_path.contains('v1beta3')`
// - `!has(request.useragent) || !(request.useragent.startsWith("Amazon-Route53-Health-Check-Service"))`
string expression = 1;
}
// Optional. If specified, this filter will be used to select specific
// requests/connections for logging.
// +cue-gen:Telemetry:releaseChannel:extended
Filter filter = 3;
}