This page describes how to write configuration that conforms to Istio’s schemas. All configuration schemas in Istio are defined as protobuf messages. When in doubt, search for the protos.
There’s an implicit mapping from protobuf to YAML using protobuf’s mapping to JSON. Below are a few examples showing common mappings you’ll encounter writing configuration in Istio.
Important things to note:
repeated
fields map to YAML lists; each element in a YAML list is prefixed by a dash (-
)message
s map to objects; in YAML objects are field names all at the same indentation levelmap
and message
fieldsProto | YAML |
---|---|
message Metric { string descriptor_name = 1; string value = 2; map<string, string> labels = 3; } | descriptorName: request_count value: "1" labels: source: origin.ip target: target.service |
Note that when numeric literals are used as strings (like value
above) they must be enclosed in quotes. Quotation marks ("
) are optional for normal strings.
repeated
fieldsProto | YAML |
---|---|
message Metric { string descriptor_name = 1; string value = 2; map<string, string> labels = 3; } message MetricsParams { repeated Metric metrics = 1; } | metrics: - descriptorName: request_count value: "1" labels: source: origin.ip target: target.service - descriptorName: request_latency value: response.duration labels: source: origin.ip target: target.service |
enum
fieldsProto | YAML |
---|---|
enum ValueType { STRING = 1; INT64 = 2; DOUBLE = 3; // more values omitted } message AttributeDescriptor { string name = 1; string description = 2; ValueType value_type = 3; } | name: request.duration value_type: INT64or name: request.duration valueType: INT64 |
Note that YAML parsing will handle both snake_case
and lowerCamelCase
field names. lowerCamelCase
is the canonical version in YAML.
message
fieldsProto | YAML |
---|---|
enum ValueType { STRING = 1; INT64 = 2; DOUBLE = 3; // more values omitted } message LabelDescriptor { string name = 1; string description = 2; ValueType value_type = 3; } message MonitoredResourceDescriptor { string name = 1; string description = 2; repeated LabelDescriptor labels = 3; } | name: My Monitored Resource labels: - name: label one valueType: STRING - name: second label valueType: DOUBLE |
Timestamp
, Duration
, and 64 bit integer fieldsThe protobuf spec special cases the JSON/YAML representations of a few well-known protobuf messages. 64 bit integer types are also special due to the fact that JSON numbers are implicitly doubles, which cannot represent all valid 64 bit integer values.
Proto | YAML |
---|---|
message Quota { string descriptor_name = 1; map<string, string> labels = 2; int64 max_amount = 3; google.protobuf.Duration expiration = 4; } | descriptorName: RequestCount labels: label one: STRING second label: DOUBLE maxAmount: "7" expiration: 1.000340012s |
Specifically, the protobuf spec declares:
Proto | JSON/YAML | Example | Notes |
---|---|---|---|
Timestamp | string | “1972-01-01T10:00:20.021Z” | Uses RFC 3339, where generated output will always be Z-normalized and uses 0, 3, 6 or 9 fractional digits. |
Duration | string | “1.000340012s”, “1s” | Generated output always contains 0, 3, 6, or 9 fractional digits, depending on required precision. Accepted are any fractional digits (also none) as long as they fit into nano-seconds precision. |
int64, fixed64, uint64 | string | “1”, “-10” | JSON value will be a decimal string. Either numbers or strings are accepted. |