content/shared/influxdb-v2/query-data/flux/monitor-states.md
Flux helps you monitor states in your metrics and events:
<!-- - [Detect state changes](#detect-state-changes) -->If you're just getting started with Flux queries, check out the following:
Use stateDuration()
to calculate the duration of consecutive rows with a specified state.
For each consecutive point that matches the specified state, stateDuration()
increments and stores the duration (in the specified unit) in a user-defined column.
Include the following information:
1s (by default), 1m, 1h) used to increment the state duration.data
|> stateDuration(fn: (r) => r.column_to_search == "value_to_search_for", column: "state_duration", unit: 1s)
true, the state duration is set to 0.
For each consecutive point that evaluates true, the state duration
increases by the time interval between each consecutive point (in specified units).false, the state duration is reset to -1.The following query searches the doors bucket over the past 5 minutes to find how many seconds a door has been closed.
from(bucket: "doors")
|> range(start: -5m)
|> stateDuration(fn: (r) => r._value == "closed", column: "door_closed", unit: 1s)
In this example, door_closed is the State duration column.
If you write data to the doors bucket every minute, the state duration
increases by 60s for each consecutive point where _value is closed.
If _value is not closed, the state duration is reset to 0.
Results for the example query above may look like this (for simplicity, we've omitted the measurement, tag, and field columns):
| _time | _value | door_closed |
|---|---|---|
| 2019-10-26T17:39:16Z | closed | 0 |
| 2019-10-26T17:40:16Z | closed | 60 |
| 2019-10-26T17:41:16Z | closed | 120 |
| 2019-10-26T17:42:16Z | open | -1 |
| 2019-10-26T17:43:16Z | closed | 0 |
| 2019-10-26T17:44:27Z | closed | 60 |
Use the stateCount() function
and include the following information:
|> stateCount(
fn: (r) => r.column_to_search == "value_to_search_for",
column: "state_count",
)
true, the state count is set to 1. For each consecutive point that evaluates true, the state count increases by 1.false, the state count is reset to -1.The following query searches the doors bucket over the past 5 minutes and calculates how many points have closed as their _value.
from(bucket: "doors")
|> range(start: -5m)
|> stateCount(fn: (r) => r._value == "closed", column: "door_closed")
This example stores the state count in the door_closed column. If you write data to the doors bucket every minute, the state count increases by 1 for each consecutive point where _value is closed. If _value is not closed, the state count is reset to -1.
Results for the example query above may look like this (for simplicity, we've omitted the measurement, tag, and field columns):
| _time | _value | door_closed |
|---|---|---|
| 2019-10-26T17:39:16Z | closed | 1 |
| 2019-10-26T17:40:16Z | closed | 2 |
| 2019-10-26T17:41:16Z | closed | 3 |
| 2019-10-26T17:42:16Z | open | -1 |
| 2019-10-26T17:43:16Z | closed | 1 |
| 2019-10-26T17:44:27Z | closed | 2 |
The following query checks the machine state every minute (idle, assigned, or busy). InfluxDB searches the servers bucket over the past hour and counts records with a machine state of idle, assigned or busy.
from(bucket: "servers")
|> range(start: -1h)
|> filter(fn: (r) => r.machine_state == "idle" or r.machine_state == "assigned" or r.machine_state == "busy")
|> stateCount(fn: (r) => r.machine_state == "busy", column: "_count")
|> stateCount(fn: (r) => r.machine_state == "assigned", column: "_count")
|> stateCount(fn: (r) => r.machine_state == "idle", column: "_count")