Index Stats API
Index Stats API
1.0에서 도입
Index Stats API는 인덱스 통계를 제공해요. 데이터 스트림의 경우, API가 스트림을 뒷받침하는 인덱스들의 통계를 제공해요. 기본적으로 반환되는 통계는 인덱스 수준이에요. 샤드 수준 통계를 받으려면 level 매개변수를 shards로 설정해요.
샤드가 다른 노드로 이동하면 그 샤드의 샤드 수준 통계가 초기화돼요. 샤드가 더 이상 그 노드의 일부가 아니어도, 노드는 샤드가 기여한 노드 수준 통계는 유지해요.
출처: 문서
본문
엔드포인트 (Endpoints)
GET /_stats
GET /{index}/_stats
GET /_stats/{metric}
GET /{index}/_stats/{metric}
경로 매개변수 (Path parameters)
다음 표는 사용 가능한 경로 매개변수예요. 모든 경로 매개변수는 선택 사항이에요.
| 매개변수 | 데이터 타입 | 설명 |
|---|---|---|
index |
String | 결과를 필터링하는 데 사용하는 인덱스, 데이터 스트림, 인덱스 별칭의 쉼표로 구분된 목록이에요. 와일드카드 표현식을 지원해요. 모든 인덱스의 통계를 가져오려면 _all 또는 *를 사용하거나 이 매개변수를 생략해요. |
metric |
String | 응답에 포함할 메트릭 그룹의 쉼표로 구분된 목록이에요. 유효한 값은 Metrics를 참고해요. 기본값은 모든 메트릭이에요. |
메트릭 (Metrics)
다음 표는 사용 가능한 모든 메트릭 그룹을 정리한 거예요.
| 메트릭 | 설명 |
|---|---|
_all |
모든 통계를 반환해요. |
completion |
completion suggester 통계예요. |
docs |
문서 수와 아직 병합되지 않은 삭제 문서 수를 반환해요. 인덱스 새로고침 작업이 이 통계에 영향을 줄 수 있어요. |
fielddata |
필드 데이터 통계예요. |
flush |
flush 통계예요. |
get |
missing 통계를 포함한 get 통계예요. |
indexing |
색인 통계예요. |
merge |
병합 통계예요. |
query_cache |
쿼리 캐시 통계예요. |
refresh |
새로고침 통계예요. |
request_cache |
샤드 요청 캐시 통계예요. |
search |
suggest 작업 통계를 포함한 검색 통계예요. 검색 작업은 하나 이상의 그룹과 연결될 수 있어요. 사용자 지정 그룹의 통계를 포함하려면 groups 매개변수(쉼표로 구분된 그룹 이름 목록)를 제공해요. 모든 그룹의 통계를 반환하려면 _all을 사용해요. |
segments |
열린 모든 세그먼트의 메모리 사용 통계예요. include_segment_file_sizes 매개변수가 true면 이 메트릭이 각 Lucene 인덱스 파일의 집계된 디스크 사용량을 포함해요. |
store |
바이트 단위의 인덱스 크기예요. |
translog |
translog 통계예요. |
warmer |
warmer 통계예요. |
쿼리 매개변수 (Query parameters)
다음 표는 사용 가능한 쿼리 매개변수예요. 모든 쿼리 매개변수는 선택 사항이에요.
| 매개변수 | 데이터 타입 | 설명 |
|---|---|---|
expand_wildcards |
String | 와일드카드 표현식이 확장될 인덱스 유형을 지정해요. 쉼표로 구분된 값을 지원해요. 유효한 값은 다음과 같아요: |
- all: 숨은 인덱스를 포함해 모든 열린·닫힌 인덱스로 확장해요. |
||
- open: 열린 인덱스로 확장해요. |
||
- closed: 닫힌 인덱스로 확장해요. |
||
- hidden: 확장할 때 숨은 인덱스를 포함해요. open, closed 또는 둘 다와 함께 사용해야 해요. |
||
- none: 와일드카드 표현식을 허용하지 않아요. |
||
기본값은 open이에요. |
||
fields |
String | 통계에 포함할 필드를 지정하는 쉼표로 구분된 목록 또는 와일드카드 표현식이에요. completion_fields도 fielddata_fields도 제공되지 않으면 기본 필드 목록을 지정해요. |
completion_fields |
String | 필드 수준 completion 통계에 포함할 필드를 지정하는 쉼표로 구분된 목록 또는 와일드카드 표현식이에요. |
fielddata_fields |
String | 필드 수준 fielddata 통계에 포함할 필드를 지정하는 쉼표로 구분된 목록 또는 와일드카드 표현식이에요. |
forbid_closed_indices |
Boolean | 닫힌 인덱스의 통계를 수집하지 않도록 지정해요. 기본값은 true예요. |
groups |
String | search 통계에 포함할 검색 그룹의 쉼표로 구분된 목록이에요. 검색 그룹은 Search API의 stats 매개변수로 검색 요청에 배정된 사용자 지정 라벨이에요. 모든 그룹의 통계를 반환하려면 _all을 사용해요. |
level |
String | 통계를 집계할 수준을 지정해요. 유효한 값은 다음과 같아요: |
- cluster: 클러스터 수준 통계예요. |
||
- indices: 인덱스 수준 통계예요. |
||
- shards: 샤드 수준 통계예요. |
||
기본값은 indices예요. |
||
include_segment_file_sizes |
Boolean | 각 Lucene 인덱스 파일의 집계된 디스크 사용량을 보고할지 지정해요. segments 통계에만 적용돼요. 기본값은 false예요. |
include_unloaded_segments |
Boolean | 메모리에 로드되지 않은 세그먼트의 정보를 포함할지 지정해요. 기본값은 false예요. |
예시 요청 (Example requests)
다음 예시 요청들은 Index Stats API를 사용하는 방법을 보여줘요.
단일 인덱스 (One index)
다음 예시는 단일 인덱스의 인덱스 통계를 반환해요:
GET /testindex/_stats
Python 클라이언트로는 이렇게 호출해요:
response = client.indices.stats(
index = "testindex"
)
쉼표로 구분된 인덱스 목록 (Comma-separated list of indexes)
다음 예시는 여러 인덱스의 통계를 반환해요:
GET /testindex1,testindex2/_stats
Python 클라이언트로는 이렇게 호출해요:
response = client.indices.stats(
index = "testindex1,testindex2"
)
와일드카드 표현식 (Wildcard expression)
다음 예시는 이름이 testindex로 시작하는 모든 인덱스의 통계를 반환해요:
GET /testindex*/_stats
Python 클라이언트로는 이렇게 호출해요:
response = client.indices.stats(
index = "testindex*"
)
특정 통계 (Specific stats)
다음 예시는 인덱스와 flush 작업 관련 인덱스 통계를 반환해요:
GET /testindex/_stats/refresh,flush
Python 클라이언트로는 이렇게 호출해요:
response = client.indices.stats(
metric = "refresh,flush",
index = "testindex"
)
와일드카드 확장 (Expand wildcards)
다음 예시는 인덱스 통계와 관련된 모든 와일드카드를 확장해요:
GET /testindex*/_stats?expand_wildcards=open,hidden
Python 클라이언트로는 이렇게 호출해요:
response = client.indices.stats(
index = "testindex*",
params = { "expand_wildcards": "open,hidden" }
)
샤드 수준 통계 (Shard-level statistics)
다음 예시는 테스트 인덱스의 샤드 수준 통계를 반환해요:
GET /testindex/_stats?level=shards
Python 클라이언트로는 이렇게 호출해요:
response = client.indices.stats(
index = "testindex",
params = { "level": "shards" }
)
특정 검색 그룹 (Specific search groups)
다음 예시는 group1과 group2 검색 그룹의 검색 통계를 반환해요:
GET /_stats/search?groups=group1,group2
Python 클라이언트로는 이렇게 호출해요:
response = client.indices.stats(
metric = "search",
params = { "groups": "group1,group2" }
)
예시 응답 (Example response)
기본적으로 반환되는 통계는 primaries와 total 두 그룹으로 나뉘어요. primaries 그룹은 기본(primary) 샤드에 대해서만 계산된 값을, total 그룹은 기본·복제 샤드 양쪽에 걸쳐 누적된 값을 담고 있어요. 다음은 Index Stats API 응답의 예시예요.
{
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_all": {
"primaries": {
"docs": {
"count": 4,
"deleted": 0
},
"store": {
"size_in_bytes": 15531,
"reserved_in_bytes": 0
},
"indexing": {
"index_total": 4,
"index_time_in_millis": 10,
"index_current": 0,
"index_failed": 0,
"delete_total": 0,
"delete_time_in_millis": 0,
"delete_current": 0,
"noop_update_total": 0,
"is_throttled": false,
"throttle_time_in_millis": 0
},
"get": {
"total": 0,
"time_in_millis": 0,
"exists_total": 0,
"exists_time_in_millis": 0,
"missing_total": 0,
"missing_time_in_millis": 0,
"current": 0
},
"search": {
"open_contexts": 0,
"query_total": 12,
"query_time_in_millis": 11,
"query_current": 0,
"fetch_total": 12,
"fetch_time_in_millis": 5,
"fetch_current": 0,
"scroll_total": 0,
"scroll_time_in_millis": 0,
"scroll_current": 0,
"point_in_time_total": 0,
"point_in_time_time_in_millis": 0,
"point_in_time_current": 0,
"suggest_total": 0,
"suggest_time_in_millis": 0,
"suggest_current": 0
},
"merges": {
"current": 0,
"current_docs": 0,
"current_size_in_bytes": 0,
"total": 0,
"total_time_in_millis": 0,
"total_docs": 0,
"total_size_in_bytes": 0,
"total_stopped_time_in_millis": 0,
"total_throttled_time_in_millis": 0,
"total_auto_throttle_in_bytes": 20971520
},
"refresh": {
"total": 8,
"total_time_in_millis": 58,
"external_total": 7,
"external_total_time_in_millis": 60,
"listeners": 0
},
"flush": {
"total": 1,
"periodic": 1,
"total_time_in_millis": 21
},
"warmer": {
"current": 0,
"total": 6,
"total_time_in_millis": 0
},
"query_cache": {
"memory_size_in_bytes": 0,
"total_count": 0,
"hit_count": 0,
"miss_count": 0,
"cache_size": 0,
"cache_count": 0,
"evictions": 0
},
"fielddata": {
"memory_size_in_bytes": 0,
"evictions": 0,
"item_count": 0
},
"completion": {
"size_in_bytes": 0
},
"segments": {
"count": 4,
"memory_in_bytes": 0,
"terms_memory_in_bytes": 0,
"stored_fields_memory_in_bytes": 0,
"term_vectors_memory_in_bytes": 0,
"norms_memory_in_bytes": 0,
"points_memory_in_bytes": 0,
"doc_values_memory_in_bytes": 0,
"index_writer_memory_in_bytes": 0,
"version_map_memory_in_bytes": 0,
"fixed_bit_set_memory_in_bytes": 0,
"max_unsafe_auto_id_timestamp": -1,
"remote_store" : {
"upload" : {
"total_upload_size" : {
"started_bytes" : 152419,
"succeeded_bytes" : 152419,
"failed_bytes" : 0
},
"refresh_size_lag" : {
"total_bytes" : 0,
"max_bytes" : 0
},
"max_refresh_time_lag_in_millis" : 0,
"total_time_spent_in_millis" : 516,
"pressure" : {
"total_rejections" : 0
}
},
"download" : {
"total_download_size" : {
"started_bytes" : 0,
"succeeded_bytes" : 0,
"failed_bytes" : 0
},
"total_time_spent_in_millis" : 0
}
},
"file_sizes": {}
},
"translog": {
"operations": 0,
"size_in_bytes": 55,
"uncommitted_operations": 0,
"uncommitted_size_in_bytes": 55,
"earliest_last_modified_age": 142622215,
"remote_store" : {
"upload" : {
"total_uploads" : {
"started" : 57,
"failed" : 0,
"succeeded" : 57
},
"total_upload_size" : {
"started_bytes" : 16830,
"failed_bytes" : 0,
"succeeded_bytes" : 16830
}
}
}
},
"request_cache": {
"memory_size_in_bytes": 0,
"evictions": 0,
"hit_count": 0,
"miss_count": 0
},
"recovery": {
"current_as_source": 0,
"current_as_target": 0,
"throttle_time_in_millis": 0
}
},
"total": {
"docs": {
"count": 4,
"deleted": 0
},
"store": {
"size_in_bytes": 15531,
"reserved_in_bytes": 0
},
"indexing": {
"index_total": 4,
"index_time_in_millis": 10,
"index_current": 0,
"index_failed": 0,
"delete_total": 0,
"delete_time_in_millis": 0,
"delete_current": 0,
"noop_update_total": 0,
"is_throttled": false,
"throttle_time_in_millis": 0
},
"get": {
"total": 0,
"time_in_millis": 0,
"exists_total": 0,
"exists_time_in_millis": 0,
"missing_total": 0,
"missing_time_in_millis": 0,
"current": 0
},
"search": {
"open_contexts": 0,
"query_total": 12,
"query_time_in_millis": 11,
"query_current": 0,
"fetch_total": 12,
"fetch_time_in_millis": 5,
"fetch_current": 0,
"scroll_total": 0,
"scroll_time_in_millis": 0,
"scroll_current": 0,
"point_in_time_total": 0,
"point_in_time_time_in_millis": 0,
"point_in_time_current": 0,
"suggest_total": 0,
"suggest_time_in_millis": 0,
"suggest_current": 0
},
"merges": {
"current": 0,
"current_docs": 0,
"current_size_in_bytes": 0,
"total": 0,
"total_time_in_millis": 0,
"total_docs": 0,
"total_size_in_bytes": 0,
"total_stopped_time_in_millis": 0,
"total_throttled_time_in_millis": 0,
"total_auto_throttle_in_bytes": 20971520
},
"refresh": {
"total": 8,
"total_time_in_millis": 58,
"external_total": 7,
"external_total_time_in_millis": 60,
"listeners": 0
},
"flush": {
"total": 1,
"periodic": 1,
"total_time_in_millis": 21
},
"warmer": {
"current": 0,
"total": 6,
"total_time_in_millis": 0
},
"query_cache": {
"memory_size_in_bytes": 0,
"total_count": 0,
"hit_count": 0,
"miss_count": 0,
"cache_size": 0,
"cache_count": 0,
"evictions": 0
},
"fielddata": {
"memory_size_in_bytes": 0,
"evictions": 0,
"item_count": 0
},
"completion": {
"size_in_bytes": 0
},
"segments": {
"count": 4,
"memory_in_bytes": 0,
"terms_memory_in_bytes": 0,
"stored_fields_memory_in_bytes": 0,
"term_vectors_memory_in_bytes": 0,
"norms_memory_in_bytes": 0,
"points_memory_in_bytes": 0,
"doc_values_memory_in_bytes": 0,
"index_writer_memory_in_bytes": 0,
"version_map_memory_in_bytes": 0,
"fixed_bit_set_memory_in_bytes": 0,
"max_unsafe_auto_id_timestamp": -1,
"remote_store" : {
"upload" : {
"total_upload_size" : {
"started_bytes" : 152419,
"succeeded_bytes" : 152419,
"failed_bytes" : 0
},
"refresh_size_lag" : {
"total_bytes" : 0,
"max_bytes" : 0
},
"max_refresh_time_lag_in_millis" : 0,
"total_time_spent_in_millis" : 516,
"pressure" : {
"total_rejections" : 0
}
},
"download" : {
"total_download_size" : {
"started_bytes" : 0,
"succeeded_bytes" : 0,
"failed_bytes" : 0
},
"total_time_spent_in_millis" : 0
}
},
"file_sizes": {}
},
"translog": {
"operations": 0,
"size_in_bytes": 55,
"uncommitted_operations": 0,
"uncommitted_size_in_bytes": 55,
"earliest_last_modified_age": 142622215,
"remote_store" : {
"upload" : {
"total_uploads" : {
"started" : 57,
"failed" : 0,
"succeeded" : 57
},
"total_upload_size" : {
"started_bytes" : 16830,
"failed_bytes" : 0,
"succeeded_bytes" : 16830
}
}
}
},
"request_cache": {
"memory_size_in_bytes": 0,
"evictions": 0,
"hit_count": 0,
"miss_count": 0
},
"recovery": {
"current_as_source": 0,
"current_as_target": 0,
"throttle_time_in_millis": 0
}
}
},
"indices": {
"testindex": {
"uuid": "0SXXSpe9Rp-FpxXXWLOD8Q",
"primaries": {
"docs": {
"count": 4,
"deleted": 0
},
"store": {
"size_in_bytes": 15531,
"reserved_in_bytes": 0
},
"indexing": {
"index_total": 4,
"index_time_in_millis": 10,
"index_current": 0,
"index_failed": 0,
"delete_total": 0,
"delete_time_in_millis": 0,
"delete_current": 0,
"noop_update_total": 0,
"is_throttled": false,
"throttle_time_in_millis": 0
},
"get": {
"total": 0,
"time_in_millis": 0,
"exists_total": 0,
"exists_time_in_millis": 0,
"missing_total": 0,
"missing_time_in_millis": 0,
"current": 0
},
"search": {
"open_contexts": 0,
"query_total": 12,
"query_time_in_millis": 11,
"query_current": 0,
"fetch_total": 12,
"fetch_time_in_millis": 5,
"fetch_current": 0,
"scroll_total": 0,
"scroll_time_in_millis": 0,
"scroll_current": 0,
"point_in_time_total": 0,
"point_in_time_time_in_millis": 0,
"point_in_time_current": 0,
"suggest_total": 0,
"suggest_time_in_millis": 0,
"suggest_current": 0
},
"merges": {
"current": 0,
"current_docs": 0,
"current_size_in_bytes": 0,
"total": 0,
"total_time_in_millis": 0,
"total_docs": 0,
"total_size_in_bytes": 0,
"total_stopped_time_in_millis": 0,
"total_throttled_time_in_millis": 0,
"total_auto_throttle_in_bytes": 20971520
},
"refresh": {
"total": 8,
"total_time_in_millis": 58,
"external_total": 7,
"external_total_time_in_millis": 60,
"listeners": 0
},
"flush": {
"total": 1,
"periodic": 1,
"total_time_in_millis": 21
},
"warmer": {
"current": 0,
"total": 6,
"total_time_in_millis": 0
},
"query_cache": {
"memory_size_in_bytes": 0,
"total_count": 0,
"hit_count": 0,
"miss_count": 0,
"cache_size": 0,
"cache_count": 0,
"evictions": 0
},
"fielddata": {
"memory_size_in_bytes": 0,
"evictions": 0,
"item_count": 0
},
"completion": {
"size_in_bytes": 0
},
"segments": {
"count": 4,
"memory_in_bytes": 0,
"terms_memory_in_bytes": 0,
"stored_fields_memory_in_bytes": 0,
"term_vectors_memory_in_bytes": 0,
"norms_memory_in_bytes": 0,
"points_memory_in_bytes": 0,
"doc_values_memory_in_bytes": 0,
"index_writer_memory_in_bytes": 0,
"version_map_memory_in_bytes": 0,
"fixed_bit_set_memory_in_bytes": 0,
"max_unsafe_auto_id_timestamp": -1,
"remote_store" : {
"upload" : {
"total_upload_size" : {
"started_bytes" : 152419,
"succeeded_bytes" : 152419,
"failed_bytes" : 0
},
"refresh_size_lag" : {
"total_bytes" : 0,
"max_bytes" : 0
},
"max_refresh_time_lag_in_millis" : 0,
"total_time_spent_in_millis" : 516,
"pressure" : {
"total_rejections" : 0
}
},
"download" : {
"total_download_size" : {
"started_bytes" : 0,
"succeeded_bytes" : 0,
"failed_bytes" : 0
},
"total_time_spent_in_millis" : 0
}
},
"file_sizes": {}
},
"translog": {
"operations": 0,
"size_in_bytes": 55,
"uncommitted_operations": 0,
"uncommitted_size_in_bytes": 55,
"earliest_last_modified_age": 142622215,
"remote_store" : {
"upload" : {
"total_uploads" : {
"started" : 57,
"failed" : 0,
"succeeded" : 57
},
"total_upload_size" : {
"started_bytes" : 16830,
"failed_bytes" : 0,
"succeeded_bytes" : 16830
}
}
}
},
"request_cache": {
"memory_size_in_bytes": 0,
"evictions": 0,
"hit_count": 0,
"miss_count": 0
},
"recovery": {
"current_as_source": 0,
"current_as_target": 0,
"throttle_time_in_millis": 0
}
},
"total": {
"docs": {
"count": 4,
"deleted": 0
},
"store": {
"size_in_bytes": 15531,
"reserved_in_bytes": 0
},
"indexing": {
"index_total": 4,
"index_time_in_millis": 10,
"index_current": 0,
"index_failed": 0,
"delete_total": 0,
"delete_time_in_millis": 0,
"delete_current": 0,
"noop_update_total": 0,
"is_throttled": false,
"throttle_time_in_millis": 0
},
"get": {
"total": 0,
"time_in_millis": 0,
"exists_total": 0,
"exists_time_in_millis": 0,
"missing_total": 0,
"missing_time_in_millis": 0,
"current": 0
},
"search": {
"open_contexts": 0,
"query_total": 12,
"query_time_in_millis": 11,
"query_current": 0,
"fetch_total": 12,
"fetch_time_in_millis": 5,
"fetch_current": 0,
"scroll_total": 0,
"scroll_time_in_millis": 0,
"scroll_current": 0,
"point_in_time_total": 0,
"point_in_time_time_in_millis": 0,
"point_in_time_current": 0,
"suggest_total": 0,
"suggest_time_in_millis": 0,
"suggest_current": 0
},
"merges": {
"current": 0,
"current_docs": 0,
"current_size_in_bytes": 0,
"total": 0,
"total_time_in_millis": 0,
"total_docs": 0,
"total_size_in_bytes": 0,
"total_stopped_time_in_millis": 0,
"total_throttled_time_in_millis": 0,
"total_auto_throttle_in_bytes": 20971520
},
"refresh": {
"total": 8,
"total_time_in_millis": 58,
"external_total": 7,
"external_total_time_in_millis": 60,
"listeners": 0
},
"flush": {
"total": 1,
"periodic": 1,
"total_time_in_millis": 21
},
"warmer": {
"current": 0,
"total": 6,
"total_time_in_millis": 0
},
"query_cache": {
"memory_size_in_bytes": 0,
"total_count": 0,
"hit_count": 0,
"miss_count": 0,
"cache_size": 0,
"cache_count": 0,
"evictions": 0
},
"fielddata": {
"memory_size_in_bytes": 0,
"evictions": 0,
"item_count": 0
},
"completion": {
"size_in_bytes": 0
},
"segments": {
"count": 4,
"memory_in_bytes": 0,
"terms_memory_in_bytes": 0,
"stored_fields_memory_in_bytes": 0,
"term_vectors_memory_in_bytes": 0,
"norms_memory_in_bytes": 0,
"points_memory_in_bytes": 0,
"doc_values_memory_in_bytes": 0,
"index_writer_memory_in_bytes": 0,
"version_map_memory_in_bytes": 0,
"fixed_bit_set_memory_in_bytes": 0,
"max_unsafe_auto_id_timestamp": -1,
"remote_store" : {
"upload" : {
"total_upload_size" : {
"started_bytes" : 152419,
"succeeded_bytes" : 152419,
"failed_bytes" : 0
},
"refresh_size_lag" : {
"total_bytes" : 0,
"max_bytes" : 0
},
"max_refresh_time_lag_in_millis" : 0,
"total_time_spent_in_millis" : 516,
"pressure" : {
"total_rejections" : 0
}
},
"download" : {
"total_download_size" : {
"started_bytes" : 0,
"succeeded_bytes" : 0,
"failed_bytes" : 0
},
"total_time_spent_in_millis" : 0
}
},
"file_sizes": {}
},
"translog": {
"operations": 0,
"size_in_bytes": 55,
"uncommitted_operations": 0,
"uncommitted_size_in_bytes": 55,
"earliest_last_modified_age": 142622215,
"remote_store" : {
"upload" : {
"total_uploads" : {
"started" : 57,
"failed" : 0,
"succeeded" : 57
},
"total_upload_size" : {
"started_bytes" : 16830,
"failed_bytes" : 0,
"succeeded_bytes" : 16830
}
}
}
},
"request_cache": {
"memory_size_in_bytes": 0,
"evictions": 0,
"hit_count": 0,
"miss_count": 0
},
"recovery": {
"current_as_source": 0,
"current_as_target": 0,
"throttle_time_in_millis": 0
}
}
}
}
}
응답 본문 필드 (Response body fields)
응답 필드에 대한 자세한 내용은 Nodes Stats API 응답 필드를 참고해요.
필요한 권한 (Required permissions)
Security 플러그인을 사용한다면 적절한 권한이 있는지 확인해야 해요: indices:monitor/stats.