|
| 1 | +## `container` operator |
| 2 | + |
| 3 | +The `container` operator parses logs in `docker`, `cri-o` and `containerd` formats. |
| 4 | + |
| 5 | +### Configuration Fields |
| 6 | + |
| 7 | +| Field | Default | Description | |
| 8 | +|------------------------------|------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |
| 9 | +| `id` | `container` | A unique identifier for the operator. | |
| 10 | +| `format` | `` | The container log format to use if it is known. Users can choose between `docker`, `crio` and `containerd`. If not set, the format will be automatically detected. | |
| 11 | +| `add_metadata_from_filepath` | `true` | Set if k8s metadata should be added from the file path. Requires the `log.file.path` field to be present. | |
| 12 | +| `output` | Next in pipeline | The connected operator(s) that will receive all outbound entries. | |
| 13 | +| `parse_from` | `body` | The [field](../types/field.md) from which the value will be parsed. | |
| 14 | +| `parse_to` | `attributes` | The [field](../types/field.md) to which the value will be parsed. | |
| 15 | +| `on_error` | `send` | The behavior of the operator if it encounters an error. See [on_error](../types/on_error.md). | |
| 16 | +| `if` | | An [expression](../types/expression.md) that, when set, will be evaluated to determine whether this operator should be used for the given entry. This allows you to do easy conditional parsing without branching logic with routers. | |
| 17 | +| `severity` | `nil` | An optional [severity](../types/severity.md) block which will parse a severity field before passing the entry to the output operator. | |
| 18 | + |
| 19 | + |
| 20 | +### Embedded Operations |
| 21 | + |
| 22 | +The `container` parser can be configured to embed certain operations such as the severity parsing. For more information, see [complex parsers](../types/parsers.md#complex-parsers). |
| 23 | + |
| 24 | +### Add metadata from file path |
| 25 | + |
| 26 | +Requires `include_file_path: true` in order for the `log.file.path` field to be available for the operator. |
| 27 | +If that's not possible, users can disable the metadata addition with `add_metadata_from_filepath: false`. |
| 28 | +A file path like `"/var/log/pods/some-ns_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log"`, |
| 29 | +will produce the following k8s metadata: |
| 30 | + |
| 31 | +```json |
| 32 | +{ |
| 33 | + "attributes": { |
| 34 | + "k8s": { |
| 35 | + "container": { |
| 36 | + "name": "kube-controller", |
| 37 | + "restart_count": "1" |
| 38 | + }, "pod": { |
| 39 | + "uid": "49cc7c1fd3702c40b2686ea7486091d6", |
| 40 | + "name": "kube-controller-kind-control-plane" |
| 41 | + }, "namespace": { |
| 42 | + "name": "some-ns" |
| 43 | + } |
| 44 | + } |
| 45 | + } |
| 46 | +} |
| 47 | +``` |
| 48 | + |
| 49 | +### Example Configurations: |
| 50 | + |
| 51 | +#### Parse the body as docker container log |
| 52 | + |
| 53 | +Configuration: |
| 54 | +```yaml |
| 55 | +- type: container |
| 56 | + format: docker |
| 57 | + add_metadata_from_filepath: true |
| 58 | +``` |
| 59 | +
|
| 60 | +Note: in this example the `format: docker` is optional since formats can be automatically detected as well. |
| 61 | + `add_metadata_from_filepath` is true by default as well. |
| 62 | + |
| 63 | +<table> |
| 64 | +<tr><td> Input body </td> <td> Output body</td></tr> |
| 65 | +<tr> |
| 66 | +<td> |
| 67 | + |
| 68 | +```json |
| 69 | +{ |
| 70 | + "timestamp": "", |
| 71 | + "body": "{\"log\":\"INFO: log line here\",\"stream\":\"stdout\",\"time\":\"2029-03-30T08:31:20.545192187Z\"}", |
| 72 | + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" |
| 73 | +} |
| 74 | +``` |
| 75 | + |
| 76 | +</td> |
| 77 | +<td> |
| 78 | + |
| 79 | +```json |
| 80 | +{ |
| 81 | + "timestamp": "2024-03-30 08:31:20.545192187 +0000 UTC", |
| 82 | + "body": "log line here", |
| 83 | + "attributes": { |
| 84 | + "time": "2024-03-30T08:31:20.545192187Z", |
| 85 | + "log.iostream": "stdout", |
| 86 | + "k8s.pod.name": "kube-controller-kind-control-plane", |
| 87 | + "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", |
| 88 | + "k8s.container.name": "kube-controller", |
| 89 | + "k8s.container.restart_count": "1", |
| 90 | + "k8s.namespace.name": "some", |
| 91 | + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" |
| 92 | + } |
| 93 | +} |
| 94 | +``` |
| 95 | + |
| 96 | +</td> |
| 97 | +</tr> |
| 98 | +</table> |
| 99 | + |
| 100 | +#### Parse the body as cri-o container log |
| 101 | + |
| 102 | +Configuration: |
| 103 | +```yaml |
| 104 | +- type: container |
| 105 | +``` |
| 106 | + |
| 107 | +<table> |
| 108 | +<tr><td> Input body </td> <td> Output body</td></tr> |
| 109 | +<tr> |
| 110 | +<td> |
| 111 | + |
| 112 | +```json |
| 113 | +{ |
| 114 | + "timestamp": "", |
| 115 | + "body": "2024-04-13T07:59:37.505201169-05:00 stdout F standalone crio line which is awesome", |
| 116 | + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" |
| 117 | +} |
| 118 | +``` |
| 119 | + |
| 120 | +</td> |
| 121 | +<td> |
| 122 | + |
| 123 | +```json |
| 124 | +{ |
| 125 | + "timestamp": "2024-04-13 12:59:37.505201169 +0000 UTC", |
| 126 | + "body": "standalone crio line which is awesome", |
| 127 | + "attributes": { |
| 128 | + "time": "2024-04-13T07:59:37.505201169-05:00", |
| 129 | + "logtag": "F", |
| 130 | + "log.iostream": "stdout", |
| 131 | + "k8s.pod.name": "kube-controller-kind-control-plane", |
| 132 | + "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", |
| 133 | + "k8s.container.name": "kube-controller", |
| 134 | + "k8s.container.restart_count": "1", |
| 135 | + "k8s.namespace.name": "some", |
| 136 | + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" |
| 137 | + } |
| 138 | +} |
| 139 | +``` |
| 140 | + |
| 141 | +</td> |
| 142 | +</tr> |
| 143 | +</table> |
| 144 | + |
| 145 | +#### Parse the body as containerd container log |
| 146 | + |
| 147 | +Configuration: |
| 148 | +```yaml |
| 149 | +- type: container |
| 150 | +``` |
| 151 | + |
| 152 | +<table> |
| 153 | +<tr><td> Input body </td> <td> Output body</td></tr> |
| 154 | +<tr> |
| 155 | +<td> |
| 156 | + |
| 157 | +```json |
| 158 | +{ |
| 159 | + "timestamp": "", |
| 160 | + "body": "2023-06-22T10:27:25.813799277Z stdout F standalone containerd line that is super awesome", |
| 161 | + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" |
| 162 | +} |
| 163 | +``` |
| 164 | + |
| 165 | +</td> |
| 166 | +<td> |
| 167 | + |
| 168 | +```json |
| 169 | +{ |
| 170 | + "timestamp": "2023-06-22 10:27:25.813799277 +0000 UTC", |
| 171 | + "body": "standalone containerd line that is super awesome", |
| 172 | + "attributes": { |
| 173 | + "time": "2023-06-22T10:27:25.813799277Z", |
| 174 | + "logtag": "F", |
| 175 | + "log.iostream": "stdout", |
| 176 | + "k8s.pod.name": "kube-controller-kind-control-plane", |
| 177 | + "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", |
| 178 | + "k8s.container.name": "kube-controller", |
| 179 | + "k8s.container.restart_count": "1", |
| 180 | + "k8s.namespace.name": "some", |
| 181 | + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" |
| 182 | + } |
| 183 | +} |
| 184 | +``` |
| 185 | + |
| 186 | +</td> |
| 187 | +</tr> |
| 188 | +</table> |
| 189 | + |
| 190 | +#### Parse the multiline as containerd container log and recombine into a single one |
| 191 | + |
| 192 | +Configuration: |
| 193 | +```yaml |
| 194 | +- type: container |
| 195 | +``` |
| 196 | + |
| 197 | +<table> |
| 198 | +<tr><td> Input body </td> <td> Output body</td></tr> |
| 199 | +<tr> |
| 200 | +<td> |
| 201 | + |
| 202 | +```json |
| 203 | +{ |
| 204 | + "timestamp": "", |
| 205 | + "body": "2023-06-22T10:27:25.813799277Z stdout P multiline containerd line that i", |
| 206 | + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" |
| 207 | +}, |
| 208 | +{ |
| 209 | + "timestamp": "", |
| 210 | + "body": "2023-06-22T10:27:25.813799277Z stdout F s super awesomne", |
| 211 | + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" |
| 212 | +} |
| 213 | +``` |
| 214 | + |
| 215 | +</td> |
| 216 | +<td> |
| 217 | + |
| 218 | +```json |
| 219 | +{ |
| 220 | + "timestamp": "2023-06-22 10:27:25.813799277 +0000 UTC", |
| 221 | + "body": "multiline containerd line that is super awesome", |
| 222 | + "attributes": { |
| 223 | + "time": "2023-06-22T10:27:25.813799277Z", |
| 224 | + "logtag": "F", |
| 225 | + "log.iostream": "stdout", |
| 226 | + "k8s.pod.name": "kube-controller-kind-control-plane", |
| 227 | + "k8s.pod.uid": "49cc7c1fd3702c40b2686ea7486091d6", |
| 228 | + "k8s.container.name": "kube-controller", |
| 229 | + "k8s.container.restart_count": "1", |
| 230 | + "k8s.namespace.name": "some", |
| 231 | + "log.file.path": "/var/log/pods/some_kube-controller-kind-control-plane_49cc7c1fd3702c40b2686ea7486091d6/kube-controller/1.log" |
| 232 | + } |
| 233 | +} |
| 234 | +``` |
| 235 | + |
| 236 | +</td> |
| 237 | +</tr> |
| 238 | +</table> |
0 commit comments