From a175315f17d6e561c935f9f05041e2e1e6d8717e Mon Sep 17 00:00:00 2001 From: braydonk Date: Mon, 8 Jul 2024 13:55:25 +0000 Subject: [PATCH 1/4] process: add process.status attribute This PR deprecates `system.process.status` and replaces it with `process.status`. The previous usage of `system.process.status` has been replaced with `process.status`, and `process.status` has also been add as a resource attribute to the `process` resource. --- docs/attributes-registry/process.md | 10 ++++++++ docs/attributes-registry/system.md | 36 +++++++++++---------------- docs/resource/process.md | 19 +++++++++++--- docs/system/system-metrics.md | 4 +-- model/metrics/system-metrics.yaml | 2 +- model/registry/deprecated/system.yaml | 23 +++++++++++++++-- model/registry/process.yaml | 20 +++++++++++++++ model/registry/system.yaml | 28 +-------------------- model/resource/process.yaml | 5 +++- schema-next.yaml | 6 +++++ 10 files changed, 95 insertions(+), 58 deletions(-) diff --git a/docs/attributes-registry/process.md b/docs/attributes-registry/process.md index 6522b0ace3..5b5d3cc940 100644 --- a/docs/attributes-registry/process.md +++ b/docs/attributes-registry/process.md @@ -38,6 +38,7 @@ An operating system process. | `process.saved_user.id` | int | The saved user ID (SUID) of the process. | `1002` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | `process.saved_user.name` | string | The username of the saved user. | `operator` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | `process.session_leader.pid` | int | The PID of the process's session leader. This is also the session ID (SID) of the process. | `14` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `process.status` | string | The process state, e.g., [Linux Process State Codes](https://man7.org/linux/man-pages/man1/ps.1.html#PROCESS_STATE_CODES) | `running` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | `process.user.id` | int | The effective user ID (EUID) of the process. | `1001` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | `process.user.name` | string | The username of the effective user of the process. | `root` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | `process.vpid` | int | Virtual process identifier. [1] | `12` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | @@ -58,6 +59,15 @@ An operating system process. | `major` | major | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | `minor` | minor | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +`process.status` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. + +| Value | Description | Stability | +| ---------- | ----------- | ---------------------------------------------------------------- | +| `defunct` | defunct | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `running` | running | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `sleeping` | sleeping | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `stopped` | stopped | ![Experimental](https://img.shields.io/badge/-experimental-blue) | + ## Process Deprecated Attributes Deprecated process attributes. diff --git a/docs/attributes-registry/system.md b/docs/attributes-registry/system.md index c504f989f9..a8d5fc1721 100644 --- a/docs/attributes-registry/system.md +++ b/docs/attributes-registry/system.md @@ -13,7 +13,6 @@ - [System Memory](#system-memory-attributes) - [System Network](#system-network-attributes) - [System Paging](#system-paging-attributes) -- [System Process](#system-process-attributes) ## System Attributes @@ -35,10 +34,11 @@ Describes System CPU attributes Deprecated system attributes. -| Attribute | Type | Description | Examples | Stability | -| ------------------------- | ------ | ------------------------------------------------ | ------------------- | --------------------------------------------------------------------------------------------------- | -| `system.cpu.state` | string | Deprecated, use `cpu.mode` instead. | `idle`; `interrupt` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `cpu.mode` | -| `system.processes.status` | string | Deprecated, use `system.process.status` instead. | `running` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `system.process.status`. | +| Attribute | Type | Description | Examples | Stability | +| ------------------------- | ------ | ----------------------------------------- | ------------------- | -------------------------------------------------------------------------------------------- | +| `system.cpu.state` | string | Deprecated, use `cpu.mode` instead. | `idle`; `interrupt` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `cpu.mode` | +| `system.process.status` | string | Deprecated, use `process.status` instead. | `running` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `system.processes.status` | string | Deprecated, use `process.status` instead. | `running` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `process.status`. | `system.cpu.state` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. @@ -52,6 +52,15 @@ Deprecated system attributes. | `system` | system | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | `user` | user | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +`system.process.status` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. + +| Value | Description | Stability | +| ---------- | ----------- | ---------------------------------------------------------------- | +| `defunct` | defunct | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `running` | running | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `sleeping` | sleeping | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `stopped` | stopped | ![Experimental](https://img.shields.io/badge/-experimental-blue) | + `system.processes.status` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. | Value | Description | Stability | @@ -164,20 +173,3 @@ Describes System Memory Paging attributes | ------- | ----------- | ---------------------------------------------------------------- | | `major` | major | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | `minor` | minor | ![Experimental](https://img.shields.io/badge/-experimental-blue) | - -## System Process Attributes - -Describes System Process attributes - -| Attribute | Type | Description | Examples | Stability | -| ----------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------- | --------- | ---------------------------------------------------------------- | -| `system.process.status` | string | The process state, e.g., [Linux Process State Codes](https://man7.org/linux/man-pages/man1/ps.1.html#PROCESS_STATE_CODES) | `running` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | - -`system.process.status` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. - -| Value | Description | Stability | -| ---------- | ----------- | ---------------------------------------------------------------- | -| `defunct` | defunct | ![Experimental](https://img.shields.io/badge/-experimental-blue) | -| `running` | running | ![Experimental](https://img.shields.io/badge/-experimental-blue) | -| `sleeping` | sleeping | ![Experimental](https://img.shields.io/badge/-experimental-blue) | -| `stopped` | stopped | ![Experimental](https://img.shields.io/badge/-experimental-blue) | diff --git a/docs/resource/process.md b/docs/resource/process.md index a081022d6f..a6432861f1 100644 --- a/docs/resource/process.md +++ b/docs/resource/process.md @@ -37,9 +37,10 @@ | [`process.command`](/docs/attributes-registry/process.md) | string | The command used to launch the process (i.e. the command name). On Linux based systems, can be set to the zeroth string in `proc/[pid]/cmdline`. On Windows, can be set to the first parameter extracted from `GetCommandLineW`. | `cmd/otelcol` | `Conditionally Required` [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | [`process.command_args`](/docs/attributes-registry/process.md) | string[] | All the command arguments (including the command/executable itself) as received by the process. On Linux-based systems (and some other Unixoid systems supporting procfs), can be set according to the list of null-delimited strings extracted from `proc/[pid]/cmdline`. For libc-based executables, this would be the full argv vector passed to `main`. | `["cmd/otecol", "--config=config.yaml"]` | `Conditionally Required` [2] | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | [`process.command_line`](/docs/attributes-registry/process.md) | string | The full command used to launch the process as a single string representing the full command. On Windows, can be set to the result of `GetCommandLineW`. Do not set this if you have to assemble it just for monitoring; use `process.command_args` instead. | `C:\cmd\otecol --config="my directory\config.yaml"` | `Conditionally Required` [3] | ![Experimental](https://img.shields.io/badge/-experimental-blue) | -| [`process.executable.name`](/docs/attributes-registry/process.md) | string | The name of the process executable. On Linux based systems, can be set to the `Name` in `proc/[pid]/status`. On Windows, can be set to the base name of `GetProcessImageFileNameW`. | `otelcol` | `Conditionally Required` [4] | ![Experimental](https://img.shields.io/badge/-experimental-blue) | -| [`process.executable.path`](/docs/attributes-registry/process.md) | string | The full path to the process executable. On Linux based systems, can be set to the target of `proc/[pid]/exe`. On Windows, can be set to the result of `GetProcessImageFileNameW`. | `/usr/bin/cmd/otelcol` | `Conditionally Required` [5] | ![Experimental](https://img.shields.io/badge/-experimental-blue) | -| [`process.owner`](/docs/attributes-registry/process.md) | string | The username of the user that owns the process. | `root` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| [`process.executable.path`](/docs/attributes-registry/process.md) | string | The full path to the process executable. On Linux based systems, can be set to the target of `proc/[pid]/exe`. On Windows, can be set to the result of `GetProcessImageFileNameW`. | `/usr/bin/cmd/otelcol` | `Conditionally Required` [4] | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| [`process.owner`](/docs/attributes-registry/process.md) | string | The username of the user that owns the process. | `root` | `Conditionally Required` [5] | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| [`process.status`](/docs/attributes-registry/process.md) | string | The process state, e.g., [Linux Process State Codes](https://man7.org/linux/man-pages/man1/ps.1.html#PROCESS_STATE_CODES) | `running` | `Conditionally Required` [6] | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| [`process.executable.name`](/docs/attributes-registry/process.md) | string | The name of the process executable. On Linux based systems, can be set to the `Name` in `proc/[pid]/status`. On Windows, can be set to the base name of `GetProcessImageFileNameW`. | `otelcol` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | [`process.parent_pid`](/docs/attributes-registry/process.md) | int | Parent Process identifier (PPID). | `111` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | | [`process.pid`](/docs/attributes-registry/process.md) | int | Process identifier (PID). | `1234` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | @@ -53,6 +54,18 @@ **[5]:** See [Selecting process attributes](#selecting-process-attributes) for details. +**[6]:** See [Selecting process attributes](#selecting-process-attributes) for details. + + + +`process.status` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. + +| Value | Description | Stability | +|---|---|---| +| `defunct` | defunct | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `running` | running | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `sleeping` | sleeping | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| `stopped` | stopped | ![Experimental](https://img.shields.io/badge/-experimental-blue) | diff --git a/docs/system/system-metrics.md b/docs/system/system-metrics.md index cd01009e28..5df67b349b 100644 --- a/docs/system/system-metrics.md +++ b/docs/system/system-metrics.md @@ -1368,9 +1368,9 @@ This metric is [recommended][MetricRecommended]. | Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability | |---|---|---|---|---|---| -| [`system.process.status`](/docs/attributes-registry/system.md) | string | The process state, e.g., [Linux Process State Codes](https://man7.org/linux/man-pages/man1/ps.1.html#PROCESS_STATE_CODES) | `running` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | +| [`process.status`](/docs/attributes-registry/process.md) | string | The process state, e.g., [Linux Process State Codes](https://man7.org/linux/man-pages/man1/ps.1.html#PROCESS_STATE_CODES) | `running` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | -`system.process.status` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. +`process.status` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. | Value | Description | Stability | |---|---|---| diff --git a/model/metrics/system-metrics.yaml b/model/metrics/system-metrics.yaml index 25e2d06665..868d7608a4 100644 --- a/model/metrics/system-metrics.yaml +++ b/model/metrics/system-metrics.yaml @@ -316,7 +316,7 @@ groups: instrument: updowncounter unit: "{process}" attributes: - - ref: system.process.status + - ref: process.status - id: metric.system.process.created type: metric diff --git a/model/registry/deprecated/system.yaml b/model/registry/deprecated/system.yaml index d220a501b7..8f97805be7 100644 --- a/model/registry/deprecated/system.yaml +++ b/model/registry/deprecated/system.yaml @@ -19,8 +19,8 @@ groups: - id: defunct value: 'defunct' stability: experimental - brief: "Deprecated, use `system.process.status` instead." - deprecated: "Replaced by `system.process.status`." + brief: "Deprecated, use `process.status` instead." + deprecated: "Replaced by `process.status`." stability: experimental examples: ["running"] - id: system.cpu.state @@ -52,3 +52,22 @@ groups: stability: experimental deprecated: 'Replaced by `cpu.mode`' examples: [ "idle", "interrupt" ] + - id: system.process.status + type: + allow_custom_values: true + members: + - id: running + value: 'running' + stability: experimental + - id: sleeping + value: 'sleeping' + stability: experimental + - id: stopped + value: 'stopped' + stability: experimental + - id: defunct + value: 'defunct' + stability: experimental + stability: experimental + brief: "Deprecated, use `process.status` instead." + examples: ["running"] \ No newline at end of file diff --git a/model/registry/process.yaml b/model/registry/process.yaml index 7cb7451e66..5ba0e97e12 100644 --- a/model/registry/process.yaml +++ b/model/registry/process.yaml @@ -196,3 +196,23 @@ groups: value: 'minor' stability: experimental stability: experimental + - id: status + type: + allow_custom_values: true + members: + - id: running + value: 'running' + stability: experimental + - id: sleeping + value: 'sleeping' + stability: experimental + - id: stopped + value: 'stopped' + stability: experimental + - id: defunct + value: 'defunct' + stability: experimental + stability: experimental + brief: > + The process state, e.g., [Linux Process State Codes](https://man7.org/linux/man-pages/man1/ps.1.html#PROCESS_STATE_CODES) + examples: ["running"] diff --git a/model/registry/system.yaml b/model/registry/system.yaml index 790a1374af..866f70e996 100644 --- a/model/registry/system.yaml +++ b/model/registry/system.yaml @@ -199,30 +199,4 @@ groups: stability: experimental stability: experimental brief: "A stateless protocol MUST NOT set this attribute" - examples: ["close_wait"] - # system.process.* attribute group - - id: registry.system.process - prefix: system.process - type: attribute_group - brief: "Describes System Process attributes" - attributes: - - id: status - type: - allow_custom_values: true - members: - - id: running - value: 'running' - stability: experimental - - id: sleeping - value: 'sleeping' - stability: experimental - - id: stopped - value: 'stopped' - stability: experimental - - id: defunct - value: 'defunct' - stability: experimental - stability: experimental - brief: > - The process state, e.g., [Linux Process State Codes](https://man7.org/linux/man-pages/man1/ps.1.html#PROCESS_STATE_CODES) - examples: ["running"] + examples: ["close_wait"] \ No newline at end of file diff --git a/model/resource/process.yaml b/model/resource/process.yaml index 36becc7606..b9592b3c41 100644 --- a/model/resource/process.yaml +++ b/model/resource/process.yaml @@ -8,6 +8,7 @@ groups: - ref: process.pid - ref: process.parent_pid - ref: process.executable.name + - ref: process.owner requirement_level: conditionally_required: See [Selecting process attributes](#selecting-process-attributes) for details. - ref: process.executable.path @@ -22,7 +23,9 @@ groups: - ref: process.command_args requirement_level: conditionally_required: See [Selecting process attributes](#selecting-process-attributes) for details. - - ref: process.owner + - ref: process.status + requirement_level: + conditionally_required: See [Selecting process attributes](#selecting-process-attributes) for details. - id: process.runtime prefix: process.runtime diff --git a/schema-next.yaml b/schema-next.yaml index b2d310bd77..42a356d95a 100644 --- a/schema-next.yaml +++ b/schema-next.yaml @@ -46,6 +46,12 @@ versions: # https://github.com/open-telemetry/semantic-conventions/pull/1006 - rename_metrics: messaging.publish.messages: messaging.client.published.messages + # TODO https://github.com/open-telemetry/semantic-conventions/pull/x + - rename_attributes: + attribute_map: + system.process.status: process.status + apply_to_metrics: + - system.processes.count # https://github.com/open-telemetry/semantic-conventions/pull/1026 - rename_attributes: attribute_map: From 344f35dc94e95409d83c849df12c065f4786fd70 Mon Sep 17 00:00:00 2001 From: braydonk Date: Mon, 8 Jul 2024 14:06:29 +0000 Subject: [PATCH 2/4] add changelog and use PR number --- .chloggen/process_status.yaml | 17 +++++++++++++++++ schema-next.yaml | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 .chloggen/process_status.yaml diff --git a/.chloggen/process_status.yaml b/.chloggen/process_status.yaml new file mode 100644 index 0000000000..59986e3170 --- /dev/null +++ b/.chloggen/process_status.yaml @@ -0,0 +1,17 @@ +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: breaking + +# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db) +component: system + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Deprecate system.process.status in favour of process.status. Use process.status as a process resource attribute. + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +# The values here must be integers. +issues: [1181] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: diff --git a/schema-next.yaml b/schema-next.yaml index 42a356d95a..12fff75b11 100644 --- a/schema-next.yaml +++ b/schema-next.yaml @@ -46,7 +46,7 @@ versions: # https://github.com/open-telemetry/semantic-conventions/pull/1006 - rename_metrics: messaging.publish.messages: messaging.client.published.messages - # TODO https://github.com/open-telemetry/semantic-conventions/pull/x + # https://github.com/open-telemetry/semantic-conventions/pull/1212 - rename_attributes: attribute_map: system.process.status: process.status From daab5c0de700367a92e472b8b081e322dc82a0a1 Mon Sep 17 00:00:00 2001 From: braydonk Date: Mon, 8 Jul 2024 14:13:03 +0000 Subject: [PATCH 3/4] properly mark system.process.status deprecated --- docs/attributes-registry/system.md | 10 +++++----- model/registry/deprecated/system.yaml | 5 +++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/attributes-registry/system.md b/docs/attributes-registry/system.md index a8d5fc1721..42c2a69298 100644 --- a/docs/attributes-registry/system.md +++ b/docs/attributes-registry/system.md @@ -34,11 +34,11 @@ Describes System CPU attributes Deprecated system attributes. -| Attribute | Type | Description | Examples | Stability | -| ------------------------- | ------ | ----------------------------------------- | ------------------- | -------------------------------------------------------------------------------------------- | -| `system.cpu.state` | string | Deprecated, use `cpu.mode` instead. | `idle`; `interrupt` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `cpu.mode` | -| `system.process.status` | string | Deprecated, use `process.status` instead. | `running` | ![Experimental](https://img.shields.io/badge/-experimental-blue) | -| `system.processes.status` | string | Deprecated, use `process.status` instead. | `running` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `process.status`. | +| Attribute | Type | Description | Examples | Stability | +| ------------------------- | ------ | ----------------------------------------- | ------------------- | ------------------------------------------------------------------------------------------- | +| `system.cpu.state` | string | Deprecated, use `cpu.mode` instead. | `idle`; `interrupt` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `cpu.mode` | +| `system.process.status` | string | Deprecated, use `process.status` instead. | `running` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `process.status` | +| `system.processes.status` | string | Deprecated, use `process.status` instead. | `running` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `process.status` | `system.cpu.state` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. diff --git a/model/registry/deprecated/system.yaml b/model/registry/deprecated/system.yaml index 8f97805be7..c46623c293 100644 --- a/model/registry/deprecated/system.yaml +++ b/model/registry/deprecated/system.yaml @@ -20,7 +20,7 @@ groups: value: 'defunct' stability: experimental brief: "Deprecated, use `process.status` instead." - deprecated: "Replaced by `process.status`." + deprecated: "Replaced by `process.status`" stability: experimental examples: ["running"] - id: system.cpu.state @@ -50,7 +50,7 @@ groups: stability: experimental brief: "Deprecated, use `cpu.mode` instead." stability: experimental - deprecated: 'Replaced by `cpu.mode`' + deprecated: "Replaced by `cpu.mode`" examples: [ "idle", "interrupt" ] - id: system.process.status type: @@ -70,4 +70,5 @@ groups: stability: experimental stability: experimental brief: "Deprecated, use `process.status` instead." + deprecated: "Replaced by `process.status`" examples: ["running"] \ No newline at end of file From fdc74cbe7bd6218b1313e8e71cd9860edb5f781d Mon Sep 17 00:00:00 2001 From: braydonk Date: Mon, 8 Jul 2024 14:15:09 +0000 Subject: [PATCH 4/4] adding missing eof newlines --- model/registry/deprecated/system.yaml | 2 +- model/registry/system.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/model/registry/deprecated/system.yaml b/model/registry/deprecated/system.yaml index c46623c293..58184ac239 100644 --- a/model/registry/deprecated/system.yaml +++ b/model/registry/deprecated/system.yaml @@ -71,4 +71,4 @@ groups: stability: experimental brief: "Deprecated, use `process.status` instead." deprecated: "Replaced by `process.status`" - examples: ["running"] \ No newline at end of file + examples: ["running"] diff --git a/model/registry/system.yaml b/model/registry/system.yaml index 866f70e996..a727946449 100644 --- a/model/registry/system.yaml +++ b/model/registry/system.yaml @@ -199,4 +199,4 @@ groups: stability: experimental stability: experimental brief: "A stateless protocol MUST NOT set this attribute" - examples: ["close_wait"] \ No newline at end of file + examples: ["close_wait"]