monsqlize 1.3.0 → 2.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 +56 -60
- package/LICENSE +201 -21
- package/README.md +537 -1828
- package/changelogs/README.md +160 -0
- package/changelogs/v2.0.0.md +222 -0
- package/dist/cjs/index.cjs +10600 -0
- package/dist/cjs/mongodb/common/transaction-aware.cjs +10 -0
- package/dist/cjs/transaction/CacheLockManager.cjs +100 -0
- package/dist/cjs/transaction/Transaction.cjs +158 -0
- package/dist/cjs/transaction/TransactionManager.cjs +298 -0
- package/dist/esm/index.mjs +10650 -0
- package/dist/types/base.d.ts +81 -0
- package/dist/types/collection.d.ts +1031 -0
- package/dist/types/expression.d.ts +115 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/lock.d.ts +74 -0
- package/dist/types/model.d.ts +526 -0
- package/dist/types/mongodb.d.ts +49 -0
- package/dist/types/monsqlize.d.ts +491 -0
- package/dist/types/pool.d.ts +84 -0
- package/dist/types/runtime.d.ts +362 -0
- package/dist/types/saga.d.ts +143 -0
- package/dist/types/slow-query-log.d.ts +126 -0
- package/dist/types/sync.d.ts +103 -0
- package/dist/types/transaction.d.ts +132 -0
- package/package.json +67 -69
- package/index.d.ts +0 -206
- package/index.mjs +0 -52
- package/lib/cache-invalidation.js +0 -279
- package/lib/cache.js +0 -530
- package/lib/common/cursor.js +0 -59
- package/lib/common/docs-urls.js +0 -73
- package/lib/common/index-options.js +0 -223
- package/lib/common/log.js +0 -61
- package/lib/common/namespace.js +0 -22
- package/lib/common/normalize.js +0 -34
- package/lib/common/page-result.js +0 -43
- package/lib/common/runner.js +0 -57
- package/lib/common/server-features.js +0 -232
- package/lib/common/shape-builders.js +0 -27
- package/lib/common/validation.js +0 -113
- package/lib/connect.js +0 -99
- package/lib/constants.js +0 -55
- package/lib/count-queue.js +0 -188
- package/lib/distributed-cache-invalidator.js +0 -260
- package/lib/errors.js +0 -168
- package/lib/expression/cache/ExpressionCache.js +0 -114
- package/lib/expression/compiler/ExpressionCompiler.js +0 -1090
- package/lib/expression/compiler/ExpressionCompilerExtensions.js +0 -531
- package/lib/expression/detector.js +0 -84
- package/lib/expression/factory.js +0 -29
- package/lib/expression/index.js +0 -19
- package/lib/function-cache.js +0 -533
- package/lib/index.js +0 -1251
- package/lib/infrastructure/ConnectionPoolManager.js +0 -464
- package/lib/infrastructure/HealthChecker.js +0 -281
- package/lib/infrastructure/PoolConfig.js +0 -199
- package/lib/infrastructure/PoolSelector.js +0 -225
- package/lib/infrastructure/PoolStats.js +0 -244
- package/lib/infrastructure/ssh-tunnel-ssh2.js +0 -212
- package/lib/infrastructure/ssh-tunnel.js +0 -41
- package/lib/infrastructure/uri-parser.js +0 -36
- package/lib/lock/Lock.js +0 -67
- package/lib/lock/errors.js +0 -28
- package/lib/lock/index.js +0 -13
- package/lib/logger.js +0 -225
- package/lib/model/examples/test.js +0 -311
- package/lib/model/features/defaults.js +0 -161
- package/lib/model/features/populate.js +0 -568
- package/lib/model/features/relations.js +0 -120
- package/lib/model/features/soft-delete.js +0 -349
- package/lib/model/features/version.js +0 -157
- package/lib/model/features/virtuals.js +0 -219
- package/lib/model/index.js +0 -1265
- package/lib/mongodb/common/accessor-helpers.js +0 -59
- package/lib/mongodb/common/agg-pipeline.js +0 -36
- package/lib/mongodb/common/aggregation-validator.js +0 -127
- package/lib/mongodb/common/iid.js +0 -28
- package/lib/mongodb/common/lexicographic-expr.js +0 -53
- package/lib/mongodb/common/shape.js +0 -32
- package/lib/mongodb/common/sort.js +0 -39
- package/lib/mongodb/common/transaction-aware.js +0 -25
- package/lib/mongodb/connect.js +0 -234
- package/lib/mongodb/index.js +0 -639
- package/lib/mongodb/management/admin-ops.js +0 -200
- package/lib/mongodb/management/bookmark-ops.js +0 -167
- package/lib/mongodb/management/cache-ops.js +0 -50
- package/lib/mongodb/management/collection-ops.js +0 -387
- package/lib/mongodb/management/database-ops.js +0 -202
- package/lib/mongodb/management/index-ops.js +0 -475
- package/lib/mongodb/management/index.js +0 -17
- package/lib/mongodb/management/namespace.js +0 -31
- package/lib/mongodb/management/validation-ops.js +0 -268
- package/lib/mongodb/queries/aggregate.js +0 -172
- package/lib/mongodb/queries/chain.js +0 -631
- package/lib/mongodb/queries/count.js +0 -99
- package/lib/mongodb/queries/distinct.js +0 -78
- package/lib/mongodb/queries/find-and-count.js +0 -193
- package/lib/mongodb/queries/find-by-ids.js +0 -236
- package/lib/mongodb/queries/find-one-by-id.js +0 -171
- package/lib/mongodb/queries/find-one.js +0 -71
- package/lib/mongodb/queries/find-page.js +0 -618
- package/lib/mongodb/queries/find.js +0 -171
- package/lib/mongodb/queries/index.js +0 -51
- package/lib/mongodb/queries/watch.js +0 -538
- package/lib/mongodb/writes/common/batch-retry.js +0 -65
- package/lib/mongodb/writes/delete-batch.js +0 -323
- package/lib/mongodb/writes/delete-many.js +0 -181
- package/lib/mongodb/writes/delete-one.js +0 -173
- package/lib/mongodb/writes/find-one-and-delete.js +0 -203
- package/lib/mongodb/writes/find-one-and-replace.js +0 -239
- package/lib/mongodb/writes/find-one-and-update.js +0 -240
- package/lib/mongodb/writes/increment-one.js +0 -259
- package/lib/mongodb/writes/index.js +0 -46
- package/lib/mongodb/writes/insert-batch.js +0 -508
- package/lib/mongodb/writes/insert-many.js +0 -223
- package/lib/mongodb/writes/insert-one.js +0 -169
- package/lib/mongodb/writes/replace-one.js +0 -226
- package/lib/mongodb/writes/result-handler.js +0 -237
- package/lib/mongodb/writes/update-batch.js +0 -416
- package/lib/mongodb/writes/update-many.js +0 -275
- package/lib/mongodb/writes/update-one.js +0 -273
- package/lib/mongodb/writes/upsert-one.js +0 -203
- package/lib/multi-level-cache.js +0 -244
- package/lib/operators.js +0 -330
- package/lib/redis-cache-adapter.js +0 -267
- package/lib/saga/SagaContext.js +0 -67
- package/lib/saga/SagaDefinition.js +0 -32
- package/lib/saga/SagaExecutor.js +0 -201
- package/lib/saga/SagaOrchestrator.js +0 -186
- package/lib/saga/index.js +0 -11
- package/lib/slow-query-log/base-storage.js +0 -70
- package/lib/slow-query-log/batch-queue.js +0 -97
- package/lib/slow-query-log/config-manager.js +0 -196
- package/lib/slow-query-log/index.js +0 -238
- package/lib/slow-query-log/mongodb-storage.js +0 -324
- package/lib/slow-query-log/query-hash.js +0 -39
- package/lib/sync/ChangeStreamSyncManager.js +0 -405
- package/lib/sync/ResumeTokenStore.js +0 -192
- package/lib/sync/SyncConfig.js +0 -127
- package/lib/sync/SyncTarget.js +0 -240
- package/lib/sync/index.js +0 -20
- package/lib/transaction/CacheLockManager.js +0 -162
- package/lib/transaction/DistributedCacheLockManager.js +0 -475
- package/lib/transaction/Transaction.js +0 -315
- package/lib/transaction/TransactionManager.js +0 -267
- package/lib/transaction/index.js +0 -11
- package/lib/utils/objectid-converter.js +0 -632
- package/types/README.md +0 -122
- package/types/base.ts +0 -94
- package/types/batch.ts +0 -187
- package/types/cache.ts +0 -71
- package/types/chain.ts +0 -254
- package/types/collection.ts +0 -357
- package/types/expression.ts +0 -109
- package/types/function-cache.d.ts +0 -135
- package/types/lock.ts +0 -95
- package/types/model/definition.ts +0 -152
- package/types/model/index.ts +0 -10
- package/types/model/instance.ts +0 -121
- package/types/model/relations.ts +0 -121
- package/types/model/virtuals.ts +0 -32
- package/types/monsqlize.ts +0 -245
- package/types/options.ts +0 -192
- package/types/pagination.ts +0 -154
- package/types/pool.ts +0 -125
- package/types/query.ts +0 -71
- package/types/saga.ts +0 -125
- package/types/stream.ts +0 -64
- package/types/sync.ts +0 -79
- package/types/transaction.ts +0 -79
- package/types/write.ts +0 -77
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 慢查询日志配置管理器
|
|
3
|
-
* 负责配置合并、验证和默认值处理
|
|
4
|
-
*
|
|
5
|
-
* @version 1.3.0
|
|
6
|
-
* @since 2025-12-22
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
// 默认配置
|
|
10
|
-
const DEFAULT_CONFIG = {
|
|
11
|
-
enabled: false,
|
|
12
|
-
|
|
13
|
-
storage: {
|
|
14
|
-
type: null, // null = 自动推断
|
|
15
|
-
useBusinessConnection: true,
|
|
16
|
-
uri: null,
|
|
17
|
-
|
|
18
|
-
mongodb: {
|
|
19
|
-
database: 'admin',
|
|
20
|
-
collection: 'slow_query_logs',
|
|
21
|
-
ttl: 7 * 24 * 3600, // 7天
|
|
22
|
-
ttlField: 'lastSeen'
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
deduplication: {
|
|
27
|
-
enabled: true,
|
|
28
|
-
strategy: 'aggregate',
|
|
29
|
-
keepRecentExecutions: 0
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
batch: {
|
|
33
|
-
enabled: true,
|
|
34
|
-
size: 10,
|
|
35
|
-
interval: 5000,
|
|
36
|
-
maxBufferSize: 100
|
|
37
|
-
},
|
|
38
|
-
|
|
39
|
-
filter: {
|
|
40
|
-
excludeDatabases: [],
|
|
41
|
-
excludeCollections: [],
|
|
42
|
-
excludeOperations: [],
|
|
43
|
-
minExecutionTimeMs: 0
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
advanced: {
|
|
47
|
-
autoCreateIndexes: true,
|
|
48
|
-
validateConnection: true,
|
|
49
|
-
errorHandling: 'log', // log | throw | silent
|
|
50
|
-
debug: false
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
class SlowQueryLogConfigManager {
|
|
55
|
-
/**
|
|
56
|
-
* 合并用户配置与默认配置
|
|
57
|
-
* @param {*} userConfig - 用户配置(可以是boolean或object)
|
|
58
|
-
* @param {string} businessType - 业务库类型
|
|
59
|
-
* @returns {Object} 合并后的完整配置
|
|
60
|
-
*/
|
|
61
|
-
static mergeConfig(userConfig, businessType) {
|
|
62
|
-
// 场景1:未配置(默认禁用)
|
|
63
|
-
if (userConfig === undefined || userConfig === null) {
|
|
64
|
-
return { ...deepClone(DEFAULT_CONFIG), enabled: false };
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// 场景2:boolean快捷配置
|
|
68
|
-
if (typeof userConfig === 'boolean') {
|
|
69
|
-
const config = deepClone(DEFAULT_CONFIG);
|
|
70
|
-
config.enabled = userConfig;
|
|
71
|
-
|
|
72
|
-
// 自动推断storage.type
|
|
73
|
-
if (userConfig && businessType) {
|
|
74
|
-
config.storage.type = businessType;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return config;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// 场景3:对象配置(深度合并)
|
|
81
|
-
if (typeof userConfig === 'object') {
|
|
82
|
-
const merged = deepMerge(deepClone(DEFAULT_CONFIG), userConfig);
|
|
83
|
-
|
|
84
|
-
// 智能推断:如果提供了storage配置,自动启用
|
|
85
|
-
if (userConfig.storage && merged.enabled === false) {
|
|
86
|
-
merged.enabled = true;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// 自动推断storage.type
|
|
90
|
-
if (merged.storage.type === null && businessType) {
|
|
91
|
-
if (merged.storage.useBusinessConnection) {
|
|
92
|
-
merged.storage.type = businessType;
|
|
93
|
-
} else {
|
|
94
|
-
merged.storage.type = 'mongodb'; // 独立连接默认MongoDB
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return merged;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
throw new Error('Invalid slowQueryLog config type. Expected boolean or object');
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* 验证配置合法性
|
|
106
|
-
* @param {Object} config - 配置对象
|
|
107
|
-
* @param {string} businessType - 业务库类型
|
|
108
|
-
* @throws {Error} 配置错误时抛出异常
|
|
109
|
-
*/
|
|
110
|
-
static validate(config, businessType) {
|
|
111
|
-
const { storage } = config;
|
|
112
|
-
|
|
113
|
-
// 验证storage.type
|
|
114
|
-
const validTypes = ['mongodb', 'postgresql', 'mysql', 'file', 'custom'];
|
|
115
|
-
if (storage.type && !validTypes.includes(storage.type)) {
|
|
116
|
-
throw new Error(
|
|
117
|
-
`Invalid storage.type: ${storage.type}. ` +
|
|
118
|
-
`Valid types are: ${validTypes.join(', ')}`
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// 验证复用连接的类型一致性
|
|
123
|
-
if (storage.useBusinessConnection === true) {
|
|
124
|
-
if (storage.type && storage.type !== businessType) {
|
|
125
|
-
throw new Error(
|
|
126
|
-
`Cannot use business connection when storage type (${storage.type}) ` +
|
|
127
|
-
`differs from business type (${businessType}). ` +
|
|
128
|
-
`Set useBusinessConnection=false and provide storage.uri`
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
} else {
|
|
132
|
-
// 验证独立连接的uri
|
|
133
|
-
if (!storage.uri) {
|
|
134
|
-
throw new Error(
|
|
135
|
-
'storage.uri is required when useBusinessConnection=false'
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// 验证deduplication.strategy
|
|
141
|
-
const validStrategies = ['aggregate', 'none'];
|
|
142
|
-
if (!validStrategies.includes(config.deduplication.strategy)) {
|
|
143
|
-
throw new Error(
|
|
144
|
-
`Invalid deduplication.strategy: ${config.deduplication.strategy}. ` +
|
|
145
|
-
`Valid strategies are: ${validStrategies.join(', ')}`
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// 验证TTL
|
|
150
|
-
if (storage.mongodb.ttl < 0) {
|
|
151
|
-
throw new Error('storage.mongodb.ttl must be positive');
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// 验证batch配置
|
|
155
|
-
if (config.batch.size < 1 || config.batch.size > 1000) {
|
|
156
|
-
throw new Error('batch.size must be between 1 and 1000');
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (config.batch.interval < 100) {
|
|
160
|
-
throw new Error('batch.interval must be >= 100ms');
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return true;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* 深度克隆对象
|
|
169
|
-
* @param {Object} obj - 源对象
|
|
170
|
-
* @returns {Object} 克隆后的对象
|
|
171
|
-
*/
|
|
172
|
-
function deepClone(obj) {
|
|
173
|
-
return JSON.parse(JSON.stringify(obj));
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* 深度合并对象
|
|
178
|
-
* @param {Object} target - 目标对象
|
|
179
|
-
* @param {Object} source - 源对象
|
|
180
|
-
* @returns {Object} 合并后的对象
|
|
181
|
-
*/
|
|
182
|
-
function deepMerge(target, source) {
|
|
183
|
-
for (const key in source) {
|
|
184
|
-
if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
|
|
185
|
-
target[key] = target[key] || {};
|
|
186
|
-
deepMerge(target[key], source[key]);
|
|
187
|
-
} else {
|
|
188
|
-
target[key] = source[key];
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return target;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
module.exports = { SlowQueryLogConfigManager, DEFAULT_CONFIG };
|
|
195
|
-
|
|
196
|
-
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 慢查询日志模块导出
|
|
3
|
-
*
|
|
4
|
-
* @version 1.3.0
|
|
5
|
-
* @since 2025-12-22
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const { ISlowQueryLogStorage } = require('./base-storage');
|
|
9
|
-
const { MongoDBSlowQueryLogStorage } = require('./mongodb-storage');
|
|
10
|
-
const { BatchQueue } = require('./batch-queue');
|
|
11
|
-
const { generateQueryHash } = require('./query-hash');
|
|
12
|
-
const { SlowQueryLogConfigManager, DEFAULT_CONFIG } = require('./config-manager');
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* 慢查询日志管理器
|
|
16
|
-
* 统一管理存储、队列、配置
|
|
17
|
-
*/
|
|
18
|
-
class SlowQueryLogManager {
|
|
19
|
-
/**
|
|
20
|
-
* 创建慢查询日志管理器
|
|
21
|
-
* @param {Object} userConfig - 用户配置
|
|
22
|
-
* @param {Object} [businessClient] - 业务数据库客户端(复用连接时)
|
|
23
|
-
* @param {string} businessType - 业务数据库类型
|
|
24
|
-
* @param {Object} logger - 日志记录器
|
|
25
|
-
*/
|
|
26
|
-
constructor(userConfig, businessClient, businessType, logger) {
|
|
27
|
-
this.logger = logger || console;
|
|
28
|
-
|
|
29
|
-
// 合并配置
|
|
30
|
-
this.config = SlowQueryLogConfigManager.mergeConfig(userConfig, businessType);
|
|
31
|
-
|
|
32
|
-
// 验证配置
|
|
33
|
-
SlowQueryLogConfigManager.validate(this.config, businessType);
|
|
34
|
-
|
|
35
|
-
// 初始化存储适配器
|
|
36
|
-
this.storage = this.createStorage(businessClient);
|
|
37
|
-
|
|
38
|
-
// 初始化批量队列
|
|
39
|
-
if (this.config.batch.enabled) {
|
|
40
|
-
this.queue = new BatchQueue(this.storage, this.config.batch, this.logger);
|
|
41
|
-
} else {
|
|
42
|
-
this.queue = null;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
this.initialized = false;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* 创建存储适配器
|
|
50
|
-
* @param {Object} businessClient - 业务数据库客户端
|
|
51
|
-
* @returns {ISlowQueryLogStorage}
|
|
52
|
-
*/
|
|
53
|
-
createStorage(businessClient) {
|
|
54
|
-
const { storage } = this.config;
|
|
55
|
-
|
|
56
|
-
// 根据存储类型创建适配器
|
|
57
|
-
switch (storage.type) {
|
|
58
|
-
case 'mongodb': {
|
|
59
|
-
const client = storage.useBusinessConnection ? businessClient : null;
|
|
60
|
-
return new MongoDBSlowQueryLogStorage(
|
|
61
|
-
storage.mongodb,
|
|
62
|
-
client,
|
|
63
|
-
this.logger
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
case 'postgresql':
|
|
68
|
-
case 'mysql':
|
|
69
|
-
case 'file':
|
|
70
|
-
case 'custom':
|
|
71
|
-
throw new Error(
|
|
72
|
-
`Storage type '${storage.type}' is not yet implemented. ` +
|
|
73
|
-
`Currently only 'mongodb' is supported in v1.3`
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
default:
|
|
77
|
-
throw new Error(`Unknown storage type: ${storage.type}`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* 初始化(延迟初始化)
|
|
83
|
-
* @returns {Promise<void>}
|
|
84
|
-
*/
|
|
85
|
-
async initialize() {
|
|
86
|
-
if (this.initialized) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
try {
|
|
91
|
-
await this.storage.initialize();
|
|
92
|
-
this.initialized = true;
|
|
93
|
-
|
|
94
|
-
if (this.logger.info) {
|
|
95
|
-
this.logger.info('[SlowQueryLog] Manager initialized successfully');
|
|
96
|
-
}
|
|
97
|
-
} catch (err) {
|
|
98
|
-
if (this.logger.error) {
|
|
99
|
-
this.logger.error('[SlowQueryLog] Failed to initialize manager:', err);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// 根据错误处理策略决定是否抛出异常
|
|
103
|
-
if (this.config.advanced.errorHandling === 'throw') {
|
|
104
|
-
throw err;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* 保存慢查询日志
|
|
111
|
-
* @param {Object} log - 慢查询日志对象
|
|
112
|
-
* @returns {Promise<void>}
|
|
113
|
-
*/
|
|
114
|
-
async save(log) {
|
|
115
|
-
// 延迟初始化
|
|
116
|
-
if (!this.initialized) {
|
|
117
|
-
await this.initialize();
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// 过滤检查
|
|
121
|
-
if (this.shouldFilter(log)) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
try {
|
|
126
|
-
if (this.queue) {
|
|
127
|
-
// 批量模式:添加到队列
|
|
128
|
-
await this.queue.add(log);
|
|
129
|
-
} else {
|
|
130
|
-
// 实时模式:直接保存
|
|
131
|
-
await this.storage.save(log);
|
|
132
|
-
}
|
|
133
|
-
} catch (err) {
|
|
134
|
-
if (this.logger.error) {
|
|
135
|
-
this.logger.error('[SlowQueryLog] Failed to save log:', err);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// 保存失败不抛异常(不影响主流程)
|
|
139
|
-
if (this.config.advanced.errorHandling === 'throw') {
|
|
140
|
-
throw err;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* 检查是否应该过滤该日志
|
|
147
|
-
* @param {Object} log - 慢查询日志对象
|
|
148
|
-
* @returns {boolean}
|
|
149
|
-
*/
|
|
150
|
-
shouldFilter(log) {
|
|
151
|
-
const { filter } = this.config;
|
|
152
|
-
|
|
153
|
-
// 检查数据库过滤
|
|
154
|
-
if (filter.excludeDatabases.length > 0) {
|
|
155
|
-
if (filter.excludeDatabases.includes(log.db)) {
|
|
156
|
-
return true;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// 检查集合过滤
|
|
161
|
-
if (filter.excludeCollections.length > 0) {
|
|
162
|
-
const coll = log.collection || log.coll;
|
|
163
|
-
if (filter.excludeCollections.includes(coll)) {
|
|
164
|
-
return true;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// 检查操作类型过滤
|
|
169
|
-
if (filter.excludeOperations.length > 0) {
|
|
170
|
-
const op = log.operation || log.op;
|
|
171
|
-
if (filter.excludeOperations.includes(op)) {
|
|
172
|
-
return true;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// 检查最小执行时间
|
|
177
|
-
if (filter.minExecutionTimeMs > 0) {
|
|
178
|
-
const ms = log.executionTimeMs || log.ms || 0;
|
|
179
|
-
if (ms < filter.minExecutionTimeMs) {
|
|
180
|
-
return true;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* 查询慢查询日志
|
|
189
|
-
* @param {Object} filter - 查询条件
|
|
190
|
-
* @param {Object} options - 查询选项
|
|
191
|
-
* @returns {Promise<Object[]>}
|
|
192
|
-
*/
|
|
193
|
-
async query(filter, options) {
|
|
194
|
-
if (!this.initialized) {
|
|
195
|
-
await this.initialize();
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
return this.storage.query(filter, options);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* 关闭管理器
|
|
203
|
-
* @returns {Promise<void>}
|
|
204
|
-
*/
|
|
205
|
-
async close() {
|
|
206
|
-
try {
|
|
207
|
-
// 关闭队列(确保数据不丢失)
|
|
208
|
-
if (this.queue) {
|
|
209
|
-
await this.queue.close();
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// 关闭存储
|
|
213
|
-
await this.storage.close();
|
|
214
|
-
|
|
215
|
-
this.initialized = false;
|
|
216
|
-
|
|
217
|
-
if (this.logger.info) {
|
|
218
|
-
this.logger.info('[SlowQueryLog] Manager closed');
|
|
219
|
-
}
|
|
220
|
-
} catch (err) {
|
|
221
|
-
if (this.logger.error) {
|
|
222
|
-
this.logger.error('[SlowQueryLog] Failed to close manager:', err);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
module.exports = {
|
|
229
|
-
SlowQueryLogManager,
|
|
230
|
-
SlowQueryLogConfigManager,
|
|
231
|
-
MongoDBSlowQueryLogStorage,
|
|
232
|
-
BatchQueue,
|
|
233
|
-
generateQueryHash,
|
|
234
|
-
DEFAULT_CONFIG,
|
|
235
|
-
ISlowQueryLogStorage
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
|