Skip to content

Commit

Permalink
Metric for distinct total user
Browse files Browse the repository at this point in the history
Instead of creating a metric for yesterday's users, the patch makes the
exporter list the total amount of users. If we want the rate of users,
we can use PromQL to do that.
  • Loading branch information
lkiesow committed Jan 14, 2025
1 parent 89680c9 commit aa49e1a
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 40 deletions.
9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,10 @@ librechat_active_users 0.0
# HELP librechat_active_conversations Current number of active conversations
# TYPE librechat_active_conversations gauge
librechat_active_conversations 0.0
# HELP librechat_unique_users_yesterday Number of unique users active yesterday
# TYPE librechat_unique_users_yesterday gauge
librechat_unique_users_yesterday 0.0
# HELP librechat_files_total Number of uploaded files
# TYPE librechat_files_total counter
librechat_files_total 0.0
# HELP librechat_users_total Number of distinct users
# TYPE librechat_users_total counter
librechat_users_total 0.0
```
48 changes: 11 additions & 37 deletions metrics.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from pymongo import MongoClient
from prometheus_client import start_http_server
from prometheus_client.core import GaugeMetricFamily, REGISTRY
from prometheus_client.core import CounterMetricFamily, GaugeMetricFamily, REGISTRY
import logging
import os
import signal
Expand Down Expand Up @@ -47,6 +47,7 @@ def collect(self):
yield from self.collect_active_users()
yield from self.collect_active_conversations()
yield from self.collect_total_files()
yield from self.collect_total_users()

def collect_total_messages(self):
"""
Expand Down Expand Up @@ -308,53 +309,26 @@ def collect_active_conversations(self):
except Exception as e:
logger.error(f"Error collecting active conversations: {e}", exc_info=True)

def collect_daily_unique_users(self):
def collect_total_users(self):
"""
Collect number of unique users active yesterday.
This metric is collected once per day, but yielded on every scrape.
Collect number of distinct users.
"""
try:
current_date = datetime.now(timezone.utc).date()
if self.last_run_date != current_date:
# Calculate the date range for yesterday
yesterday = current_date - timedelta(days=1)
start_time = datetime.combine(
yesterday, datetime.min.time(), tzinfo=timezone.utc
)
end_time = datetime.combine(
current_date, datetime.min.time(), tzinfo=timezone.utc
)
# Query for unique users active yesterday
unique_users = self.messages_collection.distinct(
"user", {"createdAt": {"$gte": start_time, "$lt": end_time}}
)
unique_user_count = len(unique_users)
self.last_unique_users_yesterday = unique_user_count
# Update last_run_date
self.last_run_date = current_date
logger.debug(f"Updated unique users yesterday: {unique_user_count}")
else:
# Use the last calculated value
unique_user_count = getattr(self, "last_unique_users_yesterday", 0)
logger.debug(
f"Using cached unique users yesterday: {unique_user_count}"
)
# Yield the metric with the current value
metric = GaugeMetricFamily(
"librechat_unique_users_yesterday",
"Number of unique users active yesterday",
value=unique_user_count,
user_count = self.db["users"].estimated_document_count()
yield CounterMetricFamily(
"librechat_users_total",
"Number of distinct users",
value=user_count,
)
yield metric
except Exception as e:
logger.error(f"Error collecting daily unique users: {e}", exc_info=True)
logger.exception(f"Error collecting distinct users: {e}")

def collect_total_files(self):
"""
Collect number of uploaded files.
"""
try:
file_count = self.db['files'].estimated_document_count()
file_count = self.db["files"].estimated_document_count()
yield CounterMetricFamily(
"librechat_files_total",
"Number of uploaded files",
Expand Down

0 comments on commit aa49e1a

Please sign in to comment.