style: use _count suffix for metrics

instead of `_counter` to follow grafana best practice.
update monitoring doc and grafana json
This commit is contained in:
Gwen Lg
2026-02-17 21:33:43 +01:00
committed by Alex Auvolat
parent fad82751b9
commit 38ff5c2ce3
9 changed files with 72 additions and 72 deletions
+8 -8
View File
@@ -182,14 +182,14 @@ content-type: text/plain; version=0.0.4
content-length: 12145 content-length: 12145
date: Tue, 08 Aug 2023 07:25:05 GMT date: Tue, 08 Aug 2023 07:25:05 GMT
# HELP garage_api_admin_error_counter Number of API calls to the various Admin API endpoints that resulted in errors # HELP garage_api_admin_error_count Number of API calls to the various Admin API endpoints that resulted in errors
# TYPE garage_api_admin_error_counter counter # TYPE garage_api_admin_error_count counter
garage_api_admin_error_counter{api_endpoint="CheckWebsiteEnabled",status_code="400"} 1 garage_api_admin_error_count{api_endpoint="CheckWebsiteEnabled",status_code="400"} 1
garage_api_admin_error_counter{api_endpoint="CheckWebsiteEnabled",status_code="404"} 3 garage_api_admin_error_count{api_endpoint="CheckWebsiteEnabled",status_code="404"} 3
# HELP garage_api_admin_request_counter Number of API calls to the various Admin API endpoints # HELP garage_api_admin_request_count Number of API calls to the various Admin API endpoints
# TYPE garage_api_admin_request_counter counter # TYPE garage_api_admin_request_count counter
garage_api_admin_request_counter{api_endpoint="CheckWebsiteEnabled"} 7 garage_api_admin_request_count{api_endpoint="CheckWebsiteEnabled"} 7
garage_api_admin_request_counter{api_endpoint="Health"} 3 garage_api_admin_request_count{api_endpoint="Health"} 3
# HELP garage_api_admin_request_duration Duration of API calls to the various Admin API endpoints # HELP garage_api_admin_request_duration Duration of API calls to the various Admin API endpoints
... ...
``` ```
+29 -29
View File
@@ -135,12 +135,12 @@ garage_cluster_partitions_quorum 256
### Metrics of the API endpoints ### Metrics of the API endpoints
#### `garage_api_admin_request_counter` (counter) #### `garage_api_admin_request_count` (counter)
Counts the number of requests to a given endpoint of the administration API. Example: Counts the number of requests to a given endpoint of the administration API. Example:
``` ```
garage_api_admin_request_counter{api_endpoint="Metrics"} 127041 garage_api_admin_request_count{api_endpoint="Metrics"} 127041
``` ```
#### `garage_api_admin_request_duration` (histogram) #### `garage_api_admin_request_duration` (histogram)
@@ -153,20 +153,20 @@ garage_api_admin_request_duration_sum{api_endpoint="Metrics"} 605.250344830999
garage_api_admin_request_duration_count{api_endpoint="Metrics"} 127041 garage_api_admin_request_duration_count{api_endpoint="Metrics"} 127041
``` ```
#### `garage_api_s3_request_counter` (counter) #### `garage_api_s3_request_count` (counter)
Counts the number of requests to a given endpoint of the S3 API. Example: Counts the number of requests to a given endpoint of the S3 API. Example:
``` ```
garage_api_s3_request_counter{api_endpoint="CreateMultipartUpload"} 1 garage_api_s3_request_count{api_endpoint="CreateMultipartUpload"} 1
``` ```
#### `garage_api_s3_error_counter` (counter) #### `garage_api_s3_error_count` (counter)
Counts the number of requests to a given endpoint of the S3 API that returned an error. Example: Counts the number of requests to a given endpoint of the S3 API that returned an error. Example:
``` ```
garage_api_s3_error_counter{api_endpoint="GetObject",status_code="404"} 39 garage_api_s3_error_count{api_endpoint="GetObject",status_code="404"} 39
``` ```
#### `garage_api_s3_request_duration` (histogram) #### `garage_api_s3_request_duration` (histogram)
@@ -179,7 +179,7 @@ garage_api_s3_request_duration_sum{api_endpoint="CreateMultipartUpload"} 0.04634
garage_api_s3_request_duration_count{api_endpoint="CreateMultipartUpload"} 1 garage_api_s3_request_duration_count{api_endpoint="CreateMultipartUpload"} 1
``` ```
#### `garage_api_k2v_request_counter` (counter), `garage_api_k2v_error_counter` (counter), `garage_api_k2v_error_duration` (histogram) #### `garage_api_k2v_request_count` (counter), `garage_api_k2v_error_count` (counter), `garage_api_k2v_error_duration` (histogram)
Same as for S3, for the K2V API. Same as for S3, for the K2V API.
@@ -187,12 +187,12 @@ Same as for S3, for the K2V API.
### Metrics of the Web endpoint ### Metrics of the Web endpoint
#### `garage_web_request_counter` (counter) #### `garage_web_request_count` (counter)
Number of requests to the web endpoint Number of requests to the web endpoint
``` ```
garage_web_request_counter{method="GET"} 80 garage_web_request_count{method="GET"} 80
``` ```
#### `garage_web_request_duration` (histogram) #### `garage_web_request_duration` (histogram)
@@ -205,12 +205,12 @@ garage_web_request_duration_sum{method="GET"} 1.0528433229999998
garage_web_request_duration_count{method="GET"} 80 garage_web_request_duration_count{method="GET"} 80
``` ```
#### `garage_web_error_counter` (counter) #### `garage_web_error_count` (counter)
Number of requests to the web endpoint resulting in errors Number of requests to the web endpoint resulting in errors
``` ```
garage_web_error_counter{method="GET",status_code="404 Not Found"} 64 garage_web_error_count{method="GET",status_code="404 Not Found"} 64
``` ```
@@ -257,20 +257,20 @@ garage_block_write_duration_sum 195.59170078500006
garage_block_write_duration_count 3571 garage_block_write_duration_count 3571
``` ```
#### `garage_block_delete_counter` (counter) #### `garage_block_delete_count` (counter)
Counts the number of data blocks that have been deleted from storage. Counts the number of data blocks that have been deleted from storage.
``` ```
garage_block_delete_counter 122 garage_block_delete_count 122
``` ```
#### `garage_block_resync_counter` (counter), `garage_block_resync_duration` (histogram) #### `garage_block_resync_count` (counter), `garage_block_resync_duration` (histogram)
Counts the number of resync operations the node has executed, and evaluates their duration. Counts the number of resync operations the node has executed, and evaluates their duration.
``` ```
garage_block_resync_counter 308897 garage_block_resync_count 308897
garage_block_resync_duration_bucket{le="0.5"} 308892 garage_block_resync_duration_bucket{le="0.5"} 308892
garage_block_resync_duration_sum 139.64204196100016 garage_block_resync_duration_sum 139.64204196100016
garage_block_resync_duration_count 308897 garage_block_resync_duration_count 308897
@@ -298,28 +298,28 @@ garage_block_resync_errored_blocks 0
### Metrics related to RPCs (remote procedure calls) between nodes ### Metrics related to RPCs (remote procedure calls) between nodes
#### `garage_rpc_netapp_request_counter` (counter) #### `garage_rpc_netapp_request_count` (counter)
Number of RPC requests emitted Number of RPC requests emitted
``` ```
garage_rpc_request_counter{from="<this node>",rpc_endpoint="garage_block/manager.rs/Rpc",to="<remote node>"} 176 garage_rpc_request_count{from="<this node>",rpc_endpoint="garage_block/manager.rs/Rpc",to="<remote node>"} 176
``` ```
#### `garage_rpc_netapp_error_counter` (counter) #### `garage_rpc_netapp_error_count` (counter)
Number of communication errors (errors in the Netapp library, generally due to disconnected nodes) Number of communication errors (errors in the Netapp library, generally due to disconnected nodes)
``` ```
garage_rpc_netapp_error_counter{from="<this node>",rpc_endpoint="garage_block/manager.rs/Rpc",to="<remote node>"} 354 garage_rpc_netapp_error_count{from="<this node>",rpc_endpoint="garage_block/manager.rs/Rpc",to="<remote node>"} 354
``` ```
#### `garage_rpc_timeout_counter` (counter) #### `garage_rpc_timeout_count` (counter)
Number of RPC timeouts, should be close to zero in a healthy cluster. Number of RPC timeouts, should be close to zero in a healthy cluster.
``` ```
garage_rpc_timeout_counter{from="<this node>",rpc_endpoint="garage_rpc/membership.rs/SystemRpc",to="<remote node>"} 1 garage_rpc_timeout_count{from="<this node>",rpc_endpoint="garage_rpc/membership.rs/SystemRpc",to="<remote node>"} 1
``` ```
#### `garage_rpc_duration` (histogram) #### `garage_rpc_duration` (histogram)
@@ -343,43 +343,43 @@ Table garbage collector TODO queue length
garage_table_gc_todo_queue_length{table_name="block_ref"} 0 garage_table_gc_todo_queue_length{table_name="block_ref"} 0
``` ```
#### `garage_table_get_request_counter` (counter), `garage_table_get_request_duration` (histogram) #### `garage_table_get_request_count` (counter), `garage_table_get_request_duration` (histogram)
Number of get/get_range requests internally made on each table, and their duration. Number of get/get_range requests internally made on each table, and their duration.
``` ```
garage_table_get_request_counter{table_name="bucket_alias"} 315 garage_table_get_request_count{table_name="bucket_alias"} 315
garage_table_get_request_duration_bucket{table_name="bucket_alias",le="0.5"} 315 garage_table_get_request_duration_bucket{table_name="bucket_alias",le="0.5"} 315
garage_table_get_request_duration_sum{table_name="bucket_alias"} 0.048509778000000024 garage_table_get_request_duration_sum{table_name="bucket_alias"} 0.048509778000000024
garage_table_get_request_duration_count{table_name="bucket_alias"} 315 garage_table_get_request_duration_count{table_name="bucket_alias"} 315
``` ```
#### `garage_table_put_request_counter` (counter), `garage_table_put_request_duration` (histogram) #### `garage_table_put_request_count` (counter), `garage_table_put_request_duration` (histogram)
Number of insert/insert_many requests internally made on this table, and their duration Number of insert/insert_many requests internally made on this table, and their duration
``` ```
garage_table_put_request_counter{table_name="block_ref"} 677 garage_table_put_request_count{table_name="block_ref"} 677
garage_table_put_request_duration_bucket{table_name="block_ref",le="0.5"} 677 garage_table_put_request_duration_bucket{table_name="block_ref",le="0.5"} 677
garage_table_put_request_duration_sum{table_name="block_ref"} 61.617528636 garage_table_put_request_duration_sum{table_name="block_ref"} 61.617528636
garage_table_put_request_duration_count{table_name="block_ref"} 677 garage_table_put_request_duration_count{table_name="block_ref"} 677
``` ```
#### `garage_table_internal_delete_counter` (counter) #### `garage_table_internal_delete_count` (counter)
Number of value deletions in the tree (due to GC or repartitioning) Number of value deletions in the tree (due to GC or repartitioning)
``` ```
garage_table_internal_delete_counter{table_name="block_ref"} 2296 garage_table_internal_delete_count{table_name="block_ref"} 2296
``` ```
#### `garage_table_internal_update_counter` (counter) #### `garage_table_internal_update_count` (counter)
Number of value updates where the value actually changes (includes creation of new key and update of existing key) Number of value updates where the value actually changes (includes creation of new key and update of existing key)
``` ```
garage_table_internal_update_counter{table_name="block_ref"} 5996 garage_table_internal_update_count{table_name="block_ref"} 5996
``` ```
#### `garage_table_merkle_updater_todo_queue_length` (gauge) #### `garage_table_merkle_updater_todo_queue_length` (gauge)
@@ -161,7 +161,7 @@
}, },
"metrics": [ "metrics": [
{ {
"field": "garage_api_request_counter", "field": "garage_api_request_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -412,7 +412,7 @@
}, },
"metrics": [ "metrics": [
{ {
"field": "garage_api_error_counter", "field": "garage_api_error_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -540,7 +540,7 @@
}, },
"metrics": [ "metrics": [
{ {
"field": "garage_web_request_counter", "field": "garage_web_request_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -794,7 +794,7 @@
}, },
"metrics": [ "metrics": [
{ {
"field": "garage_web_error_counter", "field": "garage_web_error_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -918,7 +918,7 @@
"hide": false, "hide": false,
"metrics": [ "metrics": [
{ {
"field": "garage_table_get_request_counter", "field": "garage_table_get_request_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -1042,7 +1042,7 @@
"hide": false, "hide": false,
"metrics": [ "metrics": [
{ {
"field": "garage_table_put_request_counter", "field": "garage_table_put_request_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -1386,7 +1386,7 @@
}, },
"metrics": [ "metrics": [
{ {
"field": "garage_block_resync_counter", "field": "garage_block_resync_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -1824,7 +1824,7 @@
}, },
"metrics": [ "metrics": [
{ {
"field": "garage_block_resync_error_counter", "field": "garage_block_resync_error_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"settings": {}, "settings": {},
@@ -2041,7 +2041,7 @@
}, },
"metrics": [ "metrics": [
{ {
"field": "garage_block_corruption_counter", "field": "garage_block_corruption_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -2165,7 +2165,7 @@
}, },
"metrics": [ "metrics": [
{ {
"field": "garage_rpc_netapp_error_counter", "field": "garage_rpc_netapp_error_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -2292,7 +2292,7 @@
}, },
"metrics": [ "metrics": [
{ {
"field": "garage_rpc_request_counter", "field": "garage_rpc_request_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -2654,7 +2654,7 @@
}, },
"metrics": [ "metrics": [
{ {
"field": "garage_rpc_garage_error_counter", "field": "garage_rpc_garage_error_count",
"hide": true, "hide": true,
"id": "1", "id": "1",
"type": "sum" "type": "sum"
@@ -2995,4 +2995,4 @@
"uid": "ODT8K4B7e", "uid": "ODT8K4B7e",
"version": 7, "version": 7,
"weekStart": "" "weekStart": ""
} }
@@ -250,7 +250,7 @@
}, },
"editorMode": "code", "editorMode": "code",
"exemplar": true, "exemplar": true,
"expr": "sum by (api_endpoint) (rate(garage_api_s3_request_counter {job=\"garage\"}[$__rate_interval]))", "expr": "sum by (api_endpoint) (rate(garage_api_s3_request_count {job=\"garage\"}[$__rate_interval]))",
"hide": false, "hide": false,
"interval": "", "interval": "",
"legendFormat": "{{api_endpoint}}", "legendFormat": "{{api_endpoint}}",
@@ -345,7 +345,7 @@
"uid": "${DS_DS_PROMETHEUS}" "uid": "${DS_DS_PROMETHEUS}"
}, },
"exemplar": true, "exemplar": true,
"expr": "sum(rate(garage_web_request_counter {job=\"garage\"}[$__rate_interval]))", "expr": "sum(rate(garage_web_request_count {job=\"garage\"}[$__rate_interval]))",
"hide": false, "hide": false,
"interval": "", "interval": "",
"legendFormat": "Web request rate", "legendFormat": "Web request rate",
@@ -439,7 +439,7 @@
"uid": "${DS_DS_PROMETHEUS}" "uid": "${DS_DS_PROMETHEUS}"
}, },
"exemplar": true, "exemplar": true,
"expr": "sum by (rpc_endpoint) (rate(garage_rpc_request_counter {job=\"garage\"}[$__rate_interval]))", "expr": "sum by (rpc_endpoint) (rate(garage_rpc_request_count {job=\"garage\"}[$__rate_interval]))",
"hide": false, "hide": false,
"interval": "", "interval": "",
"legendFormat": "{{rpc_endpoint}}", "legendFormat": "{{rpc_endpoint}}",
@@ -534,7 +534,7 @@
}, },
"editorMode": "code", "editorMode": "code",
"exemplar": true, "exemplar": true,
"expr": "sum by (api_endpoint, status_code) (rate(garage_api_s3_error_counter {job=\"garage\"}[$__rate_interval]))", "expr": "sum by (api_endpoint, status_code) (rate(garage_api_s3_error_count {job=\"garage\"}[$__rate_interval]))",
"hide": false, "hide": false,
"interval": "", "interval": "",
"legendFormat": "{{api_endpoint}} {{status_code}}", "legendFormat": "{{api_endpoint}} {{status_code}}",
+2 -2
View File
@@ -84,14 +84,14 @@ impl<A: ApiHandler> ApiServer<A> {
region, region,
api_handler, api_handler,
request_counter: meter request_counter: meter
.u64_counter(format!("garage_api.{}.request_counter", A::API_NAME)) .u64_counter(format!("garage_api.{}.request_count", A::API_NAME))
.with_description(format!( .with_description(format!(
"Number of API calls to the various {} API endpoints", "Number of API calls to the various {} API endpoints",
A::API_NAME_DISPLAY A::API_NAME_DISPLAY
)) ))
.init(), .init(),
error_counter: meter error_counter: meter
.u64_counter(format!("garage_api.{}.error_counter", A::API_NAME)) .u64_counter(format!("garage_api.{}.error_count", A::API_NAME))
.with_description(format!( .with_description(format!(
"Number of API calls to the various {} API endpoints that resulted in errors", "Number of API calls to the various {} API endpoints that resulted in errors",
A::API_NAME_DISPLAY A::API_NAME_DISPLAY
+6 -6
View File
@@ -86,12 +86,12 @@ impl BlockManagerMetrics {
.init(), .init(),
resync_counter: meter resync_counter: meter
.u64_counter("garage_block.resync_counter") .u64_counter("garage_block.resync_count")
.with_description("Number of calls to resync_block") .with_description("Number of calls to resync_block")
.init() .init()
.bind(&[]), .bind(&[]),
resync_error_counter: meter resync_error_counter: meter
.u64_counter("garage_block.resync_error_counter") .u64_counter("garage_block.resync_error_count")
.with_description("Number of calls to resync_block that returned an error") .with_description("Number of calls to resync_block that returned an error")
.init() .init()
.bind(&[]), .bind(&[]),
@@ -101,11 +101,11 @@ impl BlockManagerMetrics {
.init() .init()
.bind(&[]), .bind(&[]),
resync_send_counter: meter resync_send_counter: meter
.u64_counter("garage_block.resync_send_counter") .u64_counter("garage_block.resync_send_count")
.with_description("Number of blocks sent to another node in resync operations") .with_description("Number of blocks sent to another node in resync operations")
.init(), .init(),
resync_recv_counter: meter resync_recv_counter: meter
.u64_counter("garage_block.resync_recv_counter") .u64_counter("garage_block.resync_recv_count")
.with_description("Number of blocks received from other nodes in resync operations") .with_description("Number of blocks received from other nodes in resync operations")
.init() .init()
.bind(&[]), .bind(&[]),
@@ -136,13 +136,13 @@ impl BlockManagerMetrics {
.init() .init()
.bind(&[]), .bind(&[]),
delete_counter: meter delete_counter: meter
.u64_counter("garage_block.delete_counter") .u64_counter("garage_block.delete_count")
.with_description("Number of blocks deleted") .with_description("Number of blocks deleted")
.init() .init()
.bind(&[]), .bind(&[]),
corruption_counter: meter corruption_counter: meter
.u64_counter("garage_block.corruption_counter") .u64_counter("garage_block.corruption_count")
.with_description("Data corruptions detected on block reads") .with_description("Data corruptions detected on block reads")
.init() .init()
.bind(&[]), .bind(&[]),
+4 -4
View File
@@ -14,19 +14,19 @@ impl RpcMetrics {
let meter = global::meter("garage_rpc"); let meter = global::meter("garage_rpc");
RpcMetrics { RpcMetrics {
rpc_counter: meter rpc_counter: meter
.u64_counter("garage_rpc.request_counter") .u64_counter("garage_rpc.request_count")
.with_description("Number of RPC requests emitted") .with_description("Number of RPC requests emitted")
.init(), .init(),
rpc_timeout_counter: meter rpc_timeout_counter: meter
.u64_counter("garage_rpc.timeout_counter") .u64_counter("garage_rpc.timeout_count")
.with_description("Number of RPC timeouts") .with_description("Number of RPC timeouts")
.init(), .init(),
rpc_netapp_error_counter: meter rpc_netapp_error_counter: meter
.u64_counter("garage_rpc.netapp_error_counter") .u64_counter("garage_rpc.netapp_error_count")
.with_description("Number of communication errors (errors in the Netapp library)") .with_description("Number of communication errors (errors in the Netapp library)")
.init(), .init(),
rpc_garage_error_counter: meter rpc_garage_error_counter: meter
.u64_counter("garage_rpc.garage_error_counter") .u64_counter("garage_rpc.garage_error_count")
.with_description("Number of RPC errors (errors happening when handling the RPC)") .with_description("Number of RPC errors (errors happening when handling the RPC)")
.init(), .init(),
rpc_duration: meter rpc_duration: meter
+4 -4
View File
@@ -104,7 +104,7 @@ impl TableMetrics {
.init(), .init(),
get_request_counter: meter get_request_counter: meter
.u64_counter("garage_table.get_request_counter") .u64_counter("garage_table.get_request_count")
.with_description("Number of get/get_range requests internally made on this table") .with_description("Number of get/get_range requests internally made on this table")
.init() .init()
.bind(&[KeyValue::new("table_name", table_name)]), .bind(&[KeyValue::new("table_name", table_name)]),
@@ -114,7 +114,7 @@ impl TableMetrics {
.init() .init()
.bind(&[KeyValue::new("table_name", table_name)]), .bind(&[KeyValue::new("table_name", table_name)]),
put_request_counter: meter put_request_counter: meter
.u64_counter("garage_table.put_request_counter") .u64_counter("garage_table.put_request_count")
.with_description("Number of insert/insert_many requests internally made on this table") .with_description("Number of insert/insert_many requests internally made on this table")
.init() .init()
.bind(&[KeyValue::new("table_name", table_name)]), .bind(&[KeyValue::new("table_name", table_name)]),
@@ -125,12 +125,12 @@ impl TableMetrics {
.bind(&[KeyValue::new("table_name", table_name)]), .bind(&[KeyValue::new("table_name", table_name)]),
internal_update_counter: meter internal_update_counter: meter
.u64_counter("garage_table.internal_update_counter") .u64_counter("garage_table.internal_update_count")
.with_description("Number of value updates where the value actually changes (includes creation of new key and update of existing key)") .with_description("Number of value updates where the value actually changes (includes creation of new key and update of existing key)")
.init() .init()
.bind(&[KeyValue::new("table_name", table_name)]), .bind(&[KeyValue::new("table_name", table_name)]),
internal_delete_counter: meter internal_delete_counter: meter
.u64_counter("garage_table.internal_delete_counter") .u64_counter("garage_table.internal_delete_count")
.with_description("Number of value deletions in the tree (due to GC or repartitioning)") .with_description("Number of value deletions in the tree (due to GC or repartitioning)")
.init() .init()
.bind(&[KeyValue::new("table_name", table_name)]), .bind(&[KeyValue::new("table_name", table_name)]),
+2 -2
View File
@@ -54,11 +54,11 @@ impl WebMetrics {
let meter = global::meter("garage/web"); let meter = global::meter("garage/web");
Self { Self {
request_counter: meter request_counter: meter
.u64_counter("garage_web.request_counter") .u64_counter("garage_web.request_count")
.with_description("Number of requests to the web endpoint") .with_description("Number of requests to the web endpoint")
.init(), .init(),
error_counter: meter error_counter: meter
.u64_counter("garage_web.error_counter") .u64_counter("garage_web.error_count")
.with_description("Number of requests to the web endpoint resulting in errors") .with_description("Number of requests to the web endpoint resulting in errors")
.init(), .init(),
request_duration: meter request_duration: meter