Skip to content

Commit

Permalink
Plot usage: re-enable interval, fix deprecated, add logging
Browse files Browse the repository at this point in the history
  • Loading branch information
vladsavelyev committed Feb 23, 2024
1 parent 30e711d commit 5bb3b05
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 25 deletions.
23 changes: 13 additions & 10 deletions app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -423,36 +423,39 @@ class PlotlyTemplates(str, Enum):

@app.get("/plot_usage")
async def plot_usage(
categories: models.UsageCategory | None = None,
interval: models.IntervalTypes = models.IntervalTypes.D,
category: models.UsageCategory | None = None,
interval: models.IntervalType = models.IntervalType.min,
start: datetime.datetime | None = None,
end: datetime.datetime | None = None,
limit: int | None = None,
format: PlotlyImageFormats = PlotlyImageFormats.png,
template: PlotlyTemplates = PlotlyTemplates.simple_white,
):
"""Plot usage metrics."""
# Get visit data
visit_stats = db.get_visit_stats(start=start, end=end, limit=limit)
if not visit_stats:
msg = "No usage data available to plot"
logger.info(msg)
return PlainTextResponse(content=msg)
df = pd.DataFrame.from_records([i.model_dump() for i in visit_stats])
legend_title_text = models.usage_category_nicenames[categories] if categories else None
legend_title_text = models.usage_category_nice_names[category] if category else None

# Simplify version numbers if requested
if categories in (models.UsageCategory.version_multiqc_simple, models.UsageCategory.version_python_simple):
categories = models.UsageCategory[categories.name.replace("_simple", "")]
df[categories.name] = df[categories.name].str.replace(r"^v?(\d+\.\d+).+", lambda m: m.group(1), regex=True)
if category in (models.UsageCategory.version_multiqc_simple, models.UsageCategory.version_python_simple):
category = models.UsageCategory[category.name.replace("_simple", "")]
df[category.name] = df[category.name].str.replace(r"^v?(\d+\.\d+).+", lambda m: m.group(1), regex=True)

# Plot histogram of df.count per interval from df.start
logger.debug(
f"Plotting usage data, color by: {category.name if category else None}, start: {start}, "
f"end: {end}, interval: {interval.value}, limit: {limit}, format: {format.name}"
)
fig = px.histogram(
df,
x="start",
x=df["start"].dt.to_period(interval.name).astype(str),
y="count",
color=categories.name if categories else None,
title="Usage per version per week",
color=category.name if category else None,
title=f"MultiQC usage per {interval.value}",
)
fig.update_layout(
legend_title_text=legend_title_text,
Expand Down
19 changes: 4 additions & 15 deletions app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,29 +35,18 @@ class VersionResponse(BaseModel):
module_warnings: list[ModuleWarning] = []


class IntervalTypes(str, Enum):
class IntervalType(str, Enum):
"""Allowed intervals for the usage endpoint."""

S = "second"
T = "minute"
s = "second"
min = "minute"
H = "hour"
D = "day"
W = "week"
M = "month"
Y = "year"


interval_types_plotly = {
"second": "S1",
"minute": "T1",
"hour": "H1",
"day": "D1",
"week": "W1",
"month": "M1",
"year": "Y1",
}


class SortTypes(str, Enum):
"""Allowed sort types for the usage endpoint."""

Expand All @@ -79,7 +68,7 @@ class UsageCategory(str, Enum):
is_ci = "is_ci"


usage_category_nicenames = dict(
usage_category_nice_names = dict(
version_multiqc="MultiQC version",
version_multiqc_simple="MultiQC version (simple)",
version_python="Python version",
Expand Down

0 comments on commit 5bb3b05

Please sign in to comment.