kafka
This commit is contained in:
@@ -34,9 +34,4 @@ public class AnalyticsController {
|
||||
return ResponseEntity.ok(queryService.getDailyStats(days));
|
||||
}
|
||||
|
||||
@GetMapping("/tokens/usage")
|
||||
public ResponseEntity<List<DailyStatsResponse>> getTokenUsage(
|
||||
@RequestParam(defaultValue = "30") int days) {
|
||||
return ResponseEntity.ok(queryService.getTokenUsage(days));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,9 +15,7 @@ public class DailyStatsResponse {
|
||||
|
||||
private LocalDate date;
|
||||
private Long queries;
|
||||
private Long tokensUsed;
|
||||
private Long ragHits;
|
||||
private Long newUsers;
|
||||
private Long newChats;
|
||||
private Integer activeUsers;
|
||||
}
|
||||
}
|
||||
@@ -15,9 +15,7 @@ import java.util.Map;
|
||||
public class DashboardResponse {
|
||||
|
||||
private Long totalQueries;
|
||||
private Long totalTokensUsed;
|
||||
private Long totalRagHits;
|
||||
private Long totalUsers;
|
||||
private Integer activeUsersToday;
|
||||
private Map<String, Long> eventBreakdown;
|
||||
}
|
||||
}
|
||||
@@ -18,8 +18,6 @@ public class UserEvent {
|
||||
private EventType type;
|
||||
private String userId;
|
||||
private String chatId;
|
||||
private Integer tokensUsed;
|
||||
private Integer documentsFound;
|
||||
private Instant timestamp;
|
||||
|
||||
public enum EventType {
|
||||
@@ -28,4 +26,4 @@ public class UserEvent {
|
||||
CHAT_DELETED,
|
||||
QUERY_SENT
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import java.time.LocalDate;
|
||||
|
||||
@Entity
|
||||
@Table(name = "daily_stats", uniqueConstraints = {
|
||||
@UniqueConstraint(columnNames = "statsDate")
|
||||
@UniqueConstraint(columnNames = "stats_date")
|
||||
})
|
||||
@Getter
|
||||
@Setter
|
||||
@@ -26,15 +26,6 @@ public class DailyStats {
|
||||
@Builder.Default
|
||||
private Long totalQueries = 0L;
|
||||
|
||||
@Builder.Default
|
||||
private Long totalTokensUsed = 0L;
|
||||
|
||||
@Builder.Default
|
||||
private Long totalRagHits = 0L;
|
||||
|
||||
@Builder.Default
|
||||
private Long totalDocumentsFound = 0L;
|
||||
|
||||
@Builder.Default
|
||||
private Long newUsers = 0L;
|
||||
|
||||
@@ -46,4 +37,4 @@ public class DailyStats {
|
||||
|
||||
@Builder.Default
|
||||
private Integer activeUsers = 0;
|
||||
}
|
||||
}
|
||||
@@ -8,9 +8,9 @@ import java.time.LocalDate;
|
||||
|
||||
@Entity
|
||||
@Table(name = "event_log", indexes = {
|
||||
@Index(name = "idx_event_log_type", columnList = "eventType"),
|
||||
@Index(name = "idx_event_log_user", columnList = "userId"),
|
||||
@Index(name = "idx_event_log_date", columnList = "eventDate")
|
||||
@Index(name = "idx_event_log_type", columnList = "event_type"),
|
||||
@Index(name = "idx_event_log_user", columnList = "user_id"),
|
||||
@Index(name = "idx_event_log_date", columnList = "event_date")
|
||||
})
|
||||
@Getter
|
||||
@Setter
|
||||
@@ -31,13 +31,9 @@ public class EventLog {
|
||||
|
||||
private String chatId;
|
||||
|
||||
private Integer tokensUsed;
|
||||
|
||||
private Integer documentsFound;
|
||||
|
||||
@Column(nullable = false)
|
||||
private Instant eventTimestamp;
|
||||
|
||||
@Column(nullable = false)
|
||||
private LocalDate eventDate;
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import java.time.Instant;
|
||||
|
||||
@Entity
|
||||
@Table(name = "user_stats", uniqueConstraints = {
|
||||
@UniqueConstraint(columnNames = "userId")
|
||||
@UniqueConstraint(columnNames = "user_id")
|
||||
})
|
||||
@Getter
|
||||
@Setter
|
||||
@@ -26,16 +26,10 @@ public class UserStats {
|
||||
@Builder.Default
|
||||
private Long totalQueries = 0L;
|
||||
|
||||
@Builder.Default
|
||||
private Long totalTokensUsed = 0L;
|
||||
|
||||
@Builder.Default
|
||||
private Long totalRagHits = 0L;
|
||||
|
||||
@Builder.Default
|
||||
private Integer totalChats = 0;
|
||||
|
||||
private Instant firstSeen;
|
||||
|
||||
private Instant lastActive;
|
||||
}
|
||||
}
|
||||
@@ -35,8 +35,6 @@ public class AnalyticsQueryService {
|
||||
.findByStatsDateBetweenOrderByStatsDateAsc(thirtyDaysAgo, today);
|
||||
|
||||
long totalQueries = last30Days.stream().mapToLong(DailyStats::getTotalQueries).sum();
|
||||
long totalTokens = last30Days.stream().mapToLong(DailyStats::getTotalTokensUsed).sum();
|
||||
long totalRagHits = last30Days.stream().mapToLong(DailyStats::getTotalRagHits).sum();
|
||||
long totalUsers = userStatsRepository.count();
|
||||
Integer activeToday = eventLogRepository.countActiveUsers(today, today);
|
||||
|
||||
@@ -48,8 +46,6 @@ public class AnalyticsQueryService {
|
||||
|
||||
return DashboardResponse.builder()
|
||||
.totalQueries(totalQueries)
|
||||
.totalTokensUsed(totalTokens)
|
||||
.totalRagHits(totalRagHits)
|
||||
.totalUsers(totalUsers)
|
||||
.activeUsersToday(activeToday != null ? activeToday : 0)
|
||||
.eventBreakdown(breakdown)
|
||||
@@ -71,19 +67,13 @@ public class AnalyticsQueryService {
|
||||
return userStatsRepository.findActiveUsersSince(since);
|
||||
}
|
||||
|
||||
public List<DailyStatsResponse> getTokenUsage(int days) {
|
||||
return getDailyStats(days);
|
||||
}
|
||||
|
||||
private DailyStatsResponse toResponse(DailyStats ds) {
|
||||
return DailyStatsResponse.builder()
|
||||
.date(ds.getStatsDate())
|
||||
.queries(ds.getTotalQueries())
|
||||
.tokensUsed(ds.getTotalTokensUsed())
|
||||
.ragHits(ds.getTotalRagHits())
|
||||
.newUsers(ds.getNewUsers())
|
||||
.newChats(ds.getNewChats())
|
||||
.activeUsers(ds.getActiveUsers())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,8 +35,6 @@ public class AnalyticsService {
|
||||
.eventType(event.getType().name())
|
||||
.userId(event.getUserId())
|
||||
.chatId(event.getChatId())
|
||||
.tokensUsed(event.getTokensUsed())
|
||||
.documentsFound(event.getDocumentsFound())
|
||||
.eventTimestamp(timestamp)
|
||||
.eventDate(eventDate)
|
||||
.build();
|
||||
@@ -59,12 +57,7 @@ public class AnalyticsService {
|
||||
case USER_CREATED -> daily.setNewUsers(daily.getNewUsers() + 1);
|
||||
case CHAT_CREATED -> daily.setNewChats(daily.getNewChats() + 1);
|
||||
case CHAT_DELETED -> daily.setDeletedChats(daily.getDeletedChats() + 1);
|
||||
case QUERY_SENT -> {
|
||||
daily.setTotalQueries(daily.getTotalQueries() + 1);
|
||||
if (event.getTokensUsed() != null) {
|
||||
daily.setTotalTokensUsed(daily.getTotalTokensUsed() + event.getTokensUsed());
|
||||
}
|
||||
}
|
||||
case QUERY_SENT -> daily.setTotalQueries(daily.getTotalQueries() + 1);
|
||||
}
|
||||
|
||||
dailyStatsRepository.save(daily);
|
||||
@@ -81,15 +74,10 @@ public class AnalyticsService {
|
||||
|
||||
switch (event.getType()) {
|
||||
case CHAT_CREATED -> userStats.setTotalChats(userStats.getTotalChats() + 1);
|
||||
case QUERY_SENT -> {
|
||||
userStats.setTotalQueries(userStats.getTotalQueries() + 1);
|
||||
if (event.getTokensUsed() != null) {
|
||||
userStats.setTotalTokensUsed(userStats.getTotalTokensUsed() + event.getTokensUsed());
|
||||
}
|
||||
}
|
||||
case QUERY_SENT -> userStats.setTotalQueries(userStats.getTotalQueries() + 1);
|
||||
default -> { /* no user-level aggregation needed */ }
|
||||
}
|
||||
|
||||
userStatsRepository.save(userStats);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,10 @@
|
||||
CREATE TABLE event_log (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
event_type VARCHAR(50) NOT NULL,
|
||||
user_id VARCHAR(255) NOT NULL,
|
||||
chat_id VARCHAR(255),
|
||||
tokens_used INTEGER,
|
||||
documents_found INTEGER,
|
||||
event_timestamp TIMESTAMP WITH TIME ZONE NOT NULL,
|
||||
event_date DATE NOT NULL
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
event_type VARCHAR(50) NOT NULL,
|
||||
user_id VARCHAR(255) NOT NULL,
|
||||
chat_id VARCHAR(255),
|
||||
event_timestamp TIMESTAMP WITH TIME ZONE NOT NULL,
|
||||
event_date DATE NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX idx_event_log_type ON event_log(event_type);
|
||||
@@ -14,25 +12,20 @@ CREATE INDEX idx_event_log_user ON event_log(user_id);
|
||||
CREATE INDEX idx_event_log_date ON event_log(event_date);
|
||||
|
||||
CREATE TABLE daily_stats (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
stats_date DATE NOT NULL UNIQUE,
|
||||
total_queries BIGINT DEFAULT 0,
|
||||
total_tokens_used BIGINT DEFAULT 0,
|
||||
total_rag_hits BIGINT DEFAULT 0,
|
||||
total_documents_found BIGINT DEFAULT 0,
|
||||
new_users BIGINT DEFAULT 0,
|
||||
new_chats BIGINT DEFAULT 0,
|
||||
deleted_chats BIGINT DEFAULT 0,
|
||||
active_users INTEGER DEFAULT 0
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
stats_date DATE NOT NULL UNIQUE,
|
||||
total_queries BIGINT DEFAULT 0,
|
||||
new_users BIGINT DEFAULT 0,
|
||||
new_chats BIGINT DEFAULT 0,
|
||||
deleted_chats BIGINT DEFAULT 0,
|
||||
active_users INTEGER DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE TABLE user_stats (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id VARCHAR(255) NOT NULL UNIQUE,
|
||||
total_queries BIGINT DEFAULT 0,
|
||||
total_tokens_used BIGINT DEFAULT 0,
|
||||
total_rag_hits BIGINT DEFAULT 0,
|
||||
total_chats INTEGER DEFAULT 0,
|
||||
first_seen TIMESTAMP WITH TIME ZONE,
|
||||
last_active TIMESTAMP WITH TIME ZONE
|
||||
);
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id VARCHAR(255) NOT NULL UNIQUE,
|
||||
total_queries BIGINT DEFAULT 0,
|
||||
total_chats INTEGER DEFAULT 0,
|
||||
first_seen TIMESTAMP WITH TIME ZONE,
|
||||
last_active TIMESTAMP WITH TIME ZONE
|
||||
);
|
||||
Reference in New Issue
Block a user