@deniscuciuc/redis-analyzer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/LICENSE +21 -0
- package/README.md +244 -0
- package/analyzerrc.example.json +17 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +137 -0
- package/dist/src/analyzers/memory-analyzer.d.ts +5 -0
- package/dist/src/analyzers/memory-analyzer.d.ts.map +1 -0
- package/dist/src/analyzers/memory-analyzer.js +54 -0
- package/dist/src/analyzers/performance-analyzer.d.ts +6 -0
- package/dist/src/analyzers/performance-analyzer.d.ts.map +1 -0
- package/dist/src/analyzers/performance-analyzer.js +78 -0
- package/dist/src/analyzers/persistence-analyzer.d.ts +5 -0
- package/dist/src/analyzers/persistence-analyzer.d.ts.map +1 -0
- package/dist/src/analyzers/persistence-analyzer.js +59 -0
- package/dist/src/analyzers/replication-analyzer.d.ts +5 -0
- package/dist/src/analyzers/replication-analyzer.d.ts.map +1 -0
- package/dist/src/analyzers/replication-analyzer.js +52 -0
- package/dist/src/cli/options.d.ts +24 -0
- package/dist/src/cli/options.d.ts.map +1 -0
- package/dist/src/cli/options.js +155 -0
- package/dist/src/cli/runner.d.ts +13 -0
- package/dist/src/cli/runner.d.ts.map +1 -0
- package/dist/src/cli/runner.js +214 -0
- package/dist/src/collectors/stats-collector.d.ts +15 -0
- package/dist/src/collectors/stats-collector.d.ts.map +1 -0
- package/dist/src/collectors/stats-collector.js +151 -0
- package/dist/src/config/loader.d.ts +13 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +63 -0
- package/dist/src/constants.d.ts +52 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +93 -0
- package/dist/src/health.d.ts +10 -0
- package/dist/src/health.d.ts.map +1 -0
- package/dist/src/health.js +100 -0
- package/dist/src/interactive/display.d.ts +13 -0
- package/dist/src/interactive/display.d.ts.map +1 -0
- package/dist/src/interactive/display.js +130 -0
- package/dist/src/interactive/index.d.ts +23 -0
- package/dist/src/interactive/index.d.ts.map +1 -0
- package/dist/src/interactive/index.js +236 -0
- package/dist/src/interactive/menus.d.ts +25 -0
- package/dist/src/interactive/menus.d.ts.map +1 -0
- package/dist/src/interactive/menus.js +49 -0
- package/dist/src/reporters/diff-reporter.d.ts +21 -0
- package/dist/src/reporters/diff-reporter.d.ts.map +1 -0
- package/dist/src/reporters/diff-reporter.js +96 -0
- package/dist/src/reporters/html-reporter.d.ts +9 -0
- package/dist/src/reporters/html-reporter.d.ts.map +1 -0
- package/dist/src/reporters/html-reporter.js +140 -0
- package/dist/src/reporters/report-generator.d.ts +23 -0
- package/dist/src/reporters/report-generator.d.ts.map +1 -0
- package/dist/src/reporters/report-generator.js +239 -0
- package/dist/src/types.d.ts +184 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/utils/format.d.ts +6 -0
- package/dist/src/utils/format.d.ts.map +1 -0
- package/dist/src/utils/format.js +32 -0
- package/dist/src/utils/print.d.ts +8 -0
- package/dist/src/utils/print.d.ts.map +1 -0
- package/dist/src/utils/print.js +42 -0
- package/dist/src/watch/runner.d.ts +8 -0
- package/dist/src/watch/runner.d.ts.map +1 -0
- package/dist/src/watch/runner.js +49 -0
- package/dist/tests/analysis-and-reports.test.d.ts +2 -0
- package/dist/tests/analysis-and-reports.test.d.ts.map +1 -0
- package/dist/tests/analysis-and-reports.test.js +172 -0
- package/dist/tests/collector-and-options.test.d.ts +2 -0
- package/dist/tests/collector-and-options.test.d.ts.map +1 -0
- package/dist/tests/collector-and-options.test.js +110 -0
- package/package.json +82 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_os_1 = require("node:os");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
const node_test_1 = __importDefault(require("node:test"));
|
|
11
|
+
const memory_analyzer_1 = require("../src/analyzers/memory-analyzer");
|
|
12
|
+
const performance_analyzer_1 = require("../src/analyzers/performance-analyzer");
|
|
13
|
+
const persistence_analyzer_1 = require("../src/analyzers/persistence-analyzer");
|
|
14
|
+
const replication_analyzer_1 = require("../src/analyzers/replication-analyzer");
|
|
15
|
+
const health_1 = require("../src/health");
|
|
16
|
+
const report_generator_1 = require("../src/reporters/report-generator");
|
|
17
|
+
function createInfo() {
|
|
18
|
+
return {
|
|
19
|
+
redisVersion: "7.2.5",
|
|
20
|
+
redisMode: "standalone",
|
|
21
|
+
os: "Linux",
|
|
22
|
+
uptimeInSeconds: 86400,
|
|
23
|
+
uptimeInDays: 1,
|
|
24
|
+
tcpPort: 6379,
|
|
25
|
+
executablePath: "/usr/bin/redis-server",
|
|
26
|
+
configFile: "/etc/redis/redis.conf",
|
|
27
|
+
connectedClients: 12,
|
|
28
|
+
blockedClients: 1,
|
|
29
|
+
maxClients: 1000,
|
|
30
|
+
clientRecentMaxInputBuffer: 2048,
|
|
31
|
+
clientRecentMaxOutputBuffer: 4096,
|
|
32
|
+
usedMemory: 50 * 1024 * 1024,
|
|
33
|
+
usedMemoryHuman: "50.00M",
|
|
34
|
+
usedMemoryRss: 75 * 1024 * 1024,
|
|
35
|
+
usedMemoryRssHuman: "75.00M",
|
|
36
|
+
usedMemoryPeak: 60 * 1024 * 1024,
|
|
37
|
+
usedMemoryPeakHuman: "60.00M",
|
|
38
|
+
usedMemoryPeakPerc: 83.33,
|
|
39
|
+
usedMemoryOverhead: 10 * 1024 * 1024,
|
|
40
|
+
usedMemoryDataset: 40 * 1024 * 1024,
|
|
41
|
+
memFragmentationRatio: 1.75,
|
|
42
|
+
memFragmentationBytes: 25 * 1024 * 1024,
|
|
43
|
+
maxmemory: 64 * 1024 * 1024,
|
|
44
|
+
maxmemoryHuman: "64.00M",
|
|
45
|
+
maxmemoryPolicy: "allkeys-lru",
|
|
46
|
+
totalCommandsProcessed: 1000,
|
|
47
|
+
instantaneousOpsPerSec: 150,
|
|
48
|
+
totalNetInputBytes: 1024,
|
|
49
|
+
totalNetOutputBytes: 2048,
|
|
50
|
+
rejectedConnections: 2,
|
|
51
|
+
expiredKeys: 100,
|
|
52
|
+
evictedKeys: 5,
|
|
53
|
+
keyspaceHits: 900,
|
|
54
|
+
keyspaceMisses: 100,
|
|
55
|
+
role: "master",
|
|
56
|
+
connectedSlaves: 0,
|
|
57
|
+
rdbChangesSinceLastSave: 500,
|
|
58
|
+
rdbBgsaveInProgress: false,
|
|
59
|
+
rdbLastSaveTime: Math.floor(Date.now() / 1000) - 3600,
|
|
60
|
+
rdbLastBgsaveStatus: "ok",
|
|
61
|
+
rdbLastBgsaveTimeSec: 2,
|
|
62
|
+
aofEnabled: true,
|
|
63
|
+
aofRewriteInProgress: false,
|
|
64
|
+
aofLastRewriteTimeSec: 4,
|
|
65
|
+
aofLastBgrewriteStatus: "ok",
|
|
66
|
+
aofCurrentSize: 20480,
|
|
67
|
+
keyspaces: [
|
|
68
|
+
{ db: 0, keys: 1234, expires: 234, avgTtl: 60000 },
|
|
69
|
+
{ db: 1, keys: 100, expires: 10, avgTtl: 1000 },
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
(0, node_test_1.default)("analyzers produce actionable redis report data", () => {
|
|
74
|
+
const info = createInfo();
|
|
75
|
+
const memory = new memory_analyzer_1.MemoryAnalyzer().analyze(info);
|
|
76
|
+
const performance = new performance_analyzer_1.PerformanceAnalyzer();
|
|
77
|
+
const hitRate = performance.analyzeHitRate(info);
|
|
78
|
+
const persistence = new persistence_analyzer_1.PersistenceAnalyzer().analyze(info);
|
|
79
|
+
const replication = new replication_analyzer_1.ReplicationAnalyzer().analyze(info);
|
|
80
|
+
const slowCommands = performance.analyzeSlowCommands([
|
|
81
|
+
{
|
|
82
|
+
id: 1,
|
|
83
|
+
timestamp: 1718500000,
|
|
84
|
+
durationMicros: 12000,
|
|
85
|
+
durationMs: 12,
|
|
86
|
+
command: ["KEYS", "*"],
|
|
87
|
+
commandPreview: "KEYS *",
|
|
88
|
+
},
|
|
89
|
+
], 1, 10000);
|
|
90
|
+
strict_1.default.equal(memory.fragSeverity, "warning");
|
|
91
|
+
strict_1.default.equal(Number(hitRate.hitRate.toFixed(1)), 90);
|
|
92
|
+
strict_1.default.equal(persistence.severity, "ok");
|
|
93
|
+
strict_1.default.equal(replication.role, "standalone");
|
|
94
|
+
strict_1.default.equal(slowCommands.topCommandTypes[0].command, "KEYS");
|
|
95
|
+
});
|
|
96
|
+
(0, node_test_1.default)("computeHealthScore deducts for redis risks", () => {
|
|
97
|
+
const info = createInfo();
|
|
98
|
+
const memory = new memory_analyzer_1.MemoryAnalyzer().analyze(info);
|
|
99
|
+
const performance = new performance_analyzer_1.PerformanceAnalyzer();
|
|
100
|
+
const report = {
|
|
101
|
+
generatedAt: new Date(),
|
|
102
|
+
host: "localhost",
|
|
103
|
+
port: 6379,
|
|
104
|
+
db: 0,
|
|
105
|
+
metrics: {
|
|
106
|
+
version: info.redisVersion,
|
|
107
|
+
mode: info.redisMode,
|
|
108
|
+
uptimeDays: info.uptimeInDays,
|
|
109
|
+
connectedClients: info.connectedClients,
|
|
110
|
+
blockedClients: info.blockedClients,
|
|
111
|
+
maxClients: info.maxClients,
|
|
112
|
+
opsPerSec: info.instantaneousOpsPerSec,
|
|
113
|
+
totalKeyCount: 1334,
|
|
114
|
+
keyspacesCount: 2,
|
|
115
|
+
rejectedConnections: info.rejectedConnections,
|
|
116
|
+
},
|
|
117
|
+
memory,
|
|
118
|
+
hitRate: performance.analyzeHitRate(info),
|
|
119
|
+
persistence: new persistence_analyzer_1.PersistenceAnalyzer().analyze(info),
|
|
120
|
+
replication: new replication_analyzer_1.ReplicationAnalyzer().analyze(info),
|
|
121
|
+
slowCommands: performance.analyzeSlowCommands([], 0, 10000),
|
|
122
|
+
keyspaces: info.keyspaces,
|
|
123
|
+
config: {},
|
|
124
|
+
};
|
|
125
|
+
strict_1.default.ok((0, health_1.computeHealthScore)(report) < 100);
|
|
126
|
+
});
|
|
127
|
+
(0, node_test_1.default)("ReportGenerator writes markdown, json, and html reports", async () => {
|
|
128
|
+
const info = createInfo();
|
|
129
|
+
const memory = new memory_analyzer_1.MemoryAnalyzer().analyze(info);
|
|
130
|
+
const performance = new performance_analyzer_1.PerformanceAnalyzer();
|
|
131
|
+
const report = {
|
|
132
|
+
generatedAt: new Date(),
|
|
133
|
+
host: "localhost",
|
|
134
|
+
port: 6379,
|
|
135
|
+
db: 0,
|
|
136
|
+
healthScore: 87,
|
|
137
|
+
metrics: {
|
|
138
|
+
version: info.redisVersion,
|
|
139
|
+
mode: info.redisMode,
|
|
140
|
+
uptimeDays: info.uptimeInDays,
|
|
141
|
+
connectedClients: info.connectedClients,
|
|
142
|
+
blockedClients: info.blockedClients,
|
|
143
|
+
maxClients: info.maxClients,
|
|
144
|
+
opsPerSec: info.instantaneousOpsPerSec,
|
|
145
|
+
totalKeyCount: 1334,
|
|
146
|
+
keyspacesCount: 2,
|
|
147
|
+
rejectedConnections: info.rejectedConnections,
|
|
148
|
+
},
|
|
149
|
+
memory,
|
|
150
|
+
hitRate: performance.analyzeHitRate(info),
|
|
151
|
+
persistence: new persistence_analyzer_1.PersistenceAnalyzer().analyze(info),
|
|
152
|
+
replication: new replication_analyzer_1.ReplicationAnalyzer().analyze(info),
|
|
153
|
+
slowCommands: performance.analyzeSlowCommands([], 0, 10000),
|
|
154
|
+
keyspaces: info.keyspaces,
|
|
155
|
+
config: { maxmemory: "67108864" },
|
|
156
|
+
recommendations: [
|
|
157
|
+
{
|
|
158
|
+
priority: "medium",
|
|
159
|
+
category: "memory",
|
|
160
|
+
message: "Monitor fragmentation.",
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
};
|
|
164
|
+
const outputDir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "redis-analyzer-"));
|
|
165
|
+
const generator = new report_generator_1.ReportGenerator(outputDir);
|
|
166
|
+
const markdown = await generator.generateFullReport(report, "2026-06-14T00-00-00-000Z");
|
|
167
|
+
const json = await generator.generateJsonReport(report, "2026-06-14T00-00-00-000Z");
|
|
168
|
+
const html = await generator.generateHtmlReport(report, "2026-06-14T00-00-00-000Z");
|
|
169
|
+
strict_1.default.ok(markdown.endsWith(".md"));
|
|
170
|
+
strict_1.default.ok(json.endsWith(".json"));
|
|
171
|
+
strict_1.default.ok(html.endsWith(".html"));
|
|
172
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector-and-options.test.d.ts","sourceRoot":"","sources":["../../tests/collector-and-options.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
+
const node_test_1 = __importDefault(require("node:test"));
|
|
8
|
+
const options_1 = require("../src/cli/options");
|
|
9
|
+
const stats_collector_1 = require("../src/collectors/stats-collector");
|
|
10
|
+
const SAMPLE_INFO = `# Server\r
|
|
11
|
+
redis_version:7.2.5\r
|
|
12
|
+
redis_mode:standalone\r
|
|
13
|
+
os:Linux\r
|
|
14
|
+
uptime_in_seconds:86400\r
|
|
15
|
+
uptime_in_days:1\r
|
|
16
|
+
tcp_port:6379\r
|
|
17
|
+
executable:/usr/bin/redis-server\r
|
|
18
|
+
config_file:/etc/redis/redis.conf\r
|
|
19
|
+
# Clients\r
|
|
20
|
+
connected_clients:12\r
|
|
21
|
+
blocked_clients:1\r
|
|
22
|
+
maxclients:1000\r
|
|
23
|
+
client_recent_max_input_buffer:2048\r
|
|
24
|
+
client_recent_max_output_buffer:4096\r
|
|
25
|
+
# Memory\r
|
|
26
|
+
used_memory:52428800\r
|
|
27
|
+
used_memory_human:50.00M\r
|
|
28
|
+
used_memory_rss:78643200\r
|
|
29
|
+
used_memory_rss_human:75.00M\r
|
|
30
|
+
used_memory_peak:62914560\r
|
|
31
|
+
used_memory_peak_human:60.00M\r
|
|
32
|
+
used_memory_peak_perc:83.33%\r
|
|
33
|
+
used_memory_overhead:10485760\r
|
|
34
|
+
used_memory_dataset:41943040\r
|
|
35
|
+
mem_fragmentation_ratio:1.75\r
|
|
36
|
+
mem_fragmentation_bytes:26214400\r
|
|
37
|
+
maxmemory:67108864\r
|
|
38
|
+
maxmemory_human:64.00M\r
|
|
39
|
+
maxmemory_policy:allkeys-lru\r
|
|
40
|
+
# Stats\r
|
|
41
|
+
total_commands_processed:1000\r
|
|
42
|
+
instantaneous_ops_per_sec:150\r
|
|
43
|
+
total_net_input_bytes:1024\r
|
|
44
|
+
total_net_output_bytes:2048\r
|
|
45
|
+
rejected_connections:2\r
|
|
46
|
+
expired_keys:100\r
|
|
47
|
+
evicted_keys:5\r
|
|
48
|
+
keyspace_hits:900\r
|
|
49
|
+
keyspace_misses:100\r
|
|
50
|
+
# Replication\r
|
|
51
|
+
role:master\r
|
|
52
|
+
connected_slaves:0\r
|
|
53
|
+
# Persistence\r
|
|
54
|
+
rdb_changes_since_last_save:500\r
|
|
55
|
+
rdb_bgsave_in_progress:0\r
|
|
56
|
+
rdb_last_save_time:1718352000\r
|
|
57
|
+
rdb_last_bgsave_status:ok\r
|
|
58
|
+
rdb_last_bgsave_time_sec:2\r
|
|
59
|
+
aof_enabled:1\r
|
|
60
|
+
aof_rewrite_in_progress:0\r
|
|
61
|
+
aof_last_rewrite_time_sec:4\r
|
|
62
|
+
aof_last_bgrewrite_status:ok\r
|
|
63
|
+
aof_current_size:20480\r
|
|
64
|
+
# Keyspace\r
|
|
65
|
+
db0:keys=1234,expires=234,avg_ttl=60000\r
|
|
66
|
+
db1:keys=100,expires=10,avg_ttl=1000\r
|
|
67
|
+
`;
|
|
68
|
+
(0, node_test_1.default)("parseOptions reads Redis CLI flags", () => {
|
|
69
|
+
const options = (0, options_1.parseOptions)([
|
|
70
|
+
"--host",
|
|
71
|
+
"redis.internal",
|
|
72
|
+
"--port",
|
|
73
|
+
"6380",
|
|
74
|
+
"--db",
|
|
75
|
+
"2",
|
|
76
|
+
"--slow-threshold",
|
|
77
|
+
"5000",
|
|
78
|
+
"--max-slow-commands",
|
|
79
|
+
"10",
|
|
80
|
+
"--command",
|
|
81
|
+
"health",
|
|
82
|
+
]);
|
|
83
|
+
strict_1.default.equal(options.host, "redis.internal");
|
|
84
|
+
strict_1.default.equal(options.port, 6380);
|
|
85
|
+
strict_1.default.equal(options.db, 2);
|
|
86
|
+
strict_1.default.equal(options.slowCommandThreshold, 5000);
|
|
87
|
+
strict_1.default.equal(options.maxSlowCommands, 10);
|
|
88
|
+
strict_1.default.equal(options.command, "health");
|
|
89
|
+
});
|
|
90
|
+
(0, node_test_1.default)("parseRedisInfo parses INFO output and keyspaces", () => {
|
|
91
|
+
const info = (0, stats_collector_1.parseRedisInfo)(SAMPLE_INFO);
|
|
92
|
+
strict_1.default.equal(info.redisVersion, "7.2.5");
|
|
93
|
+
strict_1.default.equal(info.connectedClients, 12);
|
|
94
|
+
strict_1.default.equal(info.maxmemoryPolicy, "allkeys-lru");
|
|
95
|
+
strict_1.default.equal(info.keyspaces.length, 2);
|
|
96
|
+
strict_1.default.deepEqual(info.keyspaces[0], {
|
|
97
|
+
db: 0,
|
|
98
|
+
keys: 1234,
|
|
99
|
+
expires: 234,
|
|
100
|
+
avgTtl: 60000,
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
(0, node_test_1.default)("parseSlowLogEntries normalizes slowlog rows", () => {
|
|
104
|
+
const slowCommands = (0, stats_collector_1.parseSlowLogEntries)([
|
|
105
|
+
[1, 1718500000, 12000, ["KEYS", "*"], "127.0.0.1:50000"],
|
|
106
|
+
]);
|
|
107
|
+
strict_1.default.equal(slowCommands[0].durationMs, 12);
|
|
108
|
+
strict_1.default.equal(slowCommands[0].commandPreview, "KEYS *");
|
|
109
|
+
strict_1.default.equal(slowCommands[0].clientAddr, "127.0.0.1:50000");
|
|
110
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@deniscuciuc/redis-analyzer",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI tool that analyzes Redis servers for memory pressure, cache efficiency, persistence safety, replication health, and slow commands.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"redis",
|
|
7
|
+
"database",
|
|
8
|
+
"analyzer",
|
|
9
|
+
"performance",
|
|
10
|
+
"cache",
|
|
11
|
+
"cli",
|
|
12
|
+
"memory",
|
|
13
|
+
"replication",
|
|
14
|
+
"slowlog",
|
|
15
|
+
"devops"
|
|
16
|
+
],
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/deniscuciuc/db-analyzer-redis.git"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/deniscuciuc/db-analyzer-redis/issues"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"author": "Denis Cuciuc <denis@deniscuciuc.dev>",
|
|
26
|
+
"homepage": "https://github.com/deniscuciuc/db-analyzer-redis#readme",
|
|
27
|
+
"private": false,
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"bin": {
|
|
32
|
+
"redis-analyzer": "./dist/index.js"
|
|
33
|
+
},
|
|
34
|
+
"main": "./dist/index.js",
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"files": [
|
|
37
|
+
"dist/",
|
|
38
|
+
"README.md",
|
|
39
|
+
"LICENSE",
|
|
40
|
+
"CHANGELOG.md",
|
|
41
|
+
"analyzerrc.example.json"
|
|
42
|
+
],
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@inquirer/prompts": "^8.1.0",
|
|
45
|
+
"ioredis": "^5.4.1"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@biomejs/biome": "2.3.11",
|
|
49
|
+
"@types/node": "^22.15.0",
|
|
50
|
+
"ts-node": "^10.9.2",
|
|
51
|
+
"typescript": "^5.9.3"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=20",
|
|
55
|
+
"pnpm": ">=10"
|
|
56
|
+
},
|
|
57
|
+
"scripts": {
|
|
58
|
+
"start": ". ./.env && npx ts-node index.ts start",
|
|
59
|
+
"analyze": ". ./.env && npx ts-node index.ts",
|
|
60
|
+
"analyze:help": "npx ts-node index.ts --help",
|
|
61
|
+
"analyze:health": ". ./.env && npx ts-node index.ts -j -c health",
|
|
62
|
+
"analyze:memory": ". ./.env && npx ts-node index.ts -j -c memory",
|
|
63
|
+
"analyze:hit-rate": ". ./.env && npx ts-node index.ts -j -c hit-rate",
|
|
64
|
+
"analyze:slow": ". ./.env && npx ts-node index.ts -j -c slow-commands",
|
|
65
|
+
"analyze:keys": ". ./.env && npx ts-node index.ts -j -c keys",
|
|
66
|
+
"analyze:connections": ". ./.env && npx ts-node index.ts -j -c connections",
|
|
67
|
+
"analyze:persistence": ". ./.env && npx ts-node index.ts -j -c persistence",
|
|
68
|
+
"analyze:replication": ". ./.env && npx ts-node index.ts -j -c replication",
|
|
69
|
+
"analyze:config": ". ./.env && npx ts-node index.ts -j -c config",
|
|
70
|
+
"analyze:html": ". ./.env && npx ts-node index.ts --html -c full",
|
|
71
|
+
"analyze:watch": ". ./.env && npx ts-node index.ts -c health --watch 30",
|
|
72
|
+
"server:info": ". ./.env && npx ts-node index.ts -j -c server-info",
|
|
73
|
+
"build": "tsc",
|
|
74
|
+
"postbuild": "node scripts/add-shebang.js",
|
|
75
|
+
"lint": "biome check .",
|
|
76
|
+
"lint:fix": "biome check --write .",
|
|
77
|
+
"test": "node --test dist/tests/*.test.js",
|
|
78
|
+
"release:patch": "npm version patch && git push && git push --tags",
|
|
79
|
+
"release:minor": "npm version minor && git push && git push --tags",
|
|
80
|
+
"release:major": "npm version major && git push && git push --tags"
|
|
81
|
+
}
|
|
82
|
+
}
|