This commit is contained in:
root
2025-12-14 21:22:55 +05:00
parent dc8b9d261a
commit 46da25f001
2 changed files with 75 additions and 6 deletions
@@ -78,36 +78,66 @@ public class MongoConfig {
logger.debug("DocumentToMapConverter: Source is null, returning empty Map"); logger.debug("DocumentToMapConverter: Source is null, returning empty Map");
return new HashMap<>(); return new HashMap<>();
} }
long startTime = System.currentTimeMillis();
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
for (String key : source.keySet()) { for (String key : source.keySet()) {
Object value = source.get(key); Object value = source.get(key);
// Рекурсивно конвертируем вложенные Document // Рекурсивно конвертируем вложенные Document
if (value instanceof Document) { if (value instanceof Document) {
logger.debug("DocumentToMapConverter: Found nested Document for key: {}", key);
result.put(key, convert((Document) value)); result.put(key, convert((Document) value));
} else { } else {
result.put(key, value); result.put(key, value);
} }
} }
logger.debug("DocumentToMapConverter: Successfully converted Document to Map with {} keys", result.size()); long duration = System.currentTimeMillis() - startTime;
logger.debug("DocumentToMapConverter: Successfully converted Document to Map with {} keys. Duration: {} ms",
result.size(), duration);
if (duration > 1000) {
logger.warn("DocumentToMapConverter: Conversion took {} ms, which is longer than expected", duration);
}
return result; return result;
} }
} }
/** /**
* Конвертер для записи: Map<String, Object> -> String * Конвертер для записи: Map<String, Object> -> String
* Не используется, но может быть полезен для обратной совместимости * Используется при сохранении reportData в MongoDB
*/ */
@WritingConverter @WritingConverter
public static class MapToStringConverter implements Converter<Map<String, Object>, String> { public static class MapToStringConverter implements Converter<Map<String, Object>, String> {
@Override @Override
public String convert(Map<String, Object> source) { public String convert(Map<String, Object> source) {
logger.info("MapToStringConverter: Starting conversion of Map to String");
if (source == null || source.isEmpty()) { if (source == null || source.isEmpty()) {
logger.debug("MapToStringConverter: Source is null or empty, returning null");
return null; return null;
} }
logger.debug("MapToStringConverter: Source Map size: {} keys. Keys: {}",
source.size(), source.keySet());
try { try {
return objectMapper.writeValueAsString(source); logger.debug("MapToStringConverter: Starting JSON serialization...");
long startTime = System.currentTimeMillis();
String result = objectMapper.writeValueAsString(source);
long duration = System.currentTimeMillis() - startTime;
logger.info(
"MapToStringConverter: Successfully converted Map to String. Result length: {} chars, Duration: {} ms",
result != null ? result.length() : 0, duration);
if (duration > 5000) {
logger.warn("MapToStringConverter: Conversion took {} ms, which is longer than expected", duration);
}
return result;
} catch (Exception e) { } catch (Exception e) {
logger.error("Error converting Map to String: {}", e.getMessage(), e); logger.error("MapToStringConverter: Error converting Map to String. Map size: {}, Keys: {}",
source.size(), source.keySet(), e);
logger.error("MapToStringConverter: Stack trace: ", e);
return null; return null;
} }
} }
@@ -134,13 +134,34 @@ public class MarketingAnalysisService {
analysis.setCompletedAt(LocalDateTime.now()); analysis.setCompletedAt(LocalDateTime.now());
logger.debug("processAnalysis: Setting reportData. ReportData keys: {}", logger.debug("processAnalysis: Setting reportData. ReportData keys: {}",
reportData != null ? reportData.keySet() : "null"); reportData != null ? reportData.keySet() : "null");
// Логируем размер reportData перед сохранением
if (reportData != null) {
try {
int estimatedSize = estimateMapSize(reportData);
logger.info("processAnalysis: reportData estimated size: ~{} KB. Keys: {}",
estimatedSize / 1024, reportData.keySet());
} catch (Exception e) {
logger.warn("processAnalysis: Could not estimate reportData size: {}", e.getMessage());
}
}
analysis.setReportData(reportData); analysis.setReportData(reportData);
analysis.setPdfFilename(filename); analysis.setPdfFilename(filename);
analysis.setPdfFilePath(filename); analysis.setPdfFilePath(filename);
addStatusHistoryEntry(analysis, "completed", "Анализ успешно завершен"); addStatusHistoryEntry(analysis, "completed", "Анализ успешно завершен");
logger.info("processAnalysis: Saving analysis to MongoDB for ID: {}", analysisId); logger.info(
"processAnalysis: About to save analysis to MongoDB for ID: {}. This may take time for large reportData...",
analysisId);
long saveStartTime = System.currentTimeMillis();
repository.save(analysis); repository.save(analysis);
logger.info("processAnalysis: Analysis saved successfully to MongoDB for ID: {}", analysisId); long saveDuration = System.currentTimeMillis() - saveStartTime;
logger.info("processAnalysis: Analysis saved successfully to MongoDB for ID: {}. Save duration: {} ms",
analysisId, saveDuration);
if (saveDuration > 10000) {
logger.warn("processAnalysis: Save operation took {} ms, which is longer than expected", saveDuration);
}
logger.info("processAnalysis: Marketing analysis completed successfully for ID: {}", analysisId); logger.info("processAnalysis: Marketing analysis completed successfully for ID: {}", analysisId);
@@ -2597,4 +2618,22 @@ public class MarketingAnalysisService {
return report; return report;
} }
/**
* Оценивает примерный размер Map в байтах для логирования
*/
private int estimateMapSize(Map<String, Object> map) {
if (map == null) {
return 0;
}
int size = 0;
try {
String json = objectMapper.writeValueAsString(map);
size = json.getBytes(java.nio.charset.StandardCharsets.UTF_8).length;
} catch (Exception e) {
// Если не удалось сериализовать, используем приблизительную оценку
size = map.size() * 100; // Примерно 100 байт на ключ
}
return size;
}
} }