WalleGriffkinder commited on
Commit
981d744
·
verified ·
1 Parent(s): 96d3197

Update stats-reporter.js

Browse files
Files changed (1) hide show
  1. stats-reporter.js +95 -35
stats-reporter.js CHANGED
@@ -10,7 +10,10 @@ const config = {
10
  STATS_GIST_ID: process.env.STATS_GIST_ID || '',
11
  ENV_GIST_ID: process.env.ENV_GIST_ID || '',
12
  UPDATE_INTERVAL_MINUTES: parseInt(process.env.UPDATE_INTERVAL_MINUTES || '1440', 10),
 
13
  TELEGRAM_DATA_DIR: process.env.TELEGRAM_DATA_DIR || '/var/lib/telegram-bot-api',
 
 
14
  FILES_TTL: parseInt(process.env.FILES_TTL || '-1', 10),
15
  DEBUG_MODE: process.env.DEBUG_MODE === 'true' // Для включения подробного логирования
16
  };
@@ -24,6 +27,24 @@ for (const envVar of requiredEnvVars) {
24
  }
25
  }
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  // Функция для подсчета файлов и логирования всех путей
28
  async function countFilesWithLogging(dirPath) {
29
  try {
@@ -66,15 +87,21 @@ async function countFilesWithLogging(dirPath) {
66
  // Записываем список файлов для отладки
67
  if (config.DEBUG_MODE) {
68
  console.log(`=== DEBUG: Found ${count} files in ${dirPath} with total size ${formatBytes(totalSize)} ===`);
69
- const debugFilename = `/tmp/telegram-api-files-${Date.now()}.txt`;
70
- await fs.writeFile(debugFilename, filesList.join('\n'));
71
- console.log(`DEBUG: Full file list saved to ${debugFilename}`);
 
 
 
 
 
 
72
 
73
  // Записываем размеры 10 самых больших файлов
74
  console.log(`=== DEBUG: Top 10 largest files in ${dirPath} ===`);
75
  const largestFiles = await findLargestFiles(dirPath, 10);
76
  for (const file of largestFiles) {
77
- console.log(`${file.path}: ${formatBytes(file.size)}`);
78
  }
79
  }
80
 
@@ -270,30 +297,56 @@ async function updateStats() {
270
  try {
271
  console.log(`[${new Date().toISOString()}] Updating statistics...`);
272
 
273
- // Запуск очистки, если настроено
 
 
 
274
  const cleanupResults = config.FILES_TTL > 0
275
  ? await cleanupOldFiles(config.TELEGRAM_DATA_DIR, config.FILES_TTL)
276
  : { processed: 0, deleted: 0 };
277
 
278
- // Получаем статистику с подробным логированием
279
- const { count: fileCount, sizeFromFiles } = await countFilesWithLogging(config.TELEGRAM_DATA_DIR);
280
- const totalSize = await getDirSize(config.TELEGRAM_DATA_DIR);
 
281
 
282
- console.log(`Directory ${config.TELEGRAM_DATA_DIR}: ${fileCount} files`);
283
- console.log(`Size from du command: ${formatBytes(totalSize)}`);
284
- console.log(`Size from summing files: ${formatBytes(sizeFromFiles)}`);
285
 
286
- // Проверяем, если есть значительное расхождение
287
- if (Math.abs(totalSize - sizeFromFiles) > 1024 * 1024) { // Больше 1 МБ разницы
288
- console.log(`WARNING: Significant difference between directory size and sum of file sizes: ${formatBytes(Math.abs(totalSize - sizeFromFiles))}`);
289
- }
 
 
 
 
 
 
 
290
 
291
- // Проверяем наличие скрытых файлов
292
- const hiddenFilesCommand = `find "${config.TELEGRAM_DATA_DIR}" -name ".*" -not -name "." -not -name ".." -type f | wc -l`;
293
- const hiddenFilesCount = parseInt(execSync(hiddenFilesCommand).toString().trim());
294
 
295
- if (hiddenFilesCount > 0) {
296
- console.log(`Found ${hiddenFilesCount} hidden files`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  }
298
 
299
  const now = Date.now();
@@ -303,6 +356,8 @@ async function updateStats() {
303
  fileCount,
304
  totalSizeBytes: totalSize,
305
  totalSizeHuman: formatBytes(totalSize),
 
 
306
  cleanupResults: config.FILES_TTL > 0 ? {
307
  ttlHours: config.FILES_TTL,
308
  processedItems: cleanupResults.processed,
@@ -313,24 +368,29 @@ async function updateStats() {
313
  // Если включен режим отладки, добавляем информацию о самых больших файлах
314
  if (config.DEBUG_MODE) {
315
  try {
316
- // Список всех файлов в директории (только имена без размеров)
317
- const allFilesCommand = `find "${config.TELEGRAM_DATA_DIR}" -type f | sort`;
318
- const allFiles = execSync(allFilesCommand).toString().trim().split('\n');
 
 
 
 
 
 
 
 
 
 
 
 
 
319
 
320
- // Поиск самых больших файлов
321
- const largestFiles = await findLargestFiles(config.TELEGRAM_DATA_DIR, 20);
322
 
 
323
  stats.debug = {
324
- totalFiles: fileCount,
325
- hiddenFiles: hiddenFilesCount,
326
- sizeFromDu: totalSize,
327
- sizeFromFiles: sizeFromFiles,
328
- fileListSample: allFiles.slice(0, 100), // Первые 100 файлов
329
- largestFiles: largestFiles.map(file => ({
330
- path: file.path,
331
- size: file.size,
332
- sizeHuman: file.sizeHuman
333
- }))
334
  };
335
  } catch (e) {
336
  console.error(`Error collecting debug info: ${e.message}`);
 
10
  STATS_GIST_ID: process.env.STATS_GIST_ID || '',
11
  ENV_GIST_ID: process.env.ENV_GIST_ID || '',
12
  UPDATE_INTERVAL_MINUTES: parseInt(process.env.UPDATE_INTERVAL_MINUTES || '1440', 10),
13
+ // Основной путь для данных Telegram Bot API
14
  TELEGRAM_DATA_DIR: process.env.TELEGRAM_DATA_DIR || '/var/lib/telegram-bot-api',
15
+ // Дополнительные пути для сканирования, разделенные запятыми
16
+ ADDITIONAL_SCAN_DIRS: (process.env.ADDITIONAL_SCAN_DIRS || '').split(',').filter(Boolean),
17
  FILES_TTL: parseInt(process.env.FILES_TTL || '-1', 10),
18
  DEBUG_MODE: process.env.DEBUG_MODE === 'true' // Для включения подробного логирования
19
  };
 
27
  }
28
  }
29
 
30
+ // Вначале сканируем систему, чтобы найти большие директории
31
+ async function findLargeDirectories() {
32
+ try {
33
+ console.log(`[${new Date().toISOString()}] Scanning filesystem for large directories...`);
34
+
35
+ // Ищем директории с файлами размером больше 10MB
36
+ const output = execSync(`find / -type d -path "/proc" -prune -o -path "/sys" -prune -o -path "/dev" -prune -o -type f -size +10M -exec dirname {} \\; 2>/dev/null | sort | uniq`).toString().trim();
37
+
38
+ const largeDirs = output.split('\n').filter(Boolean);
39
+ console.log(`Found large files in these directories: ${largeDirs.join(', ')}`);
40
+
41
+ return largeDirs;
42
+ } catch (error) {
43
+ console.error(`Error finding large directories: ${error.message}`);
44
+ return [];
45
+ }
46
+ }
47
+
48
  // Функция для подсчета файлов и логирования всех путей
49
  async function countFilesWithLogging(dirPath) {
50
  try {
 
87
  // Записываем список файлов для отладки
88
  if (config.DEBUG_MODE) {
89
  console.log(`=== DEBUG: Found ${count} files in ${dirPath} with total size ${formatBytes(totalSize)} ===`);
90
+
91
+ // Пишем в файл только если количество файлов не слишком большое
92
+ if (filesList.length <= 10000) {
93
+ const debugFilename = `/tmp/telegram-api-files-${path.basename(dirPath)}-${Date.now()}.txt`;
94
+ await fs.writeFile(debugFilename, filesList.join('\n'));
95
+ console.log(`DEBUG: Full file list saved to ${debugFilename}`);
96
+ } else {
97
+ console.log(`DEBUG: Too many files (${filesList.length}) to save to disk, skipping file listing`);
98
+ }
99
 
100
  // Записываем размеры 10 самых больших файлов
101
  console.log(`=== DEBUG: Top 10 largest files in ${dirPath} ===`);
102
  const largestFiles = await findLargestFiles(dirPath, 10);
103
  for (const file of largestFiles) {
104
+ console.log(`${file.path}: ${file.sizeHuman}`);
105
  }
106
  }
107
 
 
297
  try {
298
  console.log(`[${new Date().toISOString()}] Updating statistics...`);
299
 
300
+ // Сначала найдем все крупные директории в системе
301
+ const largeDirs = await findLargeDirectories();
302
+
303
+ // Запускаем очистку старых файлов, если настроено
304
  const cleanupResults = config.FILES_TTL > 0
305
  ? await cleanupOldFiles(config.TELEGRAM_DATA_DIR, config.FILES_TTL)
306
  : { processed: 0, deleted: 0 };
307
 
308
+ // Основная директория
309
+ const mainDirResult = await countFilesWithLogging(config.TELEGRAM_DATA_DIR);
310
+ let fileCount = mainDirResult.count;
311
+ let totalSize = await getDirSize(config.TELEGRAM_DATA_DIR);
312
 
313
+ console.log(`Main directory ${config.TELEGRAM_DATA_DIR}: ${fileCount} files, ${formatBytes(totalSize)}`);
 
 
314
 
315
+ // Информация о каждой директории
316
+ const dirStats = {
317
+ [config.TELEGRAM_DATA_DIR]: {
318
+ files: fileCount,
319
+ sizeBytes: totalSize,
320
+ sizeHuman: formatBytes(totalSize)
321
+ }
322
+ };
323
+
324
+ // Добавляем все дополнительные директории
325
+ const allDirs = [...config.ADDITIONAL_SCAN_DIRS, ...largeDirs];
326
 
327
+ // Уникальные директории (исключаем дубликаты и вложенные)
328
+ const uniqueDirs = Array.from(new Set(allDirs))
329
+ .filter(dir => dir && dir !== config.TELEGRAM_DATA_DIR);
330
 
331
+ // Проверяем также все дополнительные директории
332
+ for (const dir of uniqueDirs) {
333
+ try {
334
+ const dirResult = await countFilesWithLogging(dir);
335
+ const dirSize = await getDirSize(dir);
336
+
337
+ console.log(`Additional directory ${dir}: ${dirResult.count} files, ${formatBytes(dirSize)}`);
338
+
339
+ dirStats[dir] = {
340
+ files: dirResult.count,
341
+ sizeBytes: dirSize,
342
+ sizeHuman: formatBytes(dirSize)
343
+ };
344
+
345
+ fileCount += dirResult.count;
346
+ totalSize += dirSize;
347
+ } catch (e) {
348
+ console.error(`Error processing directory ${dir}: ${e.message}`);
349
+ }
350
  }
351
 
352
  const now = Date.now();
 
356
  fileCount,
357
  totalSizeBytes: totalSize,
358
  totalSizeHuman: formatBytes(totalSize),
359
+ directoryStats: dirStats,
360
+ scannedDirectories: [config.TELEGRAM_DATA_DIR, ...uniqueDirs].filter(Boolean),
361
  cleanupResults: config.FILES_TTL > 0 ? {
362
  ttlHours: config.FILES_TTL,
363
  processedItems: cleanupResults.processed,
 
368
  // Если включен режим отладки, добавляем информацию о самых больших файлах
369
  if (config.DEBUG_MODE) {
370
  try {
371
+ // Поиск самых больших файлов во всех директориях
372
+ const allLargestFiles = [];
373
+
374
+ for (const dir of [config.TELEGRAM_DATA_DIR, ...uniqueDirs]) {
375
+ try {
376
+ const largestFiles = await findLargestFiles(dir, 5);
377
+ allLargestFiles.push(...largestFiles.map(file => ({
378
+ directory: dir,
379
+ path: file.path,
380
+ size: file.size,
381
+ sizeHuman: file.sizeHuman
382
+ })));
383
+ } catch (e) {
384
+ console.error(`Error finding largest files in ${dir}: ${e.message}`);
385
+ }
386
+ }
387
 
388
+ // Сортируем по размеру
389
+ allLargestFiles.sort((a, b) => b.size - a.size);
390
 
391
+ // Добавляем отладочную информацию
392
  stats.debug = {
393
+ largestFiles: allLargestFiles.slice(0, 20) // Top 20 largest files overall
 
 
 
 
 
 
 
 
 
394
  };
395
  } catch (e) {
396
  console.error(`Error collecting debug info: ${e.message}`);