diff --git a/packages/redis/_dev/deploy/docker/Dockerfile b/packages/redis/_dev/deploy/docker/Dockerfile new file mode 100644 index 00000000000..6fc5f71d411 --- /dev/null +++ b/packages/redis/_dev/deploy/docker/Dockerfile @@ -0,0 +1,12 @@ +ARG SERVICE_VERSION=${SERVICE_VERSION:-8.2.3} +FROM redis:${SERVICE_VERSION}-alpine +HEALTHCHECK --interval=1s --retries=90 CMD nc -z localhost 6379 + +RUN apk add --no-cache netcat-openbsd + +COPY entrypoint.sh /usr/local/bin/entrypoint.sh +COPY seed-keyspace.sh /usr/local/bin/seed-keyspace.sh + +# Override image entrypoint; keep default CMD (or set your own). +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["redis-server"] \ No newline at end of file diff --git a/packages/redis/_dev/deploy/docker/docker-compose.yml b/packages/redis/_dev/deploy/docker/docker-compose.yml new file mode 100644 index 00000000000..0ccf02898a2 --- /dev/null +++ b/packages/redis/_dev/deploy/docker/docker-compose.yml @@ -0,0 +1,8 @@ +services: + redis: + build: + context: . + args: + SERVICE_VERSION: ${SERVICE_VERSION} + ports: + - 6379 diff --git a/packages/redis/_dev/deploy/docker/entrypoint.sh b/packages/redis/_dev/deploy/docker/entrypoint.sh new file mode 100755 index 00000000000..11a4ba64d3e --- /dev/null +++ b/packages/redis/_dev/deploy/docker/entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/sh +set -eu + +# Run seeding in background (it will wait for Redis to be ready) +/usr/local/bin/seed-keyspace.sh & + +# Hand off to the original entrypoint/command in the foreground (PID 1) +exec docker-entrypoint.sh "$@" diff --git a/packages/redis/_dev/deploy/docker/seed-keyspace.sh b/packages/redis/_dev/deploy/docker/seed-keyspace.sh new file mode 100755 index 00000000000..3d33114802d --- /dev/null +++ b/packages/redis/_dev/deploy/docker/seed-keyspace.sh @@ -0,0 +1,52 @@ +#!/bin/sh +set -eu + +# Minimal seeding script for local Redis inside the container. +# Uses only redis-cli defaults (local unix socket / localhost). No host/port flags. + +MAX_WAIT_SECONDS="${MAX_WAIT_SECONDS:-30}" +SLEEP_SECONDS="${SLEEP_SECONDS:-0.2}" + +KEY_PREFIX="${KEY_PREFIX:-test:keyspace}" +KEY_COUNT="${KEY_COUNT:-3}" + +log() { + printf '%s\n' "$*" >&2 +} + +if ! command -v redis-cli >/dev/null 2>&1; then + log "seed-keyspace: redis-cli not found" + exit 1 +fi + +log "seed-keyspace: waiting for local redis (max ${MAX_WAIT_SECONDS}s)" +end=$(( $(date +%s) + MAX_WAIT_SECONDS )) + +until redis-cli PING >/dev/null 2>&1; do + if [ "$(date +%s)" -ge "${end}" ]; then + log "seed-keyspace: timed out waiting for redis" + # Print one last attempt output to help debugging. + redis-cli PING >&2 || true + exit 1 + fi + sleep "${SLEEP_SECONDS}" +done + +log "seed-keyspace: redis is up; seeding ${KEY_COUNT} keys" + +i=1 +while [ "${i}" -le "${KEY_COUNT}" ]; do + redis-cli SET "${KEY_PREFIX}:${i}" "value-${i}" >/dev/null + i=$((i + 1)) +done + +# Optional: ensure it shows up in INFO keyspace. +if [ "${VERIFY_KEYSPACE:-1}" != "0" ]; then + redis-cli INFO keyspace | grep -E '^db0:' >/dev/null 2>&1 || { + log "seed-keyspace: seed done but INFO keyspace doesn't contain db0" + redis-cli INFO keyspace >&2 || true + exit 1 + } + log "seed-keyspace: verified db0 present" +fi + diff --git a/packages/redis/_dev/deploy/variants.yml b/packages/redis/_dev/deploy/variants.yml new file mode 100644 index 00000000000..e017e86e125 --- /dev/null +++ b/packages/redis/_dev/deploy/variants.yml @@ -0,0 +1,8 @@ +variants: + "v6": + SERVICE_VERSION: 6.2.6 + "v7": + SERVICE_VERSION: 7.4.7 + "v8": + SERVICE_VERSION: 8.2.3 +default: v8 diff --git a/packages/redis/changelog.yml b/packages/redis/changelog.yml index 570521da61a..0f1c3564c97 100644 --- a/packages/redis/changelog.yml +++ b/packages/redis/changelog.yml @@ -1,4 +1,9 @@ # newer versions go on top +- version: "1.21.0" + changes: + - description: Add new fields for Redis 7.x and 8.x + type: enhancement + link: https://github.com/elastic/integrations/pull/16732 - version: "1.20.0" changes: - description: Allow @custom pipeline access to event.original without setting preserve_original_event. diff --git a/packages/redis/data_stream/info/_dev/test/system/test-default-config.yml b/packages/redis/data_stream/info/_dev/test/system/test-default-config.yml new file mode 100644 index 00000000000..f52634acfe2 --- /dev/null +++ b/packages/redis/data_stream/info/_dev/test/system/test-default-config.yml @@ -0,0 +1,5 @@ +vars: + hosts: + - "{{Hostname}}:6379" +data_stream: + vars: ~ \ No newline at end of file diff --git a/packages/redis/data_stream/info/fields/fields.yml b/packages/redis/data_stream/info/fields/fields.yml index 867126ea4ef..d27174afa88 100644 --- a/packages/redis/data_stream/info/fields/fields.yml +++ b/packages/redis/data_stream/info/fields/fields.yml @@ -90,11 +90,21 @@ format: bytes metric_type: gauge description: "Used memory by the Lua engine. \n" + - name: used.scripts + type: long + format: bytes + description: > + Used memory by Lua scripts. - name: used.dataset type: long format: bytes metric_type: gauge description: "The size in bytes of the dataset \n" + - name: total_system + type: long + format: bytes + description: > + Total amount in bytes of memory available to Redis. - name: max.value type: long format: bytes @@ -401,6 +411,8 @@ type: long - name: config_file type: keyword + - name: number_of_cached_scripts + type: long - name: stats type: group fields: @@ -519,11 +531,53 @@ metric_type: gauge description: | Number of keys that were skipped by the active defragmentation process + - name: tracking + type: group + description: > + Redis client side caching tracking stats. + fields: + - name: total_keys + type: long + description: > + Total number of keys being tracked. + - name: total_items + type: long + description: > + Total number of tracked items. + - name: total_prefixes + type: long + description: > + Total number of tracked prefixes. - name: slowlog.count type: long metric_type: gauge description: | Count of slow operations + - name: commandstats + type: group + description: > + Redis command statistics + fields: + - name: "*.calls" + type: long + description: > + The number of calls that reached command execution (not rejected). + - name: "*.usec" + type: long + description: > + The total CPU time consumed by these commands. + - name: "*.usec_per_call" + type: float + description: > + The average CPU consumed per command execution. + - name: "*.rejected_calls" + type: long + description: > + The number of rejected calls (on redis 6.2-rc2). + - name: "*.failed_calls" + type: long + description: > + The number of failed calls (on redis 6.2-rc2). - name: os type: group description: The OS fields contain information about the operating system. diff --git a/packages/redis/data_stream/info/sample_event.json b/packages/redis/data_stream/info/sample_event.json index 64bc5854cdb..778111a9a40 100644 --- a/packages/redis/data_stream/info/sample_event.json +++ b/packages/redis/data_stream/info/sample_event.json @@ -1,183 +1,246 @@ { - "@timestamp": "2020-06-25T10:16:10.138Z", - "ecs": { - "version": "8.11.0" - }, - "event": { - "dataset": "redis.info", - "duration": 374411, - "module": "redis" - }, - "metricset": { - "name": "info", - "period": 10000 - }, - "redis": { + "@timestamp": "2025-12-31T13:03:46.990Z", + "ecs": { + "version": "8.0.0" + }, + "event": { + "agent_id_status": "verified", + "dataset": "redis.info", + "duration": 1360250, + "ingested": "2025-12-31T13:03:48Z", + "module": "redis" + }, + "metricset": { + "name": "info", + "period": 10000 + }, + "redis": { + "info": { + "clients": { + "blocked": 0, + "connected": 3, + "max_input_buffer": 0, + "max_output_buffer": 0 + }, + "cluster": { + "enabled": false + }, + "commandstats": { + "config|get": { + "calls": 2, + "failed_calls": 0, + "rejected_calls": 0, + "usec": 4, + "usec_per_call": 2 + }, "info": { - "clients": { - "biggest_input_buf": 0, - "blocked": 0, - "connected": 5, - "longest_output_list": 0, - "max_input_buffer": 0, - "max_output_buffer": 0 - }, - "cluster": { - "enabled": false - }, - "cpu": { - "used": { - "sys": 1.66, - "sys_children": 0, - "user": 0.39, - "user_children": 0.01 - } - }, - "memory": { - "active_defrag": {}, - "allocator": "jemalloc-4.0.3", - "allocator_stats": { - "fragmentation": {}, - "rss": {} - }, - "fragmentation": { - "ratio": 2.71 - }, - "max": { - "policy": "noeviction", - "value": 0 - }, - "used": { - "lua": 37888, - "peak": 945016, - "rss": 2453504, - "value": 904992 - } - }, - "persistence": { - "aof": { - "bgrewrite": { - "last_status": "ok" - }, - "buffer": {}, - "copy_on_write": {}, - "enabled": false, - "fsync": {}, - "rewrite": { - "buffer": {}, - "current_time": { - "sec": -1 - }, - "in_progress": false, - "last_time": { - "sec": -1 - }, - "scheduled": false - }, - "size": {}, - "write": { - "last_status": "ok" - } - }, - "loading": false, - "rdb": { - "bgsave": { - "current_time": { - "sec": -1 - }, - "in_progress": false, - "last_status": "ok", - "last_time": { - "sec": -1 - } - }, - "copy_on_write": {}, - "last_save": { - "changes_since": 35, - "time": 1548663522 - } - } - }, - "replication": { - "backlog": { - "active": 0, - "first_byte_offset": 0, - "histlen": 0, - "size": 1048576 - }, - "connected_slaves": 0, - "master": { - "offset": 0, - "sync": {} - }, - "master_offset": 0, - "role": "master", - "slave": {} + "calls": 54, + "failed_calls": 0, + "rejected_calls": 0, + "usec": 8183, + "usec_per_call": 151.54 + }, + "scan": { + "calls": 3, + "failed_calls": 0, + "rejected_calls": 0, + "usec": 12, + "usec_per_call": 4 + }, + "select": { + "calls": 4, + "failed_calls": 0, + "rejected_calls": 0, + "usec": 10, + "usec_per_call": 2.5 + }, + "slowlog|len": { + "calls": 45, + "failed_calls": 0, + "rejected_calls": 0, + "usec": 78, + "usec_per_call": 1.73 + } + }, + "cpu": { + "used": { + "sys": 0.213, + "sys_children": 0.001, + "user": 0.903, + "user_children": 0.005 + } + }, + "memory": { + "active_defrag": { + "is_running": false + }, + "allocator": "jemalloc-5.3.0", + "allocator_stats": { + "active": 15073280, + "allocated": 4412336, + "fragmentation": { + "bytes": 7413072, + "ratio": 4.15 + }, + "resident": 16449536, + "rss": { + "bytes": 1376256, + "ratio": 1.09 + } + }, + "fragmentation": { + "bytes": 19869600, + "ratio": 19.03 + }, + "max": { + "policy": "noeviction", + "value": 0 + }, + "total_system": 16731578368, + "used": { + "dataset": 31264, + "lua": 32768, + "peak": 1148168, + "rss": 20971520, + "scripts": 192, + "value": 1103880 + } + }, + "persistence": { + "aof": { + "bgrewrite": { + "last_status": "ok" + }, + "copy_on_write": { + "last_size": 0 + }, + "enabled": false, + "rewrite": { + "current_time": { + "sec": -1 }, - "server": { - "arch_bits": "64", - "build_id": "b9a4cd86ce8027d3", - "config_file": "", - "gcc_version": "6.4.0", - "git_dirty": "0", - "git_sha1": "00000000", - "hz": 10, - "lru_clock": 5159690, - "mode": "standalone", - "multiplexing_api": "epoll", - "run_id": "0f681cb959aa47413ec40ff383715c923f9cbefd", - "tcp_port": 6379, - "uptime": 707 + "in_progress": false, + "last_time": { + "sec": -1 }, - "slowlog": { - "count": 0 + "scheduled": false + }, + "write": { + "last_status": "ok" + } + }, + "loading": false, + "rdb": { + "bgsave": { + "current_time": { + "sec": -1 }, - "stats": { - "active_defrag": {}, - "commands_processed": 265, - "connections": { - "received": 848, - "rejected": 0 - }, - "instantaneous": { - "input_kbps": 0.18, - "ops_per_sec": 6, - "output_kbps": 1.39 - }, - "keys": { - "evicted": 0, - "expired": 0 - }, - "keyspace": { - "hits": 15, - "misses": 0 - }, - "latest_fork_usec": 0, - "migrate_cached_sockets": 0, - "net": { - "input": { - "bytes": 7300 - }, - "output": { - "bytes": 219632 - } - }, - "pubsub": { - "channels": 0, - "patterns": 0 - }, - "sync": { - "full": 0, - "partial": { - "err": 0, - "ok": 0 - } - } + "in_progress": false, + "last_status": "ok", + "last_time": { + "sec": -1 } + }, + "copy_on_write": { + "last_size": 0 + }, + "last_save": { + "changes_since": 0, + "time": 1767185772 + } + } + }, + "replication": { + "backlog": { + "active": 0, + "first_byte_offset": 0, + "histlen": 0, + "size": 1048576 + }, + "connected_slaves": 0, + "master": { + "offset": 0, + "second_offset": -1 + }, + "role": "master" + }, + "server": { + "arch_bits": "64", + "build_id": "ad6b706b81f82e04", + "config_file": "", + "gcc_version": "14.2.0", + "git_dirty": "1", + "git_sha1": "00000000", + "hz": 10, + "lru_clock": 5578546, + "mode": "standalone", + "multiplexing_api": "epoll", + "number_of_cached_scripts": 0, + "run_id": "7c52d5e16e392e2c059c567833498a2dd53f32f7", + "tcp_port": 6379, + "uptime": 455 + }, + "slowlog": { + "count": 0 + }, + "stats": { + "active_defrag": { + "hits": 0, + "key_hits": 0, + "key_misses": 0, + "misses": 0 + }, + "commands_processed": 108, + "connections": { + "received": 4, + "rejected": 0 + }, + "instantaneous": { + "input_kbps": 0, + "ops_per_sec": 0, + "output_kbps": 0 + }, + "keys": { + "evicted": 0, + "expired": 0 + }, + "keyspace": { + "hits": 0, + "misses": 0 + }, + "latest_fork_usec": 0, + "migrate_cached_sockets": 0, + "net": { + "input": { + "bytes": 2521 + }, + "output": { + "bytes": 304894 + } + }, + "pubsub": { + "channels": 0, + "patterns": 0 + }, + "slave_expires_tracked_keys": 0, + "sync": { + "full": 0, + "partial": { + "err": 0, + "ok": 0 + } + }, + "tracking": { + "total_items": 0, + "total_keys": 0, + "total_prefixes": 0 } - }, - "service": { - "address": "localhost:6379", - "type": "redis" + } } + }, + "service": { + "address": "redis://127.0.0.1:6379", + "type": "redis", + "version": "8.2.3" + } } \ No newline at end of file diff --git a/packages/redis/data_stream/key/_dev/test/system/test-default-config.yml b/packages/redis/data_stream/key/_dev/test/system/test-default-config.yml new file mode 100644 index 00000000000..f52634acfe2 --- /dev/null +++ b/packages/redis/data_stream/key/_dev/test/system/test-default-config.yml @@ -0,0 +1,5 @@ +vars: + hosts: + - "{{Hostname}}:6379" +data_stream: + vars: ~ \ No newline at end of file diff --git a/packages/redis/data_stream/key/fields/fields.yml b/packages/redis/data_stream/key/fields/fields.yml index c1c51ed7f36..db61e8936a8 100644 --- a/packages/redis/data_stream/key/fields/fields.yml +++ b/packages/redis/data_stream/key/fields/fields.yml @@ -1,3 +1,12 @@ +- name: redis.keyspace + type: group + fields: + - name: id + type: keyword + # Reason to add as dimension field: Multiple keyspace can exist and are part of multiple documents. + dimension: true + description: | + Keyspace identifier. - name: redis.key type: group fields: diff --git a/packages/redis/data_stream/key/sample_event.json b/packages/redis/data_stream/key/sample_event.json index e8366765c81..16b98d8b4f7 100644 --- a/packages/redis/data_stream/key/sample_event.json +++ b/packages/redis/data_stream/key/sample_event.json @@ -1,30 +1,35 @@ { - "@timestamp": "2020-06-25T10:16:10.138Z", - "ecs": { - "version": "8.11.0" + "@timestamp": "2025-12-31T13:20:46.958Z", + "ecs": { + "version": "8.0.0" + }, + "event": { + "agent_id_status": "verified", + "dataset": "redis.key", + "duration": 9857625, + "ingested": "2025-12-31T13:20:48Z", + "module": "redis" + }, + "metricset": { + "name": "key", + "period": 10000 + }, + "redis": { + "key": { + "expire": { + "ttl": -1 + }, + "id": "0:test", + "length": 1, + "name": "test", + "type": "string" }, - "event": { - "dataset": "redis.key", - "duration": 374411, - "module": "redis" - }, - "metricset": { - "name": "key", - "period": 10000 - }, - "redis": { - "key": { - "expire": { - "ttl": 360 - }, - "id": "0:foo", - "length": 3, - "name": "foo", - "type": "string" - } - }, - "service": { - "address": "localhost:6379", - "type": "redis" + "keyspace": { + "id": "db0" } + }, + "service": { + "address": "redis://127.0.0.1:6379", + "type": "redis" + } } \ No newline at end of file diff --git a/packages/redis/data_stream/keyspace/_dev/test/system/test-default-config.yml b/packages/redis/data_stream/keyspace/_dev/test/system/test-default-config.yml new file mode 100644 index 00000000000..5b5834c3e40 --- /dev/null +++ b/packages/redis/data_stream/keyspace/_dev/test/system/test-default-config.yml @@ -0,0 +1,8 @@ +vars: + hosts: + - "{{Hostname}}:6379" +data_stream: + vars: ~ +skip: + reason: Test is skipped for now since it will fail on Redis 7.x and 8.x due to the issue #43887 + link: https://github.com/elastic/beats/issues/43887 \ No newline at end of file diff --git a/packages/redis/data_stream/keyspace/fields/fields.yml b/packages/redis/data_stream/keyspace/fields/fields.yml index 111a858fc40..c13b7aaaf50 100644 --- a/packages/redis/data_stream/keyspace/fields/fields.yml +++ b/packages/redis/data_stream/keyspace/fields/fields.yml @@ -18,3 +18,6 @@ Number of keys in the keyspace. - name: expires type: long + - name: subexpiry + type: long + description: "Number of sub-keys with an expiry set (0 when not reported)." diff --git a/packages/redis/docs/README.md b/packages/redis/docs/README.md index 727d7ebc3d3..f19cc83a039 100644 --- a/packages/redis/docs/README.md +++ b/packages/redis/docs/README.md @@ -73,13 +73,15 @@ An example event for `info` looks as following: ```json { - "@timestamp": "2020-06-25T10:16:10.138Z", + "@timestamp": "2025-12-31T13:03:46.990Z", "ecs": { - "version": "8.11.0" + "version": "8.0.0" }, "event": { + "agent_id_status": "verified", "dataset": "redis.info", - "duration": 374411, + "duration": 1360250, + "ingested": "2025-12-31T13:03:48Z", "module": "redis" }, "metricset": { @@ -89,43 +91,93 @@ An example event for `info` looks as following: "redis": { "info": { "clients": { - "biggest_input_buf": 0, "blocked": 0, - "connected": 5, - "longest_output_list": 0, + "connected": 3, "max_input_buffer": 0, "max_output_buffer": 0 }, "cluster": { "enabled": false }, + "commandstats": { + "config|get": { + "calls": 2, + "failed_calls": 0, + "rejected_calls": 0, + "usec": 4, + "usec_per_call": 2 + }, + "info": { + "calls": 54, + "failed_calls": 0, + "rejected_calls": 0, + "usec": 8183, + "usec_per_call": 151.54 + }, + "scan": { + "calls": 3, + "failed_calls": 0, + "rejected_calls": 0, + "usec": 12, + "usec_per_call": 4 + }, + "select": { + "calls": 4, + "failed_calls": 0, + "rejected_calls": 0, + "usec": 10, + "usec_per_call": 2.5 + }, + "slowlog|len": { + "calls": 45, + "failed_calls": 0, + "rejected_calls": 0, + "usec": 78, + "usec_per_call": 1.73 + } + }, "cpu": { "used": { - "sys": 1.66, - "sys_children": 0, - "user": 0.39, - "user_children": 0.01 + "sys": 0.213, + "sys_children": 0.001, + "user": 0.903, + "user_children": 0.005 } }, "memory": { - "active_defrag": {}, - "allocator": "jemalloc-4.0.3", + "active_defrag": { + "is_running": false + }, + "allocator": "jemalloc-5.3.0", "allocator_stats": { - "fragmentation": {}, - "rss": {} + "active": 15073280, + "allocated": 4412336, + "fragmentation": { + "bytes": 7413072, + "ratio": 4.15 + }, + "resident": 16449536, + "rss": { + "bytes": 1376256, + "ratio": 1.09 + } }, "fragmentation": { - "ratio": 2.71 + "bytes": 19869600, + "ratio": 19.03 }, "max": { "policy": "noeviction", "value": 0 }, + "total_system": 16731578368, "used": { - "lua": 37888, - "peak": 945016, - "rss": 2453504, - "value": 904992 + "dataset": 31264, + "lua": 32768, + "peak": 1148168, + "rss": 20971520, + "scripts": 192, + "value": 1103880 } }, "persistence": { @@ -133,12 +185,11 @@ An example event for `info` looks as following: "bgrewrite": { "last_status": "ok" }, - "buffer": {}, - "copy_on_write": {}, + "copy_on_write": { + "last_size": 0 + }, "enabled": false, - "fsync": {}, "rewrite": { - "buffer": {}, "current_time": { "sec": -1 }, @@ -148,7 +199,6 @@ An example event for `info` looks as following: }, "scheduled": false }, - "size": {}, "write": { "last_status": "ok" } @@ -165,10 +215,12 @@ An example event for `info` looks as following: "sec": -1 } }, - "copy_on_write": {}, + "copy_on_write": { + "last_size": 0 + }, "last_save": { - "changes_since": 35, - "time": 1548663522 + "changes_since": 0, + "time": 1767185772 } } }, @@ -182,77 +234,88 @@ An example event for `info` looks as following: "connected_slaves": 0, "master": { "offset": 0, - "sync": {} + "second_offset": -1 }, - "master_offset": 0, - "role": "master", - "slave": {} + "role": "master" }, "server": { "arch_bits": "64", - "build_id": "b9a4cd86ce8027d3", + "build_id": "ad6b706b81f82e04", "config_file": "", - "gcc_version": "6.4.0", - "git_dirty": "0", + "gcc_version": "14.2.0", + "git_dirty": "1", "git_sha1": "00000000", "hz": 10, - "lru_clock": 5159690, + "lru_clock": 5578546, "mode": "standalone", "multiplexing_api": "epoll", - "run_id": "0f681cb959aa47413ec40ff383715c923f9cbefd", + "number_of_cached_scripts": 0, + "run_id": "7c52d5e16e392e2c059c567833498a2dd53f32f7", "tcp_port": 6379, - "uptime": 707 + "uptime": 455 }, "slowlog": { "count": 0 }, "stats": { - "active_defrag": {}, - "commands_processed": 265, + "active_defrag": { + "hits": 0, + "key_hits": 0, + "key_misses": 0, + "misses": 0 + }, + "commands_processed": 108, "connections": { - "received": 848, + "received": 4, "rejected": 0 }, "instantaneous": { - "input_kbps": 0.18, - "ops_per_sec": 6, - "output_kbps": 1.39 + "input_kbps": 0, + "ops_per_sec": 0, + "output_kbps": 0 }, "keys": { "evicted": 0, "expired": 0 }, "keyspace": { - "hits": 15, + "hits": 0, "misses": 0 }, "latest_fork_usec": 0, "migrate_cached_sockets": 0, "net": { "input": { - "bytes": 7300 + "bytes": 2521 }, "output": { - "bytes": 219632 + "bytes": 304894 } }, "pubsub": { "channels": 0, "patterns": 0 }, + "slave_expires_tracked_keys": 0, "sync": { "full": 0, "partial": { "err": 0, "ok": 0 } + }, + "tracking": { + "total_items": 0, + "total_keys": 0, + "total_prefixes": 0 } } } }, "service": { - "address": "localhost:6379", - "type": "redis" + "address": "redis://127.0.0.1:6379", + "type": "redis", + "version": "8.2.3" } } ``` @@ -292,6 +355,11 @@ Please refer to the following [document](https://www.elastic.co/guide/en/ecs/cur | redis.info.clients.max_input_buffer | Biggest input buffer among current client connections (on redis 5.0). | long | gauge | | redis.info.clients.max_output_buffer | Longest output list among current client connections. | long | gauge | | redis.info.cluster.enabled | Indicates that the Redis cluster is enabled. | boolean | | +| redis.info.commandstats.\*.calls | The number of calls that reached command execution (not rejected). | long | | +| redis.info.commandstats.\*.failed_calls | The number of failed calls (on redis 6.2-rc2). | long | | +| redis.info.commandstats.\*.rejected_calls | The number of rejected calls (on redis 6.2-rc2). | long | | +| redis.info.commandstats.\*.usec | The total CPU time consumed by these commands. | long | | +| redis.info.commandstats.\*.usec_per_call | The average CPU consumed per command execution. | float | | | redis.info.cpu.used.sys | System CPU consumed by the Redis server. | scaled_float | gauge | | redis.info.cpu.used.sys_children | User CPU consumed by the Redis server. | scaled_float | gauge | | redis.info.cpu.used.user | System CPU consumed by the background processes. | scaled_float | gauge | @@ -309,10 +377,12 @@ Please refer to the following [document](https://www.elastic.co/guide/en/ecs/cur | redis.info.memory.fragmentation.ratio | Ratio between used_memory_rss and used_memory | float | gauge | | redis.info.memory.max.policy | Eviction policy to use when memory limit is reached. | keyword | | | redis.info.memory.max.value | Memory limit. | long | gauge | +| redis.info.memory.total_system | Total amount in bytes of memory available to Redis. | long | | | redis.info.memory.used.dataset | The size in bytes of the dataset | long | gauge | | redis.info.memory.used.lua | Used memory by the Lua engine. | long | gauge | | redis.info.memory.used.peak | Peak memory consumed by Redis. | long | gauge | | redis.info.memory.used.rss | Number of bytes that Redis allocated as seen by the operating system (a.k.a resident set size). | long | gauge | +| redis.info.memory.used.scripts | Used memory by Lua scripts. | long | | | redis.info.memory.used.value | Total number of bytes allocated by Redis. | long | gauge | | redis.info.persistence.aof.bgrewrite.last_status | Status of the last AOF rewrite operatio | keyword | | | redis.info.persistence.aof.buffer.size | Size of the AOF buffer | long | gauge | @@ -363,6 +433,7 @@ Please refer to the following [document](https://www.elastic.co/guide/en/ecs/cur | redis.info.server.lru_clock | | long | | | redis.info.server.mode | | keyword | | | redis.info.server.multiplexing_api | | keyword | | +| redis.info.server.number_of_cached_scripts | | long | | | redis.info.server.run_id | | keyword | | | redis.info.server.tcp_port | | long | | | redis.info.server.uptime | | long | gauge | @@ -391,6 +462,9 @@ Please refer to the following [document](https://www.elastic.co/guide/en/ecs/cur | redis.info.stats.sync.full | The number of full resyncs with slaves | long | gauge | | redis.info.stats.sync.partial.err | The number of denied partial resync requests | long | gauge | | redis.info.stats.sync.partial.ok | The number of accepted partial resync requests | long | gauge | +| redis.info.stats.tracking.total_items | Total number of tracked items. | long | | +| redis.info.stats.tracking.total_keys | Total number of keys being tracked. | long | | +| redis.info.stats.tracking.total_prefixes | Total number of tracked prefixes. | long | | | service.address | Address where data about this service was collected from. This should be a URI, network address (ipv4:port or [ipv6]:port) or a resource path (sockets). | keyword | | @@ -411,13 +485,15 @@ An example event for `key` looks as following: ```json { - "@timestamp": "2020-06-25T10:16:10.138Z", + "@timestamp": "2025-12-31T13:20:46.958Z", "ecs": { - "version": "8.11.0" + "version": "8.0.0" }, "event": { + "agent_id_status": "verified", "dataset": "redis.key", - "duration": 374411, + "duration": 9857625, + "ingested": "2025-12-31T13:20:48Z", "module": "redis" }, "metricset": { @@ -427,16 +503,19 @@ An example event for `key` looks as following: "redis": { "key": { "expire": { - "ttl": 360 + "ttl": -1 }, - "id": "0:foo", - "length": 3, - "name": "foo", + "id": "0:test", + "length": 1, + "name": "test", "type": "string" + }, + "keyspace": { + "id": "db0" } }, "service": { - "address": "localhost:6379", + "address": "redis://127.0.0.1:6379", "type": "redis" } } @@ -473,6 +552,7 @@ Please refer to the following [document](https://www.elastic.co/guide/en/ecs/cur | redis.key.length | Length of the key (Number of elements for lists, length for strings, cardinality for sets). | long | gauge | | redis.key.name | Key name. | keyword | | | redis.key.type | Key type as shown by `TYPE` command. | keyword | | +| redis.keyspace.id | Keyspace identifier. | keyword | | | service.address | Address where data about this service was collected from. This should be a URI, network address (ipv4:port or [ipv6]:port) or a resource path (sockets). | keyword | | @@ -543,4 +623,5 @@ Please refer to the following [document](https://www.elastic.co/guide/en/ecs/cur | redis.keyspace.expires | | long | | | redis.keyspace.id | Keyspace identifier. | keyword | | | redis.keyspace.keys | Number of keys in the keyspace. | long | | +| redis.keyspace.subexpiry | Number of sub-keys with an expiry set (0 when not reported). | long | | | service.address | Address where data about this service was collected from. This should be a URI, network address (ipv4:port or [ipv6]:port) or a resource path (sockets). | keyword | | diff --git a/packages/redis/manifest.yml b/packages/redis/manifest.yml index 82337e7208c..91f0dfce350 100644 --- a/packages/redis/manifest.yml +++ b/packages/redis/manifest.yml @@ -1,7 +1,7 @@ format_version: "3.0.2" name: redis title: Redis -version: "1.20.0" +version: "1.21.0" description: Collect logs and metrics from Redis servers with Elastic Agent. type: integration categories: