---
title: Writing Configuration
overview: How to write Istio config YAML content.
order: 70
layout: docs
type: markdown
---
This page describes how to write configuration that conforms to Istio's schemas. All configuration schemas in Istio are defined as [protobuf messages]
(https://developers.google.com/protocol-buffers/docs/proto3). When in doubt, search for the protos.
## Translating to YAML
There is no canonical mapping between protobufs and YAML; instead [protobuf defines a canonical mapping to JSON](https://developers.google.com/protocol-buffers/docs/proto3#json), and [YAML defines a canonical mapping to JSON](http://yaml.org/spec/1.2/spec.html#id2759572). To ingest YAML as a proto we convert it to JSON then to protobuf.
**Important things to note:**
- YAML fields are implicitly strings
- Proto `repeated` fields map to YAML lists; each element in a YAML list is prefixed by a dash (`-`)
- Proto `message`s map to JSON objects; in YAML objects are field names all at the same indentation level
- YAML is whitespace sensitive and must use spaces; tabs are never allowed
### `map` and `message` fields
Proto |
YAML |
message Metric {
string descriptor_name = 1;
string value = 2;
map 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` fields
Proto |
YAML |
message Metric {
string descriptor_name = 1;
string value = 2;
map 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` fields
Proto |
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: INT64
or
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.*
### Nested `message` fields
Proto |
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 fields
The 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 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](https://developers.google.com/protocol-buffers/docs/proto3#json):
| 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.|
## What's next
* TODO: link to overall mixer config concept guide (how the config pieces fit together)